diff --git a/admin/src/api/tcm.ts b/admin/src/api/tcm.ts index 9250a78a..47ef6cf6 100644 --- a/admin/src/api/tcm.ts +++ b/admin/src/api/tcm.ts @@ -481,7 +481,7 @@ export function prescriptionOrderLogs(params: { id: number }) { } /** 修改订单金额 */ -export function prescriptionOrderUpdateAmount(params: { id: number; amount_update: number }) { +export function prescriptionOrderUpdateAmount(params: { id: number; amount: number }) { return request.post({ url: '/tcm.prescriptionOrder/updateAmount', params }) } diff --git a/admin/src/views/consumer/prescription/order_list.vue b/admin/src/views/consumer/prescription/order_list.vue index f9ef43ee..6273ae01 100644 --- a/admin/src/views/consumer/prescription/order_list.vue +++ b/admin/src/views/consumer/prescription/order_list.vue @@ -1216,9 +1216,9 @@
¥{{ formatMoney(detailData?.amount) }}
- + () const updateAmountForm = reactive({ id: 0, - amount_update: undefined as number | undefined + amount: undefined as number | undefined }) const updateAmountRules: FormRules = { - amount_update: [ + amount: [ { required: true, message: '请输入订单金额', trigger: 'blur' }, { validator: (_rule, value, callback) => { @@ -3496,7 +3496,7 @@ function resetPatchRxPatientForm() { function resetUpdateAmountDialog() { updateAmountForm.id = 0 - updateAmountForm.amount_update = undefined + updateAmountForm.amount = undefined updateAmountFormRef.value?.clearValidate() } @@ -3507,7 +3507,7 @@ function openUpdateAmount() { return } updateAmountForm.id = Number(row?.id) || 0 - updateAmountForm.amount_update = Number(row?.amount) || undefined + updateAmountForm.amount = Number(row?.amount) || undefined updateAmountVisible.value = true nextTick(() => updateAmountFormRef.value?.clearValidate()) } @@ -3568,7 +3568,7 @@ async function submitUpdateAmount() { try { await prescriptionOrderUpdateAmount({ id: orderId, - amount_update: Number(updateAmountForm.amount_update) + amount: Number(updateAmountForm.amount) }) feedback.msgSuccess('修改成功') updateAmountVisible.value = false diff --git a/admin/src/views/consumer/prescription/order_list_h5.vue b/admin/src/views/consumer/prescription/order_list_h5.vue index 4f5127be..c907ce51 100644 --- a/admin/src/views/consumer/prescription/order_list_h5.vue +++ b/admin/src/views/consumer/prescription/order_list_h5.vue @@ -677,7 +677,19 @@ -
总金额
+
+
总金额
+ + 修改 + +
¥{{ detailData.amount }}
@@ -1221,6 +1233,47 @@ + + + +
¥{{ formatMoney(detailData?.amount) }}
+
+ + + +
+ 已完成或已取消订单不可修改。提交成功后会刷新详情与操作日志。 +
+
+ +
+ ) { else if (cmd === 'withdraw') confirmWithdraw(row as any) } +function canUpdateAmount(row: { id?: number; fulfillment_status?: number } | null | undefined) { + if (!row?.id) return false + const fs = Number(row.fulfillment_status) + return fs !== 3 && fs !== 4 +} + const detailVisible = ref(false) const detailLoading = ref(false) const detailData = ref | null>(null) @@ -3344,6 +3404,29 @@ const logisticsTracePayload = ref | null>(null) const logisticsTracePhoneTail = ref('') const detailLogs = ref([]) +const updateAmountVisible = ref(false) +const updateAmountSaving = ref(false) +const updateAmountFormRef = ref() +const updateAmountForm = reactive({ + id: 0, + amount: undefined as number | undefined +}) +const updateAmountRules: FormRules = { + amount: [ + { required: true, message: '请输入订单金额', trigger: 'blur' }, + { + validator: (_rule, value, callback) => { + const num = Number(value) + if (!Number.isFinite(num) || num <= 0) { + callback(new Error('订单金额必须大于0')) + return + } + callback() + }, + trigger: 'blur' + } + ] +} function canViewPrescriptionOrderLogs() { const p = userStore.perms || [] @@ -3379,6 +3462,7 @@ function logActionText(act: string) { revoke_pay_audit: '撤回支付审核', gancao_submit: '甘草下单', patch_rx_patient: '处方患者信息', + update_amount: '修改订单金额', complete: '完成订单' } return m[act] || act @@ -3463,6 +3547,24 @@ function resetPatchRxPatientForm() { patchRxPatientForm.phone = '' } +function resetUpdateAmountDialog() { + updateAmountForm.id = 0 + updateAmountForm.amount = undefined + updateAmountFormRef.value?.clearValidate() +} + +function openUpdateAmount() { + const row = detailData.value + if (!canUpdateAmount(row)) { + feedback.msgWarning('当前订单状态不允许修改金额') + return + } + updateAmountForm.id = Number(row?.id) || 0 + updateAmountForm.amount = Number(row?.amount) || undefined + updateAmountVisible.value = true + nextTick(() => updateAmountFormRef.value?.clearValidate()) +} + async function refreshCurrentPrescriptionOrderDetail() { const id = detailData.value?.id if (!id) return @@ -3502,6 +3604,37 @@ async function submitPatchRxPatient() { } } +async function submitUpdateAmount() { + const form = updateAmountFormRef.value + if (!form) return + try { + await form.validate() + } catch { + return + } + if (!canUpdateAmount(detailData.value)) { + feedback.msgWarning('当前订单状态不允许修改金额') + return + } + const orderId = updateAmountForm.id + updateAmountSaving.value = true + try { + await prescriptionOrderUpdateAmount({ + id: orderId, + amount: Number(updateAmountForm.amount) + }) + feedback.msgSuccess('修改成功') + updateAmountVisible.value = false + await refreshCurrentPrescriptionOrderDetail() + await fetchLogs(orderId) + getLists() + } catch { + /* 拦截器已提示 */ + } finally { + updateAmountSaving.value = false + } +} + async function openDetail(id: number) { // 修复 Bug:显式彻底清空缓存,防止前一次弹窗的数据残留 detailData.value = null diff --git a/server/app/adminapi/controller/tcm/PrescriptionOrderController.php b/server/app/adminapi/controller/tcm/PrescriptionOrderController.php index 68bcdef1..c833475b 100644 --- a/server/app/adminapi/controller/tcm/PrescriptionOrderController.php +++ b/server/app/adminapi/controller/tcm/PrescriptionOrderController.php @@ -105,6 +105,17 @@ class PrescriptionOrderController extends BaseAdminController return $this->success('保存成功', $result); } + public function updateAmount() + { + $params = (new PrescriptionOrderValidate())->post()->goCheck('updateAmount'); + $result = PrescriptionOrderLogic::updateAmount($params, $this->adminId, $this->adminInfo); + if ($result === false) { + return $this->fail(PrescriptionOrderLogic::getError()); + } + + return $this->success('修改成功'); + } + /** * 修改关联处方的患者姓名与手机号(订单详情场景) */ @@ -246,21 +257,6 @@ class PrescriptionOrderController extends BaseAdminController return $this->success('', $result); } - /** - * 修改订单金额 - */ - public function updateAmount() - { - $params = (new PrescriptionOrderValidate())->post()->goCheck('updateAmount'); - $result = PrescriptionOrderLogic::updateAmount($params, $this->adminId, $this->adminInfo); - - if ($result === false) { - return $this->fail(PrescriptionOrderLogic::getError()); - } - - return $this->success('修改成功'); - } - /** * 为「已发货」订单新增一条关联支付单,并重置支付单审核状态为待审核 */ diff --git a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php index 693920fa..7ceae0ec 100644 --- a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php +++ b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php @@ -2437,18 +2437,19 @@ class PrescriptionOrderLogic */ public static function updateAmount(array $params, int $adminId, array $adminInfo): bool { + self::$error = ''; $id = (int) $params['id']; - $newAmount = round((float) $params['amount_update'], 2); + $newAmount = round((float) $params['amount'], 2); // 查询订单 - $order = PrescriptionOrder::find($id); + $order = PrescriptionOrder::where('id', $id)->whereNull('delete_time')->find(); if (!$order) { self::setError('订单不存在'); return false; } // 数据权限检查 - if (!self::checkDataScope($order->toArray(), $adminId, $adminInfo)) { + if (!self::canAccessOrder($order, $adminId, $adminInfo)) { self::setError('无权限操作此订单'); return false; } @@ -2460,16 +2461,23 @@ class PrescriptionOrderLogic } $oldAmount = round((float) $order->amount, 2); + $oldAmountCents = (int) round($oldAmount * 100); + $newAmountCents = (int) round($newAmount * 100); // 金额未变化 - if (abs($newAmount - $oldAmount) < 0.01) { + if ($newAmountCents === $oldAmountCents) { self::setError('金额未发生变化'); return false; } // 更新金额 $order->amount = $newAmount; - $order->save(); + try { + $order->save(); + } catch (\Throwable $e) { + self::setError($e->getMessage()); + return false; + } // 记录日志 $summary = sprintf('将订单金额从 ¥%.2f 修改为 ¥%.2f', $oldAmount, $newAmount); diff --git a/server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php b/server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php index 472c9437..d22a37b5 100644 --- a/server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php +++ b/server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php @@ -36,7 +36,6 @@ class PrescriptionOrderValidate extends BaseValidate 'patient_name' => 'require|max:50', 'phone' => 'require|max:20', 'phone_tail' => 'max:20|regex:/^\\d*$/', - 'amount_update' => 'require|float|gt:0', ]; protected $message = [ @@ -51,8 +50,6 @@ class PrescriptionOrderValidate extends BaseValidate 'patient_name.require' => '请输入患者姓名', 'phone.require' => '请输入手机号', 'phone_tail.regex' => '手机后四位仅支持数字', - 'amount_update.require' => '请输入订单金额', - 'amount_update.gt' => '订单金额必须大于0', ]; protected $scene = [ @@ -80,6 +77,13 @@ class PrescriptionOrderValidate extends BaseValidate 'submitGancaoRecipel' => ['id'], 'previewGancaoRecipel' => ['id'], 'patchPrescriptionPatient' => ['id', 'patient_name', 'phone'], - 'updateAmount' => ['id', 'amount_update'], + 'updateAmount' => ['id', 'amount'], ]; + + public function updateAmount(): PrescriptionOrderValidate + { + return $this->only(['id', 'amount']) + ->append('id', 'require|integer|gt:0') + ->append('amount', 'require|float|gt:0'); + } }