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