diff --git a/admin/src/views/consumer/prescription/order_list.vue b/admin/src/views/consumer/prescription/order_list.vue index cf5c8e2b..6dbb4947 100644 --- a/admin/src/views/consumer/prescription/order_list.vue +++ b/admin/src/views/consumer/prescription/order_list.vue @@ -3953,10 +3953,14 @@ const detailLinkedPayOrders = computed(() => { return Array.isArray(arr) ? arr : [] }) -/** 需代收:业务订单总金额 − 关联已付总额 */ +/** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 − 关联已付总额 */ const detailAgencyToCollect = computed(() => { const d = detailData.value if (!d) return 0 + const snap = d.agency_collect_amount + if (snap !== null && snap !== undefined && snap !== '') { + return Number(snap) || 0 + } const total = Number(d.amount) || 0 const paid = Number(d.linked_pay_paid_total) || 0 return Math.round((total - paid) * 100) / 100 diff --git a/admin/src/views/consumer/prescription/order_list_h5.vue b/admin/src/views/consumer/prescription/order_list_h5.vue index 5685180d..f7745696 100644 --- a/admin/src/views/consumer/prescription/order_list_h5.vue +++ b/admin/src/views/consumer/prescription/order_list_h5.vue @@ -3492,10 +3492,14 @@ const detailLinkedPayOrders = computed(() => { return Array.isArray(arr) ? arr : [] }) -/** 需代收:业务订单总金额 − 关联已付总额 */ +/** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 − 关联已付总额 */ const detailAgencyToCollect = computed(() => { const d = detailData.value if (!d) return 0 + const snap = d.agency_collect_amount + if (snap !== null && snap !== undefined && snap !== '') { + return Number(snap) || 0 + } const total = Number(d.amount) || 0 const paid = Number(d.linked_pay_paid_total) || 0 return Math.round((total - paid) * 100) / 100 diff --git a/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue b/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue index 11a10587..459302ea 100644 --- a/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue +++ b/admin/src/views/tcm/diagnosis/components/PatientOrderList.vue @@ -415,6 +415,10 @@ const detailLinkedPayOrders = computed(() => { const detailAgencyToCollect = computed(() => { const d = detailData.value if (!d) return 0 + const snap = d.agency_collect_amount + if (snap !== null && snap !== undefined && snap !== '') { + return Number(snap) || 0 + } const total = Number(d.amount) || 0 const paid = Number(d.linked_pay_paid_total) || 0 return Math.round((total - paid) * 100) / 100 diff --git a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php index 0aef9343..933aaf81 100755 --- a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php +++ b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php @@ -696,6 +696,8 @@ class PrescriptionOrderLogic { PrescriptionOrderPayOrder::where('prescription_order_id', (int) $order->id)->delete(); $order->linked_pay_order_id = null; + // 解除关联后刷新「需代收」固定快照(已付归零 → 需代收=总金额) + self::refreshAgencyCollectSnapshot((int) $order->id); } /** @@ -837,6 +839,35 @@ class PrescriptionOrderLogic $arr['deposit_min_amount'] = self::depositMinAmount(); } + /** + * 刷新「需代收」固定快照:按当前 总金额 − 关联已付总额(支付单 status ∈ {2 已支付, 5 待审核})写入 agency_collect_amount。 + * 在关联/新增支付单、建单、改总金额、解除关联等写操作末尾调用;之后退款/审核状态变化不再影响该值。 + */ + private static function refreshAgencyCollectSnapshot(int $id): void + { + if ($id <= 0) { + return; + } + $order = PrescriptionOrder::where('id', $id)->whereNull('delete_time')->find(); + if (!$order) { + return; + } + $amount = round((float) $order->amount, 2); + $paid = 0.0; + $ids = self::linkedPayOrderIdList($id); + if ($ids !== []) { + $payOrders = Order::whereIn('id', $ids)->whereNull('delete_time')->field(['amount', 'status'])->select(); + foreach ($payOrders as $po) { + $st = (int) $po->status; + if ($st === 2 || $st === 5) { + $paid += (float) $po->amount; + } + } + } + $order->agency_collect_amount = round($amount - $paid, 2); + $order->save(); + } + /** * @param array $params * @return array|false @@ -969,7 +1000,9 @@ class PrescriptionOrderLogic self::replacePayOrderLinks((int) $order->id, $payOrderIds); } - $out = $order->toArray(); + self::refreshAgencyCollectSnapshot((int) $order->id); + + $out = PrescriptionOrder::where('id', (int) $order->id)->find()->toArray(); self::maskInternalCostIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo); self::attachLinkedPayOrders($out); @@ -1685,7 +1718,9 @@ class PrescriptionOrderLogic self::writeLog((int) $order->id, $adminId, $adminInfo, 'edit', '编辑了业务订单及相关信息'); - $out = $order->toArray(); + self::refreshAgencyCollectSnapshot((int) $order->id); + + $out = PrescriptionOrder::where('id', (int) $order->id)->find()->toArray(); self::maskInternalCostIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo); self::attachLinkedPayOrders($out); @@ -2368,7 +2403,9 @@ class PrescriptionOrderLogic } self::writeLog($id, $adminId, $adminInfo, 'add_pay_order', $logMsg); - $out = $order->toArray(); + self::refreshAgencyCollectSnapshot($id); + + $out = PrescriptionOrder::where('id', $id)->find()->toArray(); self::maskInternalCostIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo); self::attachLinkedPayOrders($out); @@ -2479,7 +2516,9 @@ class PrescriptionOrderLogic } self::writeLog($id, $adminId, $adminInfo, 'link_pay_order', $logMsg); - $out = $order->toArray(); + self::refreshAgencyCollectSnapshot($id); + + $out = PrescriptionOrder::where('id', $id)->find()->toArray(); self::maskInternalCostIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo); self::attachLinkedPayOrders($out); @@ -3363,7 +3402,11 @@ class PrescriptionOrderLogic $item['export_refund_amount'] = $refundStored > 0 ? number_format($refundStored, 2, '.', '') : ''; - $item['export_agency_collect'] = number_format(round($amt - $paid, 2), 2, '.', ''); + // 需代收:优先用固定快照值 agency_collect_amount;历史单为 NULL 时回退实时 amt − paid + $agencySnap = $item['agency_collect_amount'] ?? null; + $item['export_agency_collect'] = ($agencySnap !== null && $agencySnap !== '') + ? number_format(round((float) $agencySnap, 2), 2, '.', '') + : number_format(round($amt - $paid, 2), 2, '.', ''); $item['export_tracking_number'] = (string) ($item['tracking_number'] ?? ''); $signTs = $poId > 0 ? (int) ($signTsByPoId[$poId] ?? 0) : 0; @@ -4097,6 +4140,9 @@ class PrescriptionOrderLogic return false; } + // 总金额变化后刷新「需代收」固定快照,保持与新总额一致 + self::refreshAgencyCollectSnapshot($id); + // 记录日志 $summary = sprintf('将订单金额从 ¥%.2f 修改为 ¥%.2f', $oldAmount, $newAmount); self::writeLog($id, $adminId, $adminInfo, 'update_amount', $summary); diff --git a/server/sql/1.9.20260605/add_prescription_order_agency_collect.sql b/server/sql/1.9.20260605/add_prescription_order_agency_collect.sql new file mode 100644 index 00000000..3d331b92 --- /dev/null +++ b/server/sql/1.9.20260605/add_prescription_order_agency_collect.sql @@ -0,0 +1,3 @@ +-- 处方业务订单:需代收固定值(关联支付单/改总金额时快照,NULL 表示按实时计算回退) +ALTER TABLE `zyt_tcm_prescription_order` + ADD COLUMN `agency_collect_amount` decimal(10,2) DEFAULT NULL COMMENT '需代收固定值(关联/改额时快照,NULL 表示按实时计算回退)' AFTER `refund_amount`;