فهرست منبع

fix(home-page): 统一首页普通商品商城涨价

- 首页热门、上新和下拉商品复用涨价配置并按详情页规则计算售价
- 更多列表同步应用涨价,保留无价商品及秒杀团购活动价

API: 首页普通商品响应的 price 改为涨价后售价,并新增 priceBeforeRise 原价字段
shizhongqi 20 ساعت پیش
والد
کامیت
c0a7c7ce18
1فایلهای تغییر یافته به همراه51 افزوده شده و 7 حذف شده
  1. 51 7
      biz-hd/homePageConfig/classes/HomePageDisplayClass.php

+ 51 - 7
biz-hd/homePageConfig/classes/HomePageDisplayClass.php

@@ -3,13 +3,15 @@
 namespace bizHd\homePageConfig\classes;
 
 use biz\shop\classes\ShopClass;
+use bizHd\goods\classes\GoodsClass;
+use bizHd\goods\classes\GoodsSettingClass;
 use common\components\business;
 use common\components\util;
 
 /**
  * 门店首页"展示数据"组装类
  * 把 HomePageConfigClass/HomePageModuleClass 存的原始配置,格式化为可直接渲染的结构
- * (拼好图片完整URL、过滤未开启/未上架内容、解析出真实商品列表等)。
+ * (拼好图片完整URL、过滤未开启/未上架内容、解析出真实商品列表、普通商品套上商城涨价等)。
  * 供 app-mall(顾客端商城首页)与 app-hd(商家端配置预览)共用同一套数据,
  * 保证"预览"看到的效果与顾客端真实首页完全一致。
  */
@@ -24,6 +26,8 @@ class HomePageDisplayClass
      */
     public static function buildHome($mainId, $shopId)
     {
+        // 三个普通商品模块共用一次涨价配置,避免重复查库
+        $rise = GoodsSettingClass::getRise($mainId);
         return [
             'modules' => HomePageConfigClass::getModules($mainId, $shopId),
             'topNav' => self::formatTopNav($mainId, HomePageConfigClass::getTopNav($mainId, $shopId)),
@@ -31,9 +35,9 @@ class HomePageDisplayClass
             'navGrid' => self::formatNavGrid(HomePageModuleClass::getNavGrid($mainId, $shopId)),
             'seckill' => self::formatActivity(HomePageModuleClass::getSeckill($mainId, $shopId, true)),
             'groupBuy' => self::formatActivity(HomePageModuleClass::getGroupBuy($mainId, $shopId, true)),
-            'hot' => self::formatGoodsSection($mainId, $shopId, 'hot'),
-            'new' => self::formatGoodsSection($mainId, $shopId, 'new'),
-            'pullGoods' => self::formatGoodsSection($mainId, $shopId, 'pullGoods'),
+            'hot' => self::formatGoodsSection($mainId, $shopId, 'hot', $rise),
+            'new' => self::formatGoodsSection($mainId, $shopId, 'new', $rise),
+            'pullGoods' => self::formatGoodsSection($mainId, $shopId, 'pullGoods', $rise),
         ];
     }
 
@@ -173,13 +177,15 @@ class HomePageDisplayClass
 
     /**
      * 格式化热门推荐/今日上新/下拉商品:关闭时清空商品;开启时按真实商品数量自动推导列数与展示条数
+     * 输出价格为商城涨价后的售价(与详情页 obeyRiseRule 一致);秒杀/团购不走本方法
      *
      * @param int $mainId
      * @param int $shopId
      * @param string $moduleKey hot|new|pullGoods
+     * @param array|null $rise 已查好的涨价配置;单模块接口未传时内部再查一次
      * @return array
      */
-    public static function formatGoodsSection($mainId, $shopId, $moduleKey)
+    public static function formatGoodsSection($mainId, $shopId, $moduleKey, $rise = null)
     {
         $data = HomePageModuleClass::getGoodsSection($mainId, $shopId, $moduleKey);
         if (empty($data['enabled'])) {
@@ -195,7 +201,8 @@ class HomePageDisplayClass
         if ($layout['displayCount'] > 0 && $layout['displayCount'] < $total) {
             $rows = array_slice($rows, 0, $layout['displayCount']);
         }
-        $data['goods'] = HomePageModuleClass::formatGoodsRows($rows);
+        // 首页列表必须走与详情页相同的涨价公式,否则顾客看到原价、点进详情才变价
+        $data['goods'] = self::applyMallRisePrice(HomePageModuleClass::formatGoodsRows($rows), $mainId, $rise);
         $data['goodsTotal'] = $total;
         return $data;
     }
@@ -257,7 +264,8 @@ class HomePageDisplayClass
                     $page,
                     $pageSize
                 );
-                $list = $paged['list'];
+                // 「更多」列表与首页模块同源,同样补涨价;秒杀/团购走活动价,上面分支不套涨价
+                $list = self::applyMallRisePrice($paged['list'], $mainId);
                 $total = $paged['total'];
             }
         }
@@ -277,4 +285,40 @@ class HomePageDisplayClass
             'endTime' => $activityEndTime,
         ];
     }
+
+    /**
+     * 给首页普通商品套上店铺涨价后的售价
+     * 只走 obeyRiseRule 纯计算,不走 getFinalPrice(后者每条商品 Redis 查聊天报价,
+     * 首页游客 userId=0 必 miss,下拉商品全量时会拖慢约 1 秒)。
+     * 无价商品(priceType=0)不涨价;秒杀/团购走活动价,不要调用本方法。
+     *
+     * @param array $goods formatGoodsRows 产出的商品列表
+     * @param int $mainId 商户 mainId,未传入 $rise 时用来查涨价配置
+     * @param array|null $rise GoodsSettingClass::getRise 的返回值,传入则不再查库
+     * @return array
+     */
+    public static function applyMallRisePrice($goods, $mainId, $rise = null)
+    {
+        if (empty($goods) || !is_array($goods)) {
+            return $goods;
+        }
+        if (!is_array($rise)) {
+            $rise = intval($mainId) > 0 ? GoodsSettingClass::getRise($mainId) : [];
+        }
+        $riseSwitch = intval($rise['riseSwitch'] ?? 0);
+        $riseType = intval($rise['riseType'] ?? 0);
+        $riseAmount = floatval($rise['riseAmount'] ?? 0);
+        // 未开启涨价时直接返回原价,避免对全量下拉商品做无意义循环
+        if ($riseSwitch != 1 || $riseAmount <= 0) {
+            return $goods;
+        }
+        foreach ($goods as $key => $item) {
+            // 无价商品不参与涨价,与详情页 modifyAndRisePrice 一致
+            if (isset($item['priceType']) && intval($item['priceType']) === 0) {
+                continue;
+            }
+            $goods[$key] = GoodsClass::obeyRiseRule($item, $riseSwitch, $riseType, $riseAmount, [], []);
+        }
+        return $goods;
+    }
 }