CategoryController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace mall\controllers;
  3. use bizHd\custom\classes\CustomClass;
  4. use bizHd\goods\classes\GoodsUseCaseClass;
  5. use bizHd\goods\classes\UseCaseClass;
  6. use bizMall\goods\services\CategoryService;
  7. use Yii;
  8. use common\components\util;
  9. class CategoryController extends BaseController
  10. {
  11. /**
  12. * 游客可浏览分类与商品列表(商城分类页未登录浏览);下单/建客仍走登录后流程
  13. * buildRelation 对空 user 直接 return,游客不会建客
  14. */
  15. public $guestAccess = ['list', 'use-case-list', 'goods-list'];
  16. //获取分类 ssh 2019.12.2(游客可浏览,不依赖 user;无店铺上下文时返回空)
  17. public function actionList()
  18. {
  19. // 未登录场景必须有 account→mainId,否则无法定位门店分类
  20. if (empty($this->shop) || empty($this->mainId)) {
  21. util::success([]);
  22. }
  23. $get = Yii::$app->request->get();
  24. $flower = $get['flower'] ?? -1;
  25. //普莲花艺、叶上花、丰行、小武鲜花、九江云朵、源花汇、紫荆不能在花卉宝下单,多处要同步修改,关键词ls_mall_not_open
  26. $mainId = $this->mainId;
  27. if (getenv('YII_ENV') == 'production') {
  28. if (in_array($mainId, [40057, 7779, 42940, 26374, 10536, 65381])) {
  29. util::fail('暂无商品哦,编号25395');
  30. }
  31. } else {
  32. if (in_array($mainId, [0, 1])) {
  33. util::fail('暂无商品哦!编号639942');
  34. }
  35. }
  36. //建立客户关系(未登录时 buildRelation 直接返回,不建客)
  37. CustomClass::buildRelation($this->shop, $this->user);
  38. $mainId = $this->mainId ?? 0;
  39. $where = ['mainId' => $mainId, 'delStatus' => 0, 'status' => 1];
  40. if ($flower > -1) {
  41. $where['flower'] = $flower;
  42. }
  43. //默认列出正常分类,美团等第三方分类不列表
  44. $where['style'] = 0;
  45. $return = CategoryService::getAllCategory($where);
  46. util::success($return);
  47. }
  48. //取分类下商品 ssh 2019.12.2(游客可浏览,custom 为空时按散客价组装)
  49. // 列表按唯一商品分页:同一商品多分类去重后仍保证每页条数,避免商城列表无法触底加载
  50. public function actionGoodsList()
  51. {
  52. $get = Yii::$app->request->get();
  53. $shop = $this->shop;
  54. if (empty($shop)) {
  55. util::success(['list' => []]);
  56. }
  57. $custom = !empty($this->custom) ? $this->custom : [];
  58. $params = [];
  59. //调用花店端的方法,后面再分离 (为了代码维护可以不分离,免得一处改了,另一处没修改到。--- 所以分离好后,又还原了)
  60. $data = \bizHd\goods\classes\GoodsCategoryClass::getGoodsList($get, $shop, $custom, $params);
  61. $data['list'] = $this->appendUseCaseInfo($data['list'] ?? []);
  62. util::success($data);
  63. }
  64. /**
  65. * 场景列表(商城筛选弹窗用)
  66. * 游客可访问,未登录返回空数组
  67. */
  68. public function actionUseCaseList()
  69. {
  70. $user = $this->user;
  71. if (empty($user)) {
  72. util::success([]);
  73. }
  74. $mainId = intval($this->mainId ?? 0);
  75. if ($mainId <= 0) {
  76. util::success([]);
  77. }
  78. $list = UseCaseClass::getAllByCondition(
  79. ['mainId' => $mainId, 'status' => 1, 'delStatus' => 0],
  80. 'inTurn DESC',
  81. 'id,useCaseName'
  82. );
  83. util::success($list ?: []);
  84. }
  85. /**
  86. * 批量为商品列表补充场景 ID 与名称,供列表页标签展示
  87. *
  88. * @param array $list
  89. * @return array
  90. */
  91. private function appendUseCaseInfo($list)
  92. {
  93. if (empty($list)) {
  94. return [];
  95. }
  96. $goodsIds = array_column($list, 'id');
  97. if (empty($goodsIds)) {
  98. return $list;
  99. }
  100. $relations = GoodsUseCaseClass::getAllByCondition(
  101. ['goodsId' => ['in', $goodsIds]],
  102. null,
  103. 'goodsId,useCaseId'
  104. );
  105. $useCaseIds = array_unique(array_column($relations ?: [], 'useCaseId'));
  106. $nameMap = [];
  107. if (!empty($useCaseIds)) {
  108. $useCases = UseCaseClass::getAllByCondition(
  109. [
  110. 'id' => ['in', $useCaseIds],
  111. 'mainId' => intval($this->mainId ?? 0),
  112. 'delStatus' => 0,
  113. ],
  114. null,
  115. 'id,useCaseName'
  116. );
  117. foreach ($useCases ?: [] as $uc) {
  118. $nameMap[intval($uc['id'])] = $uc['useCaseName'] ?? '';
  119. }
  120. }
  121. $goodsUseCaseMap = [];
  122. foreach ($relations ?: [] as $rel) {
  123. $gid = intval($rel['goodsId']);
  124. $uid = intval($rel['useCaseId']);
  125. if (!isset($goodsUseCaseMap[$gid])) {
  126. $goodsUseCaseMap[$gid] = [];
  127. }
  128. if (!isset($nameMap[$uid])) {
  129. continue;
  130. }
  131. $goodsUseCaseMap[$gid][] = [
  132. 'id' => $uid,
  133. 'name' => $nameMap[$uid],
  134. ];
  135. }
  136. foreach ($list as &$item) {
  137. $gid = intval($item['id'] ?? 0);
  138. $cases = $goodsUseCaseMap[$gid] ?? [];
  139. $item['useCaseIdList'] = array_column($cases, 'id');
  140. $item['useCaseNames'] = array_values(array_filter(array_column($cases, 'name')));
  141. }
  142. unset($item);
  143. return $list;
  144. }
  145. }