From 689a0f64a639bd032467e8ffdda09b5cb8c637eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Sun, 9 Aug 2026 14:36:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=201.=20=E5=8C=BB=E7=94=9F=E7=BA=BF?= =?UTF-8?q?=E4=B8=8B=E6=8E=A5=E8=AF=8A=E5=88=9B=E5=BB=BA=E5=B0=B1=E8=AF=8A?= =?UTF-8?q?=E4=BA=BA=E3=80=81=E6=82=A3=E8=80=85=E7=AB=AF=E6=89=AB=E7=A0=81?= =?UTF-8?q?=E8=AE=A4=E9=A2=86=E5=B0=B1=E8=AF=8A=E4=BA=BA=202.=20=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=A4=84=E6=96=B9=E5=90=8E=E5=8C=BB=E7=94=9F=E4=BB=A3?= =?UTF-8?q?=E4=BB=98=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/cells/OrderUserInfoCell.vue | 99 +++++++ .../doctor/doctor-reception/api/index.ts | 27 ++ .../components/ClaimQrcodeModal.vue | 110 +++++++ .../components/CreateUserPatientModal.vue | 276 ++++++++++++++++++ .../PatientPrescriptionHistoryDrawer.vue | 16 + .../components/ProxyPayQrcodeModal.vue | 74 +++++ .../views/doctor/doctor-reception/index.vue | 174 +++++++++-- 7 files changed, 755 insertions(+), 21 deletions(-) create mode 100644 apps/web-antd/src/views/doctor/doctor-reception/components/ClaimQrcodeModal.vue create mode 100644 apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue create mode 100644 apps/web-antd/src/views/doctor/doctor-reception/components/ProxyPayQrcodeModal.vue diff --git a/apps/web-antd/src/views/business/order/product-order/components/cells/OrderUserInfoCell.vue b/apps/web-antd/src/views/business/order/product-order/components/cells/OrderUserInfoCell.vue index 43fa971e..db4c6ae0 100644 --- a/apps/web-antd/src/views/business/order/product-order/components/cells/OrderUserInfoCell.vue +++ b/apps/web-antd/src/views/business/order/product-order/components/cells/OrderUserInfoCell.vue @@ -95,6 +95,64 @@ function handleOpenPatient() { patientName: String(patientName(props.row)), }); } + +/** 付款人类型文案:1用户 2医生 3就诊人 */ +function payUserTypeLabel(row: Record) { + const t = Number(row.pay_user_type || 0); + if (t === 2) return '医生'; + if (t === 3) return '就诊人'; + if (t === 1) return '用户'; + return '—'; +} + +/** 实际付款人用户 ID */ +function resolvePayUserId(row: Record) { + return Number(row.pay_user_id || row.pay_user?.id || 0); +} + +/** 是否展示代付行:有付款人 ID,或至少有类型(医生代付可回落医生名) */ +function hasPayUserInfo(row: Record) { + return resolvePayUserId(row) > 0 || Number(row.pay_user_type || 0) > 0; +} + +/** 代付展示名:优先 pay_user 昵称;医生代付可回落医生名 */ +function payUserDisplayName(row: Record) { + const nick = String(row.pay_user?.nickname || '').trim(); + if (nick) return nick; + if (Number(row.pay_user_type) === 2 && row.doctor?.name) { + return String(row.doctor.name); + } + if (Number(row.pay_user_type) === 3) { + return patientName(row); + } + return '—'; +} + +function getPayUserAvatarSrc(row: Record) { + const raw = String(row.pay_user?.avatarurl ?? '').trim(); + if (!raw) return defaultAvatar; + return resolveAvatarUrl(raw) || defaultAvatar; +} + +/** 点代付用户:按类型打开对应用户/医生/就诊人 */ +function handleOpenPayUser() { + const type = Number(props.row.pay_user_type || 0); + if (type === 2) { + emit('openDoctor', props.row); + return; + } + if (type === 3) { + handleOpenPatient(); + return; + } + const userId = resolvePayUserId(props.row); + if (!userId) return; + emit('openUserPatients', { + userId, + nickname: String(props.row.pay_user?.nickname || ''), + avatarurl: String(props.row.pay_user?.avatarurl || ''), + }); +} diff --git a/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts b/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts index 234c3cd5..6a5f1375 100644 --- a/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts +++ b/apps/web-antd/src/views/doctor/doctor-reception/api/index.ts @@ -547,3 +547,30 @@ export async function goldenFormulaSaveMatchApi(data: { }) { return requestClient.post(`${prefix}golden-formula-save-match`, data); } + +/** + * 医生新建就诊人并自动挂号 + * waive_register_fee=1 时免除挂号费 + */ +export async function createUserPatientApi(data: Record) { + return requestClient.post(`${prefix}create-user-patient`, data); +} + +/** 当前医生未认领就诊人列表 */ +export async function getUnclaimedUserPatientListApi() { + return requestClient.get(`${prefix}unclaimed-user-patient-list`); +} + +/** 就诊人认领小程序码(base64,不上传) */ +export async function getUserPatientClaimQrcodeApi(userPatientId: number) { + return requestClient.get(`${prefix}user-patient-claim-qrcode`, { + params: { user_patient_id: userPatientId }, + }); +} + +/** 医生代支付小程序码(患者端扫码付) */ +export async function getProxyPayQrcodeApi(orderId: number) { + return requestClient.post(`${prefix}proxy-pay-qrcode`, { + order_id: orderId, + }); +} diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/ClaimQrcodeModal.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/ClaimQrcodeModal.vue new file mode 100644 index 00000000..fb915566 --- /dev/null +++ b/apps/web-antd/src/views/doctor/doctor-reception/components/ClaimQrcodeModal.vue @@ -0,0 +1,110 @@ + + + diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue new file mode 100644 index 00000000..7470e59f --- /dev/null +++ b/apps/web-antd/src/views/doctor/doctor-reception/components/CreateUserPatientModal.vue @@ -0,0 +1,276 @@ + + + diff --git a/apps/web-antd/src/views/doctor/doctor-reception/components/PatientPrescriptionHistoryDrawer.vue b/apps/web-antd/src/views/doctor/doctor-reception/components/PatientPrescriptionHistoryDrawer.vue index c70e2b7d..89a56e1a 100644 --- a/apps/web-antd/src/views/doctor/doctor-reception/components/PatientPrescriptionHistoryDrawer.vue +++ b/apps/web-antd/src/views/doctor/doctor-reception/components/PatientPrescriptionHistoryDrawer.vue @@ -37,6 +37,8 @@ type DrawerData = { allowWithdraw?: boolean; /** 撤回成功后刷新 */ onWithdrawn?: () => void; + /** 医生代支付:打开小程序码 */ + onProxyPay?: (orderId: number) => void; }; const meta = ref({}); @@ -262,6 +264,20 @@ defineExpose({ drawerApi }); > 复用 +