Просмотр исходного кода

Merge branch 'master' into 260902_redesign_fix

shish 18 часов назад
Родитель
Сommit
a091e0bb27

+ 27 - 5
app-ghs/controllers/OrderController.php

@@ -1127,14 +1127,25 @@ class OrderController extends BaseController
             }
         }
 
+        // 导出区间跟当前时间类型走:0 开单 addTime,1 账单 payTime,2 发货 sendTime
         if ($export == 1) {
             ini_set('memory_limit', '2045M');
             set_time_limit(0);
-            if (!isset($where['payTime'])) {
-                util::fail('请选 账单时间 和 时间段');
+            if ($searchTimeType === 2) {
+                $exportTimeKey = 'sendTime';
+                $exportTimeName = '发货时间';
+            } elseif ($searchTimeType === 1) {
+                $exportTimeKey = 'payTime';
+                $exportTimeName = '账单时间';
+            } else {
+                $exportTimeKey = 'addTime';
+                $exportTimeName = '开单时间';
             }
-            $start = $where['payTime'][1][0];
-            $end = $where['payTime'][1][1];
+            if (!isset($where[$exportTimeKey])) {
+                util::fail('请选 ' . $exportTimeName . ' 和时间段');
+            }
+            $start = $where[$exportTimeKey][1][0];
+            $end = $where[$exportTimeKey][1][1];
             $monthTime = bcmul(31, 86400);
             $startArea = strtotime($start);
             $endArea = strtotime($end);
@@ -1202,7 +1213,7 @@ class OrderController extends BaseController
         }
         $respond = OrderClass::getOrderList($where, $order);
         if ($export == 1) {
-            OrderClass::exportOrderData($respond, $this->mainId);
+            OrderClass::exportOrderData($respond, $this->mainId, $searchTimeType);
         }
         $respond['shop'] = $this->shop;
         $respond['shopExt'] = $this->shopExt;
@@ -3011,6 +3022,17 @@ class OrderController extends BaseController
         if (empty($date) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
             util::fail('请选择日期');
         }
+
+        $mainId = $this->mainId;
+        //超管或者约定的人可以修改日期
+        if (getenv('YII_ENV') == 'production') {
+            if (in_array($mainId, [23390])) {
+                if (!in_array($this->adminId, [24586, 23960, 24043])) {
+                    util::fail('你不能修改哦');
+                }
+            }
+        }
+
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();
         try {

+ 10 - 1
app-ghs/controllers/PurchaseController.php

@@ -41,7 +41,7 @@ class PurchaseController extends BaseController
         util::success(['salt' => $salt]);
     }
 
-    //待结款明细 ssh 2021.1.26
+    // 采购挂账明细:searchTime 筛账单时间 entryTime,sendSearchTime 筛发货时间 sendTime
     public function actionDebtList()
     {
         $get = Yii::$app->request->get();
@@ -54,6 +54,7 @@ class PurchaseController extends BaseController
         if ($confirm > -1) {
             $where['confirm'] = $confirm;
         }
+        // 账单时间:采购入库单按入库日 entryTime(没有销售单那种 payTime)
         $searchTime = $get['searchTime'] ?? '';
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
@@ -61,6 +62,14 @@ class PurchaseController extends BaseController
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
             $where['entryTime'] = ['between', [$period['startTime'], $period['endTime']]];
         }
+        // 发货时间:按 sendTime,可与账单时间同时生效
+        $sendSearchTime = $get['sendSearchTime'] ?? '';
+        if (!empty($sendSearchTime)) {
+            $sendStartTime = $get['sendStartTime'] ?? '';
+            $sendEndTime = $get['sendEndTime'] ?? '';
+            $sendPeriod = dateUtil::formatTime($sendSearchTime, $sendStartTime, $sendEndTime);
+            $where['sendTime'] = ['between', [$sendPeriod['startTime'], $sendPeriod['endTime']]];
+        }
         if (!empty($shortOrderSn)) {
             $where['orderSn'] = ['like', $shortOrderSn];
         }

+ 62 - 5
app-ghs/controllers/PurchaseOrderController.php

@@ -683,7 +683,7 @@ class PurchaseOrderController extends BaseController
         }
     }
 
-    //订单列表
+    // 采购入库单列表:searchTime 筛开单时间 entryTime,sendSearchTime 筛发货时间 sendTime
     public function actionList()
     {
         $where = [];
@@ -718,6 +718,7 @@ class PurchaseOrderController extends BaseController
                 $where['ghsName'] = ['like', $search];
             }
         }
+        // 开单时间:采购入库单按入库日 entryTime(业务上当作开单时间)
         $searchTime = $get['searchTime'] ?? '';
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
@@ -725,6 +726,14 @@ class PurchaseOrderController extends BaseController
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
             $where['entryTime'] = ['between', [$period['startTime'], $period['endTime']]];
         }
+        // 发货时间:按 sendTime,可与开单时间同时生效
+        $sendSearchTime = $get['sendSearchTime'] ?? '';
+        if (!empty($sendSearchTime)) {
+            $sendStartTime = $get['sendStartTime'] ?? '';
+            $sendEndTime = $get['sendEndTime'] ?? '';
+            $sendPeriod = dateUtil::formatTime($sendSearchTime, $sendStartTime, $sendEndTime);
+            $where['sendTime'] = ['between', [$sendPeriod['startTime'], $sendPeriod['endTime']]];
+        }
         $cgStaffId = $get['cgStaffId'] ?? 0;
         if (!empty($cgStaffId)) {
             $where['cgStaffId'] = $cgStaffId;
@@ -732,11 +741,13 @@ class PurchaseOrderController extends BaseController
         if ($export == 1) {
             ini_set('memory_limit', '2045M');
             set_time_limit(0);
-            if (isset($where['entryTime']) == false) {
+            // 导出须先选开单或发货时间段,最长一个月
+            $exportRange = $where['entryTime'] ?? $where['sendTime'] ?? null;
+            if (empty($exportRange)) {
                 util::fail('请选时间段');
             }
-            $start = $where['entryTime'][1][0];
-            $end = $where['entryTime'][1][1];
+            $start = $exportRange[1][0];
+            $end = $exportRange[1][1];
             $monthTime = bcmul(31, 86400);
             $startArea = strtotime($start);
             $endArea = strtotime($end);
@@ -792,7 +803,8 @@ class PurchaseOrderController extends BaseController
         $data = PurchaseOrderClass::getOrderList($where);
 
         if ($export == 1) {
-            PurchaseOrderClass::exportOrderData($data, $this->mainId);
+            $searchTimeType = intval($get['searchTimeType'] ?? 0);
+            PurchaseOrderClass::exportOrderData($data, $this->mainId, $searchTimeType);
         }
 
         //状态统计,很慢,暂时隐藏
@@ -1081,6 +1093,51 @@ class PurchaseOrderController extends BaseController
         util::complete('修改成功');
     }
 
+    /**
+     * 修改采购单送货时间:只改日期,时分秒沿用原 sendTime。
+     * ghsApp 采购详情「送货时间-修改」调用;允许补录过去日期。
+     */
+    public function actionModifySendTime()
+    {
+        $get = Yii::$app->request->get();
+        $id = $get['id'] ?? 0;
+        $date = $get['date'] ?? '';
+        $date = str_replace('/', '-', trim($date));
+        if (empty($date) || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
+            util::fail('请选择日期');
+        }
+        $cg = PurchaseOrderClass::getById($id, true);
+        if (empty($cg)) {
+            util::fail('没有找到订单');
+        }
+        if ($cg->mainId != $this->mainId) {
+            util::fail('不是你的订单');
+        }
+        $mainId = $this->mainId;
+        //超管或者约定的人可以修改日期,与修改入库时间同一批账号
+        if (getenv('YII_ENV') == 'production') {
+            if (in_array($mainId, [23390])) {
+                if (!in_array($this->adminId, [24586, 23960])) {
+                    util::fail('你不能修改哦');
+                }
+            }
+        }
+        $oldSendTime = (string)($cg->sendTime ?? '');
+        $oldDate = substr($oldSendTime, 0, 10);
+        if ($oldDate === $date) {
+            util::fail('日期没变');
+        }
+        if (empty($oldSendTime) || strpos($oldSendTime, '0000-00-00') === 0) {
+            $new = $date . ' ' . date('H:i:s');
+        } else {
+            $after = date('H:i:s', strtotime($oldSendTime));
+            $new = $date . ' ' . $after;
+        }
+        $cg->sendTime = $new;
+        $cg->save();
+        util::complete('修改成功');
+    }
+
     //导入采购 ssh 20241126
     public function actionImportCreate()
     {

+ 2 - 2
biz-ghs/clear/classes/ClearClass.php

@@ -576,9 +576,9 @@ class ClearClass extends BaseClass
         foreach ($cgList as $purchase) {
             $row = self::normalizeOrderRow($purchase);
             $cgId = intval($row['id'] ?? 0);
-            $saleId = intval($row['saleId'] ?? 0);
             $row['remainDebtPrice'] = self::resolvePurchaseRemainDebtPrice($row);
-            $row['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($cgId, $saleId);
+            // 仅本采购单结账,不按 saleId 回退(避免混入销售单客户结账)
+            $row['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($cgId);
             $out[] = $row;
         }
         return $out;

+ 13 - 15
biz-ghs/clear/classes/OrderCgClearClass.php

@@ -205,29 +205,27 @@ class OrderCgClearClass extends BaseClass
     }
 
     /**
-     * 采购单关联的已销结账单(仅本采购单在结账单中的销账额,勿与 saleId 查询合并以免重复累加)
+     * 采购单关联的已销结账单(只认本采购单 cgId,绝不回退到 saleId)
+     * 说明:若按 saleId 查,会把该关联销售单的客户结账一并带出,采购详情「结账信息」会错混销售结账。
+     *
+     * @return array<int, array{clearId:int, clearSn:string, amount:string}>
      */
     public static function listPaidClearRecordsForPurchase($purchaseId, $saleOrderId = 0)
     {
         $purchaseId = intval($purchaseId);
-        $saleOrderId = intval($saleOrderId);
+        // $saleOrderId 保留入参兼容旧调用,采购结账列表不再使用,避免混入销售单结账
+        unset($saleOrderId);
 
-        if ($purchaseId > 0) {
-            $cgList = self::getAllByCondition([
-                'cgId' => $purchaseId,
-                'status' => self::STATUS_HAS_PAY,
-            ], 'id asc', '*', null, true);
-            if (!empty($cgList)) {
-                return self::mapPaidClearRecordRows($cgList);
-            }
+        if ($purchaseId <= 0) {
+            return [];
         }
 
-        // 旧数据可能只有 orderId、未写 cgId
-        if ($saleOrderId > 0) {
-            return self::listPaidClearRecordsForOrder($saleOrderId);
-        }
+        $cgList = self::getAllByCondition([
+            'cgId' => $purchaseId,
+            'status' => self::STATUS_HAS_PAY,
+        ], 'id asc', '*', null, true);
 
-        return [];
+        return self::mapPaidClearRecordRows($cgList);
     }
 
     protected static function mapPaidClearRecordRows($list)

+ 64 - 48
biz-ghs/order/classes/OrderClass.php

@@ -185,7 +185,11 @@ class OrderClass extends BaseClass
 
     }
 
-    public static function exportOrderData($respond, $mainId)
+    /**
+     * 导出订单明细 Excel。
+     * $searchTimeType 与列表一致:0 开单、1 账单、2 发货,只影响文件名里的时间类型标注。
+     */
+    public static function exportOrderData($respond, $mainId, $searchTimeType = 0)
     {
         $orderList = $respond['list'] ?? [];
         if (empty($orderList)) {
@@ -248,38 +252,40 @@ class OrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getPageMargins()->setFooter(0);
 
         $objPHPExcel->getActiveSheet()->setCellValue('A1', '订单号');
-        $objPHPExcel->getActiveSheet()->setCellValue('B1', '创建时间');
-        $objPHPExcel->getActiveSheet()->setCellValue('C1', '账单日期');
-        $objPHPExcel->getActiveSheet()->setCellValue('D1', '订单金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('E1', '退款金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('F1', '实际金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('G1', '客户');
-        $objPHPExcel->getActiveSheet()->setCellValue('H1', '客户手机号');
-        $objPHPExcel->getActiveSheet()->setCellValue('I1', '在线支付');
-        $objPHPExcel->getActiveSheet()->setCellValue('J1', '结清状态');
-        $objPHPExcel->getActiveSheet()->setCellValue('K1', '已优惠');
-        $objPHPExcel->getActiveSheet()->setCellValue('L1', '备注');
-        $objPHPExcel->getActiveSheet()->setCellValue('M1', '开单人');
-        $objPHPExcel->getActiveSheet()->setCellValue('N1', '花材Id');
-        $objPHPExcel->getActiveSheet()->setCellValue('O1', '花材名称');
-        $objPHPExcel->getActiveSheet()->setCellValue('P1', '单价');
-        $objPHPExcel->getActiveSheet()->setCellValue('Q1', '数量');
-        $objPHPExcel->getActiveSheet()->setCellValue('R1', '已退数量');
-        $objPHPExcel->getActiveSheet()->setCellValue('S1', '金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('T1', '分类');
-        $objPHPExcel->getActiveSheet()->setCellValue('U1', '备注');
-        $objPHPExcel->getActiveSheet()->setCellValue('V1', '成本');
+        $objPHPExcel->getActiveSheet()->setCellValue('B1', '开单时间');
+        $objPHPExcel->getActiveSheet()->setCellValue('C1', '发货时间');
+        $objPHPExcel->getActiveSheet()->setCellValue('D1', '账单日期');
+        $objPHPExcel->getActiveSheet()->setCellValue('E1', '订单金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('F1', '退款金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('G1', '实际金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('H1', '客户');
+        $objPHPExcel->getActiveSheet()->setCellValue('I1', '客户手机号');
+        $objPHPExcel->getActiveSheet()->setCellValue('J1', '在线支付');
+        $objPHPExcel->getActiveSheet()->setCellValue('K1', '结清状态');
+        $objPHPExcel->getActiveSheet()->setCellValue('L1', '已优惠');
+        $objPHPExcel->getActiveSheet()->setCellValue('M1', '备注');
+        $objPHPExcel->getActiveSheet()->setCellValue('N1', '开单人');
+        $objPHPExcel->getActiveSheet()->setCellValue('O1', '花材Id');
+        $objPHPExcel->getActiveSheet()->setCellValue('P1', '花材名称');
+        $objPHPExcel->getActiveSheet()->setCellValue('Q1', '单价');
+        $objPHPExcel->getActiveSheet()->setCellValue('R1', '数量');
+        $objPHPExcel->getActiveSheet()->setCellValue('S1', '已退数量');
+        $objPHPExcel->getActiveSheet()->setCellValue('T1', '金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('U1', '分类');
+        $objPHPExcel->getActiveSheet()->setCellValue('V1', '备注');
+        $objPHPExcel->getActiveSheet()->setCellValue('W1', '成本');
 
         //设置宽度
         $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
         $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
         $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
-        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(16);
-        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20);
-        $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(20);
-        $objPHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(20);
-        $objPHPExcel->getActiveSheet()->getColumnDimension('T')->setWidth(18);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(16);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(20);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(20);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(20);
         $objPHPExcel->getActiveSheet()->getColumnDimension('U')->setWidth(18);
+        $objPHPExcel->getActiveSheet()->getColumnDimension('V')->setWidth(18);
         //加粗
         $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(9)->setBold(true);
         $objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(9)->setBold(true);
@@ -303,6 +309,7 @@ class OrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getFont()->setSize(9)->setBold(true);
         $objPHPExcel->getActiveSheet()->getStyle('U1')->getFont()->setSize(9)->setBold(true);
         $objPHPExcel->getActiveSheet()->getStyle('V1')->getFont()->setSize(9)->setBold(true);
+        $objPHPExcel->getActiveSheet()->getStyle('W1')->getFont()->setSize(9)->setBold(true);
 
         $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
@@ -326,6 +333,7 @@ class OrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('U1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('V1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
+        $objPHPExcel->getActiveSheet()->getStyle('W1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
 
         $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
@@ -349,6 +357,7 @@ class OrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('U1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('V1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
+        $objPHPExcel->getActiveSheet()->getStyle('W1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
 
         $baseRow = 2;
         $x = 0;
@@ -359,32 +368,37 @@ class OrderClass extends BaseClass
                     $i = $baseRow + $x;
                     $x++;
 
+                    $sendTime = $orderData['sendTime'] ?? '';
+                    if (empty($sendTime) || strpos((string)$sendTime, '0000-00-00') === 0) {
+                        $sendTime = '';
+                    }
                     $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, $orderData['orderSn']);
                     $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $orderData['addTime']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $orderData['payTime']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, $orderData['orderPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $orderData['tkPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('F' . $i, $orderData['actPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('G' . $i, $orderData['customName']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('H' . $i, $orderData['customMobile']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('I' . $i, $orderData['onlinePay'] == 1 ? '否' : '是');
-                    $objPHPExcel->getActiveSheet()->setCellValue('J' . $i, $orderData['debt'] == 1 ? '未结清' : '已结清');
-                    $objPHPExcel->getActiveSheet()->setCellValue('K' . $i, $orderData['discountAmount']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('L' . $i, $orderData['remark']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('M' . $i, $orderData['shopAdminName']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('N' . $i, $orderInfo['productId']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('O' . $i, $orderInfo['name']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('P' . $i, $orderInfo['xhUnitPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $sendTime);
+                    $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, $orderData['payTime']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $orderData['orderPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('F' . $i, $orderData['tkPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('G' . $i, $orderData['actPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('H' . $i, $orderData['customName']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('I' . $i, $orderData['customMobile']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('J' . $i, $orderData['onlinePay'] == 1 ? '否' : '是');
+                    $objPHPExcel->getActiveSheet()->setCellValue('K' . $i, $orderData['debt'] == 1 ? '未结清' : '已结清');
+                    $objPHPExcel->getActiveSheet()->setCellValue('L' . $i, $orderData['discountAmount']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('M' . $i, $orderData['remark']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('N' . $i, $orderData['shopAdminName']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('O' . $i, $orderInfo['productId']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('P' . $i, $orderInfo['name']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('Q' . $i, $orderInfo['xhUnitPrice']);
                     $remainNum = bcsub($orderInfo['xhNum'], $orderInfo['refundNum']);
                     $price = bcmul($remainNum, $orderInfo['xhUnitPrice'], 2);
-                    $objPHPExcel->getActiveSheet()->setCellValue('Q' . $i, $remainNum);
-                    $objPHPExcel->getActiveSheet()->setCellValue('R' . $i, $orderInfo['refundNum']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('S' . $i, $price);
+                    $objPHPExcel->getActiveSheet()->setCellValue('R' . $i, $remainNum);
+                    $objPHPExcel->getActiveSheet()->setCellValue('S' . $i, $orderInfo['refundNum']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('T' . $i, $price);
                     $classId = $orderInfo['classId'] ?? 0;
                     $className = isset($classList[$classId]) && isset($classList[$classId]['name']) ? $classList[$classId]['name'] : '';
-                    $objPHPExcel->getActiveSheet()->setCellValue('T' . $i, $className);
-                    $objPHPExcel->getActiveSheet()->setCellValue('U' . $i, $orderInfo['remark']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('V' . $i, $orderInfo['cost']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('U' . $i, $className);
+                    $objPHPExcel->getActiveSheet()->setCellValue('V' . $i, $orderInfo['remark']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('W' . $i, $orderInfo['cost']);
 
                     //居左
                     $objPHPExcel->getActiveSheet()->getStyle('A' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
@@ -408,10 +422,12 @@ class OrderClass extends BaseClass
                     $objPHPExcel->getActiveSheet()->getStyle('S' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                     $objPHPExcel->getActiveSheet()->getStyle('T' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                     $objPHPExcel->getActiveSheet()->getStyle('V' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
+                    $objPHPExcel->getActiveSheet()->getStyle('W' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                 }
             }
         }
-        $fileName = '订单明细-' . time();
+        $timeTypeName = $searchTimeType === 2 ? '发货时间' : ($searchTimeType === 1 ? '账单时间' : '开单时间');
+        $fileName = '订单明细-' . $timeTypeName . '-' . time();
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;

+ 65 - 40
biz-ghs/order/classes/PurchaseOrderClass.php

@@ -1353,6 +1353,17 @@ class PurchaseOrderClass extends BaseClass
         }
 
         $data['entryTime'] = isset($data['entryTime']) && !empty($data['entryTime']) ? $data['entryTime'] . ' 12:00:00' : date('Y-m-d H:i:s');
+        // 送货时间写入 sendTime(datetime),允许补录过去日期;空则当天
+        $sendTimeInput = isset($data['sendTime']) ? str_replace('/', '-', trim((string)$data['sendTime'])) : '';
+        if ($sendTimeInput === '') {
+            $data['sendTime'] = date('Y-m-d H:i:s');
+        } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $sendTimeInput)) {
+            $data['sendTime'] = $sendTimeInput . ' ' . date('H:i:s');
+        } elseif (!preg_match('/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}/', $sendTimeInput)) {
+            $data['sendTime'] = date('Y-m-d H:i:s');
+        } else {
+            $data['sendTime'] = $sendTimeInput;
+        }
 
         $packingCharge = $data['packingCharge'] ?? 0;
         $shortCharge = $data['shortCharge'] ?? 0;
@@ -1780,10 +1791,9 @@ class PurchaseOrderClass extends BaseClass
         }
         $orderData['needRemindRefreshSeat'] = $needRemindRefreshSeat;
         $orderData['inBooking'] = $inBooking;
-        // 结账信息列表:对齐销售单详情 orderClearList(部分/多次销均展示金额)
+        // 结账信息:仅本采购单 cgId 下的已销结账单,不含关联销售单的客户结账
         $cgId = intval($orderData['id'] ?? 0);
-        $saleId = intval($orderData['saleId'] ?? 0);
-        $orderData['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($cgId, $saleId);
+        $orderData['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($cgId);
         return $orderData;
     }
 
@@ -2012,7 +2022,11 @@ class PurchaseOrderClass extends BaseClass
         util::success(['file' => $fileUrl, 'shortFile' => $file]);
     }
 
-    public static function exportOrderData($respond, $mainId)
+    /**
+     * 导出采购单明细 Excel。
+     * $searchTimeType 与列表一致:0 开单 entryTime、2 发货 sendTime,只影响文件名里的时间类型标注。
+     */
+    public static function exportOrderData($respond, $mainId, $searchTimeType = 0)
     {
         $orderList = $respond['list'] ?? [];
         if (empty($orderList)) {
@@ -2072,24 +2086,25 @@ class PurchaseOrderClass extends BaseClass
 
         $objPHPExcel->getActiveSheet()->setCellValue('A1', '订单号');
         $objPHPExcel->getActiveSheet()->setCellValue('B1', '创建时间');
-        $objPHPExcel->getActiveSheet()->setCellValue('C1', '入库时间');
-        $objPHPExcel->getActiveSheet()->setCellValue('D1', '订单金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('E1', '退款金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('F1', '实际金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('G1', '供货商名称');
-        $objPHPExcel->getActiveSheet()->setCellValue('H1', '录入人员');
-        $objPHPExcel->getActiveSheet()->setCellValue('I1', '采购人员');
-        $objPHPExcel->getActiveSheet()->setCellValue('J1', '状态');
-        $objPHPExcel->getActiveSheet()->setCellValue('K1', '打印次数');
-        $objPHPExcel->getActiveSheet()->setCellValue('L1', '结清状态');
-        $objPHPExcel->getActiveSheet()->setCellValue('M1', '备注');
-        $objPHPExcel->getActiveSheet()->setCellValue('N1', '花材Id');
-        $objPHPExcel->getActiveSheet()->setCellValue('O1', '花材名称');
-        $objPHPExcel->getActiveSheet()->setCellValue('P1', '单价');
-        $objPHPExcel->getActiveSheet()->setCellValue('Q1', '数量');
-        $objPHPExcel->getActiveSheet()->setCellValue('R1', '已退数量');
-        $objPHPExcel->getActiveSheet()->setCellValue('S1', '金额');
-        $objPHPExcel->getActiveSheet()->setCellValue('T1', '分类');
+        $objPHPExcel->getActiveSheet()->setCellValue('C1', '开单时间');
+        $objPHPExcel->getActiveSheet()->setCellValue('D1', '发货时间');
+        $objPHPExcel->getActiveSheet()->setCellValue('E1', '订单金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('F1', '退款金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('G1', '实际金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('H1', '供货商名称');
+        $objPHPExcel->getActiveSheet()->setCellValue('I1', '录入人员');
+        $objPHPExcel->getActiveSheet()->setCellValue('J1', '采购人员');
+        $objPHPExcel->getActiveSheet()->setCellValue('K1', '状态');
+        $objPHPExcel->getActiveSheet()->setCellValue('L1', '打印次数');
+        $objPHPExcel->getActiveSheet()->setCellValue('M1', '结清状态');
+        $objPHPExcel->getActiveSheet()->setCellValue('N1', '备注');
+        $objPHPExcel->getActiveSheet()->setCellValue('O1', '花材Id');
+        $objPHPExcel->getActiveSheet()->setCellValue('P1', '花材名称');
+        $objPHPExcel->getActiveSheet()->setCellValue('Q1', '单价');
+        $objPHPExcel->getActiveSheet()->setCellValue('R1', '数量');
+        $objPHPExcel->getActiveSheet()->setCellValue('S1', '已退数量');
+        $objPHPExcel->getActiveSheet()->setCellValue('T1', '金额');
+        $objPHPExcel->getActiveSheet()->setCellValue('U1', '分类');
 
         //设置宽度
         $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
@@ -2120,6 +2135,7 @@ class PurchaseOrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('R1')->getFont()->setSize(9)->setBold(true);
         $objPHPExcel->getActiveSheet()->getStyle('S1')->getFont()->setSize(9)->setBold(true);
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getFont()->setSize(9)->setBold(true);
+        $objPHPExcel->getActiveSheet()->getStyle('U1')->getFont()->setSize(9)->setBold(true);
 
         $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
@@ -2141,6 +2157,7 @@ class PurchaseOrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('R1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('S1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
+        $objPHPExcel->getActiveSheet()->getStyle('U1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
 
         $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
@@ -2162,6 +2179,7 @@ class PurchaseOrderClass extends BaseClass
         $objPHPExcel->getActiveSheet()->getStyle('R1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('S1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
         $objPHPExcel->getActiveSheet()->getStyle('T1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
+        $objPHPExcel->getActiveSheet()->getStyle('U1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
 
         $baseRow = 2;
         $x = 0;
@@ -2179,16 +2197,21 @@ class PurchaseOrderClass extends BaseClass
                     } else {
                         $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, '');
                     }
-                    $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, $orderData['orderPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $orderData['tkPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('F' . $i, $orderData['actPrice']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('G' . $i, $orderData['ghsName']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('H' . $i, $orderData['shopAdminName']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('I' . $i, $orderData['cgStaffName']);
+                    $sendTime = $orderData['sendTime'] ?? '';
+                    if ($sendTime === '' || strpos($sendTime, '0000-00-00') !== false) {
+                        $sendTime = '';
+                    }
+                    $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, $sendTime);
+                    $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $orderData['orderPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('F' . $i, $orderData['tkPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('G' . $i, $orderData['actPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('H' . $i, $orderData['ghsName']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('I' . $i, $orderData['shopAdminName']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('J' . $i, $orderData['cgStaffName']);
                     $map = [1 => '待确认', 2 => '待发货', 3 => '待入库', 4 => '已入库', 5 => '已取消'];
                     $statusName = isset($orderData['status']) && isset($map[$orderData['status']]) ? $map[$orderData['status']] : '未知';
-                    $objPHPExcel->getActiveSheet()->setCellValue('J' . $i, $statusName);
-                    $objPHPExcel->getActiveSheet()->setCellValue('K' . $i, $orderData['printNum'] ?? 0);
+                    $objPHPExcel->getActiveSheet()->setCellValue('K' . $i, $statusName);
+                    $objPHPExcel->getActiveSheet()->setCellValue('L' . $i, $orderData['printNum'] ?? 0);
                     $debtName = '';
                     if ($orderData['debt'] == 1) {
                         $debtName = '未结清';
@@ -2196,20 +2219,20 @@ class PurchaseOrderClass extends BaseClass
                     if ($orderData['debt'] == 2) {
                         $debtName = '已结清';
                     }
-                    $objPHPExcel->getActiveSheet()->setCellValue('L' . $i, $debtName);
-                    $objPHPExcel->getActiveSheet()->setCellValue('M' . $i, $orderData['remark']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('N' . $i, $orderInfo['productId']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('O' . $i, $orderInfo['name']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('P' . $i, $orderInfo['bigPrice']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('M' . $i, $debtName);
+                    $objPHPExcel->getActiveSheet()->setCellValue('N' . $i, $orderData['remark']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('O' . $i, $orderInfo['productId']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('P' . $i, $orderInfo['name']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('Q' . $i, $orderInfo['bigPrice']);
                     $remainNum = bcsub($orderInfo['itemNum'], $orderInfo['refundNum']);
                     $price = bcmul($remainNum, $orderInfo['bigPrice'], 2);
                     $price = floatval($price);
-                    $objPHPExcel->getActiveSheet()->setCellValue('Q' . $i, $remainNum);
-                    $objPHPExcel->getActiveSheet()->setCellValue('R' . $i, $orderInfo['refundNum']);
-                    $objPHPExcel->getActiveSheet()->setCellValue('S' . $i, $price);
+                    $objPHPExcel->getActiveSheet()->setCellValue('R' . $i, $remainNum);
+                    $objPHPExcel->getActiveSheet()->setCellValue('S' . $i, $orderInfo['refundNum']);
+                    $objPHPExcel->getActiveSheet()->setCellValue('T' . $i, $price);
                     $classId = $orderInfo['classId'] ?? 0;
                     $className = isset($classList[$classId]) && isset($classList[$classId]['name']) ? $classList[$classId]['name'] : '';
-                    $objPHPExcel->getActiveSheet()->setCellValue('T' . $i, $className);
+                    $objPHPExcel->getActiveSheet()->setCellValue('U' . $i, $className);
 
                     //居左
                     $objPHPExcel->getActiveSheet()->getStyle('A' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
@@ -2232,10 +2255,12 @@ class PurchaseOrderClass extends BaseClass
                     $objPHPExcel->getActiveSheet()->getStyle('R' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                     $objPHPExcel->getActiveSheet()->getStyle('S' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                     $objPHPExcel->getActiveSheet()->getStyle('T' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
+                    $objPHPExcel->getActiveSheet()->getStyle('U' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                 }
             }
         }
-        $fileName = '采购单明细-' . time();
+        $timeTypeName = $searchTimeType === 2 ? '发货时间' : '开单时间';
+        $fileName = '采购单明细-' . $timeTypeName . '-' . time();
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;

+ 12 - 3
biz-ghs/order/services/OrderService.php

@@ -720,8 +720,11 @@ class OrderService extends BaseService
         return true;
     }
 
-    //支付成功后的流程 ssh 2021.5.14
-    //$isPurchase 是否零售端采购支付,如果是会引起销售方余额变动
+    /**
+     * 销售单付款成功后流程。
+     * $isPurchase 为零售端采购支付时会引起销售方余额变动。
+     * 空 sendTime 写成当前时刻,与采购单 PurchaseService::payAfter 对称。
+     */
     public static function payAfter($order, $payWay, $isPurchase = false)
     {
         if (isset($order->status) == false) {
@@ -892,8 +895,14 @@ class OrderService extends BaseService
             $order->debtPrice = $order->orderPrice ?? 0;
         }
         $order->payStatus = 1;
+        $payTime = date("Y-m-d H:i:s");
         if (!isset($order->payTime) || $order->payTime == '0000-00-00 00:00:00') {
-            $order->payTime = date("Y-m-d H:i:s");
+            $order->payTime = $payTime;
+        }
+        // 付款成功后补发货时间:空 sendTime 写成当前时刻,与采购单 payAfter 对称。开单已写入的不覆盖。
+        $sendTime = $order->sendTime ?? '';
+        if (empty($sendTime) || strpos((string)$sendTime, '0000-00-00') === 0) {
+            $order->sendTime = $payTime;
         }
         $order->save();
 

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

@@ -11,7 +11,7 @@ class PurchaseOrderService extends BaseService
 
     public static $baseFile = '\bizGhs\order\classes\PurchaseOrderClass';
 
-    //所有的欠款采购单 ssh 2021.1.26
+    // 采购挂账列表:按发货时间排,同一批发货的单挨在一起;空 sendTime 沉到底
     public static function getDebtList($where)
     {
         $get = Yii::$app->request->get();
@@ -20,7 +20,7 @@ class PurchaseOrderService extends BaseService
             ? (int)$get['pageSize'] : 100;
         $page = max(1, (int)($get['page'] ?? 1));
         Yii::$app->request->setQueryParams(array_merge($get, ['page' => $page, 'pageSize' => $pageSize]));
-        $result = PurchaseOrderClass::getList('*', $where, 'addTime DESC');
+        $result = PurchaseOrderClass::getList('*', $where, 'sendTime DESC, addTime DESC');
         $result['debtNum'] = $result['totalNum'] ?? 0;
         $list = $result['list'] ?? [];
         if (!empty($list)) {

+ 11 - 3
biz-hd/purchase/services/PurchaseService.php

@@ -147,8 +147,8 @@ class PurchaseService extends BaseService
         $respond = PurchaseClass::groupPurchase([$info], $showButton, $showProduct);
         $result = current($respond);
         $purchaseId = intval($result['id'] ?? 0);
-        $saleId = intval($result['saleId'] ?? 0);
-        $result['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($purchaseId, $saleId);
+        // 仅本采购单结账列表,不按关联销售单回退
+        $result['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($purchaseId);
         return $result;
     }
 
@@ -534,7 +534,10 @@ class PurchaseService extends BaseService
 
     }
 
-    //第三方支付、余额支付和欠款支付后调用的流程 ssh 2021.4.27
+    /**
+     * 采购单付款成功后流程。
+     * 空 sendTime 写成当前时刻;销售单发货时间由 OrderService::payAfter 对称写入。
+     */
     public static function payAfter($info, $payWay)
     {
         if (empty($info)) {
@@ -581,6 +584,11 @@ class PurchaseService extends BaseService
             //如果外面没有设置支付时间,即账单时间,则赋值支付时间
             $info->payTime = $payTime;
         }
+        // 花店确认页付款成功后补发货时间:空 sendTime 写成当前时刻。批发店开单已写入的 sendTime 不覆盖。
+        $sendTime = $info->sendTime ?? '';
+        if (empty($sendTime) || strpos((string)$sendTime, '0000-00-00') === 0) {
+            $info->sendTime = $payTime;
+        }
 
         if ($payWay == dict::getDict('payWay', 'debtPay')) {
             //欠款支付(批发开单若销售单已 payAfter,沿用其待结,支持开单余额抵挂账)