shish hace 2 meses
padre
commit
eb208443eb
Se han modificado 2 ficheros con 113 adiciones y 48 borrados
  1. 50 38
      biz-ghs/order/classes/OrderClass.php
  2. 63 10
      biz-hd/purchase/classes/PurchaseClass.php

+ 50 - 38
biz-ghs/order/classes/OrderClass.php

@@ -23,7 +23,6 @@ use biz\stat\classes\StatSaleClass;
 use bizGhs\express\services\DadaExpressServices;
 use bizGhs\order\traits\OrderTrait;
 use bizGhs\order\models\Order;
-use bizGhs\order\models\OrderMerge;
 use bizGhs\product\classes\ProductClass;
 use bizGhs\admin\classes\AdminClass;
 use bizGhs\custom\classes\CustomClass;
@@ -3204,37 +3203,39 @@ XL;
                 $order->save();
                 OrderMergeClass::add(['mergeId' => $hasMergeId, 'orderId' => $orderId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId]);
             } else {
-                $mergeData = ['mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
-                $mergeId = orderSn::getGhsOrderMergeId($mergeData);
-                self::updateByIds($ids, ['mergeId' => $mergeId]);
-                $addData = [];
-                foreach ($ids as $currentId) {
-                    $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
-                }
-                OrderMergeClass::batchAdd($addData);
+                self::rebuildOrderMergeGroupForDay($ids, $date, $customId, $mainId);
             }
         } else {
-            //修改
-            $oldMergeId = $order->mergeId ?? 0;
-            $oldMerge = OrderMergeSnClass::getById($oldMergeId, true);
-            $oldDate = $oldMerge->mergeDate ?? '';
-            if ($oldDate == $date) {
-                //修改前后日期一样,不需要调整
-                return false;
-            }
-            $oldMergeList = OrderMergeClass::getAllByCondition(['mergeId' => $oldMergeId], null, '*', null, true);
-            if (count($oldMergeList) <= 2) {
-                $oldMerge->delete();
-                $del = [];
-                foreach ($oldMergeList as $oldMerge) {
-                    $del[] = $oldMerge->orderId;
-                    $oldMerge->delete();
+            //修改账单日:订单 payTime 已在调用方改为新日 $date
+            $oldMergeId = (int)($order->mergeId ?? 0);
+            if ($oldMergeId > 0) {
+                $oldMergeSn = OrderMergeSnClass::getById($oldMergeId, true);
+                if (empty($oldMergeSn)) {
+                    // 订单仍挂着 mergeId,但主档已不存在,避免后续报错并清理脏数据
+                    $order->mergeId = 0;
+                    $order->save();
+                } else {
+                    $oldDate = $oldMergeSn->mergeDate ?? '';
+                    if ($oldDate == $date) {
+                        //合并组账单日与当前一致,无需调整
+                        return false;
+                    }
+                    $oldMergeList = OrderMergeClass::getAllByCondition(['mergeId' => $oldMergeId], null, '*', null, true);
+                    if (count($oldMergeList) <= 2) {
+                        //合并组内至多 2 单:整组 dissolve(与原先「只剩一单合并无意义」一致)
+                        $oldMergeSn->delete();
+                        $del = [];
+                        foreach ($oldMergeList as $mergeRow) {
+                            $del[] = $mergeRow->orderId;
+                            $mergeRow->delete();
+                        }
+                        self::updateByIds($del, ['mergeId' => 0]);
+                    } else {
+                        $order->mergeId = 0;
+                        $order->save();
+                        OrderMergeClass::deleteByCondition(['mergeId' => $oldMergeId, 'orderId' => $orderId]);
+                    }
                 }
-                OrderClass::updateByIds($del, ['mergeId' => 0]);
-            } else {
-                $order->mergeId = 0;
-                $order->save();
-                OrderMergeClass::deleteByCondition(['mergeId' => $oldMergeId, 'orderId' => $orderId]);
             }
             $hasNewMerge = OrderMergeSnClass::getByCondition(['customId' => $customId, 'mergeDate' => $date], true);
             if (!empty($hasNewMerge)) {
@@ -3242,20 +3243,31 @@ XL;
                 $order->mergeId = $newMergeId;
                 $order->save();
                 OrderMergeClass::add(['mergeId' => $newMergeId, 'orderId' => $orderId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId]);
-            }else{
-                $mergeData = ['mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
-                $mergeId = orderSn::getGhsOrderMergeId($mergeData);
-                self::updateByIds($ids, ['mergeId' => $mergeId]);
-                $addData = [];
-                foreach ($ids as $currentId) {
-                    $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
-                }
-                OrderMergeClass::batchAdd($addData);
+            } else {
+                self::rebuildOrderMergeGroupForDay($ids, $date, $customId, $mainId);
             }
         }
+
         return true;
     }
 
+    /**
+     * 指定客户、某日多单:新建合并主档,回写订单 mergeId,并批量写入 xhGhsOrderMerge。
+     *
+     * @param int[] $ids 当日同客户订单 id 列表
+     */
+    private static function rebuildOrderMergeGroupForDay(array $ids, $date, $customId, $mainId)
+    {
+        $mergeData = ['mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
+        $mergeId = orderSn::getGhsOrderMergeId($mergeData);
+        self::updateByIds($ids, ['mergeId' => $mergeId]);
+        $addData = [];
+        foreach ($ids as $currentId) {
+            $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
+        }
+        OrderMergeClass::batchAdd($addData);
+    }
+
     // 更新同天内的所有订单的 sameTimeIds
     public static function updateSameTimeIds($order, $date)
     {

+ 63 - 10
biz-hd/purchase/classes/PurchaseClass.php

@@ -67,15 +67,18 @@ class PurchaseClass extends BaseClass
     const REFUND_NO = 1;
     const REFUND_YES = 2;
 
+    //更新同一供货商、同一天的多张采购单合并 $update 0 添加 1 修改(写法对齐 OrderClass::updateMergeOrder)
     public static function updateMergeCg($cg, $update = 0)
     {
         $date = substr($cg->payTime, 0, 10);
         $ghsId = $cg->ghsId ?? 0;
         $mainId = $cg->mainId ?? 0;
-        //找到当前订单客户的账单日期为 $date 的所有订单
+        $cgId = $cg->id ?? 0;
+        //当前零售商 + 供货商 + 账单日 下的采购单
         $startTime = $date . ' 00:00:00';
         $endTime = $date . ' 23:59:59';
         $dayOrders = self::getAllByCondition([
+            'mainId' => $mainId,
             'ghsId' => $ghsId,
             'payTime' => ['between', [$startTime, $endTime]]
         ], 'id ASC', 'id');
@@ -84,23 +87,74 @@ class PurchaseClass extends BaseClass
         }
         $ids = array_column($dayOrders, 'id');
         $count = count($ids);
+
         if ($update == 0) {
             if ($count <= 1) {
                 //新增,如果当天只有一个订单,不需要操作
                 return false;
             }
+            $hasMerge = CgMergeSnClass::getByCondition(['ghsId' => $ghsId, 'mainId' => $mainId, 'mergeDate' => $date], true);
+            if (!empty($hasMerge)) {
+                $hasMergeId = $hasMerge->id ?? 0;
+                $cg->mergeId = $hasMergeId;
+                $cg->save();
+                CgMergeClass::add(['mergeId' => $hasMergeId, 'cgId' => $cgId, 'mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId]);
+            } else {
+                self::rebuildCgMergeGroupForDay($ids, $date, $ghsId, $mainId);
+            }
         } else {
-            //修改
-            $oldMergeId = $cg->mergeId ?? 0;
-            $oldMerge = CgMergeSnClass::getById($oldMergeId, true);
-            $oldDate = $oldMerge->mergeDate ?? '';
-            if ($oldDate == $date) {
-                //修改前后日期一样,不需要调整
-                return false;
+            //修改账单日:payTime 已在调用方改为新日 $date
+            $oldMergeId = (int)($cg->mergeId ?? 0);
+            if ($oldMergeId > 0) {
+                $oldMergeSn = CgMergeSnClass::getById($oldMergeId, true);
+                if (empty($oldMergeSn)) {
+                    $cg->mergeId = 0;
+                    $cg->save();
+                } else {
+                    $oldDate = $oldMergeSn->mergeDate ?? '';
+                    if ($oldDate == $date) {
+                        return false;
+                    }
+                    $oldMergeList = CgMergeClass::getAllByCondition(['mergeId' => $oldMergeId], null, '*', null, true);
+                    if (count($oldMergeList) <= 2) {
+                        $oldMergeSn->delete();
+                        $del = [];
+                        foreach ($oldMergeList as $mergeRow) {
+                            $del[] = $mergeRow->cgId;
+                            $mergeRow->delete();
+                        }
+                        self::updateByIds($del, ['mergeId' => 0]);
+                    } else {
+                        $cg->mergeId = 0;
+                        $cg->save();
+                        CgMergeClass::deleteByCondition(['mergeId' => $oldMergeId, 'cgId' => $cgId]);
+                    }
+                }
+            }
+            $hasNewMerge = CgMergeSnClass::getByCondition(['ghsId' => $ghsId, 'mainId' => $mainId, 'mergeDate' => $date], true);
+            if (!empty($hasNewMerge)) {
+                $newMergeId = $hasNewMerge->id ?? 0;
+                $cg->mergeId = $newMergeId;
+                $cg->save();
+                CgMergeClass::add(['mergeId' => $newMergeId, 'cgId' => $cgId, 'mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId]);
+            } else {
+                self::rebuildCgMergeGroupForDay($ids, $date, $ghsId, $mainId);
             }
         }
-        CgMerge::deleteAll(['cgId' => $ids]);
 
+        return true;
+    }
+
+    /**
+     * 指定零售商、供货商、某日多采购单:清理旧明细后新建合并主档,回写 mergeId,并写入 xhCgMerge。
+     *
+     * @param int[] $ids 当日同供货商采购单 id 列表
+     */
+    private static function rebuildCgMergeGroupForDay(array $ids, $date, $ghsId, $mainId)
+    {
+        if (!empty($ids)) {
+            CgMerge::deleteAll(['cgId' => $ids]);
+        }
         $mergeData = ['mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId];
         $mergeId = orderSn::getCgMergeId($mergeData);
         self::updateByIds($ids, ['mergeId' => $mergeId]);
@@ -109,7 +163,6 @@ class PurchaseClass extends BaseClass
             $addData[] = ['mergeId' => $mergeId, 'cgId' => $currentId, 'mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId];
         }
         CgMergeClass::batchAdd($addData);
-        return true;
     }
 
     //获取打包费