Bläddra i källkod

Merge branch 'moreShare' into dev

shish 3 månader sedan
förälder
incheckning
e29e04981c
2 ändrade filer med 127 tillägg och 24 borttagningar
  1. 61 11
      biz-ghs/order/classes/OrderClass.php
  2. 66 13
      biz-hd/purchase/classes/PurchaseClass.php

+ 61 - 11
biz-ghs/order/classes/OrderClass.php

@@ -3177,6 +3177,7 @@ XL;
         $date = substr($order->payTime, 0, 10);
         $date = substr($order->payTime, 0, 10);
         $customId = $order->customId ?? 0;
         $customId = $order->customId ?? 0;
         $mainId = $order->mainId ?? 0;
         $mainId = $order->mainId ?? 0;
+        $orderId = $order->id ?? 0;
         //找到当前订单客户的账单日期为 $date 的所有订单
         //找到当前订单客户的账单日期为 $date 的所有订单
         $startTime = $date . ' 00:00:00';
         $startTime = $date . ' 00:00:00';
         $endTime = $date . ' 23:59:59';
         $endTime = $date . ' 23:59:59';
@@ -3185,7 +3186,7 @@ XL;
             'customId' => $customId,
             'customId' => $customId,
             'payTime' => ['between', [$startTime, $endTime]]
             'payTime' => ['between', [$startTime, $endTime]]
         ], 'id ASC', 'id');
         ], 'id ASC', 'id');
-        if (!empty($dayOrders)) {
+        if (empty($dayOrders)) {
             return false;
             return false;
         }
         }
         $ids = array_column($dayOrders, 'id');
         $ids = array_column($dayOrders, 'id');
@@ -3195,27 +3196,76 @@ XL;
                 //新增,如果当天只有一个订单,不需要操作
                 //新增,如果当天只有一个订单,不需要操作
                 return false;
                 return false;
             }
             }
+            $hasMerge = OrderMergeSnClass::getByCondition(['customId' => $customId, 'mergeDate' => $date], true);
+            if (!empty($hasMerge)) {
+                $hasMergeId = $hasMerge->id ?? 0;
+                $order->mergeId = $hasMergeId;
+                $order->save();
+                OrderMergeClass::add(['mergeId' => $hasMergeId, 'orderId' => $orderId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId]);
+            } else {
+                self::rebuildOrderMergeGroupForDay($ids, $date, $customId, $mainId);
+            }
         } else {
         } else {
-            //修改
-            $oldMergeId = $order->mergeId ?? 0;
-            $oldMerge = OrderMergeSnClass::getById($oldMergeId, true);
-            $oldDate = $oldMerge->mergeDate ?? '';
-            if ($oldDate == $date) {
-                //修改前后日期一样,不需要调整
-                return false;
+            //修改账单日:订单 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]);
+                    }
+                }
+            }
+            $hasNewMerge = OrderMergeSnClass::getByCondition(['customId' => $customId, 'mergeDate' => $date], true);
+            if (!empty($hasNewMerge)) {
+                $newMergeId = $hasNewMerge->id ?? 0;
+                $order->mergeId = $newMergeId;
+                $order->save();
+                OrderMergeClass::add(['mergeId' => $newMergeId, 'orderId' => $orderId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId]);
+            } else {
+                self::rebuildOrderMergeGroupForDay($ids, $date, $customId, $mainId);
             }
             }
         }
         }
-        OrderMergeClass::deleteByCondition(['id' => ['in', $ids]]);
 
 
+        return true;
+    }
+
+    /**
+     * 指定客户、某日多单:新建合并主档,回写订单 mergeId,并批量写入 xhGhsOrderMerge。
+     *
+     * @param int[] $ids 当日同客户订单 id 列表
+     */
+    private static function rebuildOrderMergeGroupForDay(array $ids, $date, $customId, $mainId)
+    {
         $mergeData = ['mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
         $mergeData = ['mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
         $mergeId = orderSn::getGhsOrderMergeId($mergeData);
         $mergeId = orderSn::getGhsOrderMergeId($mergeData);
         self::updateByIds($ids, ['mergeId' => $mergeId]);
         self::updateByIds($ids, ['mergeId' => $mergeId]);
         $addData = [];
         $addData = [];
         foreach ($ids as $currentId) {
         foreach ($ids as $currentId) {
-            $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date];
+            $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
         }
         }
         OrderMergeClass::batchAdd($addData);
         OrderMergeClass::batchAdd($addData);
-        return true;
     }
     }
 
 
     // 更新同天内的所有订单的 sameTimeIds
     // 更新同天内的所有订单的 sameTimeIds

+ 66 - 13
biz-hd/purchase/classes/PurchaseClass.php

@@ -21,6 +21,7 @@ use bizGhs\stock\classes\OnStockRecordClass;
 use bizGhs\stock\classes\StockRecordClass;
 use bizGhs\stock\classes\StockRecordClass;
 use bizHd\cg\classes\CgMergeClass;
 use bizHd\cg\classes\CgMergeClass;
 use bizHd\cg\classes\CgMergeSnClass;
 use bizHd\cg\classes\CgMergeSnClass;
+use bizHd\cg\models\CgMerge;
 use bizHd\cg\classes\CgRefundClass;
 use bizHd\cg\classes\CgRefundClass;
 use bizHd\cg\classes\CgTreeClass;
 use bizHd\cg\classes\CgTreeClass;
 use bizHd\cg\classes\CgXjClass;
 use bizHd\cg\classes\CgXjClass;
@@ -66,12 +67,14 @@ class PurchaseClass extends BaseClass
     const REFUND_NO = 1;
     const REFUND_NO = 1;
     const REFUND_YES = 2;
     const REFUND_YES = 2;
 
 
+    //更新同一供货商、同一天的多张采购单合并 $update 0 添加 1 修改(写法对齐 OrderClass::updateMergeOrder)
     public static function updateMergeCg($cg, $update = 0)
     public static function updateMergeCg($cg, $update = 0)
     {
     {
         $date = substr($cg->payTime, 0, 10);
         $date = substr($cg->payTime, 0, 10);
         $ghsId = $cg->ghsId ?? 0;
         $ghsId = $cg->ghsId ?? 0;
         $mainId = $cg->mainId ?? 0;
         $mainId = $cg->mainId ?? 0;
-        //找到当前订单客户的账单日期为 $date 的所有订单
+        $cgId = $cg->id ?? 0;
+        //当前零售商 + 供货商 + 账单日 下的采购单
         $startTime = $date . ' 00:00:00';
         $startTime = $date . ' 00:00:00';
         $endTime = $date . ' 23:59:59';
         $endTime = $date . ' 23:59:59';
         $dayOrders = self::getAllByCondition([
         $dayOrders = self::getAllByCondition([
@@ -79,37 +82,87 @@ class PurchaseClass extends BaseClass
             'ghsId' => $ghsId,
             'ghsId' => $ghsId,
             'payTime' => ['between', [$startTime, $endTime]]
             'payTime' => ['between', [$startTime, $endTime]]
         ], 'id ASC', 'id');
         ], 'id ASC', 'id');
-        if (!empty($dayOrders)) {
+        if (empty($dayOrders)) {
             return false;
             return false;
         }
         }
         $ids = array_column($dayOrders, 'id');
         $ids = array_column($dayOrders, 'id');
         $count = count($ids);
         $count = count($ids);
+
         if ($update == 0) {
         if ($update == 0) {
             if ($count <= 1) {
             if ($count <= 1) {
                 //新增,如果当天只有一个订单,不需要操作
                 //新增,如果当天只有一个订单,不需要操作
                 return false;
                 return false;
             }
             }
+            $hasMerge = CgMergeSnClass::getByCondition(['ghsId' => $ghsId, '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 {
         } 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, '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);
             }
             }
         }
         }
-        CgMergeClass::deleteByCondition(['id' => ['in', $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];
         $mergeData = ['mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId];
-        $mergeId = orderSn::getGhsOrderMergeId($mergeData);
+        $mergeId = orderSn::getCgMergeId($mergeData);
         self::updateByIds($ids, ['mergeId' => $mergeId]);
         self::updateByIds($ids, ['mergeId' => $mergeId]);
         $addData = [];
         $addData = [];
         foreach ($ids as $currentId) {
         foreach ($ids as $currentId) {
-            $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date];
+            $addData[] = ['mergeId' => $mergeId, 'cgId' => $currentId, 'mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId];
         }
         }
         CgMergeClass::batchAdd($addData);
         CgMergeClass::batchAdd($addData);
-        return true;
     }
     }
 
 
     //获取打包费
     //获取打包费