Selaa lähdekoodia

Merge branch 'master' into 260902_redesign_fix

shish 6 päivää sitten
vanhempi
commit
38b4a5f93d

+ 57 - 7
app-ghs/controllers/ExpendController.php

@@ -37,8 +37,12 @@ class ExpendController extends BaseController
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
         $where = ['mainId' => $this->mainId];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
-        $where['delStatus'] = 0; //过滤掉已删除的
+        // timeType=pay(默认记账 payTime)/ send(发生 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'pay';
+        $timeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+        $where[$timeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // 未删除才计入;sendTime 不代表单据有效,发货/发生口径同样必须带 delStatus=0
+        $where['delStatus'] = 0;
         $list = ExpendClass::getAllByCondition($where, null, '*', null);
         $arr = [];
         $cat = [];
@@ -207,6 +211,7 @@ class ExpendController extends BaseController
         if ($bx != -1) {
             $where['bx'] = $bx;
         }
+        // 未删除才列出;按 sendTime 筛时同样必须带,sendTime 不代表单据有效
         $where['delStatus'] = 0;
         $searchTime = isset($get['searchTime']) && !empty($get['searchTime']) ? $get['searchTime'] : 'thisYear';
         $startTime = $get['startTime'] ?? '';
@@ -218,8 +223,11 @@ class ExpendController extends BaseController
         $currentEndDate = date('Y-m-d', strtotime($end));
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
-        $respond = ExpendClass::getExpendList($where);
+        // timeType=pay(默认记账 payTime)/ send(发生 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'pay';
+        $timeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+        $where[$timeField] = ['between', [$currentStartTime, $currentEndTime]];
+        $respond = ExpendClass::getExpendList($where, $timeField . ' DESC,id DESC');
         $map = dict::getDict('expendTypeMap');
         if (!empty($respond['list'])) {
             foreach ($respond['list'] as $key => $val) {
@@ -319,10 +327,18 @@ class ExpendController extends BaseController
             }
             $staffName = $staff->name ?? '';
             $ptStyle = dict::getDict('ptStyle', 'ghs');
+            // payTime:登记记账时间,固定为当前时刻(不可再改)
             $payTime = date("Y-m-d H:i:s");
-            $historyDate = $post['historyDate'] ?? '';
-            if (!empty($historyDate)) {
-                $payTime = $historyDate . date(" H:i:s");
+            // sendTime:业务归属时间,前端可选日期;空则当天
+            $sendTimeInput = isset($post['sendTime']) ? str_replace('/', '-', trim((string)$post['sendTime'])) : '';
+            if ($sendTimeInput === '') {
+                $sendTime = $payTime;
+            } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $sendTimeInput)) {
+                $sendTime = $sendTimeInput . date(' H:i:s');
+            } elseif (preg_match('/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}/', $sendTimeInput)) {
+                $sendTime = $sendTimeInput;
+            } else {
+                $sendTime = $payTime;
             }
             $expendData = [
                 'type' => $type,
@@ -335,6 +351,7 @@ class ExpendController extends BaseController
                 'payWay' => $payWay,
                 'bx' => $bx,
                 'payTime' => $payTime,
+                'sendTime' => $sendTime,
             ];
             $respond = ExpendClass::add($expendData, true);
 
@@ -425,4 +442,37 @@ class ExpendController extends BaseController
         util::complete('修改成功');
     }
 
+    /**
+     * 修改支出业务时间 sendTime(列表「修改」走此接口;payTime 仍不可改)。
+     */
+    public function actionChangeSendTime()
+    {
+        $get = Yii::$app->request->get();
+        $id = $get['id'] ?? 0;
+        $date = $get['date'] ?? '';
+        if (empty($date)) {
+            util::fail('没有日期');
+        }
+        $date = str_replace('/', '-', trim((string)$date));
+        if (!preg_match('/^\d{4}-\d{2}-\d{2}/', $date)) {
+            util::fail('日期格式错误');
+        }
+        $expend = ExpendClass::getById($id, true);
+        if (empty($expend)) {
+            util::fail('没有找到支出');
+        }
+        if ($expend->mainId != $this->mainId) {
+            util::fail('不是你的支出');
+        }
+        // 只改 sendTime;时分秒沿用原 sendTime,空则用 addTime
+        $baseTime = $expend->sendTime ?? '';
+        if (empty($baseTime) || strpos((string)$baseTime, '0000-00-00') === 0) {
+            $baseTime = $expend->addTime ?? date('Y-m-d H:i:s');
+        }
+        $day = substr($date, 0, 10);
+        $expend->sendTime = $day . date(' H:i:s', strtotime($baseTime));
+        $expend->save();
+        util::complete('修改成功');
+    }
+
 }

+ 1 - 1
app-ghs/controllers/MerchantController.php

@@ -144,4 +144,4 @@ class MerchantController extends BaseController
         util::success(['introduce' => $merchant]);
     }
 
-}
+}

+ 24 - 8
app-ghs/controllers/OrderController.php

@@ -1112,7 +1112,7 @@ class OrderController extends BaseController
             $where['book'] = $book;
         }
         $searchTime = $get['searchTime'] ?? '';
-        // 0 开单时间 addTime,1 账时间 payTime,2 发货时间 sendTime;1 保持原值避免旧端/书签坏掉
+        // 0 开单时间 addTime,1 账时间 payTime,2 发货时间 sendTime;1 保持原值避免旧端/书签坏掉
         $searchTimeType = (int)($get['searchTimeType'] ?? 0);
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
@@ -1136,7 +1136,7 @@ class OrderController extends BaseController
                 $exportTimeName = '发货时间';
             } elseif ($searchTimeType === 1) {
                 $exportTimeKey = 'payTime';
-                $exportTimeName = '账时间';
+                $exportTimeName = '账时间';
             } else {
                 $exportTimeKey = 'addTime';
                 $exportTimeName = '开单时间';
@@ -1342,7 +1342,7 @@ class OrderController extends BaseController
 
         CustomClass::valid($custom, $this->shopId);
         if (!empty($custom['mainId']) && $custom['mainId'] == $custom['ownMainId']) {
-            util::fail('不能给自己开单');
+            //util::fail('不能给自己开单');
         }
         $post['ghsId'] = $custom['ghsId'] ?? 0;
         $post['customMobile'] = $custom['mobile'] ?? '';
@@ -3078,7 +3078,8 @@ class OrderController extends BaseController
     }
 
     /**
-     * 应收统计:按支付日汇总。
+     * 应收统计:按记账日或发货日汇总。
+     * timeType=bill(默认)筛 payTime;send 筛 sendTime,且只统计已付款。
      * originAmount=未扣隔天;nextDayAmount=跨天售后;amount=已扣隔天(净额)。
      */
     public function actionAccountList()
@@ -3104,7 +3105,14 @@ class OrderController extends BaseController
         if ($debt > -1) {
             $where['debt'] = $debt;
         }
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
         $orderList = OrderClass::getAllByCondition($where, null, '*');
         $list = [];
         $totalOriginAmount = 0;
@@ -3228,7 +3236,8 @@ class OrderController extends BaseController
 
 
     /**
-     * 客户业绩(PC):按支付日汇总开单;跨天售后按通过日扣实际金额并计入退款。
+     * 客户业绩(PC):按记账日或发货日汇总开单;跨天售后按通过日扣实际金额并计入退款。
+     * timeType=bill(默认)筛 payTime;send 筛 sendTime,且只统计已付款。
      * 与小程序 statCustomCg 同步,搜索关键词 customYj。
      */
     public function actionYj()
@@ -3254,7 +3263,14 @@ class OrderController extends BaseController
         if ($debt > -1) {
             $where['debt'] = $debt;
         }
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
         $orderList = OrderClass::getAllByCondition($where, null, '*');
         $list = [];
         $totalActPrice = 0;
@@ -3527,7 +3543,7 @@ class OrderController extends BaseController
             }
 
             if (isset($customRes->mainId) && !empty($customRes->mainId) && $customRes->mainId == $customRes->ownMainId) {
-                util::fail('不能给自己开单');
+                //util::fail('不能给自己开单');
             }
 
             $file = $_FILES['file'];

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

@@ -41,7 +41,7 @@ class PurchaseController extends BaseController
         util::success(['salt' => $salt]);
     }
 
-    // 采购挂账明细:searchTime 筛账时间 entryTime,sendSearchTime 筛发货时间 sendTime
+    // 采购挂账明细:searchTime 筛账时间 entryTime,sendSearchTime 筛发货时间 sendTime
     public function actionDebtList()
     {
         $get = Yii::$app->request->get();
@@ -54,7 +54,7 @@ class PurchaseController extends BaseController
         if ($confirm > -1) {
             $where['confirm'] = $confirm;
         }
-        // 账时间:采购入库单按入库日 entryTime(没有销售单那种 payTime)
+        // 账时间:采购入库单按入库日 entryTime(没有销售单那种 payTime)
         $searchTime = $get['searchTime'] ?? '';
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
@@ -62,7 +62,7 @@ class PurchaseController 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'] ?? '';
@@ -75,6 +75,11 @@ class PurchaseController extends BaseController
         }
         $respond = PurchaseOrderService::getDebtList($where);
         $respond['ghsInfo'] = $info;
+
+        $shop = $this->shop;
+        $pfLevel = $shop->pfLevel ?? 0;
+        $respond['pfLevel'] = $pfLevel;
+
         util::success($respond);
     }
 
@@ -85,7 +90,7 @@ class PurchaseController extends BaseController
         if (getenv('YII_ENV') == 'production') {
             //小向花卉采购的结账确认,有多处,关键词ghs_cg_clear_confirm
             if (in_array($this->mainId, [23390, 24516])) {
-                if (!in_array($this->adminId, [24655,77951])) {
+                if (!in_array($this->adminId, [24655, 77951])) {
                     util::fail('不能操作哦');
                 }
             }
@@ -122,4 +127,4 @@ class PurchaseController extends BaseController
         util::complete('确认成功');
     }
 
-}
+}

+ 11 - 2
app-ghs/controllers/PurchaseOrderController.php

@@ -817,6 +817,11 @@ class PurchaseOrderController extends BaseController
             'finishNum' => 0,
         ];
         $data = array_merge($data, $statData);
+
+        $shop = $this->shop;
+        $pfLevel = $shop->pfLevel ?? 0;
+        $data['pfLevel'] = $pfLevel;
+
         util::success($data);
     }
 
@@ -953,7 +958,8 @@ class PurchaseOrderController extends BaseController
     }
 
     /**
-     * 应付统计:按入库日汇总。
+     * 应付统计:按记账日或发货日汇总。
+     * timeType=bill(默认)筛 entryTime;send 筛 sendTime(仍只统计已入库 status=4)。
      * originAmount=未扣隔天;nextDayAmount=跨天售后;amount=已扣隔天(净额)。
      */
     public function actionDueList()
@@ -978,7 +984,10 @@ class PurchaseOrderController extends BaseController
         if ($debt > 0) {
             $cgWhere['debt'] = $debt;
         }
-        $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        // timeType=bill(默认记账 entryTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $cgTimeField = ($timeType === 'send') ? 'sendTime' : 'entryTime';
+        $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
         $cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
         $list = [];
         $totalOriginAmount = 0;

+ 8 - 1
app-ghs/controllers/StatCgGhsController.php

@@ -43,7 +43,14 @@ class StatCgGhsController extends BaseController
         if (!empty($debt)) {
             $where['debt'] = $debt;
         }
-        $where['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        // timeType=bill(默认记账 entryTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $cgTimeField = ($timeType === 'send') ? 'sendTime' : 'entryTime';
+        $where[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表已入库,发货口径只统计已完成采购单
+        if ($timeType === 'send') {
+            $where['status'] = 4;
+        }
         $orderList = PurchaseOrderClass::getAllByCondition($where, null, '*');
         $list = [];
         $totalActPrice = 0;

+ 8 - 1
app-ghs/controllers/StatController.php

@@ -30,7 +30,10 @@ class StatController extends BaseController
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime, true);
             $start = date("Y-m-d 00:00:00", strtotime($period['startTime']));
             $end = date("Y-m-d 23:59:59", strtotime($period['endTime']));
-            $where['entryTime'] = ['between', [$start, $end]];
+            // timeType=bill(默认记账 entryTime)/ send(发货 sendTime);上方 status=4,发货口径同样只统计已入库
+            $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+            $cgTimeField = ($timeType === 'send') ? 'sendTime' : 'entryTime';
+            $where[$cgTimeField] = ['between', [$start, $end]];
         }
         $cgList = PurchaseOrderClass::getAllByCondition($where, 'entryTime ASC', '*', null, true);
         $packingCharge = 0;
@@ -119,6 +122,10 @@ class StatController extends BaseController
         StatSaleClass::incomeOutItem($mainId);
     }
 
+    /**
+     * 经营利润总表:ghsApp profit、PC ghs /assets/profit 共用。
+     * timeType=bill 记账(销售/支出 payTime、采购 entryTime);=send 均按 sendTime。
+     */
     public function actionProfit()
     {
         ini_set('memory_limit', '2045M');

+ 42 - 32
app-ghs/controllers/StatItemController.php

@@ -66,10 +66,18 @@ class StatItemController extends BaseController
         $currentEndDate = date('Y-m-d', strtotime($end));
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款(xhGhsOrder.payStatus=1)
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
+        // includeNextDay=1(默认)计入跨天售后通过日扣减;=0 不含售后历史
+        $includeNextDay = !isset($get['includeNextDay']) || intval($get['includeNextDay']) === 1;
 
         $staffId = $get['staffId'] ?? 0;
-
         $list = OrderClass::getAllByCondition($where, null, '*');
         $productInfo = ProductClass::getAllByCondition(['mainId' => $this->mainId], null, 'id,name,py,cgStaffId', 'id');
         $stat = [];
@@ -148,37 +156,39 @@ class StatItemController extends BaseController
 
         // 通过日:退货扣数量+金额;仅退款只扣金额;无当日销量的花材也建负行
         $nextDayDeduct = '0.00';
-        $deductMaps = [
-            NextDayRefundClass::sumItemByProduct($this->mainId, $currentStartTime, $currentEndTime),
-            NextDayRefundClass::sumMoneyOnlyAmountByProduct($this->mainId, $currentStartTime, $currentEndTime),
-        ];
-        foreach ($deductMaps as $deductMap) {
-            foreach ($deductMap as $pid => $row) {
-                if (!empty($staffId)) {
-                    $currentCgStaffId = $productInfo[$pid]['cgStaffId'] ?? 0;
-                    if ($staffId != $currentCgStaffId) {
-                        continue;
+        if ($includeNextDay) {
+            $deductMaps = [
+                NextDayRefundClass::sumItemByProduct($this->mainId, $currentStartTime, $currentEndTime),
+                NextDayRefundClass::sumMoneyOnlyAmountByProduct($this->mainId, $currentStartTime, $currentEndTime),
+            ];
+            foreach ($deductMaps as $deductMap) {
+                foreach ($deductMap as $pid => $row) {
+                    if (!empty($staffId)) {
+                        $currentCgStaffId = $productInfo[$pid]['cgStaffId'] ?? 0;
+                        if ($staffId != $currentCgStaffId) {
+                            continue;
+                        }
                     }
+                    if (!isset($stat[$pid])) {
+                        $stat[$pid] = [
+                            'productId' => $pid,
+                            'name' => $productInfo[$pid]['name'] ?? '',
+                            'py' => $productInfo[$pid]['py'] ?? '',
+                            'num' => '0.00',
+                            'amount' => '0.00',
+                            'gross' => '0.00',
+                        ];
+                    }
+                    $subNum = (string)($row['num'] ?? '0');
+                    $subAmt = (string)($row['amount'] ?? '0');
+                    $stat[$pid]['num'] = bcsub((string)$stat[$pid]['num'], $subNum, 2);
+                    $stat[$pid]['amount'] = bcsub((string)$stat[$pid]['amount'], $subAmt, 2);
+                    $stat[$pid]['gross'] = bcsub((string)$stat[$pid]['gross'], $subAmt, 2);
+                    $totalNum = bcsub((string)$totalNum, $subNum, 2);
+                    $totalAmount = bcsub((string)$totalAmount, $subAmt, 2);
+                    $totalMl = bcsub((string)$totalMl, $subAmt, 2);
+                    $nextDayDeduct = bcadd($nextDayDeduct, $subAmt, 2);
                 }
-                if (!isset($stat[$pid])) {
-                    $stat[$pid] = [
-                        'productId' => $pid,
-                        'name' => $productInfo[$pid]['name'] ?? '',
-                        'py' => $productInfo[$pid]['py'] ?? '',
-                        'num' => '0.00',
-                        'amount' => '0.00',
-                        'gross' => '0.00',
-                    ];
-                }
-                $subNum = (string)($row['num'] ?? '0');
-                $subAmt = (string)($row['amount'] ?? '0');
-                $stat[$pid]['num'] = bcsub((string)$stat[$pid]['num'], $subNum, 2);
-                $stat[$pid]['amount'] = bcsub((string)$stat[$pid]['amount'], $subAmt, 2);
-                $stat[$pid]['gross'] = bcsub((string)$stat[$pid]['gross'], $subAmt, 2);
-                $totalNum = bcsub((string)$totalNum, $subNum, 2);
-                $totalAmount = bcsub((string)$totalAmount, $subAmt, 2);
-                $totalMl = bcsub((string)$totalMl, $subAmt, 2);
-                $nextDayDeduct = bcadd($nextDayDeduct, $subAmt, 2);
             }
         }
 
@@ -279,4 +289,4 @@ class StatItemController extends BaseController
         util::success(['list' => $stat]);
     }
 
-}
+}

+ 4 - 1
app-ghs/controllers/StatKdController.php

@@ -10,7 +10,10 @@ use Yii;
 class StatKdController extends BaseController
 {
 
-    //各渠道收入 ssh 20220711
+    /**
+     * 各渠道收入:ghsApp kdIncome、PC ghs /assets/kdIncome 共用。
+     * timeType=bill 按账单日 payTime(默认);=send 按发货 sendTime(仅已付款)。
+     */
     public function actionProfile()
     {
 

+ 16 - 0
app-hd/controllers/NoticeController.php

@@ -3,6 +3,7 @@
 namespace hd\controllers;
 
 use biz\common\classes\GhsNotifyClass;
+use biz\renew\classes\RenewClass;
 use biz\shop\classes\ShopClass;
 use bizGhs\custom\classes\CustomClass;
 use bizGhs\custom\classes\CustomRechargeClass;
@@ -564,6 +565,21 @@ class NoticeController extends PublicController
             }
             Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);
 
+            // 花店续费(xhRenew)支付成功通知
+            if ($capitalType == dict::getDict('capitalType', 'xhRenew', 'id')) {
+                $renew = RenewClass::getByCondition(['orderSn' => $orderSn], true);
+                $sjName = !empty($renew) ? (string) ($renew->sjName ?? '') : '';
+                $shopName = !empty($renew) ? (string) ($renew->shopName ?? '') : '';
+                $renewName = ($shopName === '' || $shopName === '首店')
+                    ? $sjName
+                    : trim($sjName . ' ' . $shopName);
+                if ($renewName === '') {
+                    $renewName = (string) $orderSn;
+                }
+                $renewAmount = !empty($renew) ? ($renew->actPrice ?? $totalFee) : $totalFee;
+                noticeUtil::push('零售花店:' . $renewName . ',续费金额:' . $renewAmount . ',续费成功', '15280215347');
+            }
+
             //零售采购结账通知
             if ($capitalType == dict::getDict('capitalType', 'xhPurchase', 'id')) {
                 $cg = PurchaseClass::getByCondition(['orderSn' => $orderSn], true);

+ 9 - 0
app-hd/controllers/RenewController.php

@@ -14,6 +14,7 @@ use bizHd\user\services\UserService;
 use bizHd\wx\classes\WxOpenClass;
 use common\components\dict;
 use common\components\httpUtil;
+use common\components\noticeUtil;
 use common\components\util;
 use Yii;
 
@@ -161,6 +162,14 @@ class RenewController extends BaseController
                 'capitalType=' . dict::getDict('capitalType', 'xhRenew', 'id') . '&applyId=' . $attachApplyId,
                 ''
             );
+            // 0 元续费当场完成,不走微信支付回调,此处补发成功通知
+            $renewName = $shopName == '首店' || $shopName === ''
+                ? $sjName
+                : trim($sjName . ' ' . $shopName);
+            if ($renewName === '') {
+                $renewName = (string) $this->shopId;
+            }
+            noticeUtil::push('零售花店:' . $renewName . ',续费金额:' . $actPrice . ',续费成功', '15280215347');
             util::success([
                 'needPay' => 0,
                 'paid' => 1,

+ 21 - 14
app-mall/controllers/ShopController.php

@@ -28,34 +28,41 @@ class ShopController extends BaseController
         // 测试 / 正式各写死 3 家;shopId 请换成真实 xhShop.id(ptStyle=1)
         $rows = $isProd
             ? [
-                [
-                    'shopId' => 2,
-                    'name' => '龙岩花掌柜',
-                    'address' => '龙岩市交易城新杰路138号',
-                    'businessHours' => '09:00-22:00',
-                    'cover' => 'hhb/images/guest/shop1.jpg',
-                ],
                 [
                     'shopId' => 501,
                     'name' => '楼兰花艺',
-                    'address' => '深圳市龙岗区坂田街道岗头社区中围路33号',
+                    'address' => '厦门市集美区凤林前山路147号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'shop/wsf_ll.png',
                 ],
                 [
-                    'shopId' => 106502,
-                    'name' => '吉星鲜花',
-                    'address' => '福州市仓山区浦上大道339-30号',
+                    'shopId' => 1,
+                    'name' => '国兰花尚',
+                    'address' => '厦门市思明区后埭溪路128号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop2.jpg',
                 ],
                 [
-                    'shopId' => 106473,
-                    'name' => '大自然鲜花',
-                    'address' => '漳州市龙海区鸿江路15号',
+                    'shopId' => 17117,
+                    'name' => '淘花里鲜花',
+                    'address' => '广东省中山市歧关西路20号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop3.jpg',
                 ],
+                [
+                    'shopId' => 77702,
+                    'name' => '天天鲜花',
+                    'address' => '厦门市思明区双涵路97号',
+                    'businessHours' => '09:00-22:00',
+                    'cover' => 'hhb/images/guest/shop1.jpg',
+                ],
+                [
+                    'shopId' => 2,
+                    'name' => '龙岩花掌柜',
+                    'address' => '龙岩市交易城C区',
+                    'businessHours' => '09:00-22:00',
+                    'cover' => 'hhb/images/guest/shop2.jpg',
+                ]
             ]
             : [
                 [

+ 8 - 2
biz-ghs/expend/classes/ExpendClass.php

@@ -9,9 +9,15 @@ class ExpendClass extends BaseClass
 
     public static $baseFile = '\bizGhs\expend\models\Expend';
 
-    public static function getExpendList($where)
+    /**
+     * 支出分页列表。
+     * @param array $where 查询条件(含 payTime 或 sendTime 区间)
+     * @param string $order 排序,默认按记账时间
+     * @return array
+     */
+    public static function getExpendList($where, $order = 'payTime DESC,id DESC')
     {
-        $data = self::getList('*', $where, 'payTime DESC,id DESC');
+        $data = self::getList('*', $where, $order);
         return $data;
     }
 

+ 7 - 3
biz-ghs/order/classes/OrderClass.php

@@ -426,7 +426,7 @@ class OrderClass extends BaseClass
                 }
             }
         }
-        $timeTypeName = $searchTimeType === 2 ? '发货时间' : ($searchTimeType === 1 ? '账时间' : '开单时间');
+        $timeTypeName = $searchTimeType === 2 ? '发货时间' : ($searchTimeType === 1 ? '账时间' : '开单时间');
         $fileName = '订单明细-' . $timeTypeName . '-' . time();
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
@@ -2959,7 +2959,9 @@ XL;
                 $objPHPExcel->getActiveSheet()->getStyle($col . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
             }
         }
-        $fileName = '应收统计-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '应收统计-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;
@@ -3142,7 +3144,9 @@ XL;
             $objPHPExcel->getActiveSheet()->getStyle('I' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
             $objPHPExcel->getActiveSheet()->getStyle('J' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         }
-        $fileName = '客户业绩-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '客户业绩-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;

+ 3 - 1
biz-ghs/order/classes/PurchaseOrderClass.php

@@ -2008,7 +2008,9 @@ class PurchaseOrderClass extends BaseClass
                 $objPHPExcel->getActiveSheet()->getStyle($col . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
             }
         }
-        $fileName = '应付统计-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '应付统计-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;

+ 15 - 3
biz-ghs/stat/classes/StatCgClass.php

@@ -50,8 +50,13 @@ class StatCgClass extends BaseClass
 
         $productInfo = ProductClass::getAllByCondition(['mainId' => $mainId], null, 'id,name,py', 'id');
 
+        // timeType=bill(默认记账 entryTime)/ send(发货 sendTime)
+        // status=4 已入库;发货口径也必须带,因为 sendTime 不代表已入库
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $cgTimeField = ($timeType === 'send') ? 'sendTime' : 'entryTime';
+
         $cgWhere = ['mainId' => $mainId, 'status' => 4];
-        $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
         $cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
         $arr = [];
         $cgData = [];
@@ -223,7 +228,9 @@ class StatCgClass extends BaseClass
             $objPHPExcel->getActiveSheet()->getStyle('B' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
             $objPHPExcel->getActiveSheet()->getStyle('C' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
         }
-        $fileName = '采购花材-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '采购花材-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;
@@ -265,8 +272,13 @@ class StatCgClass extends BaseClass
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
+        // timeType=bill(默认记账 entryTime)/ send(发货 sendTime)
+        // status=4 已入库;发货口径也必须带,因为 sendTime 不代表已入库
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $cgTimeField = ($timeType === 'send') ? 'sendTime' : 'entryTime';
+
         $cgWhere = ['mainId' => $mainId, 'status' => 4];
-        $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
         $cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
 
         $cgData = [];

+ 14 - 2
biz-ghs/stat/classes/StatKdClass.php

@@ -43,6 +43,10 @@ class StatKdClass extends BaseClass
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime):只切批发/零售销售表
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+
         $staffList = ShopAdminClass::getAllByCondition(['mainId' => $mainId, 'isPt' => 0], null, '*', 'id', true);
         $kf = [];
         if (!empty($staffList)) {
@@ -165,7 +169,11 @@ class StatKdClass extends BaseClass
 
         //批发开单
         $where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
 
         $ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
         if (!empty($ghsOrderList)) {
@@ -279,7 +287,11 @@ class StatKdClass extends BaseClass
         $payCodeIncome = 0;
         $lsAfterSale = 0;
         $hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
-        $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
+        if ($timeType === 'send') {
+            $hdWhere['payStatus'] = 1;
+        }
         $hdOrderList = HdOrderClass::getAllByCondition($hdWhere, null, '*');
         foreach ($hdOrderList as $hdKey => $hdOrder) {
             $payWay = $hdOrder['payWay'] ?? 0;

+ 78 - 16
biz-ghs/stat/classes/StatSaleClass.php

@@ -140,8 +140,16 @@ class StatSaleClass extends BaseClass
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+
         $where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
 
         $customList = CustomClass::getAllByCondition(['ownMainId' => $mainId], null, 'id,name,py', 'id');
 
@@ -254,6 +262,11 @@ class StatSaleClass extends BaseClass
     /**
      * 经营利润总表:收入 − 支出。
      * 采购跨天售后:不改「花材采购」入库口径;通过日单独「采购隔天退货」(退货并退款+仅退款合计)计入收入。
+     * timeType=bill(默认):销售按 payTime、采购按 entryTime、支出按 payTime;
+     * timeType=send:销售/采购/支出均按 sendTime。
+     * 发货口径须补成功态:xhGhsOrder/xhOrder 加 payStatus=1,xhGhsCgOrder 加 status=4,xhExpend 加 delStatus=0
+     * (sendTime 开单即可写入,不代表成交;payTime/entryTime 本身即成功时间)。
+     * 仅切换 xhGhsOrder / xhOrder / xhGhsCgOrder / xhExpend,其它统计项时间字段不变。
      */
     public static function profile($mainId)
     {
@@ -277,12 +290,22 @@ class StatSaleClass extends BaseClass
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
+        // 记账时间(bill,默认) / 发货时间(send):作用于批发销售、零售销售、供货商采购、支出登记
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $useSendTime = ($timeType === 'send');
+        // xhGhsOrder / xhOrder
+        $saleTimeField = $useSendTime ? 'sendTime' : 'payTime';
+        // xhGhsCgOrder:账单口径用入库时间 entryTime
+        $cgTimeField = $useSendTime ? 'sendTime' : 'entryTime';
+        // xhExpend:账单口径 payTime,发货口径 sendTime
+        $expendTimeField = $useSendTime ? 'sendTime' : 'payTime';
+
         //出库
         $stockOut = StatStockOutClass::getSum($where);
 
-        //采购入库
+        //采购入库(xhGhsCgOrder):status=4 已入库;发货口径也必须带,因为 sendTime 不代表已入库
         $cgWhere = ['mainId' => $mainId, 'status' => 4];
-        $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
         $cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
         $cg = 0;
         if (!empty($cgList)) {
@@ -343,12 +366,16 @@ class StatSaleClass extends BaseClass
 
         $totalOrderNum = 0;
 
-        //批发开单
+        //批发开单(xhGhsOrder)
         $pfIncome = 0;
         $pfSendCost = 0;
         $pfPack = 0;
         $where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($useSendTime) {
+            $where['payStatus'] = 1;
+        }
 
         $ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
         if (!empty($ghsOrderList)) {
@@ -380,7 +407,7 @@ class StatSaleClass extends BaseClass
             $currentEndTime
         );
 
-        //零售开单
+        //零售开单(xhOrder)
         $payCodeIncome = 0;
         $lsAfterSale = 0;
         $lsGiveBalance = 0;
@@ -388,7 +415,11 @@ class StatSaleClass extends BaseClass
         $lsSendCost = 0;
         $lsServiceFee = 0;
         $hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
-        $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
+        if ($useSendTime) {
+            $hdWhere['payStatus'] = 1;
+        }
         $hdOrderList = HdOrderClass::getAllByCondition($hdWhere, null, '*');
         foreach ($hdOrderList as $hdKey => $hdOrder) {
             $actPrice = $hdOrder['mainPay'] ?? 0;
@@ -437,9 +468,10 @@ class StatSaleClass extends BaseClass
             }
         }
 
+        // 支出:delStatus=0 未删除;发货口径也必须带,因为 sendTime 不代表单据有效
         $condition = [
             'mainId' => $mainId,
-            'payTime' => ['between', [$currentStartTime, $currentEndTime]],
+            $expendTimeField => ['between', [$currentStartTime, $currentEndTime]],
             'delStatus' => 0,
         ];
         $expendList = ExpendClass::getAllByCondition($condition, null, '*', null, true);
@@ -869,6 +901,13 @@ class StatSaleClass extends BaseClass
             util::fail('查询时间不能超过三个月,编号780');
         }
 
+        // timeType=bill:销售 payTime、采购 entryTime;send:均按 sendTime
+        // 发货口径销售须补 payStatus=1、采购须 status=4(sendTime 不代表成交/入库)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $useSendTime = ($timeType === 'send');
+        $saleTimeField = $useSendTime ? 'sendTime' : 'payTime';
+        $cgTimeField = $useSendTime ? 'sendTime' : 'entryTime';
+
         $classList = ItemClassClass::getAllByCondition(['mainId' => $mainId], null, 'id,name', 'id');
         if (empty($classList)) {
             util::fail('没有找到花材');
@@ -882,11 +921,11 @@ class StatSaleClass extends BaseClass
         $totalDiscountAmount = 0;
         $totalLabourCost = 0;
 
-        //采购入库
+        //采购入库:status=4 已入库;发货口径也必须带,sendTime 不代表已入库
         $tbCgIncome = [];
         $tbCgIncomeStaff = [];
         $cgWhere = ['mainId' => $mainId, 'status' => 4];
-        $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
         $cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
         if (!empty($cgList)) {
             foreach ($cgList as $cgKey => $cgItem) {
@@ -1027,7 +1066,11 @@ class StatSaleClass extends BaseClass
         $tbSaleIncome = [];
         $tbSaleIncomeStaff = [];
         $where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($useSendTime) {
+            $where['payStatus'] = 1;
+        }
         $ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
         if (!empty($ghsOrderList)) {
             foreach ($ghsOrderList as $ghsKey => $ghsOrder) {
@@ -1156,7 +1199,11 @@ class StatSaleClass extends BaseClass
         //零售开单
         $lsIncome = 0;
         $hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
-        $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
+        if ($useSendTime) {
+            $hdWhere['payStatus'] = 1;
+        }
         $hdOrderList = HdOrderClass::getAllByCondition($hdWhere, null, '*');
         foreach ($hdOrderList as $hdKey => $hdOrder) {
             $actPrice = $hdOrder['mainPay'] ?? 0;
@@ -1339,7 +1386,9 @@ class StatSaleClass extends BaseClass
             $objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
             $objPHPExcel->getActiveSheet()->getStyle('F' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
         }
-        $fileName = '收支花材-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '收支花材-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;
@@ -1430,7 +1479,9 @@ class StatSaleClass extends BaseClass
             $objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
             $objPHPExcel->getActiveSheet()->getStyle('F' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         }
-        $fileName = '收支分类-' . time();
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '收支分类-' . $timeTypeName . '-' . time();
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;
@@ -1513,7 +1564,10 @@ class StatSaleClass extends BaseClass
             $objPHPExcel->getActiveSheet()->getStyle('D' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
             $objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
         }
-        $fileName = '花材销量-' . date("m-d");
+        // 文件名带上记账/发货 + 是否含售后历史,避免下载后分不清口径
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $afterSaleName = ((int)Yii::$app->request->get('includeNextDay', 1) === 1) ? '含售后历史' : '不含售后历史';
+        $fileName = '花材销量-' . $timeTypeName . '-' . $afterSaleName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;
@@ -1630,8 +1684,16 @@ class StatSaleClass extends BaseClass
         $currentStartTime = $currentStartDate . ' 00:00:00';
         $currentEndTime = $currentEndDate . ' 23:59:59';
 
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+
         $where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
 
         $customList = CustomClass::getAllByCondition(['ownMainId' => $mainId], null, 'id,name,distId', 'id');
 

+ 15 - 2
biz-ghs/stat/classes/StatYjClass.php

@@ -36,9 +36,18 @@ class StatYjClass extends BaseClass
 
         $arr = [];
 
+        // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
+        // 发货口径须补 payStatus=1:sendTime 不代表成交
+        $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
+        $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
+
         //批发开单
         $where = ['mainId' => $mainId];
-        $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款
+        if ($timeType === 'send') {
+            $where['payStatus'] = 1;
+        }
         $ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
         if (!empty($ghsOrderList)) {
             foreach ($ghsOrderList as $ghsKey => $ghsOrder) {
@@ -63,7 +72,11 @@ class StatYjClass extends BaseClass
         }
 
         $hdWhere = ['mainId' => $mainId];
-        $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
+        $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
+        // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
+        if ($timeType === 'send') {
+            $hdWhere['payStatus'] = 1;
+        }
         $hdOrderList = \bizHd\order\classes\OrderClass::getAllByCondition($hdWhere, null, '*');
         if (!empty($hdOrderList)) {
             foreach ($hdOrderList as $hdKey => $hdOrder) {

+ 2 - 5
biz-hd/order/classes/OrderClass.php

@@ -434,11 +434,8 @@ class OrderClass extends BaseClass
         $order->status = self::ORDER_STATUS_UN_SEND; // 付款后,订单状态设置为:已付款(待配送)
         $order->payWay = $payWay;
         $order->payStatus = 1;
-        if (!empty($params['historyDate'])) {
-            $order->payTime = $params['historyDate'] . ' ' . date("H:i:s");
-        } else {
-            $order->payTime = date("Y-m-d H:i:s");
-        }
+        $order->sendTime = date("Y-m-d H:i:s");
+        $order->payTime = date("Y-m-d H:i:s");
         $order->stockChange = 1;
         $order->save();
 

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

@@ -581,7 +581,7 @@ class PurchaseService extends BaseService
         $info->payStatus = 1;
         $payTime = date("Y-m-d H:i:s");
         if (empty($info->payTime) || $info->payTime == '0000-00-00 00:00:00') {
-            //如果外面没有设置支付时间,即账时间,则赋值支付时间
+            //如果外面没有设置支付时间,即账时间,则赋值支付时间
             $info->payTime = $payTime;
         }
         // 花店确认页付款成功后补发货时间:空 sendTime 写成当前时刻。批发店开单已写入的 sendTime 不覆盖。

+ 3 - 1
biz/stat/classes/StatCgGhsClass.php

@@ -184,7 +184,9 @@ class StatCgGhsClass extends BaseClass
             $objPHPExcel->getActiveSheet()->getStyle('I' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
             $objPHPExcel->getActiveSheet()->getStyle('J' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
         }
-        $fileName = '供货商业绩-' . date("m-d");
+        // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
+        $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
+        $fileName = '供货商业绩-' . $timeTypeName . '-' . date("m-d");
         $objPHPExcel->getActiveSheet()->setTitle($fileName);
         $objPHPExcel->setActiveSheetIndex(0);
         $dir = './priceTable/' . $mainId;

+ 38 - 43
common/components/bookHd.php

@@ -1,5 +1,10 @@
 <?php
 
+/**
+ * 零售花店(hd)教学手册:目录与详情内容。
+ * BookController::actionList / actionDetail 读取;id 必须与 $data 的 key 一致,视频走 hdHost/jc/{id}.mp4。
+ */
+
 namespace common\components;
 
 class bookHd
@@ -7,62 +12,52 @@ class bookHd
 
     public static $list = [
         ['class' => '开始', 'icon' => '/book/begin.png', 'list' => [
-            ['title' => '花掌柜是什么', 'id' => 'hd_what'],
-            ['title' => '如何注册花掌柜', 'id' => 'hd_register'],
-            ['title' => '使用前的准备工作', 'id' => 'hd_prepare'],
-            ['title' => '添加花束到相册', 'id' => 'hd_add_hs_album'],
-            ['title' => '添加花束到商城', 'id' => 'hd_add_hs_mall'],
-            ['title' => '编辑花束简介', 'id' => 'hd_edit_hs_intro'],
-            ['title' => '售后说明和养护知识', 'id' => 'hd_image_text'],
-            ['title' => '添加修改分类', 'id' => 'hd_category'],
-            ['title' => '花束和分类的排序', 'id' => 'hd_order'],
-            ['title' => '分享相册和商城', 'id' => 'hd_share'],
-            ['title' => '搞充值活动', 'id' => 'hd_recharge'],
-            ['title' => '登记客户生日', 'id' => 'hd_birthday'],
-            ['title' => '收款码', 'id' => 'hd_gathering_code'],
+            ['title' => '如何跟批发店购买花材', 'id' => 'ls_buy_item'],
+            ['title' => '分类如何管理与配置', 'id' => 'ls_category_manage'],
+            ['title' => '商品添加与修改', 'id' => 'ls_goods_manage'],
+            ['title' => '花材的添加与管理', 'id' => 'ls_item_mange'],
+            ['title' => '导航栏、轮播图、金刚区的设置', 'id' => 'ls_index'],
+            ['title' => '热门推荐、今日上新、更多商品', 'id' => 'ls_hot'],
+            ['title' => '场景管理与使用', 'id' => 'ls_scene'],
+            //['title' => '节日涨价配置', 'id' => 'hd_category'],
+            ['title' => '客户售后处理', 'id' => 'ls_refund'],
+            ['title' => '秒杀活动', 'id' => 'ls_seckill'],
+            ['title' => '团购活动', 'id' => 'ls_group'],
         ]],
     ];
 
+    // 详情按 $list 的 id 取值;点开某条教程时 BookController 拼完整视频地址
     public static $data = [
-        'hd_what' => [
-            ['style' => 'video', 'value' => 'jc/hd_what.mp4'],
-        ],
-        'hd_register' => [
-            ['style' => 'video', 'value' => 'jc/hd_register.mp4'],
-        ],
-        'hd_prepare' => [
-            ['style' => 'video', 'value' => 'jc/hd_prepare.mp4'],
-        ],
-        'hd_add_hs_album' => [
-            ['style' => 'video', 'value' => 'jc/hd_add_hs_album.mp4'],
+        'ls_buy_item' => [
+            ['style' => 'video', 'value' => 'jc/ls_buy_item.mp4'],
         ],
-        'hd_add_hs_mall' => [
-            ['style' => 'video', 'value' => 'jc/hd_add_hs_mall.mp4'],
+        'ls_category_manage' => [
+            ['style' => 'video', 'value' => 'jc/ls_category_manage.mp4'],
         ],
-        'hd_edit_hs_intro' => [
-            ['style' => 'video', 'value' => 'jc/hd_edit_hs_intro.mp4'],
+        'ls_goods_manage' => [
+            ['style' => 'video', 'value' => 'jc/ls_goods_manage.mp4'],
         ],
-        'hd_image_text' => [
-            ['style' => 'video', 'value' => 'jc/hd_image_text.mp4'],
+        'ls_item_mange' => [
+            ['style' => 'video', 'value' => 'jc/ls_item_mange.mp4'],
         ],
-        'hd_category' => [
-            ['style' => 'video', 'value' => 'jc/hd_category.mp4'],
+        'ls_index' => [
+            ['style' => 'video', 'value' => 'jc/ls_index.mp4'],
         ],
-        'hd_order' => [
-            ['style' => 'video', 'value' => 'jc/hd_order.mp4'],
+        'ls_hot' => [
+            ['style' => 'video', 'value' => 'jc/ls_hot.mp4'],
         ],
-        'hd_share' => [
-            ['style' => 'video', 'value' => 'jc/hd_share.mp4'],
+        'ls_scene' => [
+            ['style' => 'video', 'value' => 'jc/ls_scene.mp4'],
         ],
-        'hd_recharge' => [
-            ['style' => 'video', 'value' => 'jc/hd_recharge.mp4'],
+        'ls_refund' => [
+            ['style' => 'video', 'value' => 'jc/ls_refund.mp4'],
         ],
-        'hd_birthday' => [
-            ['style' => 'video', 'value' => 'jc/hd_birthday.mp4'],
+        'ls_seckill' => [
+            ['style' => 'video', 'value' => 'jc/ls_seckill.mp4'],
         ],
-        'hd_gathering_code' => [
-            ['style' => 'video', 'value' => 'jc/hd_gathering_code.mp4'],
+        'ls_group' => [
+            ['style' => 'video', 'value' => 'jc/ls_group.mp4'],
         ],
     ];
 
-}
+}

+ 1 - 1
common/components/dict.php

@@ -740,7 +740,7 @@ class dict
             ['id' => 5, 'name' => '其它'],
         ],
         'hdRegisterConfig' => [
-            'price' => 0.02, //花店开通费用
+            'price' => 980, //花店开通费用
             'commissionAmount' => 88.00, //默认分佣金额 (默认)
             'hdDiscountAmount' => 88.00 //花店优惠金额 (默认)
         ]