Procházet zdrojové kódy

Merge branch 'moreShare'

shish před 2 měsíci
rodič
revize
2a35ef2b0d

+ 28 - 7
app-ghs/controllers/OrderController.php

@@ -17,6 +17,8 @@ use bizHd\purchase\services\PurchaseService;
 use bizHd\wx\classes\WxOpenClass;
 use bizGhs\custom\classes\CustomClass;
 use bizGhs\order\classes\OrderClass;
+use bizGhs\order\classes\OrderMergeClass;
+use bizGhs\order\classes\OrderMergeSnClass;
 use bizGhs\order\services\OrderService;
 use bizHd\saas\services\RegionService;
 use bizGhs\product\classes\ProductClass;
@@ -229,14 +231,15 @@ class OrderController extends BaseController
             if (empty($mergeId)) {
                 util::fail('请选择要合并发货的订单');
             }
-            $mergeInfo = OrderClass::getById($mergeId, true);
+            $mergeInfo = OrderMergeSnClass::getById($mergeId, true);
             if (empty($mergeInfo)) {
                 util::fail('请选择要合并发货的订单呢');
             }
             if ($mergeInfo->mainId != $this->mainId) {
                 util::fail('不是你的订单呢');
             }
-            $ids = $mergeInfo->sameTimeIds ?? '';
+            $mergeRows = OrderMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'orderId');
+            $ids = !empty($mergeRows) ? implode(',', array_column($mergeRows, 'orderId')) : '';
             if (empty($ids)) {
                 util::fail('请选择要合并发货的订单哈');
             }
@@ -285,14 +288,15 @@ class OrderController extends BaseController
             if (empty($mergeId)) {
                 util::fail('请选择要合并打印的订单');
             }
-            $mergeInfo = OrderClass::getById($mergeId, true);
+            $mergeInfo = OrderMergeSnClass::getById($mergeId, true);
             if (empty($mergeInfo)) {
                 util::fail('请选择要合并打印的订单呢');
             }
             if ($mergeInfo->mainId != $this->mainId) {
                 util::fail('不是你的订单呢');
             }
-            $ids = $mergeInfo->sameTimeIds ?? '';
+            $mergeRows = OrderMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'orderId');
+            $ids = !empty($mergeRows) ? implode(',', array_column($mergeRows, 'orderId')) : '';
             if (empty($ids)) {
                 util::fail('请选择要合并打印的订单哈');
             }
@@ -322,14 +326,15 @@ class OrderController extends BaseController
 
         $get = Yii::$app->request->get();
         $mergeId = $get['mergeId'] ?? '';
-        $mergeInfo = OrderClass::getById($mergeId, true);
+        $mergeInfo = OrderMergeSnClass::getById($mergeId, true);
         if (empty($mergeInfo)) {
             util::fail('请选择订单');
         }
         if ($mergeInfo->mainId != $this->mainId) {
             util::fail('不是你的订单');
         }
-        $ids = $mergeInfo->sameTimeIds ?? '';
+        $mergeRows = OrderMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'orderId');
+        $ids = !empty($mergeRows) ? implode(',', array_column($mergeRows, 'orderId')) : '';
         if (empty($ids)) {
             util::fail('请选择订单哈');
         }
@@ -342,6 +347,20 @@ class OrderController extends BaseController
         $respond = OrderClass::getOrderList($where);
         $respond['shop'] = $this->shop;
         $respond['shopExt'] = $this->shopExt;
+        $totalPrice = 0;
+        if (!empty($respond['list'])) {
+            foreach ($respond['list'] as $order) {
+                $actPrice = $order['actPrice'] ?? 0;
+                $totalPrice = bcadd($totalPrice, $actPrice, 2);
+            }
+        }
+        $totalPrice = floatval($totalPrice);
+        $respond['shareInfo'] = [
+            'id' => $mergeInfo->cgMergeId ?? 0,
+            'mergeId' => $mergeInfo->cgMergeId ?? 0,
+            'salt' => $mergeInfo->cgSalt ?? '',
+            'totalPrice' => $totalPrice,
+        ];
         util::success($respond);
     }
 
@@ -2650,6 +2669,8 @@ class OrderController extends BaseController
 
             //找到当前订单客户的账单日期为 $date 的所有订单,然后更新同天内的所有订单的 sameTimeIds(加此次要改变的订单的订单号$id),有多处调用,关键词 update_same_ids
             OrderClass::updateSameTimeIds($order, $date);
+            PurchaseClass::updateMergeCg($cg, 1);
+            OrderClass::updateMergeOrder($order, 1);
 
             $transaction->commit();
             util::complete('修改成功');
@@ -3252,4 +3273,4 @@ class OrderController extends BaseController
         util::complete('修改成功');
     }
 
-}
+}

+ 61 - 2
app-hd/controllers/PurchaseController.php

@@ -10,6 +10,7 @@ use biz\shop\classes\ShopExtClass;
 use bizGhs\custom\classes\CustomClass;
 use bizGhs\express\classes\GhsDeliveryOrderClass;
 use bizGhs\order\classes\OrderClass;
+use bizHd\cg\classes\CgMergeSnClass;
 use bizHd\purchase\classes\PurchaseClass;
 use bizHd\purchase\classes\PurchaseItemClass;
 use bizHd\purchase\services\PurchaseService;
@@ -31,7 +32,7 @@ use common\components\push;
 class PurchaseController extends BaseController
 {
 
-    public $guestAccess = ['detail', 'ali-pay', 'get-ali-pay-code', 'wx-pay'];
+    public $guestAccess = ['detail', 'ali-pay', 'get-ali-pay-code', 'wx-pay', 'merge-order-list'];
 
     //取消采购单 ssh 20250710
     public function actionCancel()
@@ -1041,13 +1042,71 @@ class PurchaseController extends BaseController
         util::success($respond);
     }
 
+    //获取合并采购单列表 ssh 20260519
+    public function actionMergeOrderList()
+    {
+        Yii::$app->params['pageSize'] = 9999;
+
+        $get = Yii::$app->request->get();
+        $mergeId = $get['mergeId'] ?? 0;
+        if (empty($mergeId)) {
+            util::fail('请选择采购单');
+        }
+        $mergeSn = CgMergeSnClass::getById($mergeId, true);
+        if (empty($mergeSn)) {
+            util::fail('请选择合并采购单');
+        }
+        $salt = $get['salt'] ?? '';
+        if (empty($this->shopId)) {
+            if (empty($salt)) {
+                util::fail('请求参数错误');
+            }
+            if (empty($mergeSn->salt) || $mergeSn->salt != $salt) {
+                util::fail('找不到订单');
+            }
+        } else {
+            if ($mergeSn->mainId != $this->mainId) {
+                util::fail('不是你的订单');
+            }
+        }
+        $ghsId = $mergeSn->ghsId ?? 0;
+        $where = [
+            'ghsId' => $ghsId,
+            'mergeId' => $mergeId,
+        ];
+        $respond = PurchaseService::getPurchaseList($where);
+        $totalPrice = 0;
+        if (!empty($respond['list'])) {
+            foreach ($respond['list'] as $one) {
+                $actPrice = $one['actPrice'] ?? 0;
+                $totalPrice = bcadd($totalPrice, $actPrice, 2);
+            }
+        }
+        $totalPrice = floatval($totalPrice);
+        $respond['totalPrice'] = $totalPrice;
+        $respond['shop'] = !empty($this->shop) ? $this->shop->attributes : [];
+        util::success($respond);
+    }
+
     //采购详情 ssh 2021.01.25
     public function actionDetail()
     {
         $get = Yii::$app->request->get();
         $id = $get['id'] ?? 0;
         $info = PurchaseService::getInfo($id, true, true);
-        if (isset($info['mainId']) == false || $info['mainId'] != $this->mainId) {
+        if (empty($info)) {
+            util::fail('没有找到采购单');
+        }
+        if (empty($this->shopId)) {
+            $salt = $get['salt'] ?? '';
+            if (empty($salt)) {
+                util::fail('请求参数错误');
+            }
+            if (empty($info['salt']) || $info['salt'] != $salt) {
+                util::fail('没有找到采购单');
+            }
+        }
+        if (empty($info['mainId']) || $info['mainId'] != $this->mainId) {
             //不能注释,分享付款功能要用,客户没有登录也能付款
             //util::fail('无法访问');
         }

+ 0 - 14
biz-ghs/cg/classes/CgMergeClass.php

@@ -1,14 +0,0 @@
-<?php
-
-namespace bizGhs\cg\classes;
-
-use bizGhs\base\classes\BaseClass;
-use common\components\util;
-use Yii;
-
-class CgMergeClass extends BaseClass
-{
-
-    public static $baseFile = '\bizGhs\cg\models\CgMerge';
-
-}

+ 0 - 14
biz-ghs/cg/classes/CgMergeSnClass.php

@@ -1,14 +0,0 @@
-<?php
-
-namespace bizGhs\cg\classes;
-
-use bizGhs\base\classes\BaseClass;
-use common\components\util;
-use Yii;
-
-class CgMergeSnClass extends BaseClass
-{
-
-    public static $baseFile = '\bizGhs\cg\models\CgMergeSn';
-
-}

+ 0 - 13
biz-ghs/cg/models/CgMerge.php

@@ -1,13 +0,0 @@
-<?php
-namespace bizGhs\cg\models;
-use bizGhs\base\models\Base;
-
-class CgMerge extends Base
-{
-
-    public static function tableName()
-    {
-        return 'xhGhsCgMerge';
-    }
-
-}

+ 0 - 13
biz-ghs/cg/models/CgMergeSn.php

@@ -1,13 +0,0 @@
-<?php
-namespace bizGhs\cg\models;
-use bizGhs\base\models\Base;
-
-class CgMergeSn extends Base
-{
-
-    public static function tableName()
-    {
-        return 'xhGhsCgMergeSn';
-    }
-
-}

+ 148 - 9
biz-ghs/order/classes/OrderClass.php

@@ -1019,6 +1019,7 @@ class OrderClass extends BaseClass
         $localConfirmTime = dict::getDict('local_gys_kd_auto_set_debt_time');
         $currentSet = $currentTime + $localConfirmTime;
         $data['autoSetTime'] = $data['autoSetTime'] ?? date("Y-m-d H:i:s", $currentSet);
+        $data['salt'] = $data['salt'] ?? stringUtil::charsShuffleLowerCase(10);
         $return = self::add($data, true);
 
         return $return;
@@ -1386,11 +1387,22 @@ class OrderClass extends BaseClass
             foreach ($data['list'] as $key => $val) {
 
                 //同个人同地址当天订单数
-                $sameTimeIds = $val['sameTimeIds'] ?? '';
-                $sameNum = 0;
-                if (!empty($sameTimeIds)) {
-                    $sameIds = explode(',', $sameTimeIds);
-                    $sameNum = count($sameIds);
+                $sameNum = $val['mergeNum'];
+                if ($sameNum > 0) {
+                    $mergeId = $val['mergeId'] ?? 0;
+                    if (!empty($mergeId)) {
+                        $mergeList = OrderMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'orderId');
+                        $ids = array_column($mergeList, 'orderId');
+                        $sameTimeIds = implode(',', $ids);
+                        $data['list'][$key]['sameTimeIds'] = $sameTimeIds;
+                        $data['list'][$key]['mergeStatus'] = '已经使用新版本';
+                    }
+                } else {
+                    $sameTimeIds = $val['sameTimeIds'] ?? '';
+                    if (!empty($sameTimeIds)) {
+                        $sameIds = explode(',', $sameTimeIds);
+                        $sameNum = count($sameIds);
+                    }
                 }
                 $data['list'][$key]['sameTimeIdsNum'] = $sameNum;
 
@@ -3154,9 +3166,9 @@ XL;
             $remark .= $orderItem->remark;
         }
         if (!empty($order->remark)) {
-            if(!empty($remark)){
-                $remark .= ' '.$order->remark;
-            }else{
+            if (!empty($remark)) {
+                $remark .= ' ' . $order->remark;
+            } else {
                 $remark .= $order->remark;
             }
         }
@@ -3172,6 +3184,133 @@ XL;
         return true;
     }
 
+    //更新客户同一天的订单 $update 0 添加 1 修改
+    public static function updateMergeOrder($order, $update = 0)
+    {
+        $date = substr($order->payTime, 0, 10);
+        $customId = $order->customId ?? 0;
+        $mainId = $order->mainId ?? 0;
+        $orderId = $order->id ?? 0;
+        //找到当前订单客户的账单日期为 $date 的所有订单
+        $startTime = $date . ' 00:00:00';
+        $endTime = $date . ' 23:59:59';
+        $dayOrders = self::getAllByCondition([
+            'mainId' => $mainId,
+            'customId' => $customId,
+            'payTime' => ['between', [$startTime, $endTime]]
+        ], 'id ASC', 'id');
+        if (empty($dayOrders)) {
+            return false;
+        }
+        $ids = array_column($dayOrders, 'id');
+        $count = count($ids);
+        if ($update == 0) {
+            if ($count <= 1) {
+                //新增,如果当天只有一个订单,不需要操作
+                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]);
+                self::syncOrderMergeNumForMergeId($hasMergeId);
+                PurchaseClass::syncMergeRelationByOrderIds([$orderId]);
+            } else {
+                self::rebuildOrderMergeGroupForDay($ids, $date, $customId, $mainId);
+            }
+        } else {
+            //修改账单日:订单 payTime 已在调用方改为新日 $date
+            $oldMergeId = (int)($order->mergeId ?? 0);
+            if ($oldMergeId > 0) {
+                $oldMergeSn = OrderMergeSnClass::getById($oldMergeId, true);
+                if (empty($oldMergeSn)) {
+                    // 订单仍挂着 mergeId,但主档已不存在,避免后续报错并清理脏数据
+                    $order->mergeId = 0;
+                    $order->mergeNum = 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, 'mergeNum' => 0]);
+                    } else {
+                        $order->mergeId = 0;
+                        $order->mergeNum = 0;
+                        $order->save();
+                        OrderMergeClass::deleteByCondition(['mergeId' => $oldMergeId, 'orderId' => $orderId]);
+                        self::syncOrderMergeNumForMergeId($oldMergeId);
+                    }
+                }
+            }
+            $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]);
+                self::syncOrderMergeNumForMergeId($newMergeId);
+                PurchaseClass::syncMergeRelationByOrderIds([$orderId]);
+            } 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);
+        $mergeNum = count($ids);
+        self::updateByIds($ids, ['mergeId' => $mergeId, 'mergeNum' => $mergeNum]);
+        $addData = [];
+        foreach ($ids as $currentId) {
+            $addData[] = ['mergeId' => $mergeId, 'orderId' => $currentId, 'mergeDate' => $date, 'customId' => $customId, 'mainId' => $mainId];
+        }
+        OrderMergeClass::batchAdd($addData);
+        PurchaseClass::syncMergeRelationByOrderIds($ids);
+    }
+
+    /** 按 xhGhsOrderMerge 明细数量,回写该合并组内所有订单的 mergeNum */
+    private static function syncOrderMergeNumForMergeId($mergeId)
+    {
+        $mergeId = (int)$mergeId;
+        if ($mergeId <= 0) {
+            return;
+        }
+        $rows = OrderMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'orderId', null, true);
+        $mergeNum = count($rows);
+        if ($mergeNum === 0) {
+            return;
+        }
+        $orderIds = [];
+        foreach ($rows as $row) {
+            $orderIds[] = (int)(is_object($row) ? ($row->orderId ?? 0) : ($row['orderId'] ?? 0));
+        }
+        $orderIds = array_values(array_filter($orderIds));
+        if (!empty($orderIds)) {
+            self::updateByIds($orderIds, ['mergeNum' => $mergeNum]);
+        }
+    }
 
     // 更新同天内的所有订单的 sameTimeIds
     public static function updateSameTimeIds($order, $date)
@@ -3227,4 +3366,4 @@ XL;
         //noticeUtil::push("orderIds = {$sameTimeIdsStr}, sameTimeIdsStr: {$sameTimeIdsStr}");
     }
 
-}
+}

+ 1 - 0
biz-ghs/order/services/OrderService.php

@@ -900,6 +900,7 @@ class OrderService extends BaseService
         //当天同个人同地址的订单汇总
         $prefixDate = substr($order->payTime, 0, 10);
         OrderClass::updateSameTimeIds($order, $prefixDate);
+        OrderClass::updateMergeOrder($order,0);
     }
 
     //发起退款

+ 29 - 0
biz-hd/cg/classes/CgMergeClass.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace bizHd\cg\classes;
+
+use biz\shop\classes\ShopCapitalClass;
+use biz\shop\classes\ShopExtClass;
+use bizHd\ghs\classes\GhsClass;
+use bizHd\purchase\classes\PurchaseClass;
+use bizHd\purchase\classes\PurchaseItemClass;
+use bizHd\shop\classes\MainClass;
+use bizGhs\stock\classes\StockRecordClass;
+use bizHd\shop\classes\ShopClass;
+use bizHd\wx\classes\WxOpenClass;
+use common\components\dict;
+use common\components\noticeUtil;
+use common\components\orderSn;
+use common\components\util;
+use Yii;
+use bizGhs\base\classes\BaseClass;
+use bizGhs\order\traits\OrderTrait;
+use bizGhs\product\classes\ProductClass;
+use common\components\lakala\Lakala;
+
+class CgMergeClass extends BaseClass
+{
+
+    public static $baseFile = '\bizHd\cg\models\CgMerge';
+
+}

+ 29 - 0
biz-hd/cg/classes/CgMergeSnClass.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace bizHd\cg\classes;
+
+use biz\shop\classes\ShopCapitalClass;
+use biz\shop\classes\ShopExtClass;
+use bizHd\ghs\classes\GhsClass;
+use bizHd\purchase\classes\PurchaseClass;
+use bizHd\purchase\classes\PurchaseItemClass;
+use bizHd\shop\classes\MainClass;
+use bizGhs\stock\classes\StockRecordClass;
+use bizHd\shop\classes\ShopClass;
+use bizHd\wx\classes\WxOpenClass;
+use common\components\dict;
+use common\components\noticeUtil;
+use common\components\orderSn;
+use common\components\util;
+use Yii;
+use bizGhs\base\classes\BaseClass;
+use bizGhs\order\traits\OrderTrait;
+use bizGhs\product\classes\ProductClass;
+use common\components\lakala\Lakala;
+
+class CgMergeSnClass extends BaseClass
+{
+
+    public static $baseFile = '\bizHd\cg\models\CgMergeSn';
+
+}

+ 15 - 0
biz-hd/cg/models/CgMerge.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace bizHd\cg\models;
+
+use bizHd\base\models\Base;
+
+class CgMerge extends Base
+{
+
+    public static function tableName()
+    {
+        return 'xhCgMerge';
+    }
+
+}

+ 15 - 0
biz-hd/cg/models/CgMergeSn.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace bizHd\cg\models;
+
+use bizHd\base\models\Base;
+
+class CgMergeSn extends Base
+{
+
+    public static function tableName()
+    {
+        return 'xhCgMergeSn';
+    }
+
+}

+ 199 - 1
biz-hd/purchase/classes/PurchaseClass.php

@@ -15,10 +15,14 @@ use bizGhs\admin\classes\AdminClass;
 use bizGhs\custom\classes\CustomClass;
 use bizGhs\item\classes\CostChangeClass;
 use bizGhs\order\classes\OrderClass;
+use bizGhs\order\classes\OrderMergeSnClass;
 use bizGhs\order\traits\OrderTrait;
 use bizGhs\product\classes\ProductClass;
 use bizGhs\stock\classes\OnStockRecordClass;
 use bizGhs\stock\classes\StockRecordClass;
+use bizHd\cg\classes\CgMergeClass;
+use bizHd\cg\classes\CgMergeSnClass;
+use bizHd\cg\models\CgMerge;
 use bizHd\cg\classes\CgRefundClass;
 use bizHd\cg\classes\CgTreeClass;
 use bizHd\cg\classes\CgXjClass;
@@ -30,6 +34,7 @@ use common\components\IntraCityExpress;
 use common\components\mapUtil;
 use common\components\noticeUtil;
 use common\components\orderSn;
+use common\components\stringUtil;
 use common\components\util;
 use bizHd\base\classes\BaseClass;
 use common\components\lakala\Lakala;
@@ -64,6 +69,198 @@ 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;
+        $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');
+        if (empty($dayOrders)) {
+            return false;
+        }
+        $ids = array_column($dayOrders, 'id');
+        $count = count($ids);
+
+        if ($update == 0) {
+            if ($count <= 1) {
+                //新增,如果当天只有一个订单,不需要操作
+                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]);
+                self::syncCgMergeNumForMergeId($hasMergeId);
+                self::syncMergeRelationByCgIds([$cgId]);
+            } else {
+                self::rebuildCgMergeGroupForDay($ids, $date, $ghsId, $mainId);
+            }
+        } else {
+            //修改账单日:payTime 已在调用方改为新日 $date
+            $oldMergeId = (int)($cg->mergeId ?? 0);
+            if ($oldMergeId > 0) {
+                $oldMergeSn = CgMergeSnClass::getById($oldMergeId, true);
+                if (empty($oldMergeSn)) {
+                    $cg->mergeId = 0;
+                    $cg->mergeNum = 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, 'mergeNum' => 0]);
+                    } else {
+                        $cg->mergeId = 0;
+                        $cg->mergeNum = 0;
+                        $cg->save();
+                        CgMergeClass::deleteByCondition(['mergeId' => $oldMergeId, 'cgId' => $cgId]);
+                        self::syncCgMergeNumForMergeId($oldMergeId);
+                    }
+                }
+            }
+            $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]);
+                self::syncCgMergeNumForMergeId($newMergeId);
+                self::syncMergeRelationByCgIds([$cgId]);
+            } else {
+                self::rebuildCgMergeGroupForDay($ids, $date, $ghsId, $mainId);
+            }
+        }
+
+        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);
+        $mergeNum = count($ids);
+        self::updateByIds($ids, ['mergeId' => $mergeId, 'mergeNum' => $mergeNum]);
+        $addData = [];
+        foreach ($ids as $currentId) {
+            $addData[] = ['mergeId' => $mergeId, 'cgId' => $currentId, 'mergeDate' => $date, 'ghsId' => $ghsId, 'mainId' => $mainId];
+        }
+        CgMergeClass::batchAdd($addData);
+        self::syncMergeRelationByCgIds($ids);
+    }
+
+    public static function syncMergeRelationByOrderIds($orderIds)
+    {
+        if (empty($orderIds)) {
+            return false;
+        }
+        $orders = OrderClass::getByIds($orderIds, null, null, 'id,purchaseId');
+        if (empty($orders)) {
+            return false;
+        }
+        $cgIds = [];
+        foreach ($orders as $order) {
+            $purchaseId = $order['purchaseId'] ?? 0;
+            if (!empty($purchaseId)) {
+                $cgIds[] = $purchaseId;
+            }
+        }
+        return self::syncMergeRelationByCgIds($cgIds);
+    }
+
+    public static function syncMergeRelationByCgIds($cgIds)
+    {
+        if (empty($cgIds)) {
+            return false;
+        }
+        $cgIds = array_values(array_unique(array_filter($cgIds)));
+        if (empty($cgIds)) {
+            return false;
+        }
+        $cgs = self::getByIds($cgIds, null, null, 'id,saleId,mergeId');
+        if (empty($cgs)) {
+            return false;
+        }
+        foreach ($cgs as $cg) {
+            $cgId = $cg['id'] ?? 0;
+            $orderId = $cg['saleId'] ?? 0;
+            $cgMergeId = $cg['mergeId'] ?? 0;
+            if (empty($cgId) || empty($orderId) || empty($cgMergeId)) {
+                continue;
+            }
+            $order = OrderClass::getById($orderId, false, 'id,mergeId');
+            $ghsMergeId = $order['mergeId'] ?? 0;
+            if (empty($ghsMergeId)) {
+                continue;
+            }
+            $cgMergeSn = CgMergeSnClass::getById($cgMergeId, false, 'id,salt');
+            $ghsMergeSn = OrderMergeSnClass::getById($ghsMergeId, false, 'id,salt');
+            $cgSalt = $cgMergeSn['salt'] ?? '';
+            $ghsSalt = $ghsMergeSn['salt'] ?? '';
+            if (empty($cgSalt) || empty($ghsSalt)) {
+                continue;
+            }
+            CgMergeSnClass::updateById($cgMergeId, [
+                'ghsMergeId' => $ghsMergeId,
+                'ghsSalt' => $ghsSalt,
+            ]);
+            OrderMergeSnClass::updateById($ghsMergeId, [
+                'cgMergeId' => $cgMergeId,
+                'cgSalt' => $cgSalt,
+            ]);
+        }
+        return true;
+    }
+
+    /** 按 xhCgMerge 明细数量,回写该合并组内所有采购单的 mergeNum */
+    private static function syncCgMergeNumForMergeId($mergeId)
+    {
+        $mergeId = (int)$mergeId;
+        if ($mergeId <= 0) {
+            return;
+        }
+        $rows = CgMergeClass::getAllByCondition(['mergeId' => $mergeId], null, 'cgId', null, true);
+        $mergeNum = count($rows);
+        if ($mergeNum === 0) {
+            return;
+        }
+        $cgIds = [];
+        foreach ($rows as $row) {
+            $cgIds[] = (int)(is_object($row) ? ($row->cgId ?? 0) : ($row['cgId'] ?? 0));
+        }
+        $cgIds = array_values(array_filter($cgIds));
+        if (!empty($cgIds)) {
+            self::updateByIds($cgIds, ['mergeNum' => $mergeNum]);
+        }
+    }
+
     //获取打包费
     public static function getKmPackCost($mainId)
     {
@@ -1071,6 +1268,7 @@ class PurchaseClass extends BaseClass
         $localConfirmTime = dict::getDict('local_gys_kd_auto_set_debt_time');
         $currentSet = $currentTime + $localConfirmTime;
         $data['autoSetTime'] = $data['autoSetTime'] ?? date("Y-m-d H:i:s", $currentSet);
+        $data['salt'] = $data['salt'] ?? stringUtil::charsShuffleLowerCase(10);
         //保存订单
         $respond = self::add($data, true);
 
@@ -1102,7 +1300,7 @@ class PurchaseClass extends BaseClass
             }
             if (!empty($data['treeData'][$currentPtItemId])) {
                 $myTreeData = $data['treeData'][$currentPtItemId];
-                foreach($myTreeData as $treeItem) {
+                foreach ($myTreeData as $treeItem) {
                     $treeNum = $treeItem['num'] ?? 0;
                     $treeParams = [
                         'orderSn' => $orderSn,

+ 2 - 1
biz-hd/purchase/services/PurchaseService.php

@@ -488,7 +488,8 @@ class PurchaseService extends BaseService
         $ghs->expendAmount = bcadd($ghs->expendAmount, $actPrice, 2);
         $ghs->expendNum += 1;
         $ghs->save();
-    }
 
+        PurchaseClass::updateMergeCg($info, 0);
+    }
 
 }

+ 26 - 0
common/components/orderSn.php

@@ -12,7 +12,9 @@ use bizGhs\ghs\classes\GhsRechargeSnClass;
 use bizGhs\live\classes\LiveOrderSnClass;
 use bizGhs\order\classes\GiveSnClass;
 use bizGhs\order\classes\OrderClass;
+use bizGhs\order\classes\OrderMergeSnClass;
 use bizHd\cg\classes\AcceptSnClass;
+use bizHd\cg\classes\CgMergeSnClass;
 use bizHd\cg\classes\CgRefundSnClass;
 use bizHd\common\classes\MobileSnClass;
 use bizHd\express\classes\ExpressSnClass;
@@ -39,6 +41,30 @@ use yii\imagine\Image;
 class orderSn
 {
 
+    public static function getGhsOrderMergeId($data)
+    {
+        $data['id'] = null;
+        $data['salt'] = $data['salt'] ?? stringUtil::charsShuffleLowerCase(10);
+        $respond = OrderMergeSnClass::add($data);
+        $id = $respond['id'] ?? 0;
+        if (empty($id)) {
+            util::fail('单号没有生成');
+        }
+        return $id;
+    }
+
+    public static function getCgMergeId($data)
+    {
+        $data['id'] = null;
+        $data['salt'] = $data['salt'] ?? stringUtil::charsShuffleLowerCase(10);
+        $respond = CgMergeSnClass::add($data);
+        $id = $respond['id'] ?? 0;
+        if (empty($id)) {
+            util::fail('单号没有生成');
+        }
+        return $id;
+    }
+
     public static function getGhsExpressSn($data)
     {
         $prefix = 'EX_CS';