Explorar o código

添加扫码获取建档信息逻辑

cc12458 hai 8 meses
pai
achega
3dedaddfd1

+ 1 - 0
@types/router.d.ts

@@ -7,5 +7,6 @@ export {};
 declare module 'vue-router' {
   interface RouteMeta {
     title?: string;
+    scan?: boolean;
   }
 }

+ 30 - 0
src/loader/bridge.loader.ts

@@ -0,0 +1,30 @@
+import router from '@/router';
+import pinia  from '@/stores';
+
+
+export interface globalAIO {
+  scan(value: string): number;
+}
+
+declare var window: Window & typeof globalThis & { AIO: globalAIO };
+
+
+export default function bridgeLoader(): DEV.Loader {
+  return async function() {
+    window.AIO ??= {} as globalAIO;
+
+    window.AIO.scan = (value) => {
+      if ( !value ) return -1;
+
+      if ( !router.currentRoute.value.meta?.scan ) {
+        import(`@/platform/notify.ui`).then(({ Notify }) => { Notify.warning(`请返回首页后,再进行扫码!`); });
+        return 1;
+      }
+
+      const key = Date.now();
+      sessionStorage.setItem(`scan_${ key }`, JSON.stringify(value));
+      router.replace({ path: '/register', query: { scan: key } });
+      return 0;
+    };
+  };
+}

+ 1 - 0
src/loader/index.ts

@@ -11,4 +11,5 @@ export default async function Loader(component: Component, ...loader: DEV.Loader
 }
 
 export { default as launchLoader } from './launch.loader';
+export { default as bridgeLoader } from './bridge.loader';
 export { default as debugLoader } from './debug.loader';

+ 3 - 2
src/main.ts

@@ -1,7 +1,7 @@
 import '@/themes/index.scss';
 
-import Loader, { debugLoader, launchLoader } from '@/loader';
-import { platformIsAIO }                     from '@/platform';
+import Loader, { bridgeLoader, debugLoader, launchLoader } from '@/loader';
+import { platformIsAIO }                                   from '@/platform';
 
 import App from './App.vue';
 
@@ -9,6 +9,7 @@ import App from './App.vue';
 Loader(
   App,
   debugLoader('debug', !platformIsAIO()),
+  bridgeLoader(),
   launchLoader('#app'),
 ).then(
   (app) => {},

+ 34 - 2
src/pages/register.page.vue

@@ -7,12 +7,13 @@ import {
   processMethod,
   registerAccountMethod,
   registerFieldsMethod,
-  searchAccountMethod,
+  scanAccountMethod, searchAccountMethod,
 } from '@/request/api';
 
 import { useVisitor } from '@/stores';
+import { useRouteQuery } from '@vueuse/router';
 
-import { useCaptcha, useForm, useRequest } from 'alova/client';
+import { useCaptcha, useForm, useRequest, useWatcher } from 'alova/client';
 
 import type { FieldRule, FormInstance, NumberKeyboardProps, PasswordInputProps } from 'vant';
 import { RadioGroup as vanRadioGroup }                                           from 'vant';
@@ -222,6 +223,37 @@ function fix(key: FieldKey) {
     if (field.keyboard?.show && field.name !== key ) field.keyboard.show = false;
   }
 }
+
+const scan = useRouteQuery<string>('scan');
+useWatcher(
+  () => scanAccountMethod(sessionStorage.getItem(`scan_${ scan.value }`)!),
+  [ scan ],
+  {
+    immediate: true,
+    async middleware(_, next) {
+      if ( _.method.config.params?.scanCode ) {
+        let scanToastRef: any;
+        try {
+          scanToastRef = Toast.loading(100, { message: '加载中' });
+          await next();
+        } catch ( error ) {} finally {
+          scanToastRef?.close?.();
+        }
+      }
+      console.log('12->', _);
+    },
+  },
+).onSuccess(({ data }) => {
+  Toast.success('扫码成功');
+  modelRef.value = { ...modelRef.value, ...data };
+});
+
+onBeforeUnmount(() => {
+  for ( let i = 0; i < sessionStorage.length; i++ ) {
+    const key = sessionStorage.key(i);
+    if ( key?.startsWith('scan_') ) sessionStorage.removeItem(key);
+  }
+});
 </script>
 <template>
   <div>

+ 10 - 0
src/request/api/account.api.ts

@@ -39,3 +39,13 @@ export function searchAccountMethod(params: Partial<RegisterModel>) {
     },
   });
 }
+
+export function scanAccountMethod(value: string) {
+  return HTTP.Get(`/fdhb-tablet/patientInfoManage/getPatInfoByScanCode`, {
+    hitSource: 'register',
+    params: { scanCode: value },
+    transform(data: Record<string, any>, headers) {
+      return Object.fromEntries(Object.entries(data).filter(([ item, value ]) => !!value)) as Partial<RegisterModel>;
+    },
+  });
+}

+ 2 - 4
src/router/index.ts

@@ -4,10 +4,8 @@ import { createRouter, createWebHistory } from 'vue-router';
 const router = createRouter({
   history: createWebHistory(import.meta.env.BASE_URL),
   routes: [
-    {
-      path: '/screen', component: () => import('@/pages/screen.page.vue'),
-    },
-    { path: '/register', component: () => import('@/pages/register.page.vue'), meta: { title: '建档' } },
+    { path: '/screen', component: () => import('@/pages/screen.page.vue'), meta: { scan: true } },
+    { path: '/register', component: () => import('@/pages/register.page.vue'), meta: { title: '建档', scan: true } },
     { path: '/camera', component: () => import('@/modules/camera/camera.page.vue'), meta: { title: '拍摄' } },
     { path: '/camera/result', component: () => import('@/modules/camera/camera-result.page.vue'), meta: { title: '拍摄完成' } },
     { path: '/questionnaire', component: () => import('@/modules/questionnaire/page.vue'), meta: { title: '问卷' } },