| | |
| | | bookCheckType: number // é¢çº¦æ£æ¥ç±»å |
| | | paid: number //已仿¬¾ |
| | | bookSeqNum: number |
| | | // ========== 以ä¸å段å端 AppointmentRespVO ä¸ç´æè¿åï¼æ¤å TS æªå£°æ ========== |
| | | // éæ±1 使ç¨ï¼ç¶æ / å¼åå»å¸ / å¼åæ¥æ / è·ä»å¤©æ°ï¼ç± doctorTime 计ç®ï¼/ å°±è¯å¡å· |
| | | status?: string // ç¶æï¼åå
¸ ecg_statusï¼ |
| | | doctor?: string // å¼åå»å¸ |
| | | doctorCode?: string // å¼åå»å¸ä»£ç |
| | | doctorTime?: Date | number | string // å¼åæ¥æï¼å¼åæ¶é´ï¼ |
| | | registerDate?: Date | number | string // ç»è®°æ¶é´ |
| | | hospitalNo?: string // ä½é¢å· |
| | | medicalCard?: string // å°±è¯å¡å·ï¼åºä¸å¤ä¸ºç©ºï¼é¡µé¢åéå° outpatientNoï¼ |
| | | doctorAdviceNo?: string // å»å±å·ï¼HIS root 2.16.156.10011.1.28ï¼åºä¸å岿°æ®ä¸ºç©ºï¼ |
| | | outpatientNo?: string // é¨è¯å·ï¼å®æµé¨åæ°æ®åçæ¯èº«ä»½è¯å·ï¼ |
| | | bookSrc?: number // é¢çº¦æ¥æºï¼0人工 10å¹³å° |
| | | roomName?: string // è¯å®¤åç§° |
| | | remark?: string // 夿³¨ |
| | | jjbz?: string // å æ¥æ è®° |
| | | createTime?: Date | number | string // å建æ¶é´ |
| | | } |
| | | |
| | | // é¢çº¦ API |
| | |
| | | affinityCheckTypes: number[] | null// 亲åçæ£æ¥ç±»å |
| | | notes: string // é¢çº¦æ³¨æäºé¡¹ |
| | | seqPrefix: string // åºå·åç¼ |
| | | /** |
| | | * æéåºå·è§åï¼ |
| | | * 0=é¢çº¦å·ï¼ç¨é¢çº¦ç³»ç»çå·ï¼ä¸ååé
ï¼ |
| | | * 1=ç¾å°åºå·ï¼å½å¤©åæ£æ¥ç±»åè¿ç»éå¢ï¼æ¯ 9 个é¢ç 1 个ç»å æ¥ï¼ |
| | | * 2=æ¶æ®µå·ï¼æé¢çº¦æ¶é´æ®µç»å·ï¼ |
| | | * æªé
ç½®(null/undefined) æ¶å端æ 2 å¤çï¼ä¸æ¹é åè¡ä¸ºä¸è´ã |
| | | */ |
| | | seqRule: number | null |
| | | } |
| | | |
| | | // æ£æ¥ç±»å API |
| | |
| | | patGender?: number | undefined | null // æ£è
æ§å«ï¼1 ç· 2 女ï¼å端ä»é¢çº¦åè¡¥é½ï¼ä»
å±ç¤ºï¼ |
| | | patDetails?: PatDetailsVO | undefined | null |
| | | checkType?: number | undefined | null |
| | | tolerance?: string | number | undefined | null // æ¯å¦å¤èè¯ï¼å端为å符串 "0"(å¦) / "1"(æ¯) |
| | | // å¤èè¯ï¼0 æ / 1 å¤è / 2 å¤éèè¯ï¼å端为åç¬¦ä¸²ï¼ |
| | | tolerance?: string | number | undefined | null |
| | | // 以ä¸å段ç±å端ä»é¢çº¦åè¡¥é½ï¼ä»
ç¨äºå»ç端å±ç¤ºï¼ä¸åä¸æäº¤ |
| | | patBirthday?: number | undefined | null // åºçæ¥æï¼æ¯«ç§æ¶é´æ³ï¼ |
| | | registerDate?: number | undefined | null // ç»è®°æ¶é´ï¼æ¯«ç§æ¶é´æ³ï¼ |
| | | patBirthday?: number | string | undefined | null // åºçæ¥æ |
| | | registerDate?: number | string | undefined | null // ç»è®°æ¶é´ |
| | | doctor?: string | undefined | null // å¼åå»å¸ |
| | | doctorTime?: number | undefined | null // å¼åæ¥æï¼æ¯«ç§æ¶é´æ³ï¼ |
| | | doctorTime?: number | string | undefined | null // å¼åæ¥æ |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼å端 DevRentRespVO å·²æ©å段ï¼åç±é¢çº¦ååå¡«ï¼ |
| | | patSrc?: number | undefined | null // æ£è
æ¥æºï¼1é¨è¯ 2æ¥è¯ 3ä½é¢ 4使£ |
| | | patMobile?: string | undefined | null // ææºå· |
| | | patPhone?: string | undefined | null // çµè¯ |
| | | patWardDesc?: string | undefined | null // ç
åºåç§° |
| | | patBedNo?: string | undefined | null // ç
åºå·ï¼æ³¨æä¸æ¯ bedNoï¼åè
æ¯è¯çåº/å·¥ä½å·ï¼ |
| | | medicalCard?: string | undefined | null // å°±è¯å¡å·ï¼åºä¸å¤ä¸ºç©ºï¼ |
| | | doctorAdviceNo?: string // å»å±å·ï¼HIS root 2.16.156.10011.1.28ï¼åºä¸å岿°æ®ä¸ºç©ºï¼ |
| | | outpatientNo?: string | undefined | null // é¨è¯å· |
| | | patIdentityId?: string | undefined | null // 身份è¯å· |
| | | // éåç¸å
³ï¼ç± setPatient ä» QueueVO 带å
¥ï¼ä»
ç¨äºå«å·é¢æ¿å±ç¤ºï¼ |
| | | seqNum?: number | undefined | null // æéåºå· |
| | | status?: number | undefined | null // éåç¶æï¼åå
¸ ecg_queue_statusï¼ |
| | | rentTime?: number | undefined | null // è£
æºæ¶é´ |
| | | returnTime?: number | undefined | null // ææºæ¶é´ |
| | | interference?: number | undefined | null // å¹²æ°æ° |
| | |
| | | patientJump: async (params: PatientVO) => { |
| | | return await request.get({ url: `/ecg/doctor/patient-jump`, params }) |
| | | }, |
| | | |
| | | // ==================== éæ±2ï¼æ¤éãå«å· / æ£æ¥å®æã ==================== |
| | | |
| | | // æ¤éæ£æ¥å®æï¼å·²å°±è¯(40) â åè¯ä¸(20)ãå¿
须带 patId + checkType 精确å®ä½ |
| | | undoFinishPatient: async (params: PatientVO) => { |
| | | return await request.get({ url: `/ecg/doctor/undo-finish-patient`, params }) |
| | | }, |
| | | |
| | | // æ¤éå«å·ï¼å°±è¯ä¸(30) â åè¯ä¸(20) |
| | | undoCallPatient: async (params: { roomId: number | null; bedNo: string | null }) => { |
| | | return await request.get({ url: `/ecg/doctor/undo-call-patient`, params }) |
| | | }, |
| | | |
| | | // 忬工ä½ä»æ¥æè¿ä¸ä½å·²å®ææ£è
ï¼ä¾æ¤éæç¤ºï¼ |
| | | lastFinishedPatient: async (params: { roomId: number | null; bedNo: string | null }) => { |
| | | return await request.get({ url: `/ecg/doctor/last-finished-patient`, params }) |
| | | }, |
| | | |
| | | // ==================== éæ±3ï¼åæ¢åè¯å¼å
³ ==================== |
| | | |
| | | // 忢åè¯ï¼ä¸åæ°å¢åè¯æ£è
ï¼å·²æåè¯ä»å¯å«å·ï¼ |
| | | stopReady: async (params: { roomId: number | null; bedNo: string | null }) => { |
| | | return await request.get({ url: `/ecg/doctor/stop-ready`, params }) |
| | | }, |
| | | |
| | | // æ¢å¤åè¯ï¼éæ°å¼å§æ¥æ¶åè¯æ£è
|
| | | resumeReady: async (params: { roomId: number | null; bedNo: string | null }) => { |
| | | return await request.get({ url: `/ecg/doctor/resume-ready`, params }) |
| | | }, |
| | | |
| | | // æ¥è¯¢åæ¢åè¯ç¶æ |
| | | getStopReady: async (params: { roomId: number | null; bedNo: string | null }) => { |
| | | return await request.get({ url: `/ecg/doctor/get-stop-ready`, params }) |
| | | }, |
| | | |
| | | // ä¸è½½ |
| | | yddownload: async (id: number | string) => { |
| | | return await request.get({ url: `/ecg/template/download/${id}` }) |
| | |
| | | summary: number // ä½ä¸æ¦è¦ |
| | | remark: string // 夿³¨ |
| | | paid: number |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼å端æ job_record.rentId â dev_rent.applyNo â appointment æ¹éåå¡«ï¼ |
| | | applyNo?: string // ç³è¯·ç¼å· |
| | | episodeId?: string // å°±è¯æµæ°´å· |
| | | patGender?: number // æ§å« |
| | | patBirthday?: number | string // åºçæ¥æ |
| | | registerDate?: number | string // ç»è®°æ¶é´ |
| | | doctor?: string // å¼åå»å¸ |
| | | doctorTime?: number | string // å¼åæ¥æ |
| | | patSrc?: number // æ£è
æ¥æºï¼1é¨è¯ 2æ¥è¯ 3ä½é¢ 4使£ |
| | | patMobile?: string |
| | | patPhone?: string |
| | | patWardDesc?: string // ç
åº |
| | | patBedNo?: string // ç
åºå· |
| | | medicalCard?: string // å°±è¯å¡å· |
| | | doctorAdviceNo?: string // å»å±å·ï¼HIS root 2.16.156.10011.1.28ï¼åºä¸å岿°æ®ä¸ºç©ºï¼ |
| | | outpatientNo?: string // é¨è¯å· |
| | | patIdentityId?: string // 身份è¯å· |
| | | tolerance?: string // å¤èè¯ï¼0æ 1å¤è 2å¤éèè¯ |
| | | } |
| | | |
| | | export interface JobStatisticVO { |
| | |
| | | bookSeqNum?: number //é¢çº¦åºå· |
| | | isVip?: number // æ¯å¦VIPæ£è
|
| | | seqNum?: number // æéåºå· |
| | | status?: number // 5:è¿å· 10:æéä¸ 15:å·²å¬å 20:åè¯åå¤ 30:å°±è¯ä¸ 40:å°±è¯å®æ |
| | | status?: number // 3:å·²è¿å·-æé 5:è¿å· 7:å·²è¿å·-å®è£
10:æéä¸ 15:å·²å¬å 20:åè¯ä¸ 30:å°±è¯ä¸ 33:å·²é¢ç¨ 34:å·²å¬å-å®è£
36:å®è£
ä¸ 40:å·²å°±è¯ |
| | | passed?: number // è¿å·æ è®° |
| | | expired?: number // é¢çº¦è¿ææ è®° |
| | | jumpFlag?: number //æéæ è®° |
| | | roomId?: number // è¯å®¤ç¼å· |
| | | roomName?: string // è¯å®¤åç§° |
| | | bedNo?: string // è¯çåºç¼å· |
| | | bedNo?: string // è¯çåºç¼å·ï¼å·¥ä½å·ï¼éç
åºå·ï¼ï¼ |
| | | patDetails?: PatDetailsVO |
| | | // 以ä¸å段ç±å端ä»é¢çº¦åè¡¥é½ï¼queue 表ä¸åï¼ |
| | | tolerance?: string // æ¯å¦å¤èè¯ï¼0 å¦ï¼1 æ¯ |
| | | patBirthday?: number // åºçæ¥æï¼æ¶é´æ³ï¼ |
| | | registerDate?: number // ç»è®°æ¶é´ï¼æ¶é´æ³ï¼ |
| | | tolerance?: string // å¤èè¯ï¼0 æ ï¼1 å¤èï¼2 å¤éèè¯ |
| | | patBirthday?: number | string // åºçæ¥æ |
| | | registerDate?: number | string // ç»è®°æ¶é´ |
| | | doctor?: string // å¼åå»å¸ |
| | | doctorTime?: number // å¼åæ¥æ/å¼åæ¶é´ï¼æ¶é´æ³ï¼ |
| | | doctorTime?: number | string // å¼åæ¥æ/å¼åæ¶é´ |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼åæ ·ç±å端ä»é¢çº¦åå¹³éºåå¡«ï¼ |
| | | patSrc?: number // æ£è
æ¥æºï¼1é¨è¯ 2æ¥è¯ 3ä½é¢ 4使£ |
| | | patMobile?: string // ææºå· |
| | | patPhone?: string // çµè¯ |
| | | patWardDesc?: string // ç
åºåç§° |
| | | patBedNo?: string // ç
åºå·ï¼çæ£çç
åºå·ï¼ |
| | | medicalCard?: string // å°±è¯å¡å·ï¼åºä¸å¤ä¸ºç©ºï¼ |
| | | doctorAdviceNo?: string // å»å±å·ï¼HIS root 2.16.156.10011.1.28ï¼åºä¸å岿°æ®ä¸ºç©ºï¼ |
| | | outpatientNo?: string // é¨è¯å· |
| | | patIdentityId?: string // 身份è¯å· |
| | | } |
| | | |
| | | // æé API |
| | |
| | | } |
| | | const handleAuthorized = () => { |
| | | const { t } = useI18n() |
| | | |
| | | // ãä¿®å¤ãé´æå¤±è´¥æ¶**ç«å³**æ¸
çæ¬å°åè¯ä¸ç¨æ·ç¼åï¼ä¸åçç¨æ·ç¹å»å¼¹çªã |
| | | // |
| | | // åå ï¼åå
åªæå¨ç¨æ·ç¹ãéæ°ç»å½ãåæ removeToken/deleteUserCacheã |
| | | // è¥ç¨æ·ä¸ç¹ï¼æé¡µé¢å¨å¯å¨é¶æ®µå°±è¢«å¼å¸¸ææãå¼¹çªé½æ²¡æ¾ç¤ºåºæ¥ï¼ï¼ |
| | | // 失æç token ä¸èçç¨æ·ç¼åä¼ä¸ç´çå¨ localStorage éï¼ |
| | | // 导è´"å·æ°é¡µé¢ â 忬¡ç¨æ§ token é´æ â 忬¡å¤±è´¥"ç循ç¯ï¼ |
| | | // 表ç°ä¸ºæ¯æ¬¡å¯å¨é½å¼¹ãç»å½è¶
æ¶ï¼è¯·éæ°ç»å½ãã |
| | | removeToken() |
| | | deleteUserCache() |
| | | |
| | | if (!isRelogin.show) { |
| | | // 妿已ç»å°éæ°ç»å½é¡µé¢åä¸è¿è¡å¼¹çªæç¤º |
| | | if (window.location.href.includes('login?redirect=')) { |
| | |
| | | type: 'warning' |
| | | }).then(() => { |
| | | resetRouter() // éç½®éæè·¯ç±è¡¨ |
| | | deleteUserCache() // å é¤ç¨æ·ç¼å |
| | | removeToken() |
| | | isRelogin.show = false |
| | | // å¹²ætokenååèµ°ä¸æ¬¡è·¯ç±è®©å®è¿router.beforeEachçæ ¡éª |
| | | //window.location.href = window.location.href |
| | | window.location.href ="/login" |
| | | |
| | | window.location.href = '/login' |
| | | }) |
| | | } |
| | | return Promise.reject(t('sys.api.timeoutMessage')) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { watch } from 'vue' |
| | | import { useIdle } from '@vueuse/core' |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | | /** |
| | | * 空é²è¶
æ¶èªå¨éåºï¼éæ±ï¼30 åéä¸æä½æè¦æ±éæ°è¾å
¥å¯ç ï¼ã |
| | | * |
| | | * èæ¯ |
| | | * ---- |
| | | * å端 token æ¯**åºå®æææ**ï¼`system_oauth2_client.access_token_validity_seconds`ï¼ |
| | | * å½å default 客æ·ç«¯ = 3600 ç§ï¼ï¼ä¸"ç¨æ·æ¯å¦ææä½"æ å
³ã |
| | | * å æ¤ä¼åºç°ä¸¤ç§é½ä¸çæ³çæ
åµï¼ |
| | | * · 页颿çä¸å¨ â å°ç¹è¢«è¸¢ï¼ç¨æ·è§å¾"ææ²¡åè¿æä¹åè¦ç»å½"ï¼ï¼ |
| | | * · ä¸ç´æä½ â token å°æä¹ä¼è¢«è¸¢ï¼æææ¯"æç»æä½å°±ä¸è¯¥éç»"ï¼ã |
| | | * |
| | | * æ¬æ¨¡åå¨å端补ä¸**çæ£çç©ºé²æ£æµ**ï¼ |
| | | * · æä»»ä½é¼ æ /é®ç/触æ¸/æ»å¨æä½ â 计æ¶å¨éç½®ï¼ |
| | | * · è¿ç» 30 åé**æ 任使ä½** â 䏻卿¸
çç»å½æå¹¶è·³è½¬ç»å½é¡µï¼è¦æ±éæ°è¾å¯ç ï¼ï¼ |
| | | * · ææä½æ¶ä¸ä¸»å¨ç»åºï¼token èªèº«çç»æç± axios æ¦æªå¨ç refresh-token è´è´£ï¼ã |
| | | * |
| | | * ç¨æ³ï¼å¨ permission.ts ä¸è°ç¨ä¸æ¬¡å³å¯ï¼å
é¨èªå¸¦å¹çä¿æ¤ï¼ï¼ |
| | | * setupIdleLogout() |
| | | */ |
| | | |
| | | /** 空é²éå¼ï¼30 åéï¼éæ±æå®ï¼ */ |
| | | export const IDLE_TIMEOUT_MINUTES = 30 |
| | | const IDLE_TIMEOUT_MS = IDLE_TIMEOUT_MINUTES * 60 * 1000 |
| | | |
| | | /** |
| | | * è§ä¸º"ææä½"çäºä»¶ã |
| | | * 廿**ä¸**å
å« mousemove çé«é¢èæµé®é¢ï¼useIdle å
é¨å·²åèæµï¼ |
| | | * ä¸ mousemove æ¯å¤æ"人è¿å¨çµèå"çæå¯é ä¿¡å·ï¼ä¾å¦åªæ¯é
è¯»é¡µé¢æ¶ä¼ç§»å¨é¼ æ ï¼ã |
| | | * |
| | | * 注æï¼è¯é´å±/å«å·å±æ¯é¿æ¶é´æ 人æä½çå±ç¤ºé¡µé¢ï¼ä½é£äºé¡µé¢å¨è·¯ç±ç½ååé |
| | | * ï¼è§ permission.ts ç whiteListï¼ï¼ä¸ä¼è¿å
¥æ¬é»è¾ã |
| | | */ |
| | | const ACTIVITY_EVENTS = [ |
| | | 'mousemove', |
| | | 'mousedown', |
| | | 'mouseup', |
| | | 'wheel', |
| | | 'keydown', |
| | | 'keyup', |
| | | 'touchstart', |
| | | 'touchend', |
| | | 'click', |
| | | 'scroll' |
| | | ] as const |
| | | |
| | | let started = false |
| | | let idleWatcher: (() => void) | null = null |
| | | |
| | | /** æ¯å¦å·²å¯å¨ï¼é¿å
é夿³¨åï¼ */ |
| | | export function isIdleLogoutStarted(): boolean { |
| | | return started |
| | | } |
| | | |
| | | /** æ¸
çï¼ä¸è¬ä¸éè¦è°ç¨ï¼ç»åºåè¥åç»å½ï¼ç¨ resetIdleLogout éç½®ï¼ */ |
| | | export function stopIdleLogout(): void { |
| | | if (idleWatcher) { |
| | | idleWatcher() |
| | | idleWatcher = null |
| | | } |
| | | started = false |
| | | } |
| | | |
| | | /** |
| | | * å¯å¨ç©ºé²ç»åºæ£æµãå¹çï¼éå¤è°ç¨åªçæä¸æ¬¡ã |
| | | * |
| | | * @param onTimeout èªå®ä¹è¶
æ¶å¨ä½ï¼é»è®¤ï¼æ¸
åè¯ + è·³ç»å½é¡µï¼ |
| | | */ |
| | | export function setupIdleLogout(onTimeout?: () => void): void { |
| | | if (started) return |
| | | started = true |
| | | |
| | | const { idle, lastActive, stop } = useIdle(IDLE_TIMEOUT_MS, { |
| | | events: ACTIVITY_EVENTS as unknown as string[], |
| | | listen: true |
| | | }) |
| | | |
| | | // æ´é² stop 便äºå¤é¨åæ¢ |
| | | idleWatcher = stop |
| | | |
| | | // useIdle ç idle æ¯åºäº"è·ä¸æ¬¡æ´»å¨æ¯å¦è¶
è¿éå¼"çååºå¼å¸å°å¼ã |
| | | // è¿éç¨ watch è䏿¯ intervalï¼é¿å
轮询å¼éã |
| | | watch(idle, (isIdle: boolean) => { |
| | | if (!isIdle) return |
| | | // åä¿é©ï¼åæ¬¡æ ¸å¯¹è·ä¸æ¬¡æ´»å¨ç¡®å®å·²è¶
è¿éå¼ |
| | | const inactiveMs = Date.now() - (lastActive.value || 0) |
| | | if (inactiveMs < IDLE_TIMEOUT_MS) return |
| | | |
| | | if (onTimeout) { |
| | | onTimeout() |
| | | return |
| | | } |
| | | doIdleLogout() |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * å®é
æ§è¡ç©ºé²ç»åºï¼æ¸
çæ¬å°åè¯å¹¶è·³è½¬ç»å½é¡µã |
| | | * |
| | | * 乿以ä¸è°ç¨ userStore.loginOut()ï¼é£æ¯"主å¨éåº"ï¼ï¼ |
| | | * · é£ä¸ªæ¥å£ä¼è¯·æ±å端注é token â 对æ¬åºæ¯æ²¡å¿
è¦ï¼ä¸å¯è½å ç½ç»é®é¢å¡ä½ï¼ |
| | | * · 空é²ç»åºåªéä¿è¯æ¬å°åè¯æ¸
å¹²å + åå°ç»å½é¡µã |
| | | */ |
| | | function doIdleLogout(): void { |
| | | ElMessage.warning(`å·²è¶
è¿ ${IDLE_TIMEOUT_MINUTES} åéæªæä½ï¼è¯·éæ°ç»å½`) |
| | | |
| | | cleanupCredentials() |
| | | |
| | | // ç¨ replace é¿å
ç¨æ·æ"è¿å"åå°å·²ç»åºçé¡µé¢ |
| | | const redirect = encodeURIComponent(window.location.pathname + window.location.search) |
| | | setTimeout(() => { |
| | | window.location.replace(`/login?redirect=${redirect}`) |
| | | }, 800) |
| | | } |
| | | |
| | | /** |
| | | * æ¸
çç»å½åè¯ä¸ç¨æ·ç¼åã |
| | | * ç¨å¨æ import é¿å
ä¸ permission.ts å½¢æå¾ªç¯ä¾èµã |
| | | */ |
| | | function cleanupCredentials(): void { |
| | | import('@/utils/auth') |
| | | .then(({ removeToken }) => { |
| | | removeToken() |
| | | return import('@/hooks/web/useCache') |
| | | }) |
| | | .then(({ deleteUserCache }) => { |
| | | deleteUserCache() |
| | | }) |
| | | .catch((e) => { |
| | | // å
åºï¼å³ä½¿ import 失败ä¹ç´æ¥æ¸
localStorageï¼ä¿è¯ä¸ä¼å¸¦çæ§ token åå°é¦é¡µ |
| | | try { |
| | | localStorage.removeItem('ACCESS_TOKEN') |
| | | localStorage.removeItem('REFRESH_TOKEN') |
| | | } catch { |
| | | /* ignore */ |
| | | } |
| | | console.error('[idle-logout] æ¸
çåè¯å¤±è´¥', e) |
| | | }) |
| | | } |
| | |
| | | import router from './router' |
| | | import type { RouteRecordRaw } from 'vue-router' |
| | | import { isRelogin } from '@/config/axios/service' |
| | | import { getAccessToken } from '@/utils/auth' |
| | | import { getAccessToken, removeToken } from '@/utils/auth' |
| | | import { deleteUserCache } from '@/hooks/web/useCache' |
| | | import { useTitle } from '@/hooks/web/useTitle' |
| | | import { useNProgress } from '@/hooks/web/useNProgress' |
| | | import { usePageLoading } from '@/hooks/web/usePageLoading' |
| | |
| | | import { useUserStoreWithOut } from '@/store/modules/user' |
| | | import { usePermissionStoreWithOut } from '@/store/modules/permission' |
| | | import { useRoomStoreWithOut } from "@/store/modules/room"; |
| | | // éæ±ï¼30 åéæ æä½æè¦æ±éæ°ç»å½ï¼åç«¯ç©ºé²æ£æµï¼ |
| | | import { setupIdleLogout } from '@/hooks/web/useIdleLogout' |
| | | |
| | | const { start, done } = useNProgress() |
| | | |
| | |
| | | return |
| | | } |
| | | |
| | | if (to.path === '/login') { |
| | | next({ path: '/' }) |
| | | return |
| | | } |
| | | // ========================================================================== |
| | | // ãä¿®å¤ã以䏿æ await é½å¿
é¡»å
å¨ try/catch å
ã |
| | | // |
| | | // èæ¯ï¼localStorage éå¯è½æ®ç**已失æç token**ï¼æå¡ç«¯éå¯ã令çè¿æçï¼ã |
| | | // æ¤æ¶ getAccessToken() ä»æå¼ â å®å«ä¸ä¼è·³ç»å½é¡µ â ç»§ç»ç¨æ§ token 请æ±å端 |
| | | // â 401 â handleAuthorized() è¿å Promise.reject('ç»å½è¶
æ¶,è¯·éæ°ç»å½!')ã |
| | | // åå
该 reject æ 人æè·ï¼ä¼ä¸è·¯åæ³¡å° setupRouter()ï¼å¯¼è´ï¼ |
| | | // [Vue Router warn] uncaught error during route navigation |
| | | // [Vue Router warn] Unexpected error when starting the router |
| | | // main.ts:76 Uncaught (in promise) ç»å½è¶
æ¶,è¯·éæ°ç»å½! |
| | | // **è·¯ç±å®è£
å¤±è´¥ï¼æ´ä¸ªé¡µé¢èµ·ä¸æ¥**ï¼ç¨æ·å¿
é¡»æå¨éæ°ç»å½ææ¢å¤ï¼ã |
| | | // |
| | | // ç°å¨ç»ä¸å
åºï¼æ è®ºé´æå¤±è´¥è¿æ¯å
¶ä»å¼å¸¸ï¼é½æ¸
ææ¬å°å¤±æåè¯å¹¶è½¬ç»å½é¡µï¼ |
| | | // ä¿è¯è·¯ç±å¨ä¸å®è½å®æåå§åã |
| | | // |
| | | // 注ï¼åå
æ¤å¤è¿æ `if (to.path === '/login') next({path:'/'})`ï¼ |
| | | // å '/login' å·²å¨ whiteList 䏿å returnï¼è¯¥åæ¯æ°¸ä¸å¯è¾¾ï¼å·²ç§»é¤ã |
| | | // ========================================================================== |
| | | try { |
| | | // è·åææåå
¸ |
| | | const dictStore = useDictStoreWithOut() |
| | | const userStore = useUserStoreWithOut() |
| | | const roomStore = useRoomStoreWithOut() |
| | | const checkTypeStore = useCheckTypeStoreWithOut() |
| | | const permissionStore = usePermissionStoreWithOut() |
| | | if (!dictStore.getIsSetDict) { |
| | | await dictStore.setDictMap() |
| | | } |
| | | if (!checkTypeStore.getIsSetCheckType) { |
| | | await checkTypeStore.setCheckTypeMap() |
| | | } |
| | | |
| | | // è·åææåå
¸ |
| | | const dictStore = useDictStoreWithOut() |
| | | const userStore = useUserStoreWithOut() |
| | | const roomStore = useRoomStoreWithOut() |
| | | const checkTypeStore = useCheckTypeStoreWithOut() |
| | | const permissionStore = usePermissionStoreWithOut() |
| | | if (!dictStore.getIsSetDict) { |
| | | await dictStore.setDictMap() |
| | | } |
| | | if (!checkTypeStore.getIsSetCheckType) { |
| | | await checkTypeStore.setCheckTypeMap() |
| | | } |
| | | |
| | | if (userStore.getIsSetUser ) { |
| | | if (userStore.getIsSetUser) { |
| | | |
| | | // <<<ãè¯å®¤éæ©ã<<< |
| | | if ( to.path !== '/roomselect' && |
| | | if (to.path !== '/roomselect' && |
| | | userStore.getRoles.includes("doctor") && !userStore.getRoles.includes("super_admin") |
| | | && !roomStore.getIsSetRoom ) { |
| | | next({path: `/roomselect?redirect=${to.fullPath}`}) |
| | | return |
| | | && !roomStore.getIsSetRoom) { |
| | | next({ path: `/roomselect?redirect=${to.fullPath}` }) |
| | | return |
| | | } |
| | | |
| | | next() |
| | | return |
| | | } |
| | | |
| | | isRelogin.show = true |
| | | await userStore.setUserInfoAction() |
| | | isRelogin.show = false |
| | | |
| | | // åç«¯è¿æ»¤èå |
| | | await permissionStore.generateRoutes() |
| | | permissionStore.getAddRouters.forEach((route) => { |
| | | router.addRoute(route as unknown as RouteRecordRaw) // å¨ææ·»å å¯è®¿é®è·¯ç±è¡¨ |
| | | }) |
| | | |
| | | // <<<ãè¯å®¤éæ©ã<<< |
| | | if (to.path !== '/roomselect' && |
| | | userStore.getRoles.includes("doctor") && !userStore.getRoles.includes("super_admin") |
| | | && !roomStore.getIsSetRoom) { |
| | | next({ path: `/roomselect?redirect=${to.fullPath}` }) |
| | | return |
| | | } |
| | | |
| | | const redirectPath = from.query.redirect || to.path |
| | | // ä¿®å¤è·³è½¬æ¶ä¸å¸¦åæ°çé®é¢ |
| | | const redirect = decodeURIComponent(redirectPath as string) |
| | | const { paramsObject: query } = parseURL(redirect) |
| | | const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect, query } |
| | | next(nextData) |
| | | } catch (e) { |
| | | // å
åºï¼æ¸
çæ¬å°å¤±æåè¯ï¼æ¾è¡å°ç»å½é¡µï¼ç»ä¸è®©å¼å¸¸ä¸æè·¯ç±åå§å |
| | | console.warn('[permission] è·¯ç±å®å«æ§è¡å¤±è´¥ï¼å·²æ¸
çæ¬å°åè¯å¹¶è½¬ç»å½é¡µï¼', e) |
| | | isRelogin.show = false |
| | | removeToken() |
| | | deleteUserCache() |
| | | next(`/login?redirect=${to.fullPath}`) |
| | | } |
| | | |
| | | isRelogin.show = true |
| | | await userStore.setUserInfoAction() |
| | | isRelogin.show = false |
| | | |
| | | // åç«¯è¿æ»¤èå |
| | | await permissionStore.generateRoutes() |
| | | permissionStore.getAddRouters.forEach((route) => { |
| | | router.addRoute(route as unknown as RouteRecordRaw) // å¨ææ·»å å¯è®¿é®è·¯ç±è¡¨ |
| | | }) |
| | | |
| | | // <<<ãè¯å®¤éæ©ã<<< |
| | | if ( to.path !== '/roomselect' && |
| | | userStore.getRoles.includes("doctor") && !userStore.getRoles.includes("super_admin") |
| | | && !roomStore.getIsSetRoom ) { |
| | | next({path: `/roomselect?redirect=${to.fullPath}`}) |
| | | return |
| | | } |
| | | |
| | | const redirectPath = from.query.redirect || to.path |
| | | // ä¿®å¤è·³è½¬æ¶ä¸å¸¦åæ°çé®é¢ |
| | | const redirect = decodeURIComponent(redirectPath as string) |
| | | const {paramsObject: query} = parseURL(redirect) |
| | | const nextData = to.path === redirect ? {...to, replace: true} : {path: redirect, query} |
| | | next(nextData) |
| | | }) |
| | | |
| | | router.afterEach((to) => { |
| | | useTitle(to?.meta?.title as string) |
| | | done() // ç»æProgress |
| | | loadDone() |
| | | |
| | | // ========================================================================== |
| | | // éæ±ï¼**30 åé䏿ä½**æè¦æ±éæ°è¾å
¥å¯ç ã |
| | | // |
| | | // èæ¯ï¼å端 token æ¯åºå®æææï¼system_oauth2_client.access_token_validity_secondsï¼ |
| | | // å½å default 客æ·ç«¯ = 3600 ç§ï¼ï¼ä¸ç¨æ·æ¯å¦ææä½æ å
³ ââ æçä¸å¨ä¹ä¼å°ç¹è¢«è¸¢ã |
| | | // è¿éå¨å端补ä¸**çæ£çç©ºé²æ£æµ**ï¼ |
| | | // · æé¼ æ /é®ç/触æ¸/æ»å¨çæä½ â 计æ¶éç½®ï¼ |
| | | // · è¿ç» 30 åéæ ä»»ä½æä½ â 䏻卿¸
åè¯å¹¶è·³ç»å½é¡µã |
| | | // 仪表ç/å«å·å±çç½åå页é¢ä¸ä¼èµ°å°è¿éï¼ä¸åå½±åã |
| | | // |
| | | // åªå¨**å·²ç»å½**ä¸éç»å½é¡µæ¶å¯å¨ï¼setupIdleLogout å
é¨å¹çï¼éå¤è°ç¨æ å¯ä½ç¨ã |
| | | // ========================================================================== |
| | | if (getAccessToken() && to.path !== '/login') { |
| | | setupIdleLogout() |
| | | } |
| | | }) |
| | |
| | | |
| | | // å é¤token |
| | | export const removeToken = () => { |
| | | //wsCache.delete(AccessTokenKey) |
| | | // wsCache.delete(RefreshTokenKey) |
| | | // ãä¿®å¤ãåå®ç°æä¸é¢ä¸¤è¡ wsCache.delete 注éæäºï¼ä½¿æ¬å½æ°æä¸º**空æä½**ã |
| | | // è以ä¸ä¸å¤é½ä¾èµå®æ¸
çåè¯ï¼ç©ºæä½ä¼å¼åè¿éé®é¢ï¼ |
| | | // 1) store/modules/user.ts ç loginOut()ï¼éåºç»å½å token ä»çå¨ localStorageï¼ |
| | | // 䏿¬¡æå¼é¡µé¢åæ¿æ§ token å»é´æ â 401 â æç¤º"ç»å½è¶
æ¶,è¯·éæ°ç»å½!"ï¼ |
| | | // 2) config/axios/service.ts ç handleAuthorized()ï¼401 æ¶æ¸
䏿失æåè¯ï¼ |
| | | // å·æ°é¡µé¢ä¼éå¤è§¦ååæ ·ç失败æµç¨ï¼ |
| | | // 3) permission.ts è·¯ç±å®å«çå¼å¸¸å
åºï¼æ¸
çæ æã |
| | | wsCache.delete(AccessTokenKey) |
| | | wsCache.delete(RefreshTokenKey) |
| | | } |
| | | |
| | | /** æ ¼å¼åtokenï¼jwtæ ¼å¼ï¼ */ |
| | |
| | | ECG_DEV_BRAND = 'ecg_dev_brand', |
| | | ECG_DEV_CATEGORY = 'ecg_dev_category', |
| | | ECG_PAT_SOURCE = 'ecg_patient_source', |
| | | ecg_tolerance = 'ecg_tolerance', |
| | | ecg_status = 'ecg_status', |
| | | // å¤èï¼å¤éèè¯ï¼ï¼0=æ 1=å¤è 2=å¤éèè¯ï¼è§ _prep/09_fix_tolerance_dict.sqlï¼ |
| | | // 注ï¼åå
å½å为å°å ecg_toleranceï¼ä¸åç» ECG_* 飿 ¼ä¸ä¸è´ï¼æ¤å¤ç»ä¸ä¸º ECG_TOLERANCEã |
| | | ECG_TOLERANCE = 'ecg_tolerance', |
| | | ECG_STATUS = 'ecg_status', |
| | | // æéåºå·è§åï¼0=é¢çº¦å· 1=ç¾å°åºå· 2=æ¶æ®µå·ï¼check_type.seq_ruleï¼è§ _prep/22_*.sqlï¼ |
| | | ECG_SEQ_RULE = 'ecg_seq_rule', |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import dayjs from 'dayjs' |
| | | import { calculateAge } from '@/utils/dateUtil' |
| | | |
| | | /** |
| | | * æ£è
ä¿¡æ¯å±ç¤ºçå
Œ
±æ ¼å¼åå·¥å
·ã |
| | | * |
| | | * èæ¯ï¼éæ±1ï¼ï¼æ£è
ä¿¡æ¯éå¨**æ¯ä¸ªçé¢**å±ç¤º 18 é¡¹ï¼ |
| | | * æµæ°´å·ãæéåºå·ãå§åãæ§å«ãåºçæ¥æãå¹´é¾ã项ç®ãç
åºãç
åºå·ã |
| | | * ç»è®°æ¶é´ãç¶æãæ£è
çµè¯ãå¼åæ¥æãè·ä»å¤©æ°ãæ¥æºï¼é¨æ¥ä½ä½æ£ï¼ã |
| | | * é¨è¯å·ãå»å±å·ãå¼åå»å¸ |
| | | * |
| | | * å
¶ä¸ **å¹´é¾** ä¸ **è·ä»å¤©æ°** æ°æ®åºæ 对åºåï¼å¿
须宿¶è®¡ç®ã |
| | | * åå
è¯¥ç®æ³å
èå¨ RoutinePanel.vue ä¸ï¼å¤ä¸ªçé¢è¥åèªå¤å¶ä¼é æå£å¾ä¸ä¸è´ |
| | | * ï¼ä¾å¦ä¸ä¸ªæ doctorTime ç®ãå¦ä¸ä¸ªæ createTime ç®ï¼ï¼æ
æ½å°æ¤å¤ç»ä¸ã |
| | | * |
| | | * 注æï¼ |
| | | * · å端è¿åççæ¥/æ¥æåæ®µå¤ä¸ºå符串ï¼"2026-09-29" / "2026-09-29 10:00:00"ï¼ï¼ |
| | | * æ
è¿éç»ä¸ç¨ dayjs å
¼å®¹è§£æï¼é¿å
Date æé å¨ä¸åæµè§å¨ä¸çå·®å¼ã |
| | | * · æ¿ä¸å°å¼æ¶ç»ä¸è¿å ''ï¼è䏿¯ "NaNå²" / "NaN天"ï¼ã |
| | | */ |
| | | |
| | | /** |
| | | * å¹´é¾ï¼ç±çæ¥å®æ¶è®¡ç®ï¼è¿åå½¢å¦ "65å²"ï¼æ çæ¥/çæ¥éæ³æ¶è¿å '' |
| | | * |
| | | * 注æï¼åºä¸ `pat_birthday` å¯è½æ¯ `LocalDate`ï¼"2000-01-01"ï¼æ |
| | | * æ¶é´æ³/ISO å符串ï¼ä¹å¯è½åå¨èå¼ï¼å¦ "0000-00-00"ï¼ã |
| | | * dayjs 对èå¼è¿å Invalidï¼`diff` ä¼å¾å° NaNï¼æ
è¿éå
æ¾å¼æ ¡éªã |
| | | */ |
| | | export function formatAge(birthday?: string | number | Date | null): string { |
| | | if (birthday === undefined || birthday === null || birthday === '') return '' |
| | | const d = dayjs(birthday as any) |
| | | if (!d.isValid()) return '' |
| | | const age = calculateAge(birthday as unknown as Date) |
| | | if (!Number.isFinite(age) || age < 0 || age > 150) return '' |
| | | return `${age}å²` |
| | | } |
| | | |
| | | /** |
| | | * è·ä»å¤©æ°ï¼æ**å¼åæ¥æ**ï¼doctorTimeï¼è®¡ç®ï¼è¿åå½¢å¦ "3天"ï¼æ 弿¶è¿å '' |
| | | * |
| | | * 说æï¼éæ±1 ç"è·ä»å¤©æ°"æ¯ç»å»ç夿"è¿å¼ åååäºå¤ä¹
"ï¼ |
| | | * å æ¤åºåå¿
é¡»æ¯**å¼åæ¥æ**ï¼è䏿¯å建æ¶é´/ç»è®°æ¶é´ã |
| | | */ |
| | | export function formatDaysFromOrder(orderTime?: string | number | Date | null): string { |
| | | if (orderTime === undefined || orderTime === null || orderTime === '') return '' |
| | | const d = dayjs(orderTime) |
| | | if (!d.isValid()) return '' |
| | | const days = dayjs().startOf('day').diff(d.startOf('day'), 'day') |
| | | if (!Number.isFinite(days)) return '' |
| | | return `${days}天` |
| | | } |
| | | |
| | | /** |
| | | * è·ä»å¤©æ°ï¼æ°å¼çï¼ä¾¿äºæåº/æ¡ä»¶æ ·å¼ï¼ |
| | | */ |
| | | export function daysFromOrder(orderTime?: string | number | Date | null): number | null { |
| | | if (orderTime === undefined || orderTime === null || orderTime === '') return null |
| | | const d = dayjs(orderTime) |
| | | if (!d.isValid()) return null |
| | | return dayjs().startOf('day').diff(d.startOf('day'), 'day') |
| | | } |
| | | |
| | | /** |
| | | * æ¥ææ¶é´æ ¼å¼åï¼ç©ºå¼å®å
¨ï¼ï¼é»è®¤ "YYYY-MM-DD HH:mm:ss" |
| | | */ |
| | | export function formatDateTime( |
| | | value?: string | number | Date | null, |
| | | format = 'YYYY-MM-DD HH:mm:ss' |
| | | ): string { |
| | | if (value === undefined || value === null || value === '') return '' |
| | | const d = dayjs(value) |
| | | return d.isValid() ? d.format(format) : '' |
| | | } |
| | | |
| | | /** |
| | | * æ¥ææ ¼å¼åï¼ç©ºå¼å®å
¨ï¼ï¼é»è®¤ "YYYY-MM-DD" |
| | | */ |
| | | export function formatDateOnly( |
| | | value?: string | number | Date | null, |
| | | format = 'YYYY-MM-DD' |
| | | ): string { |
| | | return formatDateTime(value, format) |
| | | } |
| | | |
| | | /** |
| | | * 空å¼å®å
¨å±ç¤ºï¼null/undefined/'' ç»ä¸æ¾ç¤ºä¸º "-" |
| | | */ |
| | | export function displayOr(value?: string | number | null, placeholder = '-'): string { |
| | | if (value === undefined || value === null || value === '') return placeholder |
| | | return String(value) |
| | | } |
| | | |
| | | /** å°±è¯å¡å·çè§£æç»æï¼å¼ + å®é
æ¥æºæ 注 */ |
| | | export interface CardNoResult { |
| | | /** å±ç¤ºç¨å¼ï¼æ ä»»ä½åéæ¶ä¸º '-'ï¼ */ |
| | | value: string |
| | | /** å¼çç宿¥æºï¼æçå¡å·æ¶ä¸ºç©ºä¸²ï¼æ éæ æ³¨ï¼ */ |
| | | from: '' | 'é¨è¯å·' | '身份è¯' | 'ä½é¢å·' |
| | | } |
| | | |
| | | /** |
| | | * 夿ä¸ä¸ªå¼æ¯å¦"å身份è¯å·"ï¼18 使°åæ«ä½å¯ä¸º Xï¼æ 15 ä½çº¯æ°åï¼ã |
| | | * |
| | | * 为ä»ä¹éè¦æ**å¼çå½¢æ**夿ï¼è䏿¯æå段åï¼ |
| | | * 宿µ `appointment.outpatient_no` æ··ååæ¾ä¸¤ç±»å
容 ââ |
| | | * 18 ä½èº«ä»½è¯æ ¼å¼ 103604 è¡ï¼65.2%ï¼ |
| | | * 12 ä½çé¨è¯å· 54204 è¡ï¼34.1%ï¼å½¢å¦ 882609282283ï¼ |
| | | * è¥ä¸å¾æåæ®µåæ æ³¨ä¸ºãé¨è¯å·ãï¼é£ 65% ç身份è¯å·ä¾ç¶è¢«éæ ã |
| | | */ |
| | | export function looksLikeIdCard(v?: string | null): boolean { |
| | | if (!v) return false |
| | | const s = String(v).trim() |
| | | return /^[0-9]{17}[0-9Xx]$/.test(s) || /^[0-9]{15}$/.test(s) |
| | | } |
| | | |
| | | /** |
| | | * è§£æãé¨è¯å·ãåçå±ç¤ºå¼ä¸æ¥æºã |
| | | * |
| | | * ãèæ¯ã宿µ HIS å¨ S0201ECG æ¥æç `patientPerson.id.item[1]` |
| | | * ï¼root `2.16.156.10011.1.15`ï¼å®æ¹ææ¡£æ³¨éå³ãå»ä¿å¡å·ãï¼ |
| | | * **æä¸ºç©º**ï¼222/222 æ¡ï¼ï¼å æ¤ `medical_card` å
¨åºä¸º NULL ââ 详è§ãé¨ç½²æ¸
åã5.1ã |
| | | * |
| | | * ãåååæ´ï¼ç»ç¡®è®¤ï¼ãç±äºè¯¥å**å®é
å±ç¤ºçæ¯ `outpatient_no`** |
| | | * ï¼å®æµ 159,116 è¡ï¼65% å½¢å¦èº«ä»½è¯ã35% 为é¨è¯å·ï¼`medical_card` æ ä¸é空ï¼ï¼ |
| | | * 页颿 ç¾å·²ç±ãå°±è¯å¡å·ãæ¹ä¸ºã**é¨è¯å·**ãï¼é¿å
廿¤äººå误读ã |
| | | * |
| | | * åéä¼å
çº§ä¸æ 注è§åï¼ |
| | | * 1. `medicalCard` â æ æ æ³¨ï¼HIS è¡¥é½å¡å·åä¼èµ°æ¤åæ¯ï¼æ 注èªå¨æ¶å¤±ï¼ |
| | | * 2. `outpatientNo` é身份è¯å½¢æ â æ 注ãé¨è¯å·ã |
| | | * 3. `outpatientNo` æ¯èº«ä»½è¯å½¢æ â æ 注ã身份è¯ã |
| | | * 4. `patIdentityId` â æ 注ã身份è¯ã |
| | | * 5. `hospitalNo`ï¼ä½é¢å·ï¼ â æ 注ãä½é¢å·ã |
| | | * 6. 齿²¡æ â '-' |
| | | * |
| | | * > æ æ³¨çä½ç¨ï¼`outpatient_no` æ¯**æ··åå**ï¼é颿¢æçé¨è¯å·ä¹æèº«ä»½è¯å·ï¼ |
| | | * > æ
æ**å¼å½¢æ**ï¼èéåæ®µåï¼æ 注ï¼ä¾¿äºå»æ¤äººååºåã |
| | | * |
| | | * @param row æ£è
/é¢çº¦/éå/ç§èµæ°æ®å¯¹è±¡ï¼å
¼å®¹å¹³éºåæ®µä¸ patDetailsï¼ |
| | | */ |
| | | export function resolveCardNo(row: any): CardNoResult { |
| | | if (row === undefined || row === null) return { value: '-', from: '' } |
| | | const pd = row.patDetails || {} |
| | | |
| | | const medical = firstNonEmpty(row.medicalCard, pd.medicalCard) |
| | | if (medical !== undefined) return { value: medical, from: '' } |
| | | |
| | | const outpatient = firstNonEmpty(row.outpatientNo, pd.outpatientNo) |
| | | if (outpatient !== undefined) { |
| | | // 该å宿µæ··åäºèº«ä»½è¯å·ï¼æå½¢ææ 注èéæå段å |
| | | return { value: outpatient, from: looksLikeIdCard(outpatient) ? '身份è¯' : 'é¨è¯å·' } |
| | | } |
| | | |
| | | const identity = firstNonEmpty(row.patIdentityId, pd.patIdentityId) |
| | | if (identity !== undefined) return { value: identity, from: '身份è¯' } |
| | | |
| | | const hospital = firstNonEmpty(row.hospitalNo, pd.hospitalNo) |
| | | if (hospital !== undefined) return { value: hospital, from: 'ä½é¢å·' } |
| | | |
| | | return { value: '-', from: '' } |
| | | } |
| | | |
| | | /** å第ä¸ä¸ªé空ï¼null/undefined/'' åè§ä¸ºç©ºï¼å¼ï¼å
¨ç©ºæ¶è¿å undefined */ |
| | | export function firstNonEmpty(...vals: any[]): string | undefined { |
| | | for (const v of vals) { |
| | | if (v !== undefined && v !== null && v !== '') return String(v) |
| | | } |
| | | return undefined |
| | | } |
| | |
| | | return value == null || value.trim() === ''; |
| | | } |
| | | |
| | | export function genderFormat(value: number): string { |
| | | if ( 1===value ) { |
| | | return "ç·"; |
| | | } else { |
| | | return "女"; |
| | | } |
| | | /** |
| | | * æ§å«æ ¼å¼åï¼1 ç· / 2 女ï¼ã |
| | | * |
| | | * ãä¿®æ£ãåå®ç°æ¯ `if (1===value) "ç·" else "女"` ââ 伿**ä»»ä½é 1 çå¼**é½å½æ"女"ï¼ |
| | | * å
æ¬ 0ï¼æªç¥ï¼ä¸ null/undefinedã宿µåºä¸ `pat_gender = 0` æ 2,123 è¡ |
| | | * ï¼è§ AppointmentServiceImpl ç UNKNOWN_GENDER 常éè¯ä¹ï¼ï¼è¿äºæ£è
ä¼è¢«**éæ¾ä¸ºå¥³æ§**ã |
| | | * |
| | | * å¦å¤æ³¨æï¼MySQL ç `tinyint(1)` ä¼è¢« JDBC 驱卿 å°ä¸º Booleanï¼ |
| | | * æ
è¿éåæ¶å
¼å®¹ boolean / å符串æ°åï¼"1"ã"2"ï¼çå½¢æã |
| | | */ |
| | | export function genderFormat(value: number | string | boolean | null | undefined): string { |
| | | if (value === null || value === undefined || value === '') return 'æªç¥' |
| | | if (value === true) return 'ç·' |
| | | if (value === false) return 'æªç¥' |
| | | const n = Number(value) |
| | | if (n === 1) return 'ç·' |
| | | if (n === 2) return '女' |
| | | // 0 = æªç¥ï¼HIS æªæä¾ï¼ï¼ä¸è¦é»è®¤æ"女" |
| | | return 'æªç¥' |
| | | } |
| | |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å¤èè¯" prop="tolerance"> |
| | | <el-tag type="info" v-if="formData.tolerance == 0">å¦</el-tag> |
| | | <el-tag type="danger" v-else>æ¯</el-tag> |
| | | <!-- <el-radio-group v-model="formData.tolerance" readonly> |
| | | <el-radio |
| | | v-for="dict in getIntDictOptions(DICT_TYPE.ecg_tolerance)" |
| | | :key="dict.value" |
| | | :value="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-radio> |
| | | </el-radio-group> --> |
| | | <!-- éæ±6ï¼ç»ä¸èµ°åå
¸ ecg_toleranceï¼0=æ 1=å¤è 2=å¤éèè¯ï¼ï¼NULL æ"æ "æ¾ç¤ºï¼Q12ï¼ã |
| | | åå
硬ç¼ç v-if==0âå¦ / v-elseâæ¯ï¼ææ¡ä¸åå
¸ä¸ä¸è´ã --> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" /> |
| | | </el-form-item> |
| | | </div> |
| | | <div class="form-row"> |
| | |
| | | /> |
| | | <el-table-column label="å¼åå»ç" align="center" prop="doctor" width="110px" /> |
| | | <el-table-column label="ææº" align="center" prop="patMobile" /> |
| | | <!-- éæ±1ï¼è¡¥é½æ£è
ä¿¡æ¯ 18 项ä¸ç¼ºå¤±çï¼å¹´é¾/æ§å«/æ¥æº/ç»è®°æ¶é´/å¼åæ¥æ/è·ä»å¤©æ°/ç¶æ/é¨è¯å·/å¤èï¼ --> |
| | | <el-table-column label="æ§å«" align="center" width="70px"> |
| | | <template #default="scope"> |
| | | <!-- 1ç·/2女ï¼0 æç¼ºå¤±ï¼HIS æªæä¾ï¼å®æµåºä¸æ 2123 è¡=0ï¼æ¾ç¤º"æªç¥" --> |
| | | <dict-tag v-if="scope.row.patGender === 1 || scope.row.patGender === 2" |
| | | :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" /> |
| | | <span v-else>æªç¥</span> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å»å±å·ï¼HIS observationRequest.id.item[root=2.16.156.10011.1.28]ï¼ã |
| | | 该èç¹å¨è§èä¸éå¿
须项ï¼å岿°æ®ï¼æ°å¢åä¹åééçï¼ä¸ºç©ºï¼æ¾ç¤º '-'ã --> |
| | | <el-table-column label="å»å±å·" align="center" prop="doctorAdviceNo" min-width="110px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.doctorAdviceNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" width="80px"> |
| | | <template #default="scope">{{ formatAge(scope.row.patBirthday) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¥æº" align="center" width="90px"> |
| | | <template #default="scope"> |
| | | <dict-tag v-if="scope.row.patSrc !== undefined && scope.row.patSrc !== null" |
| | | :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" /> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- æ¬åæ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼ï¼medical_card å
¨åºä¸ºç©ºï¼ |
| | | 该åå®é
æ¾ç¤º outpatient_noï¼resolveCardNo ç»åº**æ¥æºæ 注**ï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ã --> |
| | | <el-table-column label="é¨è¯å·" align="center" min-width="140px"> |
| | | <template #default="scope"> |
| | | <span>{{ resolveCardNo(scope.row).value }}</span> |
| | | <el-tag v-if="resolveCardNo(scope.row).from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ resolveCardNo(scope.row).from }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¤è" align="center" width="110px"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»è®°æ¶é´" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.registerDate) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åæ¥æ" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è·ä»å¤©æ°" align="center" width="90px"> |
| | | <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <!-- <el-table-column label="çµè¯" align="center" prop="patPhone" />--> |
| | | <!-- <el-table-column label="身份è¯å·" align="center" prop="patIdentityId" />--> |
| | | <!-- <el-table-column label="ç§å®¤ä»£ç " align="center" prop="patDeptCode" /> --> |
| | |
| | | v-hasPermi="['ecg:appointment:update']" |
| | | > |
| | | <dict-tag |
| | | v-if="scope.row.status" |
| | | :type="DICT_TYPE.ecg_status" |
| | | v-if="scope.row.status !== null && scope.row.status !== undefined && scope.row.status !== ''" |
| | | :type="DICT_TYPE.ECG_STATUS" |
| | | :value="scope.row.status" |
| | | /> |
| | | <div v-else>ç¶æç¼è¾</div> |
| | |
| | | import AppointmentForm from './AppointmentForm.vue' |
| | | import { useCheckTypeStore } from '@/store/modules/checkType' |
| | | import { getCheckTypeName } from '../../../utils/checkTypeFormatter' |
| | | // éæ±1ï¼å¹´é¾ / è·ä»å¤©æ° / æ¥ææ ¼å¼åï¼åºä¸æ 对åºåï¼é宿¶è®¡ç®ï¼ |
| | | import { formatAge, formatDaysFromOrder, formatDateTime, resolveCardNo } from '@/utils/patientInfo' |
| | | import { status } from 'nprogress' |
| | | import { log } from 'node:console' |
| | | |
| | |
| | | <el-table-column label="å°±è¯æµæ°´å·" align="center" prop="episodeId" min-width="110px"/> |
| | | <el-table-column label="ç³è¯·å·" align="center" prop="applyNo" min-width="110px"/> |
| | | <el-table-column label="ç¼å·" align="center" prop="patId" /> |
| | | <!-- æ¬åæ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼ãåå ï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ï¼ |
| | | HIS å¨å¡å·æ§½ä½ä¼ 空ï¼medical_card å
¨åº 159,116 è¡**æ ä¸é空**ï¼ |
| | | 宿µè¯¥å 99.9% æ¾ç¤ºçæ¯ outpatient_noï¼65% å½¢å¦èº«ä»½è¯ã35% 为é¨è¯å·ï¼ã |
| | | è¥ç»§ç»å«ãå°±è¯å¡å·ãä¼è®©å»æ¤äººåè¯¯è¯»ï¼æ
æå®é
å«ä¹å½åã |
| | | resolveCardNo 仿å¼å½¢æç»åº**æ¥æºæ 注**ï¼èº«ä»½è¯/ä½é¢å·/é¨è¯å·ï¼ï¼ |
| | | 便äºåºåæ··å¨ outpatient_no éç身份è¯å·ã --> |
| | | <el-table-column label="é¨è¯å·" align="center" min-width="140px"> |
| | | <template #default="scope"> |
| | | <span>{{ resolveCardNo(scope.row).value }}</span> |
| | | <el-tag v-if="resolveCardNo(scope.row).from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ resolveCardNo(scope.row).from }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å»å±å·ï¼HIS observationRequest.id.item[root=2.16.156.10011.1.28]ï¼ã |
| | | 该èç¹å¨è§èä¸éå¿
须项ï¼å岿°æ®ï¼æ°å¢åä¹åééçï¼ä¸ºç©ºï¼æ¾ç¤º '-'ã --> |
| | | <el-table-column label="å»å±å·" align="center" prop="doctorAdviceNo" min-width="110px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.doctorAdviceNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <!-- |
| | | <el-table-column label="ç¼´è´¹" align="center" prop="paid"> |
| | | <template #default="scope"> |
| | |
| | | {{scope.row.patName}} <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" /> |
| | | <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" /> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼ç¶æ --> |
| | | <!-- 注æï¼å¿
é¡»æ¾å¼å¤ç©ºï¼ä¸è½ç¨ v-if="scope.row.status" ââ |
| | | ç¶æ '0'ï¼æªç»è®°ï¼æ¯åæ³å¼ï¼çå¼å¤æä¼æå®è¯¯å¤ä¸º"æ æ°æ®"èæ¾ç¤º '-' --> |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="110px"> |
| | | <template #default="scope"> |
| | | <dict-tag |
| | | v-if="scope.row.status !== null && scope.row.status !== undefined && scope.row.status !== ''" |
| | | :type="DICT_TYPE.ECG_STATUS" |
| | | :value="scope.row.status" |
| | | /> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å¹´é¾ï¼åºä¸æ æ¤åï¼ç±çæ¥å®æ¶è®¡ç®ï¼ --> |
| | | <el-table-column label="å¹´é¾" align="center" width="80px"> |
| | | <template #default="scope">{{ formatAge(scope.row.patBirthday) }}</template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å¼åæ¥æ + è·ä»å¤©æ° --> |
| | | <el-table-column label="å¼åæ¥æ" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.doctorTime) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è·ä»å¤©æ°" align="center" width="90px"> |
| | | <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) }}</template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å¼åå»å¸ --> |
| | | <el-table-column label="å¼åå»å¸" align="center" prop="doctor" min-width="100px"> |
| | | <template #default="scope">{{ scope.row.doctor || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é¢çº¦æ¥æ" |
| | |
| | | <script setup lang="ts"> |
| | | import {DICT_TYPE} from '@/utils/dict' |
| | | import { dateFormatter2 } from '@/utils/formatTime' |
| | | // éæ±1ï¼å¹´é¾ / è·ä»å¤©æ° / å¼åæ¥ææ ¼å¼åï¼åºä¸æ 对åºåï¼é宿¶è®¡ç®ï¼ |
| | | import { formatAge, formatDaysFromOrder, formatDateTime, resolveCardNo } from '@/utils/patientInfo' |
| | | import download from '@/utils/download' |
| | | import { AppointmentApi, AppointmentVO } from '@/api/ecg/appointment' |
| | | import AppointmentForm from './AppointmentForm.vue' |
| | |
| | | <el-form-item label="é¢çº¦æ³¨æäºé¡¹" prop="notes"> |
| | | <el-input v-model="formData.notes" placeholder="请è¾å
¥é¢çº¦æ³¨æäºé¡¹" /> |
| | | </el-form-item> |
| | | <el-form-item label="åºå·åç¼" prop="notes"> |
| | | <el-form-item label="åºå·åç¼" prop="seqPrefix"> |
| | | <el-input v-model="formData.seqPrefix" placeholder="请è¾å
¥åºå·åç¼" /> |
| | | </el-form-item> |
| | | <!-- éæ±ï¼æéåºå·è§åï¼ç¾å°æ¶å¦ä½ç»æ£è
æéåºå·ï¼ --> |
| | | <el-form-item label="æéåºå·è§å" prop="seqRule"> |
| | | <el-select v-model="formData.seqRule" placeholder="è¯·éæ©æéåºå·è§å" class="w-full"> |
| | | <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_SEQ_RULE)" |
| | | :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | <div class="text-12px text-gray-500 leading-5 mt-1"> |
| | | é¢çº¦å·ï¼ç¨é¢çº¦ç³»ç»ä¸åçå·ï¼ç¾å°ä¸ååé
ï¼<br /> |
| | | ç¾å°åºå·ï¼å½å¤©åæ£æ¥ç±»åå
è¿ç»éå¢ï¼ç¬¬ 1 个ç¾å°=1 å·ï¼ï¼æ¯ 9 个å·é¢ç 1 个ç»å æ¥ï¼<br /> |
| | | æ¶æ®µå·ï¼æé¢çº¦æ¶é´æ®µç»å·ï¼<b>ä¸éæ¶é»è®¤æ¤é¡¹</b>ï¼ä¸æ¹é åè¡ä¸ºä¸è´ï¼ã |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item label="亲åçæ£æ¥ç±»å" prop="affinityCheckTypes"> |
| | | <el-checkbox-group v-model="formData.affinityCheckTypes"> |
| | |
| | | timeslotReservedNum: undefined, |
| | | affinityCheckTypes: [], |
| | | notes: undefined, |
| | | seqPrefix: undefined |
| | | seqPrefix: undefined, |
| | | // æéåºå·è§åï¼çç©ºå³æå端é»è®¤ï¼æ¶æ®µå·ï¼å¤çï¼ä¸æ¹é åè¡ä¸ºä¸è´ |
| | | seqRule: undefined |
| | | }) |
| | | const formRules = reactive({ |
| | | }) |
| | |
| | | timeslotReservedNum: undefined, |
| | | affinityCheckTypes: [], |
| | | notes: undefined, |
| | | seqPrefix: undefined |
| | | seqPrefix: undefined, |
| | | seqRule: undefined |
| | | } |
| | | formRef.value?.resetFields() |
| | | } |
| | |
| | | <el-table-column label="设å¤ç¼å·" align="center" prop="devId" /> |
| | | <el-table-column label="æ£è
ç¼å·" align="center" prop="patId" /> |
| | | <el-table-column label="æ£è
åç§°" align="center" prop="patName" /> |
| | | <!-- éæ±1ï¼é¨è¯å· + å»å±å·ï¼æ¤åè¿ä¸¤ä¸ªé¡µé¢éæ¼äºè¯¥åï¼æ¬æ¬¡è¡¥é½ï¼ |
| | | æ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼ï¼medical_card å
¨åºä¸ºç©ºï¼ |
| | | 该åå®é
æ¾ç¤º outpatient_noï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ã --> |
| | | <el-table-column label="é¨è¯å·" align="center" min-width="140px"> |
| | | <template #default="scope"> |
| | | <span>{{ resolveCardNo(scope.row).value }}</span> |
| | | <el-tag v-if="resolveCardNo(scope.row).from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ resolveCardNo(scope.row).from }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å»å±å·" align="center" prop="doctorAdviceNo" min-width="110px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.doctorAdviceNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- éæ±1ï¼è¡¥é½æ£è
ä¿¡æ¯ï¼å端 DevRentRespVO å·²æ©å段并åå¡«ï¼ --> |
| | | <el-table-column label="æ§å«" align="center" width="70px"> |
| | | <template #default="scope"> |
| | | <!-- 1ç·/2女ï¼0 æç¼ºå¤±ï¼HIS æªæä¾ï¼å®æµåºä¸æ 2123 è¡=0ï¼æ¾ç¤º"æªç¥" --> |
| | | <dict-tag v-if="scope.row.patGender === 1 || scope.row.patGender === 2" |
| | | :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" /> |
| | | <span v-else>æªç¥</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºçæ¥æ" align="center" width="110px"> |
| | | <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" width="80px"> |
| | | <template #default="scope">{{ formatAge(scope.row.patBirthday) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¥æº" align="center" width="90px"> |
| | | <template #default="scope"> |
| | | <dict-tag v-if="scope.row.patSrc !== undefined && scope.row.patSrc !== null" |
| | | :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" /> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç
åº" align="center" min-width="110px"> |
| | | <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="ç
åºå·" align="center" width="90px"> |
| | | <template #default="scope">{{ scope.row.patBedNo || scope.row.patDetails?.bedNo || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
çµè¯" align="center" min-width="120px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.patMobile || scope.row.patPhone || scope.row.patDetails?.mobile || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»è®°æ¶é´" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.registerDate) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åæ¥æ" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è·ä»å¤©æ°" align="center" width="90px"> |
| | | <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åå»å¸" align="center" min-width="100px"> |
| | | <template #default="scope">{{ scope.row.doctor || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¤è" align="center" width="110px"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£æ¥ç±»å" align="center" prop="checkType" width="100px"> |
| | | <template #default="scope"> |
| | | <span>{{getCheckTypeName(scope.row.checkType)}}</span> |
| | |
| | | import DevRentForm from './DevRentForm.vue' |
| | | import {tranlateCheckState} from "../../../utils/statusFormatter"; |
| | | import {getCheckTypeName} from "../../../utils/checkTypeFormatter"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼åå
¸ + å¹´é¾/è·ä»å¤©æ°ç宿¶è®¡ç®ï¼ |
| | | import { DICT_TYPE } from '@/utils/dict' |
| | | import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo' |
| | | |
| | | /** è£
æºææº å表 */ |
| | | defineOptions({ name: 'DevRent' }) |
| | |
| | | <el-input v-model="formData.patName" placeholder="请è¾å
¥æ£è
åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
æè¿°" prop="patDeptDesc"> |
| | | ç§å®¤: {{formData?.patDetails?.deptDesc}} ç
åº: {{formData?.patDetails?.wardDesc}} åºä½: {{formData?.patDetails?.bedNo}} |
| | | ç§å®¤: {{ formData?.patDetails?.deptDesc || '-' }} ç
åº: {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} åºä½: {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }} |
| | | </el-form-item> |
| | | <!-- éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼å端 DevRentRespVO å·²æ©å段并åå¡«ï¼ --> |
| | | <PatientInfoBlock :data="formData" check-type-field="checkType" /> |
| | | <el-form-item label="å½å
¥æ¶é´" prop="entryTime"> |
| | | <el-date-picker |
| | | v-model="formData.entryTime" |
| | |
| | | import {JobRecordApi, JobRecordVO} from "@/api/ecg/jobrecord"; |
| | | import {isStringEmpty} from "@/utils/stringUtil"; |
| | | import {curDayEnd, curDayStart} from "@/utils/dateUtil"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºå |
| | | import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue"; |
| | | |
| | | /** è£
æºææº è¡¨å */ |
| | | defineOptions({ name: 'DevDataEntry' }) |
| | |
| | | category: '', |
| | | brand: '', |
| | | model: '', |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼PatientInfoBlock ä¾èµè¿äºåæ®µï¼ |
| | | // ä¸åå§åä¼å¯¼è´ Vue 卿¨¡æ¿ä¸è¯»åæªå®ä¹å±æ§å¹¶åè¦ï¼ |
| | | applyNo: undefined, |
| | | episodeId: undefined, |
| | | patGender: undefined, |
| | | patBirthday: undefined, |
| | | registerDate: undefined, |
| | | doctor: undefined, |
| | | doctorTime: undefined, |
| | | patSrc: undefined, |
| | | patMobile: undefined, |
| | | patPhone: undefined, |
| | | medicalCard: undefined, |
| | | outpatientNo: undefined, |
| | | patIdentityId: undefined, |
| | | tolerance: undefined, |
| | | status: undefined, |
| | | seqNum: undefined, |
| | | } |
| | | formRef.value?.resetFields() |
| | | } |
| | |
| | | <el-input v-model="formData.patName" placeholder="请è¾å
¥æ£è
åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
æè¿°" prop="patDeptDesc"> |
| | | ç§å®¤: {{formData?.patDetails?.deptDesc}} ç
åº: {{formData?.patDetails?.wardDesc}} åºä½: {{formData?.patDetails?.bedNo}} |
| | | ç§å®¤: {{ formData?.patDetails?.deptDesc || '-' }} ç
åº: {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} åºä½: {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }} |
| | | </el-form-item> |
| | | <!-- éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼å端 DevRentRespVO å·²æ©å段并åå¡«ï¼ --> |
| | | <PatientInfoBlock :data="formData" check-type-field="checkType" /> |
| | | <el-form-item label="è£
æºæ¶é´" prop="rentTime"> |
| | | <el-date-picker |
| | | v-model="formData.rentTime" |
| | |
| | | import {calculateHours, curDayEnd, curDayStart} from "@/utils/dateUtil"; |
| | | import {AppointmentApi} from "@/api/ecg/appointment"; |
| | | import {tranlateDevState} from "../../../utils/statusFormatter"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºå |
| | | import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue"; |
| | | |
| | | /** è£
æºææº è¡¨å */ |
| | | defineOptions({ name: 'DevrDismantle' }) |
| | |
| | | brand: '', |
| | | model: '', |
| | | devState: undefined, |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼PatientInfoBlock ä¾èµè¿äºåæ®µï¼ |
| | | // ä¸åå§åä¼å¯¼è´ Vue 卿¨¡æ¿ä¸è¯»åæªå®ä¹å±æ§å¹¶åè¦ï¼ |
| | | applyNo: undefined, |
| | | episodeId: undefined, |
| | | patGender: undefined, |
| | | patBirthday: undefined, |
| | | registerDate: undefined, |
| | | doctor: undefined, |
| | | doctorTime: undefined, |
| | | patSrc: undefined, |
| | | patMobile: undefined, |
| | | patPhone: undefined, |
| | | medicalCard: undefined, |
| | | outpatientNo: undefined, |
| | | patIdentityId: undefined, |
| | | tolerance: undefined, |
| | | status: undefined, |
| | | seqNum: undefined, |
| | | } |
| | | formRef.value?.resetFields() |
| | | } |
| | |
| | | import QueuePanel from "@/views/ecg/doctor/components/QueuePanel.vue"; |
| | | import {DoctorApi, PatientStatisticVO, RoomBedVO} from '@/api/ecg/doctor'; |
| | | import {QueueVO} from "@/api/ecg/queue"; |
| | | import {ElNotification} from "element-plus"; |
| | | import {ElMessage, ElMessageBox, ElNotification} from "element-plus"; |
| | | import {useRoomStore} from "@/store/modules/room"; |
| | | |
| | | const roomStore = useRoomStore(); |
| | |
| | | state.value = true |
| | | else if (queueVO2.status === 30) |
| | | state.value = false |
| | | // éæ±3ï¼åæ¥"忢åè¯"å¼å
³ç¶æ |
| | | await loadStopReady() |
| | | } |
| | | |
| | | // ==================== éæ±3ï¼åæ¢åè¯å¼å
³ ==================== |
| | | // å¼å¯åãå·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
人ãï¼å
³é忢å¤ã |
| | | // 注ï¼è£
æºå·¥ä½(opType=2)æ¬èº«ä¸è¿"åæµéå"ï¼è¯¥å¼å
³å¯¹è£
æºå·¥ä½ |
| | | // 主è¦ç¨äº"åæ¢æ¥æ¶æ°çå¾
è£
æºæ£è
"çè¯ä¹ç»ä¸ä¸ç¶æå¯è§ã |
| | | const stopReady = ref<boolean>(false) |
| | | const stopReadyFlag = ref<boolean>(true) |
| | | |
| | | const loadStopReady = async () => { |
| | | try { |
| | | stopReady.value = await DoctorApi.getStopReady(roomBedVO.value) |
| | | } catch (e) { |
| | | // æ¥è¯¢å¤±è´¥ä¸ææè½®è¯¢ |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const onStopReadyChange = async (val: boolean) => { |
| | | stopReadyFlag.value = true |
| | | try { |
| | | if (val) { |
| | | await DoctorApi.stopReady(roomBedVO.value) |
| | | ElMessage.success('已忢åè¯ï¼ä¸åæ¥æ¶æ°çåè¯æ£è
ï¼å·²ææ£è
ä»å¯æ£å¸¸å«å·') |
| | | } else { |
| | | await DoctorApi.resumeReady(roomBedVO.value) |
| | | ElMessage.success('å·²æ¢å¤åè¯ï¼å¼å§æ¥æ¶æ°çåè¯æ£è
') |
| | | } |
| | | await initLoad() |
| | | } catch (e) { |
| | | stopReady.value = !val |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | // ==================== éæ±2ï¼æ¤éå«å· / æ¤éè£
æºå®æ ==================== |
| | | const undoFlag = ref<boolean>(false) |
| | | |
| | | const undoCall = async () => { |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | 'ç¡®å®è¦æ¤éæ¬æ¬¡å«å·åï¼è¯¥æ£è
å°åå°åè¯åºï¼å¯éæ°å«å·ã', |
| | | 'æ¤éå«å·', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoCallPatient(roomBedVO.value) |
| | | ElMessage.success(msg || 'å·²æ¤éå«å·') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const undoFinish = async () => { |
| | | const last = await DoctorApi.lastFinishedPatient(roomBedVO.value) |
| | | if (!last || !last.patId) { |
| | | ElMessage.warning('æ¬å·¥ä½ä»æ¥ææ å·²å®æçæ£æ¥è®°å½') |
| | | return |
| | | } |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `ç¡®å®æ¤éã${last.patName || last.patId}ãç宿æä½åï¼è¯¥æ£è
å°åå°åè¯åºã`, |
| | | 'æ¤é宿', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoFinishPatient({ |
| | | ...roomBedVO.value, |
| | | patId: last.patId, |
| | | checkType: last.bookCheckType |
| | | } as any) |
| | | ElMessage.success(msg || 'å·²æ¤é宿') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const bedControl = async () => { |
| | |
| | | <el-button :disabled="passFlag" type="primary" @click="passNextPatient">è¿å·</el-button> |
| | | <el-button type="primary" @click="callAgain">éå«</el-button> |
| | | <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{state?'æå':'æ¢å¤'}}</el-button> |
| | | <!-- éæ±3ï¼åæ¢åè¯å¼å
³ï¼å·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
äººï¼ --> |
| | | <el-switch |
| | | v-model="stopReady" |
| | | :disabled="stopReadyFlag" |
| | | active-text="忢åè¯" |
| | | inactive-text="æ£å¸¸æ¥è¯" |
| | | inline-prompt |
| | | style="margin-left: 12px; --el-switch-on-color: #e6a23c" |
| | | @change="onStopReadyChange" |
| | | /> |
| | | <!-- éæ±2ï¼æ¤é误ç¹å«å· / æ¤é宿ï¼ååå°åè¯åºï¼ --> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">æ¤éå«å·</el-button> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">æ¤é宿</el-button> |
| | | </el-container> |
| | | </el-container> |
| | | </template> |
| | |
| | | import QueuePanel from '@/views/ecg/doctor/components/QueuePanel.vue' |
| | | import { DoctorApi, PatientStatisticVO, RoomBedVO, } from '@/api/ecg/doctor' |
| | | import { QueueVO } from '@/api/ecg/queue' |
| | | import { ElNotification } from 'element-plus' |
| | | import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' |
| | | import RoutinePanel from '@/views/ecg/doctor/components/RoutinePanel.vue' |
| | | import { useRoomStore } from '@/store/modules/room' |
| | | |
| | |
| | | const bedControlFlag = ref<boolean>(true) |
| | | const finishFlag = ref<boolean>(true) |
| | | const passFlag = ref<boolean>(true) |
| | | |
| | | // ==================== éæ±3ï¼åæ¢åè¯å¼å
³ ==================== |
| | | // è¯ä¹ï¼å¼å¯åãå·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
人ãï¼å
³é忢å¤ã |
| | | // ä¸ä¸é¢ç"æå/æ¢å¤"æ¯**两个ç¬ç«æ¦å¿µ**ï¼æå伿就è¯ä¸æ£è
强å¶å®æã |
| | | // å¹¶æåè¯æ£è
踢åºå·¥ä½ï¼æ¬å¼å
³åªæ¦æª"æ°å¢"ï¼ä¸å¨å·²ææ£è
ã |
| | | const stopReady = ref<boolean>(false) |
| | | const stopReadyFlag = ref<boolean>(true) // é²è¿ç¹ |
| | | |
| | | const loadStopReady = async () => { |
| | | try { |
| | | stopReady.value = await DoctorApi.getStopReady(roomBedVO) |
| | | } catch (e) { |
| | | // æ¥è¯¢å¤±è´¥ä¸ææè½®è¯¢ï¼ä¿æä¸ä¸æ¬¡ç¶æ |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const onStopReadyChange = async (val: boolean) => { |
| | | stopReadyFlag.value = true |
| | | try { |
| | | if (val) { |
| | | await DoctorApi.stopReady(roomBedVO) |
| | | ElMessage.success('已忢åè¯ï¼ä¸åæ¥æ¶æ°çåè¯æ£è
ï¼å·²ææ£è
ä»å¯æ£å¸¸å«å·') |
| | | } else { |
| | | await DoctorApi.resumeReady(roomBedVO) |
| | | ElMessage.success('å·²æ¢å¤åè¯ï¼å¼å§æ¥æ¶æ°çåè¯æ£è
') |
| | | } |
| | | await initLoad() |
| | | } catch (e) { |
| | | // å¤±è´¥åæ»å¼å
³æ¾ç¤º |
| | | stopReady.value = !val |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | // ==================== éæ±2ï¼æ¤éå«å· / æ¤éæ£æ¥å®æ ==================== |
| | | const undoFlag = ref<boolean>(false) |
| | | |
| | | /** æ¤é误ç¹"å«å·"ï¼æå½åå°±è¯ä¸çæ£è
éååè¯åº */ |
| | | const undoCall = async () => { |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | 'ç¡®å®è¦æ¤éæ¬æ¬¡å«å·åï¼è¯¥æ£è
å°åå°åè¯åºï¼å¯éæ°å«å·ã', |
| | | 'æ¤éå«å·', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return // ç¨æ·åæ¶ |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoCallPatient(roomBedVO) |
| | | ElMessage.success(msg || 'å·²æ¤éå«å·') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | /** æ¤é"æ£æ¥å®æ"ï¼ææè¿ä¸ä½å·²å®ææ£è
éååè¯åº */ |
| | | const undoFinish = async () => { |
| | | const last = await DoctorApi.lastFinishedPatient(roomBedVO) |
| | | if (!last || !last.patId) { |
| | | ElMessage.warning('æ¬å·¥ä½ä»æ¥ææ å·²å®æçæ£æ¥è®°å½') |
| | | return |
| | | } |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `ç¡®å®æ¤éã${last.patName || last.patId}ãçæ£æ¥å®æåï¼è¯¥æ£è
å°åå°åè¯åºã`, |
| | | 'æ¤éæ£æ¥å®æ', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return // ç¨æ·åæ¶ |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoFinishPatient({ |
| | | ...roomBedVO, |
| | | patId: last.patId, |
| | | checkType: last.bookCheckType |
| | | } as any) |
| | | ElMessage.success(msg || 'å·²æ¤éæ£æ¥å®æ') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const finishNextPatient = async () => { |
| | | finishFlag.value = true |
| | |
| | | const queueVO2 = await DoctorApi.bedDoctorGet(roomBedVO) |
| | | if (queueVO2.status === 20) state.value = true |
| | | else if (queueVO2.status === 30) state.value = false |
| | | // éæ±3ï¼åæ¥"忢åè¯"å¼å
³ç¶æï¼å
¶ä»å»ç/å
¶ä»ç»ç«¯æ¹å¨åæ¬ç«¯ä¹è½çå°ï¼ |
| | | await loadStopReady() |
| | | } |
| | | |
| | | const bedControl = async () => { |
| | |
| | | <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{ |
| | | state ? 'æå' : 'æ¢å¤' |
| | | }}</el-button> |
| | | <!-- éæ±3ï¼åæ¢åè¯å¼å
³ï¼å·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
äººï¼ --> |
| | | <el-switch |
| | | v-model="stopReady" |
| | | :disabled="stopReadyFlag" |
| | | active-text="忢åè¯" |
| | | inactive-text="æ£å¸¸æ¥è¯" |
| | | inline-prompt |
| | | style="margin-left: 12px; --el-switch-on-color: #e6a23c" |
| | | @change="onStopReadyChange" |
| | | /> |
| | | <!-- éæ±2ï¼æ¤é误ç¹å«å· / æ¤éæ£æ¥å®æï¼ååå°åè¯åºï¼ --> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">æ¤éå«å·</el-button> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">æ¤é宿</el-button> |
| | | </el-container> |
| | | </el-container> |
| | | </template> |
| | |
| | | <el-input v-model="formData.patName" placeholder="请è¾å
¥æ£è
åç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
æè¿°" prop="patDetails"> |
| | | <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patDetails?.source || ''" /> |
| | | {{ formData?.patDetails?.deptDesc }} {{ formData?.patDetails?.wardDesc }} {{ formData?.patDetails?.bedNo }} |
| | | <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patSrc ?? formData.patDetails?.source ?? ''" /> |
| | | {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }} |
| | | </el-form-item> |
| | | <!-- éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºï¼å端已ä»é¢çº¦åå¹³éºåå¡«ï¼setPatient å·²èµå¼å° formDataï¼ --> |
| | | <PatientInfoBlock :data="formData" check-type-field="checkType" :span="12" /> |
| | | <el-form-item label="è£
æºæ¶é´" prop="rentTime"> |
| | | <el-date-picker v-model="formData.rentTime" type="date" value-format="x" placeholder="éæ©è£
æºæ¶é´" /> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="formData.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¤èè¯" prop="tolerance"> |
| | | <el-tag v-if="formData.tolerance == 0" type="info">å¦</el-tag> |
| | | <el-tag v-else-if="formData.tolerance == 1" type="danger">æ¯</el-tag> |
| | | <!-- å¯éï¼é²æ¢æ°æ®å¼å¸¸æ¶çå
åº --> |
| | | <el-tag v-else type="warning">æªç¥</el-tag> |
| | | <!-- éæ±6ï¼ç»ä¸èµ°åå
¸ ecg_toleranceï¼0=æ 1=å¤è 2=å¤éèè¯ï¼ï¼NULL æ"æ "æ¾ç¤ºï¼Q12ï¼ --> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' |
| | | import { tranlateDevState } from "../../../../utils/statusFormatter"; |
| | | import { getCheckTypeName } from "../../../../utils/checkTypeFormatter"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºå |
| | | import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue"; |
| | | |
| | | /** 设å¤è£
æº è¡¨å */ |
| | | defineComponent({ name: 'DevInstallPanel' }) |
| | |
| | | formData.value.patName = queueVO?.patName |
| | | formData.value.checkType = queueVO?.bookCheckType |
| | | formData.value.tolerance = queueVO?.tolerance // å¤èè¯ï¼å端ä»é¢çº¦åè¡¥é½ |
| | | // éæ±1ï¼ä»¥ä¸å¹³éºå段ç±å端ä»é¢çº¦ååå¡«å° QueueRespVOï¼ |
| | | // å¿
é¡»æ¾å¼èµå¼ç» formDataï¼å¦å模æ¿é读ä¸å°ã |
| | | formData.value.patGender = queueVO?.patGender |
| | | formData.value.patBirthday = queueVO?.patBirthday |
| | | formData.value.registerDate = queueVO?.registerDate |
| | | formData.value.doctor = queueVO?.doctor |
| | | formData.value.doctorTime = queueVO?.doctorTime |
| | | formData.value.patSrc = queueVO?.patSrc |
| | | formData.value.patMobile = queueVO?.patMobile |
| | | formData.value.patPhone = queueVO?.patPhone |
| | | formData.value.patWardDesc = queueVO?.patWardDesc |
| | | formData.value.patBedNo = queueVO?.patBedNo |
| | | formData.value.medicalCard = queueVO?.medicalCard |
| | | formData.value.outpatientNo = queueVO?.outpatientNo |
| | | // éæ±1ï¼å»å±å·ï¼æ¤å 3 ä¸ªé¢æ¿é½éæ¼äºè¯¥å段çèµå¼ï¼å¯¼è´ PatientInfoBlock ææ¾ç¤º '-'ï¼ |
| | | formData.value.doctorAdviceNo = queueVO?.doctorAdviceNo |
| | | formData.value.patIdentityId = queueVO?.patIdentityId |
| | | getReadyRentInfo(formData.value) // è·åé¢ç¨ä¿¡æ¯ |
| | | copyBarcode() |
| | | } |
| | |
| | | detachment: undefined, |
| | | remark: undefined, |
| | | checkType: undefined, |
| | | // éæ±1ï¼PatientInfoBlock ä¾èµçå¹³éºå段ï¼ç± setPatient ä» QueueVO èµå¼ï¼ |
| | | applyNo: undefined, |
| | | episodeId: undefined, |
| | | patGender: undefined, |
| | | patBirthday: undefined, |
| | | registerDate: undefined, |
| | | doctor: undefined, |
| | | doctorTime: undefined, |
| | | patSrc: undefined, |
| | | patMobile: undefined, |
| | | patPhone: undefined, |
| | | patWardDesc: undefined, |
| | | patBedNo: undefined, |
| | | medicalCard: undefined, |
| | | doctorAdviceNo: undefined, |
| | | outpatientNo: undefined, |
| | | patIdentityId: undefined, |
| | | status: undefined, |
| | | seqNum: undefined, |
| | | } |
| | | formRef.value?.resetFields() |
| | | devInfo.value = { |
| | |
| | | <el-input v-model="formData.patName" placeholder="请è¾å
¥æ£è
åç§°" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºï¼å端已ä»é¢çº¦åå¹³éºåå¡«ï¼setPatient å·²èµå¼å° formDataï¼ --> |
| | | <PatientInfoBlock :data="formData" check-type-field="checkType" :span="12" /> |
| | | <el-col :span="12"> |
| | | |
| | | <el-form-item label="æ£è
æè¿°" prop="patDeptDesc"> |
| | | <dict-tag v-if="formData.patDetails?.source" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patDetails?.source" /> |
| | | {{formData?.patDetails?.deptDesc}} {{formData?.patDetails?.wardDesc}} {{formData?.patDetails?.bedNo}} |
| | | <dict-tag v-if="formData.patSrc ?? formData.patDetails?.source" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patSrc ?? formData.patDetails?.source" /> |
| | | {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¤èè¯" prop="tolerance"> |
| | | <el-tag type="info" v-if="formData.tolerance == 0">å¦</el-tag> |
| | | <el-tag type="danger" v-else>æ¯</el-tag> |
| | | <!-- éæ±6ï¼ç»ä¸èµ°åå
¸ ecg_toleranceï¼0=æ 1=å¤è 2=å¤éèè¯ï¼ï¼NULL æ"æ "æ¾ç¤ºï¼Q12ï¼ --> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' |
| | | import {tranlateDevState} from "@/utils/statusFormatter"; |
| | | import {getCheckTypeName, needAutoFeeConfirm} from "../../../../utils/checkTypeFormatter"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ç»ä¸å±ç¤ºå |
| | | import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue"; |
| | | |
| | | /** 设å¤é¢ç¨ 表å */ |
| | | defineComponent({ name: 'DevReadyPanel' }) |
| | |
| | | remark: undefined, |
| | | patDetails: undefined, |
| | | paid: undefined, |
| | | // éæ±1ï¼PatientInfoBlock ä¾èµçå¹³éºå段ï¼å
åå§å为 undefinedï¼ |
| | | // éåç± setPatient ä» QueueVO èµå¼ï¼ä¸åå§åä¼è¯»ä¸å°å±æ§ï¼ |
| | | applyNo: undefined, |
| | | episodeId: undefined, |
| | | patGender: undefined, |
| | | patBirthday: undefined, |
| | | registerDate: undefined, |
| | | doctor: undefined, |
| | | doctorTime: undefined, |
| | | patSrc: undefined, |
| | | patMobile: undefined, |
| | | patPhone: undefined, |
| | | patWardDesc: undefined, |
| | | patBedNo: undefined, |
| | | medicalCard: undefined, |
| | | doctorAdviceNo: undefined, |
| | | outpatientNo: undefined, |
| | | patIdentityId: undefined, |
| | | status: undefined, |
| | | seqNum: undefined, |
| | | } |
| | | formRef.value?.resetFields() |
| | | |
| | |
| | | formData.value.patName = queueVO?.patName |
| | | formData.value.checkType = queueVO?.bookCheckType |
| | | formData.value.tolerance = queueVO?.tolerance // å¤èè¯ï¼å端ä»é¢çº¦åè¡¥é½ |
| | | // éæ±1ï¼ä»¥ä¸å¹³éºå段ç±å端ä»é¢çº¦ååå¡«å° QueueRespVOï¼ |
| | | // å¿
é¡»æ¾å¼èµå¼ç» formDataï¼å¦å模æ¿é读ä¸å°ï¼åå
åªèµå¼äºä¸é¢ 6 个ï¼ã |
| | | formData.value.patGender = queueVO?.patGender |
| | | formData.value.patBirthday = queueVO?.patBirthday |
| | | formData.value.registerDate = queueVO?.registerDate |
| | | formData.value.doctor = queueVO?.doctor |
| | | formData.value.doctorTime = queueVO?.doctorTime |
| | | formData.value.patSrc = queueVO?.patSrc |
| | | formData.value.patMobile = queueVO?.patMobile |
| | | formData.value.patPhone = queueVO?.patPhone |
| | | formData.value.patWardDesc = queueVO?.patWardDesc |
| | | formData.value.patBedNo = queueVO?.patBedNo |
| | | formData.value.medicalCard = queueVO?.medicalCard |
| | | formData.value.outpatientNo = queueVO?.outpatientNo |
| | | // éæ±1ï¼å»å±å·ï¼æ¤å 3 ä¸ªé¢æ¿é½éæ¼äºè¯¥å段çèµå¼ï¼å¯¼è´ PatientInfoBlock ææ¾ç¤º '-'ï¼ |
| | | formData.value.doctorAdviceNo = queueVO?.doctorAdviceNo |
| | | formData.value.patIdentityId = queueVO?.patIdentityId |
| | | getFreeRentInfo(formData.value) // å¾
æ£æ¥çä¿¡æ¯ @ dev_rent 表 |
| | | copyBarcode() |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- |
| | | æ£è
ä¿¡æ¯å±ç¤ºåï¼éæ±1ï¼18 项ç»ä¸å±ç¤ºï¼ |
| | | |
| | | èæ¯ï¼ |
| | | éæ±è¦æ±ãæµæ°´å·ãæéåºå·ãå§åãæ§å«ãåºçæ¥æãå¹´é¾ã项ç®ãç
åºãç
åºå·ã |
| | | ç»è®°æ¶é´ãç¶æãæ£è
çµè¯ãå¼åæ¥æãè·ä»å¤©æ°ãæ¥æºãé¨è¯å·ãå»å±å·ãå¼åå»å¸ã |
| | | å¨**æ¯ä¸ªçé¢**齿ã |
| | | |
| | | ï¼åå§éæ±åçæ¯ãå°±è¯å¡å·ãï¼å HIS å¨å¡å·æ§½ä½ä¼ 空ãmedical_card å
¨åºä¸ºç©ºï¼ |
| | | 该ä½ç½®å®é
å±ç¤º outpatient_noï¼ç»ç¡®è®¤æ ç¾æ¹ä¸ºãé¨è¯å·ãââ详è§ãé¨ç½²æ¸
åã5.1ãï¼ |
| | | |
| | | 为ä»ä¹åæç»ä»¶ï¼ |
| | | æ 10+ 个çé¢éè¦åä¸å¥å段ãè¥åèªå¤å¶ç²è´´ï¼ä¼åºç° |
| | | · å£å¾ä¸ä¸è´ï¼æä¸ªé¡µé¢ç¨ createTime å½å¼åæ¥æï¼ |
| | | · æ¹ä¸å¤æ¼ä¸å¤ |
| | | å æ¤ç»ä¸å°è¿éï¼å页é¢åªéä¼ æ°æ®å¯¹è±¡ã |
| | | |
| | | æ°æ®å
¼å®¹æ§ï¼ |
| | | ä¸å页é¢çæ°æ®å½¢æç¥æå·®å¼ï¼æ¬ç»ä»¶æä»¥ä¸ä¼å
级åå¼ï¼ |
| | | 1) å端平éºå段ï¼QueueRespVO / AppointmentRespVO / DevRentRespVO æ°å¢ç patWardDesc çï¼ |
| | | 2) patDetails JSON å¿«ç
§ï¼æ§æ°æ®å¯è½åªå¨è¿éæï¼ |
| | | 3) '-' å ä½ |
| | | --> |
| | | <script setup lang="ts"> |
| | | import { computed } from 'vue' |
| | | import { DICT_TYPE } from '@/utils/dict' |
| | | import { |
| | | formatAge, |
| | | formatDaysFromOrder, |
| | | formatDateOnly, |
| | | formatDateTime, |
| | | resolveCardNo |
| | | } from '@/utils/patientInfo' |
| | | import { getCheckTypeName } from '@/utils/checkTypeFormatter' |
| | | |
| | | const props = defineProps<{ |
| | | /** æ£è
/æé/é¢çº¦/ç§èµ æ°æ®å¯¹è±¡ï¼å½¢æå
¼å®¹ï¼è§æä»¶å¤´è¯´æï¼ */ |
| | | data: any |
| | | /** æ£æ¥é¡¹ç®å段åï¼éåç¨ bookCheckTypeï¼ç§èµç¨ checkType */ |
| | | checkTypeField?: string |
| | | /** ç¶æåå
¸ï¼éåç¨ ecg_queue_statusï¼é¢çº¦åç¨ ecg_status */ |
| | | statusDict?: string |
| | | /** æ¯å¦æ¾ç¤ºæéåºå·ï¼é¢çº¦è®°å½çæ æ¤å段ç页é¢å¯å
³éï¼ */ |
| | | showSeqNum?: boolean |
| | | /** |
| | | * æ¯å¦æ¾ç¤ºå»å±å·ï¼é»è®¤ **true**ã |
| | | * |
| | | * åå²è¯´æï¼æ©æææ¥å¾åº"HIS æ¥æä¸ä¸åå¨å»å±å·"çç»è®ºï¼æ
彿¶é»è®¤å
³éï¼ |
| | | * 以å
ç¨ç³è¯·å·åå
ã**该ç»è®ºå·²è¢«æ¨ç¿»** ââ HISãäº¤äºæå¡éç¨æ¥å£ææ¡£ã |
| | | * 6.1/6.4/6.5 æç¡® `observationRequest.id.item[root=2.16.156.10011.1.28]` |
| | | * å³ãå»å±ID/å»å±å·ãï¼ä¸å®æµ S0201ECG 220 æ¡ãS0202ECG 29 æ¡åæºå¸¦è¯¥å¼ã |
| | | * å端已æ°å¢ `doctorAdviceNo` åæ®µå¹¶å¨è§£ææ¶ééï¼æ
æ¤å¤é»è®¤æ¾ç¤ºã |
| | | * |
| | | * 注æè¯¥èç¹å¨è§èä¸**éå¿
须项**ï¼å岿°æ®ï¼æ°å¢åä¹åééçï¼ä¸ºç©º â |
| | | * æ¾ç¤º `-`ï¼å±é¢æã |
| | | */ |
| | | showAdviceNo?: boolean |
| | | /** æ¯åæ
æ ¼å®½åº¦ï¼é»è®¤ 6 = ä¸è¡ 4 ä¸ªï¼ */ |
| | | span?: number |
| | | }>() |
| | | |
| | | const d = computed(() => props.data || {}) |
| | | const pd = computed(() => d.value.patDetails || {}) |
| | | const colSpan = computed(() => props.span ?? 6) |
| | | // å»å±å·é»è®¤æ¾ç¤ºï¼è¯¦è§ props 说æï¼ï¼ä»
卿¾å¼ä¼ false æ¶éè |
| | | const showAdvice = computed(() => props.showAdviceNo !== false) |
| | | const checkField = computed(() => props.checkTypeField ?? 'bookCheckType') |
| | | |
| | | /** å第ä¸ä¸ªæå¼çåé */ |
| | | function pick(...vals: any[]): any { |
| | | for (const v of vals) { |
| | | if (v !== undefined && v !== null && v !== '') return v |
| | | } |
| | | return undefined |
| | | } |
| | | |
| | | const phone = computed(() => |
| | | pick(d.value.patMobile, d.value.patPhone, pd.value.mobile) ?? '-' |
| | | ) |
| | | const ward = computed(() => pick(d.value.patWardDesc, pd.value.wardDesc) ?? '-') |
| | | // 注æï¼d.bedNo å¨ queue 鿝ãè¯çåº/å·¥ä½å·ãï¼çæ£çç
åºå·æ¯ patBedNo / patDetails.bedNo |
| | | const patBed = computed(() => pick(d.value.patBedNo, pd.value.bedNo) ?? '-') |
| | | |
| | | const cardNo = computed(() => resolveCardNo(d.value)) |
| | | const source = computed(() => pick(d.value.patSrc, pd.value.source)) |
| | | const checkType = computed(() => d.value[checkField.value]) |
| | | </script> |
| | | |
| | | <template> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å°±è¯æµæ°´å·"> |
| | | {{ d.episodeId || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col v-if="showSeqNum" :span="colSpan"> |
| | | <el-form-item label="æéåºå·"> |
| | | {{ pick(d.seqNum, d.bookSeqNum) ?? '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="ç³è¯·ç¼å·"> |
| | | {{ d.applyNo || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <!-- æ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ï¼ |
| | | HIS å¨å¡å·æ§½ä½ä¼ 空ï¼medical_card å
¨åº 159,116 è¡æ ä¸éç©ºï¼ |
| | | 该ä½ç½®å®é
å±ç¤º outpatient_noãcardNo.from æ æ³¨å¼çç宿¥æºï¼ |
| | | ç¨äºåºåæ··å¨è¯¥å段éç身份è¯å· / ä½é¢å·ã --> |
| | | <el-form-item label="é¨è¯å·"> |
| | | <span>{{ cardNo.value }}</span> |
| | | <el-tag v-if="cardNo.from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ cardNo.from }} |
| | | </el-tag> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å§å"> |
| | | {{ d.patName || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="æ§å«"> |
| | | <!-- 1 ç· / 2 女ï¼0 æç¼ºå¤±ï¼HIS æªæä¾ï¼å®æµåºä¸æ 2123 è¡ = 0ï¼æ¾ç¤º"æªç¥"ã |
| | | 注æä¸è½ç´æ¥æ 0 äº¤ç» dict-tag ââ åå
¸é没æ 0 è¿ä¸é¡¹ï¼ä¼æ¸²ææç©ºç½ã --> |
| | | <dict-tag v-if="d.patGender === 1 || d.patGender === 2 || d.patGender === '1' || d.patGender === '2'" |
| | | :type="DICT_TYPE.SYSTEM_USER_SEX" :value="d.patGender" /> |
| | | <span v-else>æªç¥</span> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="åºçæ¥æ"> |
| | | {{ formatDateOnly(d.patBirthday) || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å¹´é¾"> |
| | | {{ formatAge(d.patBirthday) || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="项ç®"> |
| | | {{ checkType ? getCheckTypeName(checkType) : '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="æ¥æº"> |
| | | <dict-tag v-if="source !== undefined" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="source" /> |
| | | <span v-else>-</span> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="ç
åº"> |
| | | {{ ward }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="ç
åºå·"> |
| | | {{ patBed }} |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="æ£è
çµè¯"> |
| | | {{ phone }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="ç»è®°æ¶é´"> |
| | | {{ formatDateTime(d.registerDate) || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å¼åæ¥æ"> |
| | | {{ formatDateTime(d.doctorTime) || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="è·ä»å¤©æ°"> |
| | | {{ formatDaysFromOrder(d.doctorTime) || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å¼åå»å¸"> |
| | | {{ d.doctor || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="ç¶æ"> |
| | | <dict-tag v-if="d.status !== undefined && d.status !== null && statusDict" |
| | | :type="statusDict" :value="d.status" /> |
| | | <span v-else>-</span> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="colSpan"> |
| | | <el-form-item label="å¤è"> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="d.tolerance ?? 0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col v-if="showAdvice" :span="colSpan"> |
| | | <el-form-item label="å»å±å·"> |
| | | {{ d.doctorAdviceNo || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </template> |
| | |
| | | |
| | | <el-col :span="6"> |
| | | <el-form-item label="èç³»çµè¯" prop="episodeId"> |
| | | {{ formData?.patDetails?.mobile }} |
| | | <!-- ä¿®æ£ï¼å读 `patDetails.mobile`ï¼queue 表ç JSON å¿«ç
§ï¼åªå« source/mobile/wardDesc/bedNo ååæ®µï¼ã |
| | | è setPatient å·²æåç«¯ä» appointment åå¡«ç**å¹³éºå段** `patMobile` èµè¿ formDataï¼ |
| | | æ
åºä»¥å¹³éºå段ä¼å
ï¼patDetails ä»
使§æ°æ®åéã --> |
| | | {{ formData.patMobile || formData?.patDetails?.mobile || '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </el-col> |
| | | <el-col :span="18"> |
| | | <el-form-item label="ç§å®¤ç
åº" prop="patDetails"> |
| | | <dict-tag v-if="formData.patDetails?.source" :type="DICT_TYPE.ECG_PAT_SOURCE" |
| | | :value="formData.patDetails?.source" /> |
| | | {{ formData?.patDetails?.deptDesc }}-{{ formData?.patDetails?.wardDesc }}-{{ formData?.patDetails?.bedNo }} |
| | | <!-- ä¿®æ£ï¼æ¥æºä¸ç
åº/åºå·å读 `patDetails.*`ï¼queue 表ç JSON å¿«ç
§ï¼å¯è½æ»åä¸å¸¸ç¼ºç
åºï¼ï¼ |
| | | æ¹ä¸º**å¹³éºå段ä¼å
**ï¼åç«¯å·²ä» appointment åå¡« patSrc/patWardDesc/patBedNoï¼ï¼ |
| | | patDetails ä»
使§æ°æ®åéã --> |
| | | <dict-tag v-if="formData.patSrc ?? formData.patDetails?.source" |
| | | :type="DICT_TYPE.ECG_PAT_SOURCE" |
| | | :value="formData.patSrc ?? formData.patDetails?.source" /> |
| | | {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} |
| | | - {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }} |
| | | </el-form-item></el-col> |
| | | |
| | | |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å»å±å·"> |
| | | {{ formData.applyNo }} |
| | | <!-- ä¿®æ£ï¼æ¤å¤åå
ç»å®çæ¯ `formData.applyNo`ï¼ç³è¯·åå·ï¼ï¼ |
| | | ä¸ãå»å±å·ãæ¯**两个ä¸åçæ è¯**ï¼ |
| | | ç³è¯·åå· apply_no = HIS root 2.16.156.10011.1.24ï¼ä¾ 2126091700011 |
| | | å»å±å· doctor_advice_no = HIS root 2.16.156.10011.1.28ï¼ä¾ 112663505 |
| | | ååæ³æ¯æç³è¯·åå·åå
æå»å±å·ï¼å±äºé误å±ç¤ºã |
| | | ç°æ¹ä¸ºè¯»å端æ°ééç doctorAdviceNoï¼è¯¥èç¹è§èä¸éå¿
须项ï¼å岿°æ®ä¸ºç©º â æ¾ç¤º '-'ï¼ã --> |
| | | {{ formData.doctorAdviceNo || '-' }} |
| | | </el-form-item> |
| | | </el-col><el-col :span="6"> |
| | | <el-form-item label="ç»è®°æ¶é´"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | <!-- éæ±1ï¼è¡¥é½æ¬é¢æ¿åå
缺失çä¸¤é¡¹ï¼æéåºå·ãç¶æï¼ï¼ä½¿ 18 项é½å
¨ --> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æéåºå·"> |
| | | {{ formData?.seqNum ?? formData?.bookSeqNum ?? '-' }} |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç¶æ"> |
| | | <dict-tag v-if="formData?.status !== undefined && formData?.status !== null" |
| | | :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="formData.status" /> |
| | | <span v-else>-</span> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¤èè¯" prop="tolerance"> |
| | | <el-tag v-if="formData.tolerance == 0" type="info">å¦</el-tag> |
| | | <el-tag v-else-if="formData.tolerance == 1" type="danger">æ¯</el-tag> |
| | | <el-tag v-else type="warning">æªç¥</el-tag> |
| | | <!-- éæ±6ï¼ç»ä¸èµ°åå
¸ ecg_toleranceï¼0=æ 1=å¤è 2=å¤éèè¯ï¼ï¼ |
| | | NULL æ"æ "æ¾ç¤ºï¼Q12ï¼ãåå
硬ç¼ç "å¦/æ¯/æªç¥"ä¸åæ¯ï¼ä¸åå
¸éå¤ä¸ææ¡ä¸ç¬¦ã --> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | |
| | | formData.value.checkType = queueVO?.bookCheckType |
| | | // 以ä¸å段ç±å端ä»é¢çº¦åè¡¥é½ï¼queue 表ä¸åï¼ï¼ç¨äºå»ç端å±ç¤º |
| | | formData.value.patGender = queueVO?.patGender |
| | | formData.value.patGender = queueVO?.patGender |
| | | formData.value.tolerance = queueVO?.tolerance |
| | | formData.value.patBirthday = queueVO?.patBirthday |
| | | formData.value.registerDate = queueVO?.registerDate |
| | | formData.value.doctor = queueVO?.doctor |
| | | formData.value.doctorTime = queueVO?.doctorTime |
| | | // éæ±1ï¼è¡¥é½æéåºå· / ç¶æ / ç
åº / åºå· / çµè¯ / æ¥æº / é¨è¯å· |
| | | // è¿äºå¹³éºå段ç±å端 QueueServiceImpl#fillAppointmentInfo åå¡«ï¼ |
| | | // åå
è¿é没æèµå¼ï¼å¯¼è´æ¨¡æ¿é读ä¸å°ï¼æ¾ç¤ºä¸ºç©ºï¼ã |
| | | formData.value.seqNum = queueVO?.seqNum |
| | | formData.value.status = queueVO?.status |
| | | formData.value.patSrc = queueVO?.patSrc |
| | | formData.value.patMobile = queueVO?.patMobile |
| | | formData.value.patPhone = queueVO?.patPhone |
| | | formData.value.patWardDesc = queueVO?.patWardDesc |
| | | formData.value.patBedNo = queueVO?.patBedNo |
| | | formData.value.medicalCard = queueVO?.medicalCard |
| | | formData.value.outpatientNo = queueVO?.outpatientNo |
| | | // éæ±1ï¼å»å±å·ï¼æ¤å 3 ä¸ªé¢æ¿é½éæ¼äºè¯¥å段çèµå¼ï¼å¯¼è´ PatientInfoBlock ææ¾ç¤º '-'ï¼ |
| | | formData.value.doctorAdviceNo = queueVO?.doctorAdviceNo |
| | | formData.value.patIdentityId = queueVO?.patIdentityId |
| | | getFreeRentInfo(formData.value) |
| | | copyBarcode() |
| | | } |
| | |
| | | remark: undefined, |
| | | patDetails: undefined, |
| | | paid: undefined, |
| | | doctorAdviceNo: undefined, |
| | | roomId: props.room.roomId, |
| | | bedNo: props.room.bedNo |
| | | } |
| | |
| | | import QueuePanel from "@/views/ecg/doctor/components/QueuePanel.vue"; |
| | | import {DoctorApi, PatientStatisticVO, RoomBedVO} from '@/api/ecg/doctor'; |
| | | import {QueueVO} from "@/api/ecg/queue"; |
| | | import {ElNotification} from "element-plus"; |
| | | import {ElMessage, ElMessageBox, ElNotification} from "element-plus"; |
| | | import DevReadyPanel from "@/views/ecg/doctor/components/DevReadyPanel.vue"; |
| | | import {useRoomStore} from "@/store/modules/room"; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // ==================== éæ±3ï¼åæ¢åè¯å¼å
³ ==================== |
| | | // å¼å¯åãå·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
人ãï¼å
³é忢å¤ã |
| | | const stopReady = ref<boolean>(false) |
| | | const stopReadyFlag = ref<boolean>(true) |
| | | |
| | | const loadStopReady = async () => { |
| | | try { |
| | | stopReady.value = await DoctorApi.getStopReady(roomBedVO) |
| | | } catch (e) { |
| | | // æ¥è¯¢å¤±è´¥ä¸ææè½®è¯¢ |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const onStopReadyChange = async (val: boolean) => { |
| | | stopReadyFlag.value = true |
| | | try { |
| | | if (val) { |
| | | await DoctorApi.stopReady(roomBedVO) |
| | | ElMessage.success('已忢åè¯ï¼ä¸åæ¥æ¶æ°çåè¯æ£è
ï¼å·²ææ£è
ä»å¯æ£å¸¸å«å·') |
| | | } else { |
| | | await DoctorApi.resumeReady(roomBedVO) |
| | | ElMessage.success('å·²æ¢å¤åè¯ï¼å¼å§æ¥æ¶æ°çåè¯æ£è
') |
| | | } |
| | | await initLoad() |
| | | } catch (e) { |
| | | stopReady.value = !val |
| | | } finally { |
| | | stopReadyFlag.value = false |
| | | } |
| | | } |
| | | |
| | | // ==================== éæ±2ï¼æ¤éå«å· / æ¤éæ£æ¥å®æ ==================== |
| | | const undoFlag = ref<boolean>(false) |
| | | |
| | | const undoCall = async () => { |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | 'ç¡®å®è¦æ¤éæ¬æ¬¡å«å·åï¼è¯¥æ£è
å°åå°åè¯åºï¼å¯éæ°å«å·ã', |
| | | 'æ¤éå«å·', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoCallPatient(roomBedVO) |
| | | ElMessage.success(msg || 'å·²æ¤éå«å·') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const undoFinish = async () => { |
| | | const last = await DoctorApi.lastFinishedPatient(roomBedVO) |
| | | if (!last || !last.patId) { |
| | | ElMessage.warning('æ¬å·¥ä½ä»æ¥ææ å·²å®æçæ£æ¥è®°å½') |
| | | return |
| | | } |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `ç¡®å®æ¤éã${last.patName || last.patId}ãçæ£æ¥å®æåï¼è¯¥æ£è
å°åå°åè¯åºã`, |
| | | 'æ¤éæ£æ¥å®æ', |
| | | { type: 'warning', confirmButtonText: 'ç¡®å®æ¤é', cancelButtonText: 'åæ¶' } |
| | | ) |
| | | } catch { |
| | | return |
| | | } |
| | | undoFlag.value = true |
| | | try { |
| | | const msg = await DoctorApi.undoFinishPatient({ |
| | | ...roomBedVO, |
| | | patId: last.patId, |
| | | checkType: last.bookCheckType |
| | | } as any) |
| | | ElMessage.success(msg || 'å·²æ¤éæ£æ¥å®æ') |
| | | await initLoad() |
| | | } finally { |
| | | undoFlag.value = false |
| | | } |
| | | } |
| | | |
| | | const callAgain = async () => { |
| | | await DoctorApi.callPatientAgain(roomBedVO) |
| | | } |
| | |
| | | state.value = true |
| | | else if (queueVO2.status === 30) // å·¥ä½ç¶æ æå |
| | | state.value = false |
| | | // éæ±3ï¼åæ¥"忢åè¯"å¼å
³ç¶æ |
| | | await loadStopReady() |
| | | } |
| | | |
| | | const bedControl = async () => { |
| | |
| | | <el-button :disabled="passFlag" type="primary" @click="passNextPatient">è¿å·</el-button> |
| | | <el-button type="primary" @click="callAgain">éå«</el-button> |
| | | <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{state?'æå':'æ¢å¤'}}</el-button> |
| | | <!-- éæ±3ï¼åæ¢åè¯å¼å
³ï¼å·²æåè¯ç
人继ç»å«å·ï¼ä½ä¸åæ°å¢åè¯ç
äººï¼ --> |
| | | <el-switch |
| | | v-model="stopReady" |
| | | :disabled="stopReadyFlag" |
| | | active-text="忢åè¯" |
| | | inactive-text="æ£å¸¸æ¥è¯" |
| | | inline-prompt |
| | | style="margin-left: 12px; --el-switch-on-color: #e6a23c" |
| | | @change="onStopReadyChange" |
| | | /> |
| | | <!-- éæ±2ï¼æ¤é误ç¹å«å· / æ¤éæ£æ¥å®æï¼ååå°åè¯åºï¼ --> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">æ¤éå«å·</el-button> |
| | | <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">æ¤é宿</el-button> |
| | | </el-container> |
| | | </el-container> |
| | | </template> |
| | |
| | | <el-table-column label="设å¤ç¼å·" align="center" prop="devId" /> |
| | | <el-table-column label="æ£è
ç¼å·" align="center" prop="patId" /> |
| | | <el-table-column label="æ£è
åç§°" align="center" prop="patName" /> |
| | | <!-- éæ±1ï¼é¨è¯å· + å»å±å·ï¼æ¤åè¿ä¸¤ä¸ªé¡µé¢éæ¼äºè¯¥åï¼æ¬æ¬¡è¡¥é½ï¼ |
| | | æ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼ï¼medical_card å
¨åºä¸ºç©ºï¼ |
| | | 该åå®é
æ¾ç¤º outpatient_noï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ã --> |
| | | <el-table-column label="é¨è¯å·" align="center" min-width="140px"> |
| | | <template #default="scope"> |
| | | <span>{{ resolveCardNo(scope.row).value }}</span> |
| | | <el-tag v-if="resolveCardNo(scope.row).from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ resolveCardNo(scope.row).from }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å»å±å·" align="center" prop="doctorAdviceNo" min-width="110px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.doctorAdviceNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- éæ±1ï¼è¡¥é½æ£è
ä¿¡æ¯ï¼å端 JobRecordDO å·²æ©å段并æ rentId æ¹éåå¡«ï¼ --> |
| | | <el-table-column label="æ§å«" align="center" width="70px"> |
| | | <template #default="scope"> |
| | | <!-- 1ç·/2女ï¼0 æç¼ºå¤±ï¼HIS æªæä¾ï¼æ¾ç¤º"æªç¥" --> |
| | | <dict-tag v-if="scope.row.patGender === 1 || scope.row.patGender === 2" |
| | | :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" /> |
| | | <span v-else>æªç¥</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºçæ¥æ" align="center" width="110px"> |
| | | <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" width="80px"> |
| | | <template #default="scope">{{ formatAge(scope.row.patBirthday) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¥æº" align="center" width="90px"> |
| | | <template #default="scope"> |
| | | <dict-tag v-if="scope.row.patSrc !== undefined && scope.row.patSrc !== null" |
| | | :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" /> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç
åº" align="center" min-width="110px"> |
| | | <template #default="scope">{{ scope.row.patWardDesc || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="ç
åºå·" align="center" width="90px"> |
| | | <template #default="scope">{{ scope.row.patBedNo || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
çµè¯" align="center" min-width="120px"> |
| | | <template #default="scope">{{ scope.row.patMobile || scope.row.patPhone || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åæ¥æ" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è·ä»å¤©æ°" align="center" width="90px"> |
| | | <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åå»å¸" align="center" min-width="100px"> |
| | | <template #default="scope">{{ scope.row.doctor || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¤è" align="center" width="110px"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ä½ä¸æ¶é´" |
| | | align="center" |
| | |
| | | import download from '@/utils/download' |
| | | import { JobRecordApi, JobRecordVO } from '@/api/ecg/jobrecord' |
| | | import JobRecordForm from './JobRecordForm.vue' |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项ï¼åå
¸ + å¹´é¾/è·ä»å¤©æ°ç宿¶è®¡ç®ï¼ |
| | | import { DICT_TYPE } from '@/utils/dict' |
| | | import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo' |
| | | |
| | | /** å·¥ä½è®°å½ å表ï¼å½åæªè¢«ä»»ä½èå/代ç å¼ç¨ï¼ä¿çå¤ç¨ï¼ */ |
| | | // å name 为 'JobRecord'ï¼ä¸ JobStatistic.vue éåï¼åè
æ¯èå 2839 å¯ä¸å¨ç¨ç页é¢ï¼ã |
| | |
| | | <!-- <el-table-column label="id" align="center" prop="id" />--> |
| | | <el-table-column label="å°±è¯æµæ°´å·" align="center" prop="episodeId" min-width="110px"/> |
| | | <el-table-column label="ç³è¯·å·" align="center" prop="applyNo" min-width="110px"/> |
| | | <el-table-column label="æéåºå·" align="center" prop="seqNum" /> |
| | | <el-table-column label="é¢çº¦å·" align="center" prop="bookSeqNum" /> |
| | | <el-table-column label="æ£è
ç¼å·" align="center" prop="patId" /> |
| | | <el-table-column label="æ£è
å§å" align="center" min-width="160px"> |
| | | <!-- æ¬åæ ç¾ç±ãå°±è¯å¡å·ãæ¹ä¸ºãé¨è¯å·ãï¼ç»ç¡®è®¤ï¼ãåå ï¼è¯¦è§ãé¨ç½²æ¸
åã5.1ï¼ï¼ |
| | | HIS å¨å¡å·æ§½ä½ä¼ 空ï¼medical_card å
¨åº 159,116 è¡**æ ä¸é空**ï¼ |
| | | 宿µè¯¥å 99.9% æ¾ç¤ºçæ¯ outpatient_noï¼65% å½¢å¦èº«ä»½è¯ã35% 为é¨è¯å·ï¼ã |
| | | resolveCardNo 仿å¼å½¢æç»åº**æ¥æºæ 注**ï¼èº«ä»½è¯/ä½é¢å·/é¨è¯å·ï¼ã --> |
| | | <el-table-column label="é¨è¯å·" align="center" min-width="140px"> |
| | | <template #default="scope"> |
| | | {{scope.row.patName}} ({{genderFormat(scope.row.patGender)}}) |
| | | <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patDetails?.source" /> |
| | | <span>{{ resolveCardNo(scope.row).value }}</span> |
| | | <el-tag v-if="resolveCardNo(scope.row).from" size="small" type="info" effect="plain" class="ml-1"> |
| | | {{ resolveCardNo(scope.row).from }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éæ±1ï¼å»å±å·ï¼HIS observationRequest.id.item[root=2.16.156.10011.1.28]ï¼ã |
| | | 该èç¹å¨è§èä¸éå¿
须项ï¼å岿°æ®ï¼æ°å¢åä¹åééçï¼ä¸ºç©ºï¼æ¾ç¤º '-'ã --> |
| | | <el-table-column label="å»å±å·" align="center" prop="doctorAdviceNo" min-width="110px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.doctorAdviceNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
å§å" align="center" prop="patName" min-width="90px" /> |
| | | <el-table-column label="æ§å«" align="center" prop="patGender" width="70px"> |
| | | <template #default="scope">{{ genderFormat(scope.row.patGender) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¥æº" align="center" width="90px"> |
| | | <template #default="scope"> |
| | | <!-- ä¼å
ç¨é¢çº¦åå¹³éºå¼ï¼åéå° patDetails å¿«ç
§ --> |
| | | <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" |
| | | :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºçæ¥æ" align="center" min-width="110px"> |
| | | <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" width="80px"> |
| | | <template #default="scope">{{ formatAge(scope.row.patBirthday) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£æ¥ç±»å" align="center" prop="bookCheckType" min-width="100px"> |
| | | <template #default="scope"> |
| | | {{getCheckTypeName(scope.row.bookCheckType)}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
详æ
" align="center" prop="patDetails" min-width="300px"> |
| | | <el-table-column label="ç
åº" align="center" min-width="110px"> |
| | | <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="ç
åºå·" align="center" width="90px"> |
| | | <template #default="scope"> |
| | | <span>{{scope.row.patDetails?.mobile}} {{scope.row.patDetails?.wardDesc}} {{scope.row.patDetails?.bedNo}}</span> |
| | | <!-- 注æï¼scope.row.bedNo æ¯ãè¯çåºã(å·¥ä½)ï¼ä¸æ¯ç
åºå·ï¼ |
| | | ç
åºå·å patBedNo / patDetails.bedNo --> |
| | | {{ scope.row.patBedNo || scope.row.patDetails?.bedNo || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
çµè¯" align="center" min-width="120px"> |
| | | <template #default="scope"> |
| | | {{ scope.row.patMobile || scope.row.patPhone || scope.row.patDetails?.mobile || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç»è®°æ¶é´" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.registerDate) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åæ¥æ" align="center" min-width="150px"> |
| | | <template #default="scope">{{ formatDateTime(scope.row.doctorTime) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="è·ä»å¤©æ°" align="center" width="90px"> |
| | | <template #default="scope">{{ formatDaysFromOrder(scope.row.doctorTime) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼åå»å¸" align="center" prop="doctor" min-width="100px"> |
| | | <template #default="scope">{{ scope.row.doctor || '-' }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="é¢çº¦æ¶æ®µ" align="center" prop="bookTimeslot" min-width="100px"> |
| | | <template #default="scope"> |
| | |
| | | <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="é¢çº¦å·" align="center" prop="bookSeqNum" /> |
| | | <el-table-column label="æéå·" align="center" prop="seqNum" /> |
| | | <el-table-column label="å¤èè¯" width="150" align="center" prop="tolerance" > |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ecg_tolerance" :value="scope.row.tolerance" /> |
| | | <!-- éæ±6ï¼å¤èèµ°åå
¸ï¼NULL æ"æ "æ¾ç¤ºï¼Q12ï¼ --> |
| | | <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="VIP" align="center" prop="isVip" /> |
| | |
| | | import AppointmentForm from "@/views/ecg/appointment/AppointmentForm.vue"; |
| | | import {genderFormat} from "@/utils/stringUtil"; |
| | | import {getCheckTypeName} from "../../../utils/checkTypeFormatter"; |
| | | // éæ±1ï¼æ£è
ä¿¡æ¯ 18 项çå
Œ
±æ ¼å¼åï¼å¹´é¾ãè·ä»å¤©æ°çï¼ |
| | | import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo' |
| | | |
| | | /** æé å表 */ |
| | | defineOptions({ name: 'queue' }) |