diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a9695518..7993c574 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -15,7 +15,8 @@ "Bash(npx eslint *)", "Bash(git *)", "Bash(tail -c 100000 /Users/long/.claude/projects/-Users-long-Work-zyt/7be9f770-afc3-497d-87a3-2ffa1fbe3fd1.jsonl)", - "Read(//tmp/**)" + "Read(//tmp/**)", + "Bash(npx --no-install vue-tsc --noEmit)" ] } } diff --git a/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue b/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue new file mode 100644 index 00000000..7e77ad55 --- /dev/null +++ b/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/admin/src/views/tcm/diagnosis/edit.vue b/admin/src/views/tcm/diagnosis/edit.vue index 2918c369..3a42f8cf 100644 --- a/admin/src/views/tcm/diagnosis/edit.vue +++ b/admin/src/views/tcm/diagnosis/edit.vue @@ -638,6 +638,22 @@ + + + + + + ['order_no'], 'between_time' => 'create_time', ]; @@ -97,6 +97,7 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn { $this->applyDoctorAssistantFilters($query); $this->applyPatientKeywordFilter($query); + $this->applyPatientIdFilter($query); $this->applyExpressCompanyFilter($query); $this->applyExpressKeywordFilter($query); $this->applySupplyModeFilter($query); @@ -440,6 +441,10 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn if ($diagIdsForAssist !== []) { $assistantByDiag = Diagnosis::whereIn('id', $diagIdsForAssist)->whereNull('delete_time')->column('assistant_id', 'id'); } + $assistantIds = array_values(array_unique(array_filter(array_map('intval', array_values($assistantByDiag))))); + $assistantNames = $assistantIds !== [] + ? \app\common\model\auth\Admin::whereIn('id', $assistantIds)->column('name', 'id') + : []; foreach ($lists as &$item) { PrescriptionOrderLogic::maskInternalCostIfNeeded($item, $this->adminInfo); PrescriptionOrderLogic::maskRemarkExtraIfNeeded($item, $this->adminInfo); @@ -456,11 +461,19 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn $this->adminInfo, $assistantByDiag ); - + // 添加创建人姓名 $creatorId = (int) ($item['creator_id'] ?? 0); $item['creator_name'] = $creatorId > 0 ? ($creatorNames[$creatorId] ?? '') : ''; - + + // 添加医助(来自诊单 assistant_id) + $diagIdForAssist = (int) ($item['diagnosis_id'] ?? 0); + $assistantIdForItem = (int) ($assistantByDiag[$diagIdForAssist] ?? 0); + $item['assistant_id'] = $assistantIdForItem; + $item['assistant_name'] = $assistantIdForItem > 0 + ? ($assistantNames[$assistantIdForItem] ?? '') + : ''; + // 添加开方人姓名、处方登记手机(与业务订单收货手机比对用) $rxId = (int) ($item['prescription_id'] ?? 0); $item['doctor_name'] = $rxId > 0 ? ($prescriptionCreators[$rxId]['doctor_name'] ?? '') : ''; @@ -831,6 +844,26 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn ); } + /** + * 按真实患者ID精确过滤(tcm_diagnosis.patient_id 是跨诊单的患者唯一ID) + * 用于诊单编辑抽屉「业务订单」tab 列出该患者所有诊单产生的处方业务订单。 + */ + private function applyPatientIdFilter($query): void + { + $patientId = (int) ($this->params['patient_id'] ?? 0); + if ($patientId <= 0) { + return; + } + + $poTbl = (new PrescriptionOrder())->getTable(); + $diagTbl = (new Diagnosis())->getTable(); + + $query->whereExists( + "SELECT 1 FROM `{$diagTbl}` dg WHERE dg.`id` = `{$poTbl}`.`diagnosis_id` " + . "AND dg.`delete_time` IS NULL AND dg.`patient_id` = {$patientId}" + ); + } + /** * 按快递单号 / 快递公司 模糊检索 */ diff --git a/server/sql/1.9.20260507/add_diagnosis_patient_orders_menu.sql b/server/sql/1.9.20260507/add_diagnosis_patient_orders_menu.sql new file mode 100644 index 00000000..1ad63e06 --- /dev/null +++ b/server/sql/1.9.20260507/add_diagnosis_patient_orders_menu.sql @@ -0,0 +1,22 @@ +# 诊单编辑抽屉「业务订单」tab:菜单按钮权限注册(2026-05-07) +# 挂在「中医诊单」(perms=tcm.diagnosis/lists) 菜单下,按钮型权限节点: +# tcm.diagnosis/patientOrders 在编辑诊单抽屉查看「业务订单」tab +# +# 说明: +# - 此权限仅控制前端 tab 可见性。 +# - tab 内拉取数据复用 /tcm.prescriptionOrder/lists 接口,因此需同时分配 +# tcm.prescriptionOrder/lists 接口权限给目标角色,否则 tab 可见但列表为空/被拦截。 + +SET @diag_menu_id := (SELECT id FROM zyt_system_menu WHERE perms = 'tcm.diagnosis/lists' LIMIT 1); + +INSERT INTO zyt_system_menu ( + pid, type, name, icon, sort, perms, paths, component, + selected, params, is_cache, is_show, is_disable, create_time, update_time +) +SELECT + @diag_menu_id, 'A', '业务订单查看', '', 70, + 'tcm.diagnosis/patientOrders', '', '', + '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +FROM DUAL +WHERE @diag_menu_id IS NOT NULL + AND NOT EXISTS (SELECT 1 FROM zyt_system_menu WHERE perms = 'tcm.diagnosis/patientOrders');