Przeglądaj źródła

修复针对人脸结果认证问题

yuanmingze 3 tygodni temu
rodzic
commit
3062dc461d
2 zmienionych plików z 60 dodań i 20 usunięć
  1. 55 17
      src/hooks/useInvoice.ts
  2. 5 3
      src/views/invoice-information/index.vue

+ 55 - 17
src/hooks/useInvoice.ts

@@ -15,6 +15,15 @@ interface ToStatus {
   [key: string]: any
 }
 
+type FaceAuthRzzt = 'REQUIRED_AUTHENTICATION' | 'NO_REQUIRED_AUTHENTICATION'
+
+interface FaceAuthResultData {
+  success?: boolean
+  rzzt?: FaceAuthRzzt
+  msg?: string
+  lowCertLevel?: boolean
+}
+
 /* ========================== 主 Hook ========================== */
 
 export function useInvoice() {
@@ -26,21 +35,30 @@ export function useInvoice() {
   const isLoading = ref(false)
   const statusMap = ref<ToStatus>({})
 
-  // 状态层面是否允许继续流程
+  // get-status 接口是否允许继续流程
   const statusReady = ref(false)
 
-  // 人脸认证接口是否已经返回成功
+  /**
+   * 只表示 get-face-auth-result 接口是否已成功返回
+   * 仅用于 btnDisabled 判断
+   */
   const faceAuthReady = ref(false)
 
-  // 人脸是否“通过或无需认证”
+  /**
+   * 是否需要跳转人脸认证页
+   * REQUIRED_AUTHENTICATION => true
+   */
+  const needFaceAuth = ref(false)
+
+  /**
+   * 人脸认证是否已完成 / 无需认证
+   * NO_REQUIRED_AUTHENTICATION => true
+   * REQUIRED_AUTHENTICATION => false
+   */
   const faceAuthResult = ref(false)
 
   /* ------------------ UI 控制层 ------------------ */
 
-  /**
-   * 仅用于按钮禁用控制
-   * 不参与真实业务逻辑
-   */
   const btnDisabled = computed(() => {
     return !(statusReady.value && faceAuthReady.value)
   })
@@ -73,6 +91,7 @@ export function useInvoice() {
     if (!params.pushRecordId) return
 
     isLoading.value = true
+
     try {
       const res = await getStatusApi(params)
       if (res.code !== 0) return
@@ -82,7 +101,6 @@ export function useInvoice() {
       const { invoiceStatus, eventStatus } = res.data
 
       const isInvoiceSubmitted = !!invoiceStatus && isSubmitStatusMap.includes(invoiceStatus)
-
       const isEventSubmitted = !!eventStatus && isSubmitEventStatusMap.includes(eventStatus)
 
       // 只有未提交状态才允许继续
@@ -107,9 +125,17 @@ export function useInvoice() {
 
       if (res.code !== 0 || !res.data?.success) return
 
-      if (res.data.rzzt === 'NO_REQUIRED_AUTHENTICATION') {
-        faceAuthResult.value = true
-      }
+      const data = res.data as FaceAuthResultData
+      const rzzt = data.rzzt
+
+      // 接口成功返回后,按钮可以进入下一步流程
+      faceAuthReady.value = true
+
+      // 需要做人脸:按钮可点,但点击后应跳人脸页
+      needFaceAuth.value = rzzt === 'REQUIRED_AUTHENTICATION'
+
+      // 无需认证:视为人脸流程已通过,可以直接提交
+      faceAuthResult.value = rzzt === 'NO_REQUIRED_AUTHENTICATION'
     } catch (err: any) {
       console.error('获取认证结果失败', err)
       showToast(err?.message || '获取认证结果失败,请稍后重试')
@@ -117,8 +143,7 @@ export function useInvoice() {
   }
 
   /* ============================================================
-   * 核心提交逻辑(纯业务)
-   * ⚠ 不依赖任何 UI 计算属性
+   * 核心提交逻辑
    * ============================================================ */
 
   const doSubmitInvoice = async (): Promise<boolean> => {
@@ -151,7 +176,7 @@ export function useInvoice() {
   }
 
   /* ============================================================
-   * UI 场景提交(按钮点击)
+   * UI 场景提交
    * ============================================================ */
 
   const submitInvoiceWithGuard = async () => {
@@ -160,7 +185,7 @@ export function useInvoice() {
   }
 
   /* ============================================================
-   * 流程场景提交(loading页/自动流程)
+   * 流程场景提交
    * ============================================================ */
 
   const submitInvoiceForce = async () => {
@@ -173,7 +198,20 @@ export function useInvoice() {
     /* 状态 */
     statusMap,
     isLoading,
+
+    /**
+     * 是否需要去人脸页
+     */
+    needFaceAuth,
+
+    /**
+     * 人脸是否完成 / 无需认证
+     */
     faceAuthResult,
+
+    /**
+     * 按钮禁用状态
+     */
     btnDisabled,
 
     /* 状态获取 */
@@ -181,7 +219,7 @@ export function useInvoice() {
     getFaceAuthResult,
 
     /* 提交 */
-    submitInvoiceWithGuard, // 按钮用
-    submitInvoiceForce, // 流程自动用
+    submitInvoiceWithGuard,
+    submitInvoiceForce,
   }
 }

+ 5 - 3
src/views/invoice-information/index.vue

@@ -159,6 +159,7 @@ const {
   btnDisabled,
   statusMap,
   faceAuthResult,
+  needFaceAuth,
 } = useInvoice()
 
 // --- 其余本页面独有逻辑 ---
@@ -195,17 +196,18 @@ const getConfirmInvoiceInfo = async () => {
  */
 const handleNext = async () => {
   if (btnDisabled.value) return
+
   // 未上传身份证,跳转上传页
   if (!statusMap.value.isIdImgReady) {
     return router.push({ path: '/identity-upload' })
   }
 
-  // 已处理状态,跳转人脸识别
-  if (userStore.needFaceId && !faceAuthResult.value) {
+  // 需要人脸,并且人脸还没完成,跳转人脸认证页
+  if (needFaceAuth.value && !faceAuthResult.value) {
     return router.push({ path: '/face-recognition' })
   }
 
-  // 其他情况,直接提交
+  // 不需要人脸,或者人脸已完成,直接提交
   await submitInvoiceWithGuard()
 }