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

Merge branch 'master' into dev

shish 12 часов назад
Родитель
Сommit
296ed49031

+ 10 - 7
app-ghs/controllers/PurchaseOrderController.php

@@ -683,7 +683,7 @@ class PurchaseOrderController extends BaseController
         }
     }
 
-    // 采购入库单列表:searchTime 筛单时间 entryTime,sendSearchTime 筛发货时间 sendTime
+    // 采购入库单列表:searchTime 筛单时间 entryTime,sendSearchTime 筛发货时间 sendTime
     public function actionList()
     {
         $where = [];
@@ -718,7 +718,7 @@ class PurchaseOrderController extends BaseController
                 $where['ghsName'] = ['like', $search];
             }
         }
-        // 账单时间:采购入库单按入库日 entryTime(没有销售单那种 payTime
+        // 开单时间:采购入库单按入库日 entryTime(业务上当作开单时间
         $searchTime = $get['searchTime'] ?? '';
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
@@ -726,7 +726,7 @@ class PurchaseOrderController extends BaseController
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
             $where['entryTime'] = ['between', [$period['startTime'], $period['endTime']]];
         }
-        // 发货时间:按 sendTime,可与单时间同时生效
+        // 发货时间:按 sendTime,可与单时间同时生效
         $sendSearchTime = $get['sendSearchTime'] ?? '';
         if (!empty($sendSearchTime)) {
             $sendStartTime = $get['sendStartTime'] ?? '';
@@ -741,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);
@@ -801,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);
         }
 
         //状态统计,很慢,暂时隐藏

+ 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)

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

@@ -1791,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;
     }
 
@@ -2023,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)) {
@@ -2083,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);
@@ -2131,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);
@@ -2152,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);
@@ -2173,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;
@@ -2190,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 = '未结清';
@@ -2207,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);
@@ -2243,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;

+ 2 - 2
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;
     }