<script lang="ts" setup>
|
import { onMounted, ref } from 'vue';
|
import { useRoute, useRouter } from 'vue-router';
|
|
import { useMessage } from '@jnpf/hooks';
|
|
import { scanSignTmsRecord } from '#/api/x/tms/record';
|
import QuizPopup from '#/views/x/tms/shared/QuizPopup.vue';
|
|
import '#/views/x/tms/shared/page.css';
|
|
defineOptions({ name: 'TmsRecordScanSign' });
|
|
const route = useRoute();
|
const router = useRouter();
|
const { createMessage } = useMessage();
|
|
const loading = ref(true);
|
const success = ref(false);
|
const message = ref('');
|
const signTime = ref('');
|
const quizOpen = ref(false);
|
const quizPersonTaskId = ref<string>();
|
const quizQuestions = ref<Array<{ id?: string; sortNo?: number; question?: string }>>([]);
|
|
onMounted(() => {
|
doSign();
|
});
|
|
async function doSign() {
|
loading.value = true;
|
success.value = false;
|
message.value = '';
|
signTime.value = '';
|
try {
|
const raw = String(route.query.c || route.query.qrContent || '').trim();
|
if (!raw) {
|
message.value = '缺少签到二维码参数,请重新扫描';
|
return;
|
}
|
let qrContent = raw;
|
try {
|
qrContent = decodeURIComponent(raw);
|
} catch {
|
qrContent = raw;
|
}
|
const signMode = String(route.query.signMode || 'app_scan');
|
const res = await scanSignTmsRecord({ qrContent, signMode });
|
success.value = true;
|
signTime.value = res?.signTime || '';
|
message.value = res?.message || '扫码签到成功';
|
createMessage.success(message.value);
|
if (res?.needQuiz && res.quizQuestions?.length && res.personTaskId) {
|
quizPersonTaskId.value = res.personTaskId;
|
quizQuestions.value = res.quizQuestions;
|
quizOpen.value = true;
|
}
|
} catch (e: any) {
|
success.value = false;
|
message.value = e?.message || '扫码签到失败';
|
createMessage.error(message.value);
|
} finally {
|
loading.value = false;
|
}
|
}
|
|
function goMine() {
|
router.push('/tms/personTask');
|
}
|
|
function goHome() {
|
router.push('/tms/record');
|
}
|
</script>
|
|
<template>
|
<div class="jnpf-content-wrapper tms-scroll-page">
|
<div class="jnpf-content-wrapper-center tms-scroll-center">
|
<div class="jnpf-content-wrapper-content tms-scroll-body">
|
<a-spin :spinning="loading" class="tms-scroll-spin">
|
<div class="tms-scroll-inner scan-sign">
|
<div class="tms-page-header">
|
<div>
|
<div class="tms-page-header__title">扫码签到</div>
|
<div class="tms-page-header__sub">请使用培训现场签到码完成签到</div>
|
</div>
|
<div class="tms-page-header__actions">
|
<a-button @click="doSign" :loading="loading">重试</a-button>
|
<a-button @click="goMine">我的任务</a-button>
|
</div>
|
</div>
|
|
<a-result
|
:status="loading ? 'info' : success ? 'success' : 'error'"
|
:title="loading ? '正在签到…' : success ? '签到成功' : '签到失败'"
|
:sub-title="message"
|
>
|
<template #extra>
|
<div v-if="signTime" class="scan-sign__time">签到时间:{{ signTime }}</div>
|
<a-space>
|
<a-button type="primary" @click="goMine">前往个人培训任务</a-button>
|
<a-button @click="goHome">返回</a-button>
|
</a-space>
|
</template>
|
</a-result>
|
</div>
|
</a-spin>
|
</div>
|
</div>
|
|
<QuizPopup
|
v-model:open="quizOpen"
|
:person-task-id="quizPersonTaskId"
|
:questions="quizQuestions"
|
/>
|
</div>
|
</template>
|
|
<style scoped>
|
.scan-sign {
|
max-width: 640px;
|
margin: 0 auto;
|
}
|
|
.scan-sign__time {
|
margin-bottom: 12px;
|
color: rgba(0, 0, 0, 0.65);
|
}
|
</style>
|