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 @@
+
+
+
+
+
+
+
+
+
+
+ ¥{{ formatAmount(row.amount) }}
+
+
+
+
+ {{ row.doctor_name || '—' }}
+
+
+
+
+ {{ row.assistant_name || '—' }}
+
+
+
+
+
+ {{ fulfillmentText(row.fulfillment_status) }}
+
+
+
+
+
+ {{ formatTime(row.create_time) }}
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
['prescription_id', 'fulfillment_status', 'prescription_audit_status', 'payment_slip_audit_status'],
+ '=' => ['prescription_id', 'diagnosis_id', 'fulfillment_status', 'prescription_audit_status', 'payment_slip_audit_status'],
'%like%' => ['order_no'],
'between_time' => 'create_time',
];
@@ -96,6 +96,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);
@@ -433,6 +434,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);
@@ -449,11 +454,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'] ?? '') : '';
@@ -784,6 +797,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.20260505/add_diagnosis_patient_orders_menu.sql b/server/sql/1.9.20260505/add_diagnosis_patient_orders_menu.sql
new file mode 100644
index 00000000..1ad63e06
--- /dev/null
+++ b/server/sql/1.9.20260505/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');