代收金额快照

This commit is contained in:
2026-06-05 17:35:49 +08:00
parent 07018598ad
commit c76bd5416a
5 changed files with 68 additions and 7 deletions
@@ -3953,10 +3953,14 @@ const detailLinkedPayOrders = computed(() => {
return Array.isArray(arr) ? arr : [] return Array.isArray(arr) ? arr : []
}) })
/** 需代收:业务订单总金额 关联已付总额 */ /** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 关联已付总额 */
const detailAgencyToCollect = computed(() => { const detailAgencyToCollect = computed(() => {
const d = detailData.value const d = detailData.value
if (!d) return 0 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 total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0 const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100 return Math.round((total - paid) * 100) / 100
@@ -3492,10 +3492,14 @@ const detailLinkedPayOrders = computed(() => {
return Array.isArray(arr) ? arr : [] return Array.isArray(arr) ? arr : []
}) })
/** 需代收:业务订单总金额 关联已付总额 */ /** 需代收:优先用关联时记录的固定快照值;历史单(无快照)回退实时计算 总金额 关联已付总额 */
const detailAgencyToCollect = computed(() => { const detailAgencyToCollect = computed(() => {
const d = detailData.value const d = detailData.value
if (!d) return 0 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 total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0 const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100 return Math.round((total - paid) * 100) / 100
@@ -415,6 +415,10 @@ const detailLinkedPayOrders = computed(() => {
const detailAgencyToCollect = computed(() => { const detailAgencyToCollect = computed(() => {
const d = detailData.value const d = detailData.value
if (!d) return 0 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 total = Number(d.amount) || 0
const paid = Number(d.linked_pay_paid_total) || 0 const paid = Number(d.linked_pay_paid_total) || 0
return Math.round((total - paid) * 100) / 100 return Math.round((total - paid) * 100) / 100
@@ -696,6 +696,8 @@ class PrescriptionOrderLogic
{ {
PrescriptionOrderPayOrder::where('prescription_order_id', (int) $order->id)->delete(); PrescriptionOrderPayOrder::where('prescription_order_id', (int) $order->id)->delete();
$order->linked_pay_order_id = null; $order->linked_pay_order_id = null;
// 解除关联后刷新「需代收」固定快照(已付归零 → 需代收=总金额)
self::refreshAgencyCollectSnapshot((int) $order->id);
} }
/** /**
@@ -837,6 +839,35 @@ class PrescriptionOrderLogic
$arr['deposit_min_amount'] = self::depositMinAmount(); $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<string,mixed> $params * @param array<string,mixed> $params
* @return array<string,mixed>|false * @return array<string,mixed>|false
@@ -969,7 +1000,9 @@ class PrescriptionOrderLogic
self::replacePayOrderLinks((int) $order->id, $payOrderIds); 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::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out); self::attachLinkedPayOrders($out);
@@ -1685,7 +1718,9 @@ class PrescriptionOrderLogic
self::writeLog((int) $order->id, $adminId, $adminInfo, 'edit', '编辑了业务订单及相关信息'); 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::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out); self::attachLinkedPayOrders($out);
@@ -2368,7 +2403,9 @@ class PrescriptionOrderLogic
} }
self::writeLog($id, $adminId, $adminInfo, 'add_pay_order', $logMsg); 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::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out); self::attachLinkedPayOrders($out);
@@ -2479,7 +2516,9 @@ class PrescriptionOrderLogic
} }
self::writeLog($id, $adminId, $adminInfo, 'link_pay_order', $logMsg); 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::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo); self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out); self::attachLinkedPayOrders($out);
@@ -3363,7 +3402,11 @@ class PrescriptionOrderLogic
$item['export_refund_amount'] = $refundStored > 0 $item['export_refund_amount'] = $refundStored > 0
? number_format($refundStored, 2, '.', '') ? 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'] ?? ''); $item['export_tracking_number'] = (string) ($item['tracking_number'] ?? '');
$signTs = $poId > 0 ? (int) ($signTsByPoId[$poId] ?? 0) : 0; $signTs = $poId > 0 ? (int) ($signTsByPoId[$poId] ?? 0) : 0;
@@ -4097,6 +4140,9 @@ class PrescriptionOrderLogic
return false; return false;
} }
// 总金额变化后刷新「需代收」固定快照,保持与新总额一致
self::refreshAgencyCollectSnapshot($id);
// 记录日志 // 记录日志
$summary = sprintf('将订单金额从 ¥%.2f 修改为 ¥%.2f', $oldAmount, $newAmount); $summary = sprintf('将订单金额从 ¥%.2f 修改为 ¥%.2f', $oldAmount, $newAmount);
self::writeLog($id, $adminId, $adminInfo, 'update_amount', $summary); self::writeLog($id, $adminId, $adminInfo, 'update_amount', $summary);
@@ -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`;