GoodsController.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. <?php
  2. namespace addons\Store\api\modules\v1\controllers;
  3. use addons\Coupon\common\enums\AddonsCouponEnum;
  4. use addons\ReservationService\common\enums\ReservationServiceEnum;
  5. use addons\Store\common\enums\StoreEnum;
  6. use addons\Store\common\logic\goods\GoodsLogic as StoreGoodsLogic;
  7. use addons\Store\common\models\Store;
  8. use addons\Store\common\models\StoreCart;
  9. use addons\Store\common\models\StoreCoupon;
  10. use addons\Store\common\models\StoreCouponCatRelate;
  11. use addons\Store\common\models\StoreCouponGoodsRelate;
  12. use addons\Store\common\models\StoreGoods;
  13. use addons\Store\common\models\StoreGoodsAttr;
  14. use addons\Store\common\models\StoreGoodsCateRelate;
  15. use addons\Store\common\models\StoreGoodsReserve;
  16. use addons\Store\common\services\StoreReserveSettingService;
  17. use common\enums\GoodsTypeEnum;
  18. use common\enums\OrderCommentEnum;
  19. use common\enums\StatusEnum;
  20. use common\helpers\LocationHelper;
  21. use common\models\common\Region;
  22. use common\models\goods\GoodsCateRelate;
  23. use common\models\order\OrderComments;
  24. use common\models\user\User;
  25. use common\models\user\UserLevel;
  26. use common\logic\common\GoodsLogic;
  27. use common\models\user\UserPartitionRelationship;
  28. use Yii;
  29. use Exception;
  30. use api\controllers\OnAuthController;
  31. use addons\Store\common\services\StoreGoodsTrackingService;
  32. use common\enums\DiyEnum;
  33. use common\models\diy\DiyComponentsData;
  34. use common\models\diy\DiyPage;
  35. /**
  36. * 默认控制器
  37. *
  38. * Class DefaultController
  39. * @package addons\Store\api\modules\v1\controllers
  40. */
  41. class GoodsController extends OnAuthController
  42. {
  43. public $modelClass = '';
  44. /**
  45. * 不用进行登录验证的方法
  46. *
  47. * 例如: ['index', 'update', 'create', 'view', 'delete']
  48. * 默认全部需要验证
  49. *
  50. * @var array
  51. */
  52. protected $authOptional = ['index', 'detail', 'cate-goods-list', 'list', 'recommend', 'comments-list', 'get-platform-goods'];
  53. /**
  54. * 首页
  55. *
  56. * @return string
  57. */
  58. public function actionDetail()
  59. {
  60. $goods_id = Yii::$app->request->get('goods_id',0);
  61. $store_id = Yii::$app->request->get('store_id',0);
  62. $latitude_b = Yii::$app->request->get('latitude',23.219761);
  63. $longitude_b = Yii::$app->request->get('longitude',113.305405);
  64. $mall_id = $this->mall_id;
  65. try {
  66. $select = 'id,is_on_sale,goods_name,price,original_price,unit,attr_groups_format,attr_groups,area_limit,is_attr,is_show_stock,video_url,
  67. stock,video_cover_pic,cover_pic,bannar_pic,sales_num,virtual_sales,is_show_sales,detail,services,status,goods_source,freight_type,show_style,package_data,subtitle,
  68. goods_type';
  69. $user_id = $this->user_id?? 0;
  70. $user = $this->user ?? [];
  71. $params['mall_id'] = $mall_id;
  72. $params['where'] = [['id' => $goods_id], ['mall_id' => $mall_id],['store_id'=>$store_id],['check_status'=>1],['is_on_sale'=>1],['status'=>StatusEnum::ENABLED]];
  73. $params['is_array'] = true;
  74. $params['with'] = [
  75. 'attr' => function ($query) {
  76. $query->orderBy('price asc')->select('id,goods_id,goods_no,name,original_price,pic_url,price,sign_id,sort,status,version,weight,stock');
  77. },'extra',
  78. 'reserve' => function ($query) {
  79. $query->select('id,goods_id,original_price,price,ordering_information,information_detail,reserve_type,service_type,reserve_max_buy');
  80. //reserve_type 0 项目预约
  81. //reserve_type 1 技师预约
  82. },
  83. 'reserve.skus' => function ($query) {
  84. $query->orderBy('price asc')->select('id,goods_id,name,sign_id,original_price,price,pic_url,reserve_date,reserve_time_range_type,reserve_max_buy,service_min');
  85. },
  86. ];
  87. $params['order'] = false;
  88. $params['select'] = $select;
  89. $goods = StoreGoods::getGoodsDetail($params);
  90. if (empty($goods)) throw new Exception("商品不存在");
  91. foreach ($goods['attr'] as $k => &$item) {
  92. $item['is_show'] = StatusEnum::ENABLED;
  93. if ($goods['show_style'] == 2) $goods['attr'][$k]['name'] = str_replace('套餐:','', $goods['attr'][$k]['name']);
  94. if($k == 0){
  95. $goods['attr_id'] = $item['id'];
  96. $goods['price'] = $item['price'];
  97. $goods['original_price'] = $item['original_price'];
  98. break;
  99. }
  100. }
  101. if(!empty($goods['is_attr'])) $goods['stock'] = array_sum(array_column($goods['attr'],'stock'));//多规格,按规格库存累计
  102. $member_price_info = DiyComponentsData::getStoreMemberPrice($mall_id, [$goods], 1, $user_id ?? 0);
  103. $goods['member_price'] = $member_price_info[0]['member_price'];
  104. $goods['is_show_member_price'] = 0;
  105. $goods['is_show_price'] = $goods['extra']['is_show_price'];
  106. $goods['member_price_switch'] = $goods['extra']['member_price_switch'];
  107. $diy_page = DiyPage::getOne([['mall_id' => $mall_id], ['template' => DiyEnum::GOODS_DETAIL], ['status' => StatusEnum::ENABLED]], true, [], '', 'id,title,content');
  108. $goods['is_member_price_check'] = 0;
  109. if($diy_page){
  110. $diy_page_content = json_decode($diy_page['content'], true);
  111. $func_list_item = [];
  112. foreach($diy_page_content as $v){
  113. if($v['funcListItem']['type'] == 'goods-info'){
  114. $func_list_item = $v['data']['goodsData'] ?? [];
  115. break;
  116. }
  117. }
  118. if($func_list_item){
  119. if(isset($func_list_item['checkList'])) {
  120. in_array('memberPrice', $func_list_item['checkList']) && $goods['is_member_price_check'] = 1;
  121. }
  122. }
  123. }
  124. if (($goods['member_price_switch'] == 0 && $goods['is_member_price_check'] == 1) || ($goods['member_price_switch'] == 1 && $goods['is_show_price'] == 1)) {
  125. $goods['is_show_member_price'] = 1;
  126. }
  127. $goods['member_price_is_show'] = 0;
  128. $goods['member_price_info'] = [];
  129. $goods['is_specified_level'] = 0;
  130. $goods['specified_level_price'] = [];
  131. $goods['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0);
  132. if (!empty($user)) {
  133. //基础会员等级折扣
  134. $user_level = UserLevel::findOne(['mall_id' => $mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]);
  135. //额外会员设置
  136. if($user_level && !empty($user_level['member_price_is_show'])){
  137. $goods['member_price_is_show'] = $user_level['member_price_is_show'];
  138. $goods['member_price_info'] = StoreGoodsLogic::getMemberPriceList($mall_id,$goods,$user);
  139. }
  140. if($user_level && !empty($user_level['is_specified_level'])){
  141. $goods['is_specified_level'] = $user_level['is_specified_level'];
  142. $goods['specified_level_price'] = StoreGoodsLogic::getSpecifiedLevelPrice($mall_id, $goods, $user_level);
  143. }
  144. if(!$user_level) $user_level = UserLevel::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->orderBy('level asc')->limit(1)->one();
  145. if(isset($user_level)){
  146. $discount = $user_level['discount']??0;
  147. $goods['price_type'] = '会员优惠';
  148. $is_member_price = $goods['extra']['is_member_price']??2;
  149. $goods['is_member_price'] = $is_member_price;
  150. if($is_member_price!=2) {
  151. if (!empty($goods['extra']['is_member_price']) && !empty($goods['extra']['member_price_setting'])) {
  152. $member_systems = json_decode($goods['extra']['member_price_setting'], true);
  153. // 因为前端会员sign_id 是按照升序排列。所以这里需要修改
  154. $member_price_setting = [];
  155. if (!empty($member_systems)) {
  156. foreach ($member_systems as $key => $system) {
  157. $setting = [];
  158. foreach ($system as $key2 => $system2) {
  159. $key2 = explode(':', $key2); // 将key2 转为数组
  160. asort($key2); // 排序
  161. $key2 = implode(':', $key2);
  162. $setting[$key2] = $system2;
  163. }
  164. $member_price_setting[$key] = $setting;
  165. }
  166. }
  167. }
  168. // $goods['price'] = bcdiv($goods['price'] * $discount,10,2);
  169. if (empty($goods['is_attr'])) {
  170. if (isset($member_price_setting[$user['level']])) {
  171. //$goods['price'] = $member_price_setting[$user['level']];
  172. foreach ($goods['attr'] as &$item) {
  173. //$item['price'] = $goods['price'];
  174. $item['member_price'] = $goods['price'];
  175. }
  176. }
  177. }else{
  178. $attr_price_arr =[];
  179. foreach ($goods['attr'] as $k => &$item) {
  180. // if($item['is_show'] == false) continue;
  181. //$item['price'] = bcdiv($item['price'] * $discount,10,2); //全局等级会员价
  182. $item['member_price'] = bcdiv($item['price'] * $discount,10,2); //全局等级会员价
  183. if (isset($member_price_setting['level' . ($user['level'] > 0 ? $user['level'] : $user_level['level'])][$item['sign_id']])) {
  184. //商品独立设置的会员价
  185. //$item['price'] = $member_price_setting['level' . $user['level']][$item['sign_id']];
  186. $item['member_price'] = $member_price_setting['level' . ($user['level'] > 0 ? $user['level'] : $user_level['level'])][$item['sign_id']];
  187. }
  188. $attr_price_arr[$item['price']] = ['id'=>$item['id'],'price'=>$item['price'],'original_price'=>$item['original_price']];
  189. }
  190. ksort($attr_price_arr);
  191. $attr_arr = array_shift($attr_price_arr);
  192. $goods['attr_id'] = $attr_arr['id']??0;
  193. //$goods['price'] = $attr_arr['price']??0;
  194. $goods['original_price'] = $attr_arr['original_price']??0;
  195. }
  196. }
  197. }
  198. }
  199. $store = Store::getOne([['id'=>$store_id],['status'=>StatusEnum::ENABLED]],true,[],false,
  200. 'id,store_name,logo_img,province_id,city_id,district_id,address,longitude,latitude,business_time_start,business_time_end,shop_mobile,license_img,show_style');
  201. $region = Region::lists(['where'=>[['id'=>[$store['province_id'],$store['city_id'],$store['district_id']]]],'index'=>'id','id,name']);
  202. $latitude_a = $store['latitude'];
  203. $longitude_a = $store['longitude'];
  204. $location_obj = new LocationHelper();
  205. $distance = $location_obj->getDistanceByGeo($latitude_a,$longitude_a,$latitude_b,$longitude_b);
  206. $store['province'] = $region[$store['province_id']]['name']??'';
  207. $store['city'] = $region[$store['city_id']]['name']??'';
  208. $store['district'] = $region[$store['district_id']]['name']??'';
  209. $store['distance'] = bcmul($distance,1,1);
  210. unset($store['province_id']);
  211. unset($store['city_id']);
  212. unset($store['district_id']);
  213. unset($store['longitude']);
  214. unset($store['latitude']);
  215. $goods['member_buy_limit_setting'] = json_decode($goods['extra']['member_buy_limit_setting'],true);
  216. $goods['package_data'] = !empty($goods['package_data']) ? json_decode($goods['package_data']) : [];
  217. $repurchase_setting = [];
  218. if($goods['extra']['is_repurchase'] == StatusEnum::ENABLED && !empty($goods['extra']['repurchase_setting'])){
  219. $repurchase_setting = json_decode($goods['extra']['repurchase_setting'], true);
  220. }
  221. $goods['repurchase_setting'] = $repurchase_setting;
  222. unset($goods['extra']);
  223. //指定商品
  224. $coupon_goods_relate_list = StoreCouponGoodsRelate::lists(['where'=>[['goods_id'=>$goods_id]],'select'=>'coupon_id']);
  225. $coupon_ids = array_column($coupon_goods_relate_list,'coupon_id');
  226. $coupon_list2 = StoreCoupon::lists([
  227. 'where'=>[
  228. ['id'=>$coupon_ids],
  229. ['store_id'=>$store['id']],
  230. ['status'=>StatusEnum::ENABLED],
  231. ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING],
  232. ],
  233. 'select'=>'id,name,type,exchange_voucher_type,sub_price',
  234. 'limit'=>5
  235. ]);
  236. //指定分类
  237. $goods_cate_relate_list = GoodsCateRelate::lists(['where'=>[['goods_id'=>$goods_id]],'select'=>'cate_id']);
  238. $cate_ids = array_column($goods_cate_relate_list,'cate_id');
  239. $coupon_cate_relate_list = StoreCouponCatRelate::lists(['where'=>[['cate_id'=>$cate_ids]],'select'=>'coupon_id']);
  240. $coupon_ids = array_column($coupon_cate_relate_list,'coupon_id');
  241. $coupon_list1 = StoreCoupon::lists([
  242. 'where'=>[
  243. ['id'=>$coupon_ids],
  244. ['store_id'=>$store['id']],
  245. ['status'=>StatusEnum::ENABLED],
  246. ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING],
  247. ],
  248. 'select'=>'id,name,type,exchange_voucher_type,sub_price',
  249. 'limit'=>5
  250. ]);
  251. //全场通用
  252. $coupon_list3 = StoreCoupon::lists([
  253. 'where'=>[
  254. ['store_id'=>$store['id']],
  255. ['appoint_type' => 3],
  256. ['status'=>StatusEnum::ENABLED],
  257. ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING],
  258. ],
  259. 'select'=>'id,name,type,exchange_voucher_type,sub_price',
  260. 'limit'=>5
  261. ]);
  262. $coupon_list = array_merge($coupon_list1,$coupon_list2,$coupon_list3);
  263. foreach ($coupon_list as&$item){
  264. $item['from_type_txt'] = '店铺券';
  265. }
  266. if(!empty($goods['freight_type'])){
  267. $goods['freight_type'] = explode(',',$goods['freight_type']);
  268. }
  269. // 处理兑换券
  270. if ($coupon_list2) {
  271. $sub_price = 0;
  272. foreach ($coupon_list2 as $item) {
  273. if ($item['type'] == StoreEnum::EXCHANGE) {
  274. if ($item['exchange_voucher_type'] == 0) {
  275. $goods['coupon_price'] = 0;
  276. break;
  277. } else {
  278. if ($item['sub_price'] > $sub_price) {
  279. $sub_price = $item['sub_price'];
  280. $goods['coupon_price'] = bcsub($goods['price'], $item['sub_price'], 2);
  281. if ($goods['coupon_price'] < 0) {
  282. $goods['coupon_price'] = 0;
  283. }
  284. }
  285. }
  286. }
  287. }
  288. }
  289. $res = GoodsLogic::getGoodsAssociationList($this->mall_id,$goods_id, $store['id']);
  290. $goods['extra1_goods_list'] = $res['extra1_goods_list']??[];
  291. $goods['extra2_goods_list'] = $res['extra2_goods_list']??[];
  292. $StoreGoodsTrackingService = new StoreGoodsTrackingService();
  293. $trackingData = [
  294. 'store_id' => $store_id,
  295. 'mall_id' => $mall_id,
  296. 'goods_id' => $goods_id,
  297. 'user_id' => $this->user_id
  298. ];
  299. $StoreGoodsTrackingService->addStoreGoodsTracking($trackingData);
  300. $goodsStoreConfig = Yii::$app->services->setting->addons->get($mall_id, StoreEnum::ADDONS_NAME, 'goodsStore');
  301. $store['is_hidden_goods_store'] = 0;
  302. if ($goodsStoreConfig['is_hidden_goods_store'] == 1) $store['is_hidden_goods_store'] = 1;
  303. $return = [
  304. 'goods' => $goods,
  305. 'store' => $store,
  306. 'coupon_list' => $coupon_list,
  307. ];
  308. if($goods['goods_type']==GoodsTypeEnum::GoodsTypeReserved){
  309. $store_reserve_setting = (new StoreReserveSettingService(['mall_id'=>$this->mall_id,'store_id'=>$store_id]))->detail();
  310. $reserve_setting['employee_selection'] = $store_reserve_setting['employee_selection']??1;
  311. $return['reserve']['reserve_setting'] =$reserve_setting;
  312. $range_end = $store_reserve_setting['range_end']??1;
  313. $range_end_arr = ReservationServiceEnum::RANGE_END_ARR_MAP;
  314. $return['reserve']['days'] = $range_end_arr[$range_end]??7;
  315. }
  316. return $this->success('获取成功', $return);
  317. } catch (Exception $e) {
  318. return $this->error($e->getMessage());
  319. }
  320. }
  321. /**
  322. * 商品评价列表
  323. * @return mixed|void
  324. */
  325. public function actionCommentsList()
  326. {
  327. $params = \Yii::$app->request->get();
  328. $res = \Yii::$app->services->validate->validate($params, [
  329. [['store_id'], 'required', 'message' => 'store_id必传'],
  330. [['limit', 'page', 'type','goods_id'], 'safe']
  331. ]);
  332. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  333. $data['comments'] = [];
  334. $data['good_rate'] = 0;//满意度
  335. $where = ['mall_id' => $this->mall_id,'store_id'=>$params['store_id'], 'status' => StatusEnum::ENABLED, ];
  336. if(!empty($params['goods_id'])) $where[]=['goods_id' => $params['goods_id']];
  337. $total = OrderComments::find()->where($where)->count();
  338. $data['comment_count'][0] = ['name' => OrderCommentEnum::OC_ALL, 'count' => $total ?? 0];
  339. $good_num = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES])->count();
  340. $data['comment_count'][1] = ['name' => OrderCommentEnum::OC_PRAISE, 'count' => $good_num ?? 0];
  341. $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES])->count();
  342. $data['comment_count'][2] = ['name' => OrderCommentEnum::OC_MIDDLE, 'count' => $count ?? 0];
  343. $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES])->count();
  344. $data['comment_count'][3] = ['name' => OrderCommentEnum::OC_NEGATIVE, 'count' => $count ?? 0];
  345. $count = OrderComments::find()->where($where)->andWhere(['<>', 'pic_url', '[]'])->count();
  346. $data['comment_count'][4] = ['name' =>'有图', 'count' => $count ?? 0];
  347. $where = [];
  348. $where[] = ['mall_id' => $this->mall_id];
  349. $where[] = ['status' => StatusEnum::ENABLED];
  350. if(!empty($params['goods_id'])) $where[]=['goods_id'=>$params['goods_id']];
  351. $where[] = ['store_id' => $params['store_id']];
  352. if (!empty($params['type'])) {
  353. switch ($params['type']) {
  354. case OrderCommentEnum::TYPE1://差评
  355. $where[] = ['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES];
  356. break;
  357. case OrderCommentEnum::TYPE2://中评
  358. $where[] = ['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES];
  359. break;
  360. case OrderCommentEnum::TYPE4://好评
  361. $where[] = ['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES];
  362. break;
  363. case OrderCommentEnum::TYPE5://有图
  364. $where[] = ['<>', 'pic_url', '[]'];
  365. break;
  366. }
  367. }
  368. $params['where'] = $where;
  369. $params['select'] = '*';
  370. $params['order'] = 'is_top desc,id desc';
  371. $order_comments_list = OrderComments::listPage($params);
  372. if (!empty($order_comments_list['list'])) {
  373. $user_id_arr = array_column($order_comments_list['list'], 'user_id');
  374. $user_list = User::findAll(['id' => $user_id_arr]);
  375. $user_arr = [];
  376. foreach ($user_list as $v) {
  377. $user_arr[$v['id']] = ['nickname' => $v['nickname'], 'avatar_url' => $v['avatar_url'], 'level' => $v['level']];
  378. }
  379. foreach ($order_comments_list['list'] as &$v) {
  380. $v['pic_url'] = !empty($v['pic_url']) ? json_decode($v['pic_url'], true) : [];
  381. $comment['nickname'] = $comment['avatar_url'] = '';
  382. if (isset($user_arr[$v['user_id']])) {
  383. $user = $user_arr[$v['user_id']];
  384. $v['nickname'] = $user['nickname'];
  385. $v['avatar_url'] = $user['avatar_url'];
  386. $v['level'] = $user['level'];
  387. }
  388. }
  389. $data['comments'] = $order_comments_list;
  390. }
  391. return $this->success('操作成功', $data);
  392. }
  393. /**
  394. * 分类商品列表
  395. * @return mixed|void
  396. */
  397. public function actionCateGoodsList()
  398. {
  399. $params = \Yii::$app->request->get();
  400. $res = \Yii::$app->services->validate->validate($params, [
  401. [['store_id'], 'required'],
  402. [['cate_id','keyword','type'], 'safe'],
  403. ]);
  404. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  405. $store_id = $params['store_id'];
  406. $where[] = ['store_id'=>$store_id,'mall_id' => $this->mall_id,'check_status'=>1, 'is_on_sale' => 1, 'status' => StatusEnum::ENABLED];
  407. if(!empty($params['cate_id'])){
  408. $goods_cate_relate_list = StoreGoodsCateRelate::findAll(['cate_id' => $params['cate_id']]);
  409. $goods_id_arr = array_column($goods_cate_relate_list, 'goods_id');
  410. $where[] = ['id' => $goods_id_arr];
  411. }
  412. if(!empty($params['keyword'])){
  413. $where[] = ['like', 'goods_name', trim($params['keyword'])];
  414. }
  415. if(!empty($params['type'])){
  416. switch ($params['type']){
  417. case 'platform':
  418. $where[] = ['!=', 'mall_goods_id', 0];
  419. break;
  420. case 'store':
  421. $where[] = ['mall_goods_id'=> 0];
  422. break;
  423. }
  424. }
  425. $platform_goods_cate = StoreGoods::getPlatformGoodsCate($this->mall_id);
  426. if ($platform_goods_cate) {
  427. $filter_goods_ids = StoreGoodsCateRelate::lists([
  428. 'where' => [
  429. ['cate_id' => $platform_goods_cate['id']],
  430. ],
  431. 'select' => 'goods_id'
  432. ]);
  433. $filter_goods_ids = array_column($filter_goods_ids, 'goods_id') ?? [];
  434. $where[] = ['not in', 'id', $filter_goods_ids];
  435. }
  436. $params['where'] = $where;
  437. $params['select'] = 'id,goods_name,cover_pic,price,(sales_num+virtual_sales) as sales_num,original_price,status,stock,attr_groups,attr_groups_format,is_attr,is_show_sales,goods_type,show_style';
  438. $params['order'] = 'sort asc';
  439. $params['with'] = ['attr'=>function($query){
  440. $query->select('id,goods_id,name,price,sign_id,stock,pic_url,original_price');
  441. },'extra'
  442. ];
  443. $goods_list = StoreGoods::listPage($params);
  444. $list = StoreCart::getCartList($this->user_id);
  445. $goods_num_arr = [];
  446. $goods_attr_ids = [];
  447. foreach ($list as $v) {
  448. $row = json_decode($v, true);
  449. if (is_array($row)) {
  450. $goods_attr_ids[]=$row['attr_id'];
  451. }
  452. }
  453. $goods_attr_arr = StoreGoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids],['>','stock',0],['status'=>StatusEnum::ENABLED]],'select'=>'goods_id,id','index'=>'goods_id']);
  454. foreach ($list as $v) {
  455. $row = json_decode($v, true);
  456. if(!is_array($row)) continue;
  457. if (isset($goods_num_arr[$row['goods_id']])) {
  458. if(isset($goods_attr_arr[$row['goods_id']])){
  459. $goods_num_arr[$row['goods_id']] += $row['num'];
  460. }
  461. } else {
  462. $goods_num_arr[$row['goods_id']] = $row['num'];
  463. }
  464. }
  465. if (!empty($goods_list['list'])) {
  466. $setting = \Yii::$app->services->setting->addons->get($this->mall_id, StoreEnum::ADDONS_NAME, 'decoration');
  467. foreach ($goods_list['list'] as &$item) {
  468. if(!$setting['custom_goods_style']){ // 如果不是自定义,就按照主商城的
  469. $item['show_style'] = $setting['default_goods_style'];
  470. }
  471. $item['member_buy_limit_setting'] = empty($item['extra']['member_buy_limit_setting'])?'':json_decode($item['extra']['member_buy_limit_setting'],true);
  472. unset($item['extra']);
  473. $item['num'] = !empty($goods_num_arr[$item['id']]) ? $goods_num_arr[$item['id']] : 0;
  474. $item['status'] = empty($item['stock']) ? 0 : 1;
  475. $item['attr_id'] = 0;
  476. foreach($item['attr'] as &$val){
  477. $val['is_show'] = StatusEnum::ENABLED;
  478. $item['attr_id'] <= 0 && $item['attr_id'] = $val['id'];
  479. }
  480. unset($val);
  481. }
  482. }
  483. return $this->success('操作成功', $goods_list);
  484. }
  485. public function actionGetPlatformGoods()
  486. {
  487. $params = \Yii::$app->request->get();
  488. $res = \Yii::$app->services->validate->validate($params, [
  489. [['store_id'], 'required'],
  490. [['keyword'], 'string']
  491. ]);
  492. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  493. $store_id = $params['store_id'];
  494. $where[] = ['store_id'=>$store_id,'mall_id' => $this->mall_id,'check_status'=>1, 'is_on_sale' => 1, 'status' => StatusEnum::ENABLED];
  495. $platform_goods_cate = StoreGoods::getPlatformGoodsCate($this->mall_id);
  496. if ($platform_goods_cate) {
  497. $filter_goods_ids = StoreGoodsCateRelate::lists([
  498. 'where' => [
  499. ['cate_id' => $platform_goods_cate['id']],
  500. ],
  501. 'select' => 'goods_id'
  502. ]);
  503. $filter_goods_ids = array_column($filter_goods_ids, 'goods_id') ?? [];
  504. $where[] = ['id' => $filter_goods_ids];
  505. }else{
  506. $where[] = ['id' => 0];
  507. }
  508. if($params['keyword']) $where[] = ['like', 'goods_name', $params['keyword']];
  509. $params['where'] = $where;
  510. $params['select'] = 'id,goods_name,cover_pic,price,(sales_num+virtual_sales) as sales_num,original_price,status,stock,attr_groups,attr_groups_format,is_attr,goods_type';
  511. $params['order'] = 'sort asc';
  512. $params['with'] = ['attr'=>function($query){
  513. $query->select('id,goods_id,name,price,sign_id,stock,pic_url,original_price');
  514. },'extra'
  515. ];
  516. $goods_list = StoreGoods::listPage($params);
  517. $list = StoreCart::getCartList($this->user_id);
  518. $goods_num_arr = [];
  519. $goods_attr_ids = [];
  520. foreach ($list as $v) {
  521. $row = json_decode($v, true);
  522. if (is_array($row)) {
  523. $goods_attr_ids[]=$row['attr_id'];
  524. }
  525. }
  526. $goods_attr_arr = StoreGoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids],['>','stock',0],['status'=>StatusEnum::ENABLED]],'select'=>'goods_id,id','index'=>'goods_id']);
  527. foreach ($list as $v) {
  528. $row = json_decode($v, true);
  529. if(!is_array($row)) continue;
  530. if (isset($goods_num_arr[$row['goods_id']])) {
  531. if(isset($goods_attr_arr[$row['goods_id']])){
  532. $goods_num_arr[$row['goods_id']] += $row['num'];
  533. }
  534. } else {
  535. $goods_num_arr[$row['goods_id']] = $row['num'];
  536. }
  537. }
  538. if (!empty($goods_list['list'])) {
  539. foreach ($goods_list['list'] as &$item) {
  540. $item['member_buy_limit_setting'] = empty($item['extra']['member_buy_limit_setting'])?'':json_decode($item['extra']['member_buy_limit_setting'],true);
  541. unset($item['extra']);
  542. $item['num'] = !empty($goods_num_arr[$item['id']]) ? $goods_num_arr[$item['id']] : 0;
  543. $item['status'] = empty($item['stock']) ? 0 : 1;
  544. $item['attr_id'] = 0;
  545. foreach($item['attr'] as &$val){
  546. $val['is_show'] = StatusEnum::ENABLED;
  547. if($item['attr_id'] <= 0) $item['attr_id'] = $val['id'];
  548. }
  549. unset($val);
  550. }
  551. unset($item);
  552. }
  553. return $this->success('操作成功', $goods_list);
  554. }
  555. public function actionReserveDetail()
  556. {
  557. $params = \Yii::$app->request->get();
  558. $res = \Yii::$app->services->validate->validate($params, [
  559. [['goods_id'], 'required'],
  560. [['goods_id'], 'integer'],
  561. ]);
  562. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  563. $data = StoreGoodsReserve::getOne([
  564. ['goods_id' => $params['goods_id']],
  565. ['mall_id' => $this->mall_id],
  566. ], true, [], 'id desc', 'ordering_information, information_detail');
  567. return $this->success('获取成功', $data);
  568. }
  569. }