From 1811abc794ce2af4ab7c1979d5815007fe2bd772 Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Sat, 6 Jun 2026 15:25:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=94=AF=E4=BB=98=E5=8D=95?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=96=B9=E5=BC=8F=E9=93=BE=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/prescription/order_list.vue | 47 +++++- .../consumer/prescription/order_list_h5.vue | 146 +++++++++++++----- admin/src/views/order/index.vue | 6 + .../app/adminapi/logic/order/OrderLogic.php | 55 ++++++- .../logic/tcm/PrescriptionOrderLogic.php | 10 +- 5 files changed, 207 insertions(+), 57 deletions(-) diff --git a/admin/src/views/consumer/prescription/order_list.vue b/admin/src/views/consumer/prescription/order_list.vue index d3bef406..639ebca7 100644 --- a/admin/src/views/consumer/prescription/order_list.vue +++ b/admin/src/views/consumer/prescription/order_list.vue @@ -1096,6 +1096,11 @@ 豁免 + + + + + + + + + + + + + + + - + 不申请 申请完成订单 @@ -2528,6 +2558,7 @@ import { prescriptionOrderRevokePayAudit, prescriptionOrderPatchPrescriptionPatient, prescriptionOrderLinkPayOrder, + prescriptionOrderRequestCompletion, prescriptionOrderSubmitGancaoRecipel, prescriptionOrderPreviewGancaoRecipel, prescriptionDetail, @@ -4042,7 +4073,7 @@ const editDiagnosisCreatorDeptBreadcrumbs = computed(() => { .filter((segs) => segs.length > 0) }) -const editPaidOrders = ref>([]) +const editPaidOrders = ref>([]) const editPaidOrdersLoading = ref(false) const editDepositMin = ref(0) @@ -4058,6 +4089,24 @@ function formatPoCategory(t: unknown) { return m[Number(t)] || '未知' } +function formatPayOrderSource(row: { payment_method?: unknown; create_type?: unknown }) { + const createType = String(row?.create_type || '') + if (createType === 'wechat_work') return '企业微信对外收款' + if (createType === 'fubei') return '付呗' + const paymentMethod = String(row?.payment_method || '') + const methodMap: Record = { + alipay: '支付宝', + wechat: '微信', + wechat_work: '企业微信', + fubei: '付呗', + manual: '手动确认到账' + } + if (paymentMethod && methodMap[paymentMethod]) { + return methodMap[paymentMethod] + } + return '普通订单' +} + const editLinkedPaidTotal = computed(() => { const ids = new Set(editForm.pay_order_ids.map((x) => Number(x))) let s = 0 @@ -4899,8 +4948,14 @@ const addPayOrderRowId = ref(0) const addPayOrderFormRef = ref() const addPayOrderAvailableLoading = ref(false) const addPayOrderAvailableList = ref([]) +const addPayOrderAlertTitle = computed(() => { + if (addPayOrderForm.add_mode === 'completion_only') { + return '不创建或关联支付单,仅提交完单申请,由审核人员在支付审核时处理。' + } + return '可以通过付呗创建新支付单,或关联已存在但未绑定的支付单。' +}) const addPayOrderForm = reactive({ - add_mode: 'create' as 'create' | 'link', + add_mode: 'create' as 'create' | 'link' | 'completion_only', order_type: 3, pay_amount: undefined as number | undefined, pay_remark: '', @@ -4908,38 +4963,44 @@ const addPayOrderForm = reactive({ completion_request: 0 }) -const addPayOrderRules: FormRules = { - add_mode: [{ required: true, message: '请选择添加方式', trigger: 'change' }], - order_type: [{ required: true, message: '请选择费用类别', trigger: 'change' }], - pay_amount: [ - { required: true, message: '请输入支付金额', trigger: 'blur' }, - { - validator: (_rule, v, cb) => { - const n = Number(v) - if (!Number.isFinite(n) || n <= 0) { - cb(new Error('金额须大于 0')) - } else { - cb() - } - }, - trigger: 'blur' - } - ], - link_pay_order_ids: [ - { - required: true, - message: '请至少选择一个支付单', - trigger: 'change', - validator: (_rule, v, cb) => { - if (!Array.isArray(v) || v.length === 0) { - cb(new Error('请至少选择一个支付单')) - } else { - cb() +const addPayOrderRules = computed(() => { + const rules: FormRules = { + add_mode: [{ required: true, message: '请选择添加方式', trigger: 'change' }] + } + if (addPayOrderForm.add_mode === 'create') { + rules.order_type = [{ required: true, message: '请选择费用类别', trigger: 'change' }] + rules.pay_amount = [ + { required: true, message: '请输入支付金额', trigger: 'blur' }, + { + validator: (_rule, v, cb) => { + const n = Number(v) + if (!Number.isFinite(n) || n <= 0) { + cb(new Error('金额须大于 0')) + } else { + cb() + } + }, + trigger: 'blur' + } + ] + } else if (addPayOrderForm.add_mode === 'link') { + rules.link_pay_order_ids = [ + { + required: true, + message: '请至少选择一个支付单', + trigger: 'change', + validator: (_rule, v, cb) => { + if (!Array.isArray(v) || v.length === 0) { + cb(new Error('请至少选择一个支付单')) + } else { + cb() + } } } - } - ] -} + ] + } + return rules +}) async function loadAddPayOrderAvailable(diagnosisId: number, currentLinkedIds: number[] = []) { if (!diagnosisId) { @@ -4987,7 +5048,10 @@ async function submitAddPayOrder() { await addPayOrderFormRef.value.validate() addPayOrderSaving.value = true try { - if (addPayOrderForm.add_mode === 'create') { + if (addPayOrderForm.add_mode === 'completion_only') { + await prescriptionOrderRequestCompletion({ id: addPayOrderRowId.value }) + feedback.msgSuccess('完单申请已提交,请等待支付审核') + } else if (addPayOrderForm.add_mode === 'create') { // 手动创建新支付单 await prescriptionOrderAddPayOrder({ id: addPayOrderRowId.value, diff --git a/admin/src/views/order/index.vue b/admin/src/views/order/index.vue index 8f37fc88..d4f1484b 100644 --- a/admin/src/views/order/index.vue +++ b/admin/src/views/order/index.vue @@ -1257,6 +1257,12 @@ const getCreateTypeText = (row: any) => { fubei: '付呗' } const ct = row?.create_type + if (ct === 'wechat_work' || ct === 'fubei') { + return createTypeMap[ct] + } + if (ct === 'normal' && row?.payment_method) { + return getPaymentMethodText(row.payment_method) + } if (ct && createTypeMap[ct]) { return createTypeMap[ct] } diff --git a/server/app/adminapi/logic/order/OrderLogic.php b/server/app/adminapi/logic/order/OrderLogic.php index b84cb31a..d302472b 100755 --- a/server/app/adminapi/logic/order/OrderLogic.php +++ b/server/app/adminapi/logic/order/OrderLogic.php @@ -22,6 +22,11 @@ use think\facade\Log; */ class OrderLogic { + /** + * 创建方式统一三值:normal 普通订单 / wechat_work 企业微信对外收款 / fubei 付呗 + */ + private const CREATE_TYPES = ['normal', 'wechat_work', 'fubei']; + /** * @notes 生成订单号 * @return string @@ -31,6 +36,34 @@ class OrderLogic return 'ORD' . date('YmdHis') . mt_rand(100000, 999999); } + private static function normalizeCreateType( + ?string $createType, + ?string $paymentMethod = null, + ?string $payeeUserid = null, + ?string $payerExternalUserid = null, + ?string $remark = null + ): string { + $raw = trim((string) $createType); + if (in_array($raw, self::CREATE_TYPES, true)) { + return $raw; + } + + $paymentMethod = trim((string) $paymentMethod); + if ($paymentMethod === 'fubei') { + return 'fubei'; + } + + if ( + trim((string) $payeeUserid) !== '' + || trim((string) $payerExternalUserid) !== '' + || str_contains((string) $remark, '企业微信') + ) { + return 'wechat_work'; + } + + return 'normal'; + } + /** * @notes 创建订单 * @param array $params @@ -43,11 +76,8 @@ class OrderLogic if (!in_array($channel, ['normal', 'fubei'], true)) { $channel = 'normal'; } - // 创建方式(三值):normal 普通订单 / wechat_work 企业微信对外收款 / fubei 付呗;非法值兜底 normal - $createType = (string)($params['create_type'] ?? 'normal'); - if (!in_array($createType, ['normal', 'wechat_work', 'fubei'], true)) { - $createType = 'normal'; - } + $paymentMethod = $channel === 'fubei' ? 'fubei' : null; + $createType = self::normalizeCreateType((string)($params['create_type'] ?? ''), $paymentMethod); $requirePaymentSlipAudit = (int)($params['require_payment_slip_audit'] ?? 0) === 1; $order = new Order(); @@ -189,6 +219,10 @@ class OrderLogic $order->payment_method = 'wechat'; $needSave = true; } + if ((string) ($order->create_type ?? '') !== 'wechat_work') { + $order->create_type = 'wechat_work'; + $needSave = true; + } if ($paymentTimeStr !== '' && (string)$order->payment_time !== $paymentTimeStr) { $order->payment_time = $paymentTimeStr; $needSave = true; @@ -241,6 +275,7 @@ class OrderLogic $order->amount = $amount; $order->status = $targetStatus; $order->payment_method = 'wechat'; + $order->create_type = 'wechat_work'; $order->payment_time = $paymentTimeStr; $order->trade_no = $tradeNo; $remark = '企业微信直接收款同步,待关联患者'; @@ -289,6 +324,7 @@ class OrderLogic $order->amount = $amount; $order->status = 2; // 已支付 $order->payment_method = 'wechat'; + $order->create_type = 'wechat_work'; $order->payment_time = date('Y-m-d H:i:s'); $order->trade_no = $tradeNo; $order->remark = '企业微信直接收款,待关联患者'; @@ -542,6 +578,13 @@ class OrderLogic $n->creator_id = $order->creator_id; $n->order_type = (int) $typeList[$i]; $n->amount = $amt; + $n->create_type = self::normalizeCreateType( + (string) ($order->create_type ?? ''), + (string) ($order->payment_method ?? ''), + (string) ($order->payee_userid ?? ''), + (string) ($order->payer_external_userid ?? ''), + (string) ($order->remark ?? '') + ); if ($st === 5) { $n->payment_method = 'fubei'; $n->status = 5; @@ -1219,7 +1262,7 @@ class OrderLogic } $rows = $q - ->field(['id', 'order_no', 'order_type', 'amount', 'status', 'create_time', 'creator_id', 'remark', 'is_exempt']) + ->field(['id', 'order_no', 'order_type', 'amount', 'status', 'create_time', 'creator_id', 'remark', 'is_exempt', 'payment_method', 'create_type']) ->order('id', 'desc') ->select() ->toArray(); diff --git a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php index 6df4ded1..cd17a002 100755 --- a/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php +++ b/server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php @@ -770,7 +770,7 @@ class PrescriptionOrderLogic return []; } $rows = Order::whereIn('id', $ids)->whereNull('delete_time') - ->field(['id', 'order_no', 'order_type', 'amount', 'status', 'create_time', 'creator_id', 'remark', 'is_exempt']) + ->field(['id', 'order_no', 'order_type', 'amount', 'status', 'create_time', 'creator_id', 'remark', 'is_exempt', 'payment_method', 'create_type']) ->order('id', 'asc') ->whereIn('status', [2, 4, 5]) ->select() @@ -2264,12 +2264,16 @@ class PrescriptionOrderLogic $order->payment_slip_audit_remark = ''; self::syncFulfillmentStatus($order); - // 将关联的已支付支付单(status=2,且payment_method='manual')恢复为待审核(status=5) + // 将关联的已支付补齐支付单恢复为待审核:兼容旧 manual 与新 fubei/create_type=fubei 两种标记 $payOrderIds = self::linkedPayOrderIdList($id); if (!empty($payOrderIds)) { Order::whereIn('id', $payOrderIds) ->where('status', 2) // 只恢复已支付状态的 - ->where('payment_method', 'manual') // 只恢复手动创建的 + ->where(function ($query) { + $query->where('payment_method', 'manual') + ->whereOr('payment_method', 'fubei') + ->whereOr('create_type', 'fubei'); + }) ->update([ 'status' => 5, // 待审核 'payment_time' => null