GoodsAttrInfoForm.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. /*
  8. * @Author: your name
  9. * @Date: 2021-03-02 09:50:20
  10. * @LastEditTime: 2021-05-12 10:48:03
  11. * @LastEditors: Please set LastEditors
  12. * @Description: In User Settings Edit
  13. * @FilePath: \admin_php\modules\client\models\v1\GoodsAttrInfoForm.php
  14. */
  15. namespace app\modules\alliance\models;
  16. use app\models\ActivityNewUser;
  17. use app\models\ActivityNewUserGoods;
  18. use app\models\Goods;
  19. use app\models\GoodsFullMinus;
  20. use app\models\MdGoods;
  21. use app\models\PtActivity;
  22. use app\models\PtActivityGoods;
  23. use app\models\SeckillActivity;
  24. use app\models\SeckillActivityGoods;
  25. use app\models\SupplierSetting;
  26. use app\models\User;
  27. use app\modules\alliance\models\common\CommonGoods;
  28. use yii\base\Model;
  29. class GoodsAttrInfoForm extends Model
  30. {
  31. public $goods_id;
  32. public $attr_list;
  33. public $type;
  34. public $number;
  35. public $is_pt;
  36. public $is_seckill;
  37. public $miaosha_goods;
  38. public function rules()
  39. {
  40. return [
  41. [['goods_id', 'attr_list','number'], 'required'],
  42. [['type'], 'default', 'value' => 's'],
  43. [['is_pt', 'is_seckill'], 'safe']
  44. ];
  45. }
  46. public function search()
  47. {
  48. if (!$this->validate()) {
  49. return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
  50. }
  51. // app端传递$this->attr_list="a,b" 或 a,小程序端传递参数$this->attr_list="[a,b]"
  52. $attr_list = json_decode($this->attr_list, true);
  53. if (!is_array($attr_list)) {
  54. $attr_list = explode(',', $this->attr_list);
  55. }
  56. $this->attr_list = $attr_list;
  57. $goods = Goods::findOne($this->goods_id);
  58. if (!$goods) {
  59. return [
  60. 'code' => 0,
  61. 'msg' => '商品不存在'
  62. ];
  63. }
  64. // $res = $goods->getAttrInfo($this->attr_list);
  65. foreach ($this->attr_list as $index => $value) {
  66. if ($value < 0) {
  67. unset($this->attr_list[$index]);
  68. }
  69. }
  70. $this->attr_list = array_values($this->attr_list);
  71. $GoodsFullMinus = GoodsFullMinus::find()
  72. ->select('*')
  73. ->where(['store_id' => get_store_id(),'goods_id' => $goods->id])
  74. ->orderBy('full_minus_num ASC')->asArray()->all();
  75. // 门店逻辑
  76. $attr = $goods->attr;
  77. $price = $goods->price;
  78. if (get_md_id()) {
  79. $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]);
  80. if ($md_goods) {
  81. $attr = $md_goods->attr;
  82. $price = $md_goods->price;
  83. }
  84. }
  85. $seckill_activity_goods = [];
  86. if ($this->is_seckill) {
  87. //秒杀活动
  88. $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $goods->id])
  89. ->leftJoin(['sa' => SeckillActivity::tableName()], 'sag.activity_id = sa.id')
  90. ->andWhere(['AND', ['sa.is_delete' => 0, 'sag.is_delete' => 0], ['>', 'sa.end_time', time()]])
  91. ->andWhere(['OR', ['sa.is_platform' => 1, 'sa.is_platform_audit' => 1, 'sa.status' => 1], ['sa.is_platform' => 0]])
  92. ->select('sa.id, sa.self_limit_num, sa.order_limit_num, sa.start_time, sa.end_time, sag.attr, sag.seckill_num, sag.seckill_price, sag.use_attr, sag.sale_num, sag.virtual_sales')->asArray()->all();
  93. }
  94. $seckill_activity_arr = [];
  95. if (!empty($seckill_activity_goods)) {
  96. $last_names = array_column($seckill_activity_goods,'start_time');
  97. array_multisort($last_names, SORT_ASC, $seckill_activity_goods);
  98. foreach ($seckill_activity_goods as $activity_good) {
  99. $activity_good['progress'] = sprintf('%.2f', (($activity_good['sale_num'] + $activity_good['virtual_sales']) / ($activity_good['seckill_num'] + $activity_good['virtual_sales'])) * 100);
  100. $activity_good['price'] = $goods->price;
  101. if ($activity_good['start_time'] < time()) { //活动进行中 前端展示距离结束
  102. $activity_good['status'] = 1;
  103. $seckill_activity_arr = $activity_good;
  104. goto seckill_activity_arr;
  105. }
  106. if ($activity_good['start_time'] >= time()) {//活动进行中 前端展示距离开始
  107. $activity_good['status'] = 2;
  108. $seckill_activity_arr = $activity_good;
  109. goto seckill_activity_arr;
  110. }
  111. }
  112. seckill_activity_arr:
  113. }
  114. if (!empty($seckill_activity_arr)) {
  115. $seckill_activity_arr['attr'] = json_decode($seckill_activity_arr['attr'], true);
  116. $GoodsFullMinus = [];
  117. $goods->is_level = 0;
  118. // if ((int)$goods->use_attr === 1 && !empty($seckill_activity_arr['attr'])) {
  119. $open = false;
  120. foreach ($seckill_activity_arr['attr'] as $sag_attr) {
  121. $sag_attr_id = array_column($sag_attr['attr_list'], 'attr_id');
  122. $new_attr[] = $sag_attr;
  123. //与购物车添加的规格id数组比较
  124. if (empty(array_diff($sag_attr_id, $this->attr_list))) {
  125. $open = true;
  126. }
  127. }
  128. if ($open) {
  129. foreach ($seckill_activity_arr['attr'] as &$sag_attr) {
  130. $num = $sag_attr['seckill_num'];
  131. $sag_attr['price'] = $sag_attr['seckill_price'];
  132. $sag_attr['num'] = $num > 0 ? $num : 0;
  133. }
  134. $attr = json_encode($seckill_activity_arr['attr']);
  135. }
  136. $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  137. // } else {
  138. // $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  139. // }
  140. }
  141. $is_level = $goods->is_level;
  142. //新人专享活动
  143. $activityAt = ActivityNewUser::activityAt($goods->store_id);
  144. if ($activityAt) {
  145. $goods_ext = ActivityNewUserGoods::findOne(['activity_id' => $activityAt->id, 'goods_id' => $goods->id, 'is_delete' => 0]);
  146. if ($goods_ext) {
  147. $ext_attrs = json_decode($goods_ext->attr, true);
  148. $ext_price = 0;
  149. foreach($ext_attrs as $ext_attr){
  150. $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id');
  151. sort($ext_attr_id);
  152. sort($this->attr_list);
  153. //与购物车添加的规格id数组比较
  154. // array_splice($this->attr_list, 0, 1);
  155. if (empty(array_diff($ext_attr_id, $this->attr_list))) {
  156. $ext_price = $ext_attr['price'];
  157. }
  158. }
  159. $buy_limit = $activityAt->buy_limit;
  160. if ($buy_limit && $buy_limit > 0) {
  161. //部分享受优惠
  162. $user = User::findOne(['binding' => get_saas_user()->mobile, 'store_id' => $goods->store_id, 'is_delete' => 0]);
  163. $goodsNum = intval(Goods::getBuyNum($user, $goods->id));
  164. if ($goodsNum < $buy_limit) {
  165. $price = $ext_price ?: $price;
  166. $attr = json_encode($ext_attrs);
  167. }
  168. }
  169. }
  170. }
  171. //拼团活动
  172. if ((int)$this->is_pt) {
  173. $pt_activity_goods = PtActivityGoods::find()->alias('pag')->where(['pag.goods_id' => $goods->id])
  174. ->leftJoin(['pa' => PtActivity::tableName()], 'pag.activity_id = pa.id')
  175. ->andWhere(['AND', ['pa.is_delete' => 0, 'pag.is_delete' => 0], ['>', 'pa.end_time', time()], ['<', 'start_time', time()]])
  176. ->andWhere(['OR', ['pa.is_platform' => 1, 'pa.is_platform_audit' => 1, 'pa.status' => 1], ['pa.is_platform' => 0]])
  177. ->select('pa.id, pa.party_size, pa.party_type, pa.party_goods_count, pa.join_num, pa.start_time, pa.end_time, pag.attr, pag.pt_price, pag.use_attr, pag.sale_num, pag.virtual_sales')->asArray()->one();
  178. if (!empty($pt_activity_goods)) {
  179. $pt_activity_goods['attr'] = json_decode($pt_activity_goods['attr'], true);
  180. $open = false;
  181. foreach ($pt_activity_goods['attr'] as &$pt_attr) {
  182. $pt_attr_id = array_column($pt_attr['attr_list'], 'attr_id');
  183. sort($pt_attr_id);
  184. sort($this->attr_list);
  185. //与购物车添加的规格id数组比较
  186. // array_splice($this->attr_list, 0, 1);
  187. if (empty(array_diff($pt_attr_id, $this->attr_list))) {
  188. $open = true;
  189. $pt_attr['price'] = $pt_attr['pt_price'];
  190. }
  191. }
  192. if ($open) {
  193. $attr = json_encode($pt_activity_goods['attr']);
  194. }
  195. $price = $pt_activity_goods['attr'][0]['pt_price'];
  196. }
  197. $is_level = false;
  198. }
  199. $goodsData = [
  200. 'attr' => $attr,
  201. 'price' => $price,
  202. 'is_level' => $is_level,
  203. 'mch_id' => $goods->mch_id,
  204. 'full_minus' => $GoodsFullMinus,
  205. 'unit' => $goods->unit,
  206. 'use_attr' => $goods->use_attr,
  207. ];
  208. $res = CommonGoods::currentGoodsAttr($goodsData, (array) $this->attr_list, [], $this->number);
  209. return [
  210. 'code' => 0,
  211. 'data' => $res
  212. ];
  213. }
  214. }