shish 9 часов назад
Родитель
Сommit
417a89d805

+ 19 - 3
app-hd/controllers/CgRefundController.php

@@ -4,7 +4,9 @@ namespace hd\controllers;
 
 use biz\wx\classes\WxMessageClass;
 use bizGhs\notify\classes\NotifyClass;
+use bizGhs\order\classes\OrderClass;
 use bizGhs\order\classes\RefundOrderClass;
+use bizGhs\order\services\NextDayRefundService;
 use bizHd\cg\classes\CgRefundClass;
 use bizHd\cg\classes\CgRefundItemClass;
 use bizHd\cg\services\CgRefundService;
@@ -83,9 +85,13 @@ class CgRefundController extends BaseController
         if ($cg->status == PurchaseClass::STATUS_CANCEL) {
             util::fail("订单已取消,不能申请售后");
         }
-        if (!empty($cg->clearId)) {
-            util::fail('订单已结,不能再申请售后');
+        // 配对销售单:非当天/已结清走隔天售后,不再拦截「已结不能申请」
+        $saleOrder = OrderClass::getById(intval($cg->saleId ?? 0), true);
+        if (empty($saleOrder)) {
+            util::fail('没有订单信息');
         }
+        $forceNextDay = NextDayRefundService::mustUseNextDay($saleOrder);
+        // 保留售后时限:限制花店随意申请(当天/隔天均校验)
         $payTime = $cg->payTime;
         $currentTime = strtotime($payTime);
         $now = time();
@@ -140,7 +146,17 @@ class CgRefundController extends BaseController
             if ($post['price'] <= 0) {
                 util::fail("退款金额不能小于0");
             }
-            if (bccomp($post['price'], $cg->realPrice, 2) == 1) {
+            // 隔天冲销不减实付:上限用 actPrice - 已隔天累计;当天仍对比 realPrice
+            if ($forceNextDay) {
+                $remainNext = bcsub(
+                    (string)($saleOrder->actPrice ?? $cg->actPrice ?? '0'),
+                    (string)($saleOrder->nextDayTkPrice ?? $cg->nextDayTkPrice ?? '0'),
+                    2
+                );
+                if (bccomp((string)$post['price'], $remainNext, 2) === 1) {
+                    util::fail('冲销金额超过可冲销余额');
+                }
+            } elseif (bccomp($post['price'], $cg->realPrice, 2) == 1) {
                 util::fail("退款金额超过订单金额");
             }
             $post['shopId'] = $this->shopId;

+ 7 - 2
biz-ghs/order/services/NextDayRefundService.php

@@ -70,11 +70,16 @@ class NextDayRefundService
     }
 
     /**
-     * 创建时决定是否必须按隔天冲销:已结账单不可走当天售后。
+     * 创建/审核时是否必须按隔天冲销(sameDay=0):
+     * 与 checkEligible 对齐——非当天 / 已结账单 / 挂账已结清,均不可再走当天售后。
      */
     public static function mustUseNextDay($order)
     {
-        return !empty($order) && !empty($order->clearId);
+        if (empty($order)) {
+            return false;
+        }
+        $check = self::checkEligible($order);
+        return !empty($check['ok']);
     }
 
     /**

+ 2 - 2
biz-ghs/order/services/OrderService.php

@@ -935,12 +935,12 @@ class OrderService extends BaseService
             util::fail('没有找到订单');
         }
         $sameDay = intval($post['sameDay'] ?? \bizGhs\order\classes\RefundOrderClass::SAME_DAY_YES);
-        // 已结账单强制走冲销(sameDay=0),不再拦截为「不能售后」
+        // 非当天 / 已结账 / 挂账结清 → 强制隔天售后(sameDay=0),不再拦截为「不能售后」
         if (\bizGhs\order\services\NextDayRefundService::mustUseNextDay($order)) {
             $sameDay = \bizGhs\order\classes\RefundOrderClass::SAME_DAY_NO;
             $post['sameDay'] = $sameDay;
         }
-        // 仅「当天普通售后」仍拦截已结账
+        // 兜底:仍写成当天且已结账时拦截(正常不会走到,mustUseNextDay 已覆盖)
         if ($sameDay === \bizGhs\order\classes\RefundOrderClass::SAME_DAY_YES
             && isset($order->clearId) && !empty($order->clearId)) {
             util::fail('已经结账,请按冲销处理');

+ 38 - 5
biz-ghs/order/services/RefundOrderService.php

@@ -55,10 +55,11 @@ class RefundOrderService extends BaseService
         if ($order->status == OrderClass::ORDER_STATUS_CANCEL) {
             util::fail("已取消订单,不能申请售后");
         }
-        // 隔天冲销允许已结账单;当天售后仍拦截结账
+        // 审核时若已非当天或已结清:自动转为隔天售后(不再要求驳回)
         $sameDay = intval($refund->sameDay ?? RefundOrderClass::SAME_DAY_YES);
-        if ($sameDay === RefundOrderClass::SAME_DAY_YES && isset($order->clearId) && !empty($order->clearId)) {
-            util::fail('订单已结账,请驳回,并在线下完成售后');
+        if ($sameDay === RefundOrderClass::SAME_DAY_YES && NextDayRefundService::mustUseNextDay($order)) {
+            self::convertRefundToNextDay($refund, $order);
+            $sameDay = RefundOrderClass::SAME_DAY_NO;
         }
         $currentOrderId = $order->id;
         $addTime = $order->addTime ?? '';
@@ -129,6 +130,33 @@ class RefundOrderService extends BaseService
         CgRefundClass::passRefund($cgRefund, $cg);
     }
 
+    /**
+     * 将当天售后单转为隔天冲销类型(审核跨日/已结清时调用)
+     * 同步写销售售后单与采购售后单的 sameDay、fundType;花店申请无资金弹窗时默认返余额。
+     */
+    public static function convertRefundToNextDay($refund, $order)
+    {
+        $fundType = intval($refund->fundType ?? 0);
+        if ($fundType === NextDayRefundService::FUND_UNUSED) {
+            $fundType = NextDayRefundService::FUND_BALANCE;
+        }
+        $fundType = NextDayRefundService::resolveFundType($fundType, $order, true);
+
+        $refund->sameDay = RefundOrderClass::SAME_DAY_NO;
+        $refund->fundType = $fundType;
+        $refund->save(false, ['sameDay', 'fundType']);
+
+        $cgRefundId = intval($refund->cgRefundId ?? 0);
+        if ($cgRefundId > 0) {
+            $cgRefund = CgRefundClass::getById($cgRefundId, true);
+            if (!empty($cgRefund)) {
+                $cgRefund->sameDay = CgRefundClass::SAME_DAY_NO;
+                $cgRefund->fundType = $fundType;
+                $cgRefund->save(false, ['sameDay', 'fundType']);
+            }
+        }
+    }
+
     //新增退款
     public static function addRefund($post, $order)
     {
@@ -236,7 +264,7 @@ class RefundOrderService extends BaseService
         $data['customMobile'] = $order->customMobile??'';
         $data['orderTime'] = $order->payTime??'';
 
-        // 隔天冲销:sameDay=0 + fundType;已结账单强制冲销路径(即使当天
+        // 隔天冲销:sameDay=0 + fundType;非当天/已结清强制冲销(即使创建时未传 sameDay
         $sameDay = intval($post['sameDay'] ?? RefundOrderClass::SAME_DAY_YES);
         if (NextDayRefundService::mustUseNextDay($order)) {
             $sameDay = RefundOrderClass::SAME_DAY_NO;
@@ -246,7 +274,12 @@ class RefundOrderService extends BaseService
             if (empty($check['ok'])) {
                 util::fail($check['reason'] ?? '当前订单不可隔天冲销');
             }
-            $fundType = NextDayRefundService::resolveFundType($post['fundType'] ?? 0, $order, true);
+            $fundTypeInput = intval($post['fundType'] ?? 0);
+            // 未选手选资金时默认返余额(商家弹窗会覆盖;漏传/花店申请兜底)
+            if ($fundTypeInput === NextDayRefundService::FUND_UNUSED) {
+                $fundTypeInput = NextDayRefundService::FUND_BALANCE;
+            }
+            $fundType = NextDayRefundService::resolveFundType($fundTypeInput, $order, true);
             $data['sameDay'] = RefundOrderClass::SAME_DAY_NO;
             $data['fundType'] = $fundType;
         } else {

+ 30 - 6
biz-hd/cg/services/CgRefundService.php

@@ -9,6 +9,7 @@ use biz\shop\classes\ShopClass;
 use biz\wx\classes\WxMessageClass;
 use bizGhs\order\classes\OrderClass;
 use bizGhs\order\classes\RefundOrderClass;
+use bizGhs\order\services\NextDayRefundService;
 use bizGhs\order\services\RefundOrderService;
 use bizGhs\product\classes\ProductClass;
 use bizGhs\stock\classes\StockRecordClass;
@@ -42,14 +43,32 @@ class CgRefundService extends BaseService
         RefundOrderClass::cancelRefund($saleRefund);
     }
 
+    /**
+     * 花店申请售后:先判销售单是否须隔天(非当天/已结清),两端成对写 sameDay/fundType
+     */
     public static function createOrder($cgData, $cg)
     {
-        $respond = self::addRefund($cgData, $cg);
         $saleId = $cg->saleId ?? 0;
         $order = OrderClass::getById($saleId, true);
         if (empty($order)) {
             util::fail('没有订单信息');
         }
+
+        // 非当天 / 已结账 / 挂账结清 → 申请即写隔天售后;无资金弹窗时默认返余额
+        $sameDay = CgRefundClass::SAME_DAY_YES;
+        $fundType = NextDayRefundService::FUND_UNUSED;
+        if (NextDayRefundService::mustUseNextDay($order)) {
+            $sameDay = CgRefundClass::SAME_DAY_NO;
+            $fundType = NextDayRefundService::resolveFundType(
+                NextDayRefundService::FUND_BALANCE,
+                $order,
+                true
+            );
+        }
+        $cgData['sameDay'] = $sameDay;
+        $cgData['fundType'] = $fundType;
+
+        $respond = self::addRefund($cgData, $cg);
         $remark = $cgData['remark'] ?? '';
         $price = $cgData['price'] ?? 0;
         $refundType = $cgData['refundType'] ?? 1;
@@ -84,11 +103,11 @@ class CgRefundService extends BaseService
                 $ssPtItemId = $ss['itemId'] ?? 0;
                 $saleMap[$ssPtItemId] = $ssId;
             }
-            foreach ($cgProductList as $cg) {
-                if (isset($cg['productId']) == false) {
+            foreach ($cgProductList as $cgItem) {
+                if (isset($cgItem['productId']) == false) {
                     util::fail('花材有问题呢');
                 }
-                $productId = $cg['productId'];
+                $productId = $cgItem['productId'];
                 if (isset($cgMap[$productId]) == false) {
                     util::fail('花材有问题哈');
                 }
@@ -97,8 +116,8 @@ class CgRefundService extends BaseService
                     util::fail('花材有问题哦');
                 }
                 $newProductId = $saleMap[$ptItemId];
-                $cg['productId'] = $newProductId;
-                $newProductList[] = $cg;
+                $cgItem['productId'] = $newProductId;
+                $newProductList[] = $cgItem;
             }
         }
 
@@ -111,13 +130,18 @@ class CgRefundService extends BaseService
             'shopId' => $shopId,
             'mainId' => $mainId,
             'product' => $newProductList,
+            'sameDay' => $sameDay,
+            'fundType' => $fundType,
         ];
         $cgRefundId = $respond->id ?? 0;
         $saleRefund = RefundOrderService::addRefund($orderData, $order);
         $saleRefund->cgRefundId = $cgRefundId;
         $saleRefund->save();
         $saleRefundId = $saleRefund->id ?? 0;
+        // 与销售侧最终 sameDay/fundType 对齐(addRefund 内可能再次强制隔天)
         $respond->saleRefundId = $saleRefundId;
+        $respond->sameDay = intval($saleRefund->sameDay ?? $sameDay);
+        $respond->fundType = intval($saleRefund->fundType ?? $fundType);
         $respond->save();
         return $respond;
     }