| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- <template>
- <div class="loading-page" role="status" aria-live="polite" aria-label="页面加载中">
- <!-- 顶部导航 -->
- <van-nav-bar title="加载中" fixed :border="false" safe-area-inset-top class="nav" />
- <!-- 中心区域(带淡淡的高光背景,不是卡片) -->
- <div class="loading-body">
- <div>
- <van-loading type="circular" vertical :size="loadingSize" :color="loadingColor">
- 加载中…
- </van-loading>
- </div>
- </div>
- <!-- 低证等级弹窗 -->
- <van-dialog
- v-model:show="lowCertLevelDialog"
- title="人脸核验失败"
- confirmButtonText="我知道啦"
- @confirm="lowCertLevelConfirm"
- >
- <div class="dialog-content">
- <div class="dialog-text">
- 抱歉,您的人脸核验失败,请重新点击 "下一步”提交缴税信息并完成人脸核验。
- </div>
- <div class="dialog-text">
- 为提升人脸核验成功几率,建议您提升电子税务局的账号安全等级,可登录至电子税务局提升账号安全等级。
- </div>
- <div class="dialog-btn" @click="handleSecurityLevelGuideClick">
- 点击了解提升安全等级操作指引
- </div>
- </div>
- </van-dialog>
- <!-- 安全等级操作指引 -->
- <van-dialog
- v-model:show="securityLevelGuideDialog"
- width="90%"
- :closeOnClickOverlay="true"
- className="security-level-guide-dialog"
- @confirm="securityLevelGuideDialog = false"
- >
- <div class="security-level-guide-body">
- <img src="@/assets/images/securityLevelGuide/1.webp" class="guide-image" />
- <img src="@/assets/images/securityLevelGuide/2.webp" class="guide-image" />
- <img src="@/assets/images/securityLevelGuide/3.webp" class="guide-image" />
- <img src="@/assets/images/securityLevelGuide/4.webp" class="guide-image" />
- <img src="@/assets/images/securityLevelGuide/5.webp" class="guide-image" />
- <img src="@/assets/images/securityLevelGuide/6.webp" class="guide-image" />
- </div>
- </van-dialog>
- </div>
- </template>
- <script setup lang="ts">
- import { getFaceAuthResultApi } from '@/services/modules/faceRecognition'
- import type { PushRecordIdRequest } from '@/services/modules/invoiceInformation/type.d.ts'
- import { ref, reactive, onMounted } from 'vue'
- import { useUserStore } from '@/stores/modules/user'
- import { showToast } from 'vant'
- import { useInvoice } from '@/hooks/useInvoice'
- import { useRouter } from 'vue-router'
- const userStore = useUserStore()
- const router = useRouter()
- // --- 初始化 Hooks ---
- const { submitInvoiceForce } = useInvoice()
- const loadingSize = '10vw'
- const loadingColor = '#1677ff'
- const params = reactive<PushRecordIdRequest>({
- pushRecordId: userStore.pushRecordId,
- })
- const lowCertLevelDialog = ref(false)
- // 获取认证结果
- const getFaceAuthResult = async () => {
- try {
- const res = await getFaceAuthResultApi(params)
- if (res.code === 0 && res.data.lowCertLevel) {
- lowCertLevelDialog.value = true
- return
- }
- if (res.code === 0 && res.data?.success) {
- const rzzt = res.data.rzzt
- // 已认证或无需认证提交跳转
- if (rzzt === 'NO_REQUIRED_AUTHENTICATION') {
- submitInvoiceForce()
- return
- }
- } else {
- showToast('扫脸认证失败,请重试')
- }
- } catch (err) {
- console.error('获取认证结果失败', err)
- showToast('网络错误,请稍后重试')
- }
- setTimeout(() => {
- router.replace({
- path: '/invoice-information',
- })
- }, 1800)
- }
- const lowCertLevelConfirm = () => {
- router.replace('/invoice-information')
- }
- const securityLevelGuideDialog = ref(false)
- const handleSecurityLevelGuideClick = () => {
- securityLevelGuideDialog.value = true
- }
- onMounted(() => {
- getFaceAuthResult()
- })
- </script>
- <style scoped>
- /* 基于 375 设计稿的 vw 适配 */
- html {
- font-size: calc(100vw / 3.75);
- }
- .loading-page {
- width: 100vw;
- height: 100vh;
- background: #f6f7fb; /* 整页浅灰底,非卡片 */
- display: flex;
- flex-direction: column;
- overflow: hidden;
- }
- /* 顶部导航固定 */
- .nav {
- position: fixed;
- top: 0;
- width: 100vw;
- }
- /* 居中容器 */
- .loading-body {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: center;
- padding-top: 14vw; /* 预留固定导航空间 */
- }
- .dialog-content {
- padding: 12px;
- .dialog-text {
- font-size: 14px;
- line-height: 22px;
- color: #333;
- margin-bottom: 10px;
- font-weight: 400;
- }
- .dialog-btn {
- text-align: center;
- font-weight: 600;
- margin: 18px 0;
- color: #0072f8;
- }
- }
- :deep(.security-level-guide-dialog) {
- top: 50%;
- height: 90vh;
- .security-level-guide-body {
- height: 80vh;
- overflow-y: auto;
- -webkit-overflow-scrolling: touch;
- padding: 12px;
- .guide-image {
- width: 100%;
- height: auto;
- display: block;
- }
- }
- }
- </style>
|