|
|
@@ -30,9 +30,34 @@ class NextDayRefundService
|
|
|
const FUND_BALANCE = 2;
|
|
|
const FUND_NONE = 3;
|
|
|
|
|
|
+ /**
|
|
|
+ * 是否有有效支付时间(售后唯一时间依据;无支付时间不能售后)
|
|
|
+ */
|
|
|
+ public static function hasValidPayTime($order)
|
|
|
+ {
|
|
|
+ if (empty($order)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ $payTime = $order->payTime ?? '';
|
|
|
+ return !empty($payTime) && $payTime !== '0000-00-00 00:00:00';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 售后入口校验:无支付时间直接拦截
|
|
|
+ */
|
|
|
+ public static function assertCanRefund($order)
|
|
|
+ {
|
|
|
+ if (empty($order)) {
|
|
|
+ util::fail('没有原订单');
|
|
|
+ }
|
|
|
+ if (!self::hasValidPayTime($order)) {
|
|
|
+ util::fail('订单无支付时间,不能售后');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 原单是否可走隔天冲销(即原「冲销」路径):
|
|
|
- * - 非当天支付;或
|
|
|
+ * - 非当天支付(仅看 payTime);或
|
|
|
* - 挂账已结清;或
|
|
|
* - 已结账单(当天已结账也按冲销处理,不走普通售后)
|
|
|
* @return array{ok:bool,reason:string,sameDay:int}
|
|
|
@@ -40,13 +65,19 @@ class NextDayRefundService
|
|
|
public static function checkEligible($order)
|
|
|
{
|
|
|
if (empty($order)) {
|
|
|
- return ['ok' => false, 'reason' => '没有原订单', 'sameDay' => self::SAME_DAY_YES];
|
|
|
+ return ['ok' => false, 'reason' => '没有原订单', 'sameDay' => self::SAME_DAY_YES, 'hasPayTime' => 0];
|
|
|
}
|
|
|
- $payTime = $order->payTime ?? ($order->addTime ?? '');
|
|
|
- $isToday = false;
|
|
|
- if (!empty($payTime) && $payTime !== '0000-00-00 00:00:00') {
|
|
|
- $isToday = date('Y-m-d', strtotime($payTime)) === date('Y-m-d');
|
|
|
+ // 只用支付时间;无支付时间本单不能售后(由 assertCanRefund 拦截)
|
|
|
+ if (!self::hasValidPayTime($order)) {
|
|
|
+ return [
|
|
|
+ 'ok' => false,
|
|
|
+ 'reason' => '订单无支付时间,不能售后',
|
|
|
+ 'sameDay' => self::SAME_DAY_YES,
|
|
|
+ 'hasPayTime' => 0,
|
|
|
+ ];
|
|
|
}
|
|
|
+ $payTime = $order->payTime;
|
|
|
+ $isToday = date('Y-m-d', strtotime($payTime)) === date('Y-m-d');
|
|
|
$debtPrice = bcadd((string)($order->debtPrice ?? '0'), '0', 2);
|
|
|
$remainDebt = bcadd((string)($order->remainDebtPrice ?? '0'), '0', 2);
|
|
|
$debtCleared = bccomp($debtPrice, '0', 2) > 0 && bccomp($remainDebt, '0', 2) === 0;
|
|
|
@@ -58,6 +89,7 @@ class NextDayRefundService
|
|
|
'ok' => false,
|
|
|
'reason' => '当天未结账订单请走普通售后;已结账/挂账结清/隔天可冲销',
|
|
|
'sameDay' => self::SAME_DAY_YES,
|
|
|
+ 'hasPayTime' => 1,
|
|
|
];
|
|
|
}
|
|
|
return [
|
|
|
@@ -66,16 +98,18 @@ class NextDayRefundService
|
|
|
'sameDay' => self::SAME_DAY_NO,
|
|
|
'suggestFundBalance' => true,
|
|
|
'orderCleared' => $orderCleared ? 1 : 0,
|
|
|
+ 'hasPayTime' => 1,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建/审核时是否必须按隔天冲销(sameDay=0):
|
|
|
* 与 checkEligible 对齐——非当天 / 已结账单 / 挂账已结清,均不可再走当天售后。
|
|
|
+ * 无支付时间返回 false(须先走 assertCanRefund)。
|
|
|
*/
|
|
|
public static function mustUseNextDay($order)
|
|
|
{
|
|
|
- if (empty($order)) {
|
|
|
+ if (!self::hasValidPayTime($order)) {
|
|
|
return false;
|
|
|
}
|
|
|
$check = self::checkEligible($order);
|