Quellcode durchsuchen

Merge branch 'master' into 260902_redesign_fix

shish vor 1 Tag
Ursprung
Commit
1a043d8269

+ 12 - 7
.env.example

@@ -1,11 +1,11 @@
 #环境 local dev test production
 YII_ENV=local
-YII_DEBUG=true
-
-# CLI PHP used by detached Yii console processes
-PHP_CLI_BINARY=/usr/local/bin/php
-
-DB_DSN='mysql:host=118.178.193.23;dbname=huahuibao'
+YII_DEBUG=true
+
+# CLI PHP used by detached Yii console processes
+PHP_CLI_BINARY=/usr/local/bin/php
+
+DB_DSN='mysql:host=118.178.193.23;dbname=huahuibao'
 DB_DSN_CONSOLE='mysql:host=118.178.193.23;dbname=huahuibao'
 DB_DSN_BAK='mysql:host=118.178.193.23;dbname=hhb'
 DB_USERNAME='root'
@@ -54,5 +54,10 @@ GHS_NEW_APK_VERSION_MUST_UPDATE=0
 HD_NEW_APK_VERSION=1.0.0
 HD_NEW_APK_VERSION_MUST_UPDATE=0
 
+#商城首页展示模式 1会员服务说明 0花店列表
+MALL_HOME_MODE=1
+#仍展示花店列表的 userId,逗号分隔
+MALL_HOME_MODE_ALLOW_USER_IDS=''
+
 #订单有效时长
-ORDER_VALID_TIME=30
+ORDER_VALID_TIME=30

+ 2 - 1
app-ghs/controllers/ExpendController.php

@@ -411,6 +411,7 @@ class ExpendController extends BaseController
         if (empty($date)) {
             util::fail('没有日期');
         }
+        util::fail('不能再修改账单日期');
         $expend = ExpendClass::getById($id, true);
         if (empty($expend)) {
             util::fail('没有找到报销');
@@ -424,4 +425,4 @@ class ExpendController extends BaseController
         util::complete('修改成功');
     }
 
-}
+}

+ 94 - 13
app-ghs/controllers/OrderController.php

@@ -125,7 +125,12 @@ class OrderController extends BaseController
             util::fail('不是你的订单');
         }
         $customName = $order->customName ?? '';
-        $date = date("Ymd", strtotime($order->addTime));
+        // 下载文件名里的日期跟销售单抬头一致:发货日年月日
+        $sendTime = $order->sendTime ?? '';
+        if (empty($sendTime) || strpos($sendTime, '0000-00-00') === 0) {
+            $sendTime = $order->addTime ?? '';
+        }
+        $date = date('Ymd', strtotime($sendTime));
         $orderSn = $order->orderSn ?? '';
         $name = $customName . '_' . $date . '_' . $orderSn;
         $shop = $this->shop;
@@ -1107,16 +1112,18 @@ class OrderController extends BaseController
             $where['book'] = $book;
         }
         $searchTime = $get['searchTime'] ?? '';
-        //0搜索的addTime 1搜索的payTime
-        $searchTimeType = $get['searchTimeType'] ?? 0;
+        // 0 开单时间 addTime,1 账单时间 payTime,2 发货时间 sendTime;1 保持原值避免旧端/书签坏掉
+        $searchTimeType = (int)($get['searchTimeType'] ?? 0);
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
             $endTime = $get['endTime'] ?? '';
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
-            if ($searchTimeType == 0) {
-                $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
-            } else {
+            if ($searchTimeType === 2) {
+                $where['sendTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            } elseif ($searchTimeType === 1) {
                 $where['payTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            } else {
+                $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
             }
         }
 
@@ -1124,7 +1131,7 @@ class OrderController extends BaseController
             ini_set('memory_limit', '2045M');
             set_time_limit(0);
             if (!isset($where['payTime'])) {
-                util::fail('请选 账单日期 和 时间段');
+                util::fail('请选 账单时间 和 时间段');
             }
             $start = $where['payTime'][1][0];
             $end = $where['payTime'][1][1];
@@ -1185,7 +1192,15 @@ class OrderController extends BaseController
             $where['sendType'] = $sendType;
         }
 
-        $respond = OrderClass::getOrderList($where);
+        // 排序跟着当前时间类型:开单 addTime、账单 payTime、发货 sendTime
+        if ($searchTimeType === 2) {
+            $order = 'sendTime DESC, addTime DESC';
+        } elseif ($searchTimeType === 1) {
+            $order = 'payTime DESC, addTime DESC';
+        } else {
+            $order = 'addTime DESC';
+        }
+        $respond = OrderClass::getOrderList($where, $order);
         if ($export == 1) {
             OrderClass::exportOrderData($respond, $this->mainId);
         }
@@ -2608,7 +2623,7 @@ class OrderController extends BaseController
         util::success($out);
     }
 
-    //客户欠款的订单 ssh 2021.2.4
+    // 客户欠款订单列表:searchTime 筛开单日期 addTime,sendSearchTime 筛发货日期 sendTime
     public function actionDebtList()
     {
         $get = Yii::$app->request->get();
@@ -2622,19 +2637,28 @@ class OrderController extends BaseController
             $startTime = $get['startTime'] ?? '';
             $endTime = $get['endTime'] ?? '';
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
-            $where['payTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
         } else {
             if ($mainId == 33447 && $id == 51031) {
                 util::fail('请选时间');
             }
         }
+        // 发货日期筛选:按 xhGhsOrder.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']]];
+        }
         $allowedPageSizes = [100, 200, 300];
         $pageSize = isset($get['pageSize']) && in_array((int)$get['pageSize'], $allowedPageSizes, true)
             ? (int)$get['pageSize'] : 100;
         $page = max(1, (int)($get['page'] ?? 1));
-        $fields = ['id', 'orderSn', 'actPrice', 'addTime', 'remainDebtPrice', 'debtPrice', 'payTime', 'remark', 'tkPrice', 'nextDayTkPrice', 'clearId'];
+        $fields = ['id', 'orderSn', 'actPrice', 'addTime', 'remainDebtPrice', 'debtPrice', 'payTime', 'sendTime', 'remark', 'tkPrice', 'nextDayTkPrice', 'clearId'];
         Yii::$app->request->setQueryParams(array_merge($get, ['page' => $page, 'pageSize' => $pageSize]));
-        $result = OrderClass::getList($fields, $where, 'addTime DESC');
+        // 待结勾选按发货时间排:同一批发货的单挨在一起;空 sendTime 会沉到底
+        $result = OrderClass::getList($fields, $where, 'sendTime DESC, addTime DESC');
         if (!empty($result['list'])) {
             foreach ($result['list'] as $key => $value) {
                 $debtPrice = $value['debtPrice'] ?? 0;
@@ -2916,7 +2940,7 @@ class OrderController extends BaseController
         if (empty($date)) {
             util::fail('请选择日期');
         }
-
+        util::fail('不能再修改');
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();//开启事务
         try {
@@ -2974,6 +2998,63 @@ class OrderController extends BaseController
         }
     }
 
+    /**
+     * 修改订单发货时间:同时写 xhGhsOrder.sendTime 与 xhCg.sendTime。
+     * ghsApp 订单详情「发货时间-修改」调用;允许补录过去日期。关键词 sync_send_time
+     */
+    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('请选择日期');
+        }
+        $connection = Yii::$app->db;
+        $transaction = $connection->beginTransaction();
+        try {
+            $order = OrderClass::getById($id, true);
+            if (empty($order)) {
+                util::fail('没有找到订单');
+            }
+            if ($order->mainId != $this->mainId) {
+                util::fail('不是你的订单');
+            }
+            $oldSendTime = (string)$order->sendTime;
+            $oldDate = substr($oldSendTime, 0, 10);
+            if ($oldDate === $date) {
+                util::fail('日期没变');
+            }
+            $cgId = $order->purchaseId ?? 0;
+            $cg = PurchaseClass::getById($cgId, true);
+            if (empty($cg)) {
+                util::fail('没有找到订单信息');
+            }
+            // 只改日期,时分秒沿用原发货时间;空值则用当前时刻,方便补录历史单
+            if (empty($oldSendTime) || strpos($oldSendTime, '0000-00-00') === 0) {
+                $new = $date . ' ' . date('H:i:s');
+            } else {
+                $timeArr = explode(' ', $oldSendTime);
+                $after = $timeArr[1] ?? date('H:i:s');
+                $new = $date . ' ' . $after;
+            }
+            $order->sendTime = $new;
+            if (!$order->save()) {
+                util::fail('修改失败');
+            }
+            $cg->sendTime = $new;
+            if (!$cg->save()) {
+                util::fail('修改失败');
+            }
+            $transaction->commit();
+            util::complete('修改成功');
+        } catch (\Exception $e) {
+            $transaction->rollBack();
+            util::fail('修改失败');
+        }
+    }
+
     /**
      * 应收统计:按支付日汇总。
      * originAmount=未扣隔天;nextDayAmount=跨天售后;amount=已扣隔天(净额)。

+ 1 - 2
app-hd/controllers/ItemClassController.php

@@ -7,7 +7,6 @@
 namespace hd\controllers;
 
 use bizGhs\item\classes\ItemClassClass;
-use bizGhs\item\services\ItemClassService;
 use bizHd\product\classes\ProductClass;
 use bizHd\shop\classes\ShopClass;
 use common\components\dict;
@@ -258,7 +257,7 @@ class ItemClassController extends BaseController
         }
     }
 
-    //开单: 获取所有分类
+    //开单 / 首页金刚区关联花材分类:获取当前门店全部花材分类
     public function actionAll()
     {
         $data = ItemClassClass::getGhsItemClassAll($this->mainId);

+ 26 - 4
app-hd/controllers/PurchaseController.php

@@ -1293,17 +1293,24 @@ class PurchaseController extends BaseController
         util::success($info->attributes);
     }
 
-    //采购记录 ssh 2021.1.24
+    //采购记录:searchTimeType 0 开单 addTime,1 账单 payTime,2 发货 sendTime;排序跟着当前类型
     public function actionList()
     {
         $get = Yii::$app->request->get();
         $where = ['shopId' => $this->shopId];
         $searchTime = $get['searchTime'] ?? '';
+        $searchTimeType = (int)($get['searchTimeType'] ?? 0);
         if (!empty($searchTime)) {
             $startTime = $get['startTime'] ?? '';
             $endTime = $get['endTime'] ?? '';
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
-            $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            if ($searchTimeType === 2) {
+                $where['sendTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            } elseif ($searchTimeType === 1) {
+                $where['payTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            } else {
+                $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
+            }
         }
         $ghsId = $get['ghsId'] ?? 0;
         if (!empty($ghsId)) {
@@ -1313,7 +1320,14 @@ class PurchaseController extends BaseController
         if (!empty($status)) {
             $where['status'] = $status;
         }
-        $respond = PurchaseService::getPurchaseList($where);
+        if ($searchTimeType === 2) {
+            $order = 'sendTime DESC, addTime DESC';
+        } elseif ($searchTimeType === 1) {
+            $order = 'payTime DESC, addTime DESC';
+        } else {
+            $order = 'addTime DESC';
+        }
+        $respond = PurchaseService::getPurchaseList($where, $order);
         $respond['shop'] = $this->shop->attributes;
         util::success($respond);
     }
@@ -1468,7 +1482,7 @@ class PurchaseController extends BaseController
         util::success(['button' => $button]);
     }
 
-    //待结款明细 ssh 2021.1.26
+    // 待结款明细:searchTime 筛开单时间 addTime,sendSearchTime 筛发货时间 sendTime
     public function actionDebtList()
     {
         $get = Yii::$app->request->get();
@@ -1494,6 +1508,14 @@ class PurchaseController extends BaseController
             $period = dateUtil::formatTime($searchTime, $startTime, $endTime);
             $where['addTime'] = ['between', [$period['startTime'], $period['endTime']]];
         }
+        // 发货时间筛选:按 xhCg.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']]];
+        }
         $respond = PurchaseService::getDebtList($where);
         util::success($respond);
     }

+ 15 - 1
app-hd/models/homePageConfig/SaveNavGridForm.php

@@ -68,10 +68,24 @@ class SaveNavGridForm extends BaseForm
                 $this->addError($attribute, "请完善第{$no}个导航项");
                 return;
             }
-            if (!in_array($type, [HomePageModuleClass::LINK_CATEGORY, HomePageModuleClass::LINK_USE_CASE], true)) {
+            $allowedTypes = [
+                HomePageModuleClass::LINK_CATEGORY,
+                HomePageModuleClass::LINK_USE_CASE,
+                HomePageModuleClass::LINK_ITEM_CLASS,
+            ];
+            if (!in_array($type, $allowedTypes, true)) {
                 $this->addError($attribute, "第{$no}个导航关联类型无效");
                 return;
             }
+            // 花材分类只能关联一个分类 ID,避免商城首页无法定位到具体花材分类
+            if ($type === HomePageModuleClass::LINK_ITEM_CLASS) {
+                $itemClassIds = array_values(array_filter(array_map('intval', explode(',', $value))));
+                if (count($itemClassIds) !== 1 || $itemClassIds[0] <= 0) {
+                    $this->addError($attribute, "第{$no}个导航请选择一个花材分类");
+                    return;
+                }
+                $value = strval($itemClassIds[0]);
+            }
             $list[] = [
                 'id' => strval($item['id'] ?? ('nav_' . ($index + 1))),
                 'name' => mb_substr($name, 0, 20),

+ 15 - 1
app-mall/controllers/HdController.php

@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * 商城端花店接口:列表、详情、删除/恢复,以及首页展示模式。
+ * mallApp 首页 recent 调用;home-mode 用于分阶段开放花店列表。
+ */
 namespace mall\controllers;
 
 use bizHd\recharge\classes\RechargeShbClass;
@@ -13,7 +17,17 @@ use Yii;
 class HdController extends BaseController
 {
 
-    public $guestAccess = ['list', 'info'];
+    public $guestAccess = ['list', 'info', 'home-mode'];
+
+    /**
+     * 首页展示模式:1 会员服务说明,0 花店列表。
+     * 改 .env 的 MALL_HOME_MODE 即可切换,不必重发前端。
+     */
+    public function actionHomeMode()
+    {
+        $homeMode = HdClass::getHomeMode($this->userId);
+        util::success(['homeMode' => $homeMode]);
+    }
 
     public function actionRecover()
     {

+ 26 - 19
app-mall/controllers/ShopController.php

@@ -29,49 +29,56 @@ class ShopController extends BaseController
         $rows = $isProd
             ? [
                 [
-                    'shopId' => 4458,
-                    'name' => '花语鲜花店',
-                    'address' => '北京市朝阳区望京街道广顺北大街33号',
+                    'shopId' => 2,
+                    'name' => '龙岩花掌柜',
+                    'address' => '龙岩市交易城新杰路138号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop1.jpg',
                 ],
                 [
-                    'shopId' => 4458,
-                    'name' => '初见花艺',
-                    'address' => '北京市朝阳区望京SOHO塔1-B座底商',
+                    'shopId' => 501,
+                    'name' => '楼兰花艺',
+                    'address' => '深圳市龙岗区坂田街道岗头社区中围路33号',
+                    'businessHours' => '09:00-22:00',
+                    'cover' => 'shop/wsf_ll.png',
+                ],
+                [
+                    'shopId' => 106502,
+                    'name' => '吉星鲜花',
+                    'address' => '福州市仓山区浦上大道339-30号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop2.jpg',
                 ],
                 [
-                    'shopId' => 4458,
-                    'name' => '拾光花坊',
-                    'address' => '北京市朝阳区利泽西街6号院底商',
+                    'shopId' => 106473,
+                    'name' => '大自然鲜花',
+                    'address' => '漳州市龙海区鸿江路15号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop3.jpg',
                 ],
             ]
             : [
                 [
-                    'shopId' => 36524,
-                    'name' => '花语鲜花店',
-                    'address' => '北京市朝阳区望京街道广顺北大街33号',
+                    'shopId' => 36523,
+                    'name' => '好运鲜花批发',
+                    'address' => '厦门市集美区凤林前山路147号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop1.jpg',
                 ],
                 [
-                    'shopId' => 36524,
-                    'name' => '初见花艺',
-                    'address' => '北京市朝阳区望京SOHO塔1-B座底商',
+                    'shopId' => 37064,
+                    'name' => '楼兰鲜花',
+                    'address' => '福州市仓山区浦上大道339-30号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop2.jpg',
                 ],
                 [
-                    'shopId' => 36524,
-                    'name' => '拾光花坊',
-                    'address' => '北京市朝阳区利泽西街6号院底商',
+                    'shopId' => 36548,
+                    'name' => '花夕花艺',
+                    'address' => '漳州市龙海区鸿江路15号',
                     'businessHours' => '09:00-22:00',
                     'cover' => 'hhb/images/guest/shop3.jpg',
-                ],
+                ]
             ];
 
         $list = [];

+ 15 - 6
biz-ghs/order/classes/OrderClass.php

@@ -1451,10 +1451,12 @@ class OrderClass extends BaseClass
         return $list;
     }
 
-    //订单列表 ssh 2021.1.19
-    public static function getOrderList($where)
+    /**
+     * 供货商订单列表。$order 由列表页时间类型决定:开单 addTime、账单 payTime、发货 sendTime。
+     */
+    public static function getOrderList($where, $order = 'addTime DESC')
     {
-        $data = self::getList('*', $where, 'addTime DESC');
+        $data = self::getList('*', $where, $order);
 
         $data['totalActPrice'] = 0;
         $data['totalTkPrice'] = 0;
@@ -2644,6 +2646,9 @@ class OrderClass extends BaseClass
         Yii::$app->redis->executeCommand('LPUSH', [$newOrderKey, $id]);
     }
 
+    /**
+     * 生成销售单图片:下载 / 全下载共用,抬头发货日期取 sendTime 的年月日。
+     */
     public static function createImgOrder($order, $shop, $staff, $all)
     {
         $staffName = $order->shopAdminName ?? '';
@@ -2663,8 +2668,12 @@ class OrderClass extends BaseClass
             mkdir($dir, 0700, true);
         }
 
-        $payTime = $order->payTime ?? '';
-        $currentDate = date("Y-m-d", strtotime($payTime));
+        // 下载/全下载销售单抬头用发货日,只要年月日;空 sendTime 回退开单日
+        $sendTime = $order->sendTime ?? '';
+        if (empty($sendTime) || strpos($sendTime, '0000-00-00') === 0) {
+            $sendTime = $order->addTime ?? '';
+        }
+        $currentDate = date('Y-m-d', strtotime($sendTime));
 
         $sameTimeIds = $order->sameTimeIds;
         $sameIds = [];
@@ -2814,7 +2823,7 @@ XL;
 			<div style="margin-top:5px;">销售单</div>
 		</div>
 		<div style="width:750px;">
-			<span>单据日期:{$currentDate}</span>
+			<span>发货日期:{$currentDate}</span>
 			<span style="margin-left:80px;">开单:{$staffName}</span>
 			<span style="margin-left:80px;">客户:{$customName}</span>
 			<span style="float:right;">编号:{$orderSn}</span>

+ 8 - 4
biz-ghs/order/classes/PurchaseOrderClass.php

@@ -968,6 +968,10 @@ class PurchaseOrderClass extends BaseClass
         }
     }
 
+    /**
+     * 确认入库:加库存、挂账、改状态为已完成。
+     * 入库时间以本次确认时刻为准(可被 $data['entryTime'] 显式覆盖),避免「稍后入库」仍沿用开单时间。
+     */
     public static function putIn($cg, $data)
     {
         if ($cg->status == self::PURCHASE_ORDER_STATUS_COMPLETE) {
@@ -1218,10 +1222,10 @@ class PurchaseOrderClass extends BaseClass
         self::initDebtPrices($cg, $currentPrice);
         $cg->status = $status;
         $update = ['status' => $status];
-        if (isset($data['entryTime']) && !empty($data['entryTime'])) {
-            $cg->entryTime = $data['entryTime'];
-            $update['entryTime'] = $data['entryTime'];
-        }
+        // 确认入库:默认写入当前时间;仅当调用方显式传入 entryTime 时才按传入值落库
+        $entryTime = (!empty($data['entryTime'])) ? $data['entryTime'] : date('Y-m-d H:i:s');
+        $cg->entryTime = $entryTime;
+        $update['entryTime'] = $entryTime;
         PurchaseOrderItemClass::updateByCondition(['orderSn' => $orderSn], $update);
         $cg->save();
         return $cg;

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

@@ -176,6 +176,19 @@ class OrderService extends BaseService
             $data['product'] = $newProductData;
         }
 
+        // 开单发货时间写入 sendTime(datetime),允许补录过去日期;sendTimeWant 仍是客户要求发货日。关键词 sync_send_time
+        $sendTimeInput = isset($data['sendTime']) ? str_replace('/', '-', trim((string)$data['sendTime'])) : '';
+        if ($sendTimeInput === '') {
+            $sendTimeInput = date('Y-m-d');
+        }
+        if (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;
+        }
+
         //供货商销售单
         $returnOrder = OrderClass::addOrder($data, $custom);
         $saleId = $returnOrder->id ?? 0;
@@ -234,6 +247,7 @@ class OrderService extends BaseService
             'book' => $book,
             'product' => $currentProduct,
             'sendTimeWant' => $sendTimeWant,
+            'sendTime' => $data['sendTime'],
             'sendCost' => $data['sendCost'] ?? '0',
             'packCost' => $data['packCost'] ?? '0',
             'ghsShopAdminId' => $ghsShopAdminId,

+ 18 - 3
biz-hd/birthday/classes/BirthdayGiftClass.php

@@ -11,6 +11,7 @@ use bizHd\member\classes\MemberLevelClass;
 use bizHd\message\classes\SmsClass;
 use bizHd\shop\classes\ShopClass;
 use bizHd\shop\classes\ShopExtClass;
+use common\components\dateUtil;
 use common\components\noticeUtil;
 use common\components\printUtil;
 use common\components\ChuanglanSmsApi;
@@ -187,6 +188,15 @@ class BirthdayGiftClass extends BaseClass
         return false;
     }
 
+    /**
+     * 判断客户生日是否落在所选时间范围内。
+     * 兼容看板原 period(today/tomorrow/week/all/custom),以及订单页 DateSelect 的 searchTime。
+     *
+     * @param object $custom 客户
+     * @param string $period 时间类型
+     * @param array $params custom/byMonth 时带 startDate、endDate 或 startTime、endTime
+     * @return bool
+     */
     public static function matchesPeriod($custom, $period, $params = [])
     {
         $period = $period ?: 'week';
@@ -202,10 +212,15 @@ class BirthdayGiftClass extends BaseClass
         if ($period == 'all') {
             return true;
         }
-        if ($period == 'custom') {
-            return self::matchesCustomPeriod($custom, $params['startDate'] ?? '', $params['endDate'] ?? '');
+        $startDate = $params['startDate'] ?? $params['startTime'] ?? '';
+        $endDate = $params['endDate'] ?? $params['endTime'] ?? '';
+        // 昨天/本月/近30天等快捷项先转成日期区间,再按生日月日匹配
+        if ($period != 'custom') {
+            $range = dateUtil::formatTime($period, $startDate, $endDate);
+            $startDate = $range['startTime'];
+            $endDate = $range['endTime'];
         }
-        return false;
+        return self::matchesCustomPeriod($custom, $startDate, $endDate);
     }
 
     public static function matchesCustomPeriod($custom, $startDate, $endDate)

+ 4 - 2
biz-hd/homePageConfig/classes/HomePageModuleClass.php

@@ -39,10 +39,12 @@ class HomePageModuleClass
 
     /** 关联:商品 */
     const LINK_GOODS = 2;
-    /** 关联:分类 */
+    /** 关联:花束分类(可多选) */
     const LINK_CATEGORY = 3;
-    /** 关联:场景 */
+    /** 关联:场景(可多选) */
     const LINK_USE_CASE = 4;
+    /** 关联:花材分类(仅单选一个) */
+    const LINK_ITEM_CLASS = 5;
 
     /** 排序:按商品排序 */
     const SORT_PRODUCT = 1;

+ 2 - 2
biz-hd/merchant/services/SjService.php

@@ -188,8 +188,8 @@ class SjService extends BaseService
         $isProduction = getenv('YII_ENV') == 'production';
         if ($isProduction) {
             // 生产环境下的模板店,此 mainId/shopId 写死,不考虑配置化
-            $tplMainId = 1;
-            $tplShopId = 1;
+            $tplMainId = 691;
+            $tplShopId = 501;
         } else {
             // 测试环境下的模板店,此 mainId/shopId 写死,不考虑配置化
             $tplMainId = 1107;

+ 7 - 4
biz-hd/purchase/services/PurchaseService.php

@@ -164,10 +164,12 @@ class PurchaseService extends BaseService
         util::fail('无法操作');
     }
 
-    //采购记录 ssh 2021.1.24
-    public static function getPurchaseList($where)
+    /**
+     * 采购记录列表。$order 由列表页时间类型决定:开单 addTime、账单 payTime、发货 sendTime。
+     */
+    public static function getPurchaseList($where, $order = 'addTime DESC')
     {
-        $data = PurchaseClass::getList('*', $where, 'addTime DESC');
+        $data = PurchaseClass::getList('*', $where, $order);
         $data['list'] = self::groupInfo($data['list']);
         return $data;
     }
@@ -193,7 +195,8 @@ class PurchaseService extends BaseService
             ? (int)$get['pageSize'] : 100;
         $page = max(1, (int)($get['page'] ?? 1));
 
-        $list = PurchaseClass::getAllList('*', $where, 'addTime DESC');
+        // 待结勾选按发货时间排:同一批发货的单挨在一起;空 sendTime 会沉到底
+        $list = PurchaseClass::getAllList('*', $where, 'sendTime DESC, addTime DESC');
         $synced = [];
         $clearedSum = '0.00';
         $remainSum = '0.00';

+ 45 - 9
biz-hd/shop/classes/ShopTemplateClass.php

@@ -16,7 +16,9 @@ use bizHd\goods\classes\GoodsUseCaseClass;
 use bizHd\goods\classes\KindClass;
 use bizHd\goods\classes\UseCaseClass;
 use bizHd\homePageConfig\classes\HomePageConfigClass;
+use bizHd\homePageConfig\classes\HomePageModuleClass;
 use bizHd\homePageConfig\classes\HomePageModuleConfigClass;
+use bizHd\item\classes\ItemClassClass;
 use bizHd\seckill\classes\SeckillActivityClass;
 use bizHd\seckill\classes\SeckillGoodsClass;
 use Yii;
@@ -61,7 +63,8 @@ class ShopTemplateClass extends BaseClass
             self::copyUseCaseRelations($tplMainId, $newShop, $goodsMap, $useCaseMap);
             $activityMap = self::copySeckillActivities($tplMainId, $tplShopId, $newShop);
             self::copySeckillGoods($tplMainId, $tplShopId, $newShop, $activityMap, $goodsMap);
-            self::copyHomePageConfig($tplShopId, $newShop, $goodsMap, $categoryMap, $useCaseMap);
+            $itemClassMap = self::buildItemClassMap($tplMainId, $newMainId);
+            self::copyHomePageConfig($tplShopId, $newShop, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap);
             $transaction->commit();
             return true;
         } catch (\Throwable $e) {
@@ -157,6 +160,34 @@ class ShopTemplateClass extends BaseClass
         return $map;
     }
 
+    /**
+     * 按分类名称把模板店花材分类映射到新店已初始化的花材分类
+     * @param int $tplMainId
+     * @param int $newMainId
+     * @return array 旧花材分类id => 新花材分类id
+     */
+    protected static function buildItemClassMap($tplMainId, $newMainId)
+    {
+        $map = [];
+        $oldList = ItemClassClass::getAllByCondition(['mainId' => $tplMainId], null, 'id,name');
+        $newList = ItemClassClass::getAllByCondition(['mainId' => $newMainId], null, 'id,name');
+        $newByName = [];
+        foreach ($newList as $item) {
+            $name = trim(strval($item['name'] ?? ''));
+            if ($name !== '') {
+                $newByName[$name] = intval($item['id'] ?? 0);
+            }
+        }
+        foreach ($oldList as $item) {
+            $name = trim(strval($item['name'] ?? ''));
+            $oldId = intval($item['id'] ?? 0);
+            if ($oldId > 0 && isset($newByName[$name]) && $newByName[$name] > 0) {
+                $map[$oldId] = $newByName[$name];
+            }
+        }
+        return $map;
+    }
+
     /**
      * 复制商品:先主记录再子规格,销量清零,masterId/kindId 按映射重写
      * 商品按 mainId 归属,xhGoods 没有 shopId,不能按门店过滤
@@ -373,15 +404,16 @@ class ShopTemplateClass extends BaseClass
     }
 
     /**
-     * 复制首页模块配置,并把 JSON 里引用的商品/分类/场景 ID 换成新店 ID
+     * 复制首页模块配置,并把 JSON 里引用的商品/分类/场景/花材分类 ID 换成新店 ID
      * @param int $tplShopId
      * @param array $newShop
      * @param array $goodsMap
      * @param array $categoryMap
      * @param array $useCaseMap
+     * @param array $itemClassMap
      * @return void
      */
-    protected static function copyHomePageConfig($tplShopId, $newShop, $goodsMap, $categoryMap, $useCaseMap)
+    protected static function copyHomePageConfig($tplShopId, $newShop, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap)
     {
         $list = HomePageModuleConfigClass::getAllByCondition(['shopId' => $tplShopId], 'id ASC');
         if (empty($list)) {
@@ -396,7 +428,7 @@ class ShopTemplateClass extends BaseClass
             if (!is_array($payload)) {
                 $payload = [];
             }
-            $payload = self::remapHomePagePayload($moduleKey, $payload, $goodsMap, $categoryMap, $useCaseMap);
+            $payload = self::remapHomePagePayload($moduleKey, $payload, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap);
             HomePageModuleConfigClass::saveConfigValue($newShop['mainId'], $newShop['shopId'], $moduleKey, $payload);
         }
     }
@@ -409,9 +441,10 @@ class ShopTemplateClass extends BaseClass
      * @param array $goodsMap
      * @param array $categoryMap
      * @param array $useCaseMap
+     * @param array $itemClassMap
      * @return array
      */
-    protected static function remapHomePagePayload($moduleKey, $payload, $goodsMap, $categoryMap, $useCaseMap)
+    protected static function remapHomePagePayload($moduleKey, $payload, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap)
     {
         if ($moduleKey === 'banner' || $moduleKey === 'navGrid') {
             if (empty($payload['list']) || !is_array($payload['list'])) {
@@ -423,14 +456,14 @@ class ShopTemplateClass extends BaseClass
                 }
                 $type = intval($item['type'] ?? 0);
                 $value = strval($item['value'] ?? '');
-                $payload['list'][$index]['value'] = self::remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap);
+                $payload['list'][$index]['value'] = self::remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap);
             }
             return $payload;
         }
         if (in_array($moduleKey, ['hot', 'new', 'pullGoods'], true)) {
             $type = intval($payload['type'] ?? 0);
             $value = strval($payload['value'] ?? '');
-            $payload['value'] = self::remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap);
+            $payload['value'] = self::remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap);
             return $payload;
         }
         return $payload;
@@ -438,15 +471,16 @@ class ShopTemplateClass extends BaseClass
 
     /**
      * 把关联配置的 value(单个 ID 或逗号拼接)按 type 映射到新店
-     * type:2 商品、3 分类、4 使用场景;未映射到的 ID 丢弃,避免新店引用模板店数据
+     * type:2 商品、3 分类、4 使用场景、5 花材分类;未映射到的 ID 丢弃,避免新店引用模板店数据
      * @param int $type
      * @param string $value
      * @param array $goodsMap
      * @param array $categoryMap
      * @param array $useCaseMap
+     * @param array $itemClassMap
      * @return string
      */
-    protected static function remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap)
+    protected static function remapLinkedValue($type, $value, $goodsMap, $categoryMap, $useCaseMap, $itemClassMap)
     {
         $map = [];
         if ($type === HomePageConfigClass::BANNER_TYPE_GOODS) {
@@ -455,6 +489,8 @@ class ShopTemplateClass extends BaseClass
             $map = $categoryMap;
         } elseif ($type === HomePageConfigClass::BANNER_TYPE_USE_CASE) {
             $map = $useCaseMap;
+        } elseif ($type === HomePageModuleClass::LINK_ITEM_CLASS) {
+            $map = $itemClassMap;
         } else {
             return $value;
         }

+ 29 - 0
biz-mall/hd/classes/HdClass.php

@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * 商城端花店(xhHd)业务:列表组装与首页展示模式。
+ * app-mall HdController 调用;home-mode 给 mallApp 首页决定展示会员服务页还是花店列表。
+ */
 namespace bizMall\hd\classes;
 
 use bizHd\shop\classes\ShopClass;
@@ -11,6 +15,31 @@ class HdClass extends BaseClass
 {
     public static $baseFile = '\bizMall\hd\models\Hd';
 
+    /**
+     * 首页展示模式:1 会员服务说明,0 花店列表。
+     * 读 .env 的 MALL_HOME_MODE;改回 0 即恢复列表,不必重发前端。
+     * 白名单 MALL_HOME_MODE_ALLOW_USER_IDS 内的用户仍看花店列表,方便自测。
+     *
+     * @param int $userId 当前登录用户,0 表示未登录
+     * @return int 1 会员服务页,0 花店列表或白名单
+     */
+    public static function getHomeMode($userId = 0)
+    {
+        $flag = getenv('MALL_HOME_MODE');
+        $on = $flag === false ? 0 : intval($flag);
+        if ($on != 1) {
+            return 0;
+        }
+        if ($userId > 0) {
+            $allowStr = getenv('MALL_HOME_MODE_ALLOW_USER_IDS') ?: '';
+            $allowIds = !empty($allowStr) ? explode(',', $allowStr) : [];
+            if (in_array($userId, $allowIds)) {
+                return 0;
+            }
+        }
+        return 1;
+    }
+
     public static function getHdList($where)
     {
         $data = self::getList('*', $where, 'inTurn DESC,addTime ASC');