完善支付单创建方式链路

This commit is contained in:
2026-06-06 15:25:16 +08:00
parent 07abf2abca
commit 1811abc794
5 changed files with 207 additions and 57 deletions
+49 -6
View File
@@ -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();
@@ -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