GoodsAttrInfoForm.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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\client\models\v1;
  16. use app\models\ActivityNewUser;
  17. use app\models\ActivityNewUserGoods;
  18. use app\models\Cart;
  19. use app\models\Goods;
  20. use app\models\GoodsFullMinus;
  21. use app\models\MdGoods;
  22. use app\models\MdGroupActivities;
  23. use app\models\MdGroupActivitiesGoods;
  24. use app\models\PtActivity;
  25. use app\models\PtActivityGoods;
  26. use app\models\SeckillActivity;
  27. use app\models\SeckillActivityGoods;
  28. use app\models\SupplierSetting;
  29. use app\modules\client\models\v1\common\CommonGoods;
  30. use yii\base\Model;
  31. class GoodsAttrInfoForm extends Model
  32. {
  33. public $goods_id;
  34. public $attr_list;
  35. public $type;
  36. public $number;
  37. public $is_pt;
  38. public $is_seckill;
  39. public $miaosha_goods;
  40. public function rules()
  41. {
  42. return [
  43. [['goods_id', 'attr_list','number'], 'required'],
  44. [['type'], 'default', 'value' => 's'],
  45. [['is_pt', 'is_seckill'], 'safe']
  46. ];
  47. }
  48. public function search()
  49. {
  50. if (!$this->validate()) {
  51. return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
  52. }
  53. $attrList = json_decode($this->attr_list, true);
  54. if(!$attrList || !is_array($attrList)){
  55. $attrList = explode(',', $this->attr_list);
  56. }
  57. $this->attr_list = $attrList;
  58. $goods = Goods::findOne($this->goods_id);
  59. if (!$goods) {
  60. return [
  61. 'code' => 0,
  62. 'msg' => '商品不存在'
  63. ];
  64. }
  65. // $res = $goods->getAttrInfo($this->attr_list);
  66. foreach ($this->attr_list as $index => $value) {
  67. if ($value < 0) {
  68. unset($this->attr_list[$index]);
  69. }
  70. }
  71. $this->attr_list = array_values($this->attr_list);
  72. $GoodsFullMinus = GoodsFullMinus::find()
  73. ->select('*')
  74. ->where(['store_id' => get_store_id(),'goods_id' => $goods->id])
  75. ->orderBy('full_minus_num ASC')->asArray()->all();
  76. // 门店逻辑
  77. $attr = $goods->attr;
  78. $price = $goods->price;
  79. if (get_md_id()) {
  80. $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]);
  81. if ($md_goods) {
  82. $attr = $md_goods->attr;
  83. $price = $md_goods->price;
  84. }
  85. }
  86. //新人专享活动
  87. $activityAt = ActivityNewUser::activityAt($goods->store_id);
  88. if ($activityAt) {
  89. $goods_ext = ActivityNewUserGoods::findOne(['activity_id' => $activityAt->id, 'goods_id' => $goods->id, 'is_delete' => 0]);
  90. if ($goods_ext) {
  91. $ext_attrs = json_decode($goods_ext->attr, true);
  92. $ext_price = 0;
  93. //计算购物车当前数量与下单数量是否大于额定数量,若小于额定数量则将价格改为新人专享价格 START
  94. $price_open = false;
  95. $buy_limit = $activityAt->buy_limit;
  96. $attr = json_decode($attr, true);
  97. if ($buy_limit && $buy_limit > 0) {
  98. $open = false;
  99. //部分享受优惠
  100. $goodsNum = intval(Goods::getBuyNum(get_user(), $goods->id));
  101. if ($goodsNum < $buy_limit) {
  102. $open = true;
  103. }
  104. //获取购物车中的数量
  105. $cart = Cart::findOne([
  106. 'type'=>Cart::TYPE_DEFAULT,
  107. 'store_id' => $goods->store_id,
  108. 'goods_id' => $goods->id,
  109. 'user_id' => get_user_id(),
  110. 'is_delete' => 0
  111. ]);
  112. $cart_num = 0;
  113. if ($cart) {
  114. $cart_num = $cart->num ?: 0;
  115. }
  116. $total_num = $cart_num + $goodsNum;
  117. if ($open && $total_num < $buy_limit) {
  118. $price_open = true;
  119. }
  120. if ($price_open) {
  121. $open = false;
  122. foreach($ext_attrs as $ext_attr){
  123. $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id');
  124. foreach($attr as &$attr_item){
  125. $attr_id = array_column($attr_item['attr_list'], 'attr_id');
  126. sort($ext_attr_id);
  127. sort($attr_id);
  128. if($attr_id == $ext_attr_id){
  129. $attr_item['price'] = $ext_attr['price'];
  130. }
  131. sort($this->attr_list);
  132. if (empty(array_diff($attr_id, $this->attr_list))) {
  133. $open = true;
  134. $ext_price = $attr_item['price'];
  135. }
  136. }
  137. }
  138. if ($open) {
  139. $is_level = false;
  140. $GoodsFullMinus = [];
  141. }
  142. $price = $ext_price ?: $price;
  143. }
  144. }
  145. $attr = json_encode($attr, JSON_UNESCAPED_UNICODE);
  146. }
  147. //END
  148. }
  149. $seckill_activity_goods = [];
  150. if ($this->is_seckill) {
  151. //秒杀活动
  152. $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $goods->id])
  153. ->leftJoin(['sa' => SeckillActivity::tableName()], 'sag.activity_id = sa.id')
  154. ->andWhere(['AND', ['sa.is_delete' => 0], ['>', 'sa.end_time', time()], ['sag.is_delete' => 0]])
  155. ->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();
  156. }
  157. $seckill_activity_arr = [];
  158. if (!empty($seckill_activity_goods)) {
  159. $last_names = array_column($seckill_activity_goods,'start_time');
  160. array_multisort($last_names, SORT_ASC, $seckill_activity_goods);
  161. foreach ($seckill_activity_goods as $activity_good) {
  162. $activity_good['progress'] = sprintf('%.2f', (($activity_good['sale_num'] + $activity_good['virtual_sales']) / ($activity_good['seckill_num'] + $activity_good['virtual_sales'])) * 100);
  163. $activity_good['price'] = $goods->price;
  164. if ($activity_good['start_time'] < time()) { //活动进行中 前端展示距离结束
  165. $activity_good['status'] = 1;
  166. $seckill_activity_arr = $activity_good;
  167. goto seckill_activity_arr;
  168. }
  169. if ($activity_good['start_time'] >= time()) {//活动进行中 前端展示距离开始
  170. $activity_good['status'] = 2;
  171. $seckill_activity_arr = $activity_good;
  172. goto seckill_activity_arr;
  173. }
  174. }
  175. seckill_activity_arr:
  176. }
  177. if (!empty($seckill_activity_arr)) {
  178. $seckill_activity_arr['attr'] = json_decode($seckill_activity_arr['attr'], true);
  179. $GoodsFullMinus = [];
  180. $goods->is_level = 0;
  181. // if ((int)$goods->use_attr === 1 && !empty($seckill_activity_arr['attr'])) {
  182. $open = false;
  183. foreach ($seckill_activity_arr['attr'] as $sag_attr) {
  184. $sag_attr_id = array_column($sag_attr['attr_list'], 'attr_id');
  185. $new_attr[] = $sag_attr;
  186. //与购物车添加的规格id数组比较
  187. if (empty(array_diff($sag_attr_id, $this->attr_list))) {
  188. $open = true;
  189. }
  190. }
  191. if ($open) {
  192. foreach ($seckill_activity_arr['attr'] as &$sag_attr) {
  193. $num = $sag_attr['seckill_num'];
  194. $sag_attr['price'] = $sag_attr['seckill_price'];
  195. $sag_attr['num'] = $num > 0 ? $num : 0;
  196. }
  197. $attr = json_encode($seckill_activity_arr['attr']);
  198. }
  199. $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  200. // } else {
  201. // $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  202. // }
  203. }
  204. $is_level = $goods->is_level;
  205. //拼团活动
  206. if ((int)$this->is_pt) {
  207. $pt_activity_goods = PtActivityGoods::find()->alias('pag')->where(['pag.goods_id' => $goods->id])
  208. ->leftJoin(['pa' => PtActivity::tableName()], 'pag.activity_id = pa.id')
  209. ->andWhere(['AND', ['pa.is_delete' => 0], ['>', 'pa.end_time', time()], ['<', 'start_time', time()], ['pag.is_delete' => 0]])
  210. ->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();
  211. if (!empty($pt_activity_goods)) {
  212. $pt_activity_goods['attr'] = json_decode($pt_activity_goods['attr'], true);
  213. $open = false;
  214. foreach ($pt_activity_goods['attr'] as &$pt_attr) {
  215. $pt_attr_id = array_column($pt_attr['attr_list'], 'attr_id');
  216. sort($pt_attr_id);
  217. sort($this->attr_list);
  218. //与购物车添加的规格id数组比较
  219. // array_splice($this->attr_list, 0, 1);
  220. if (empty(array_diff($pt_attr_id, $this->attr_list))) {
  221. $open = true;
  222. $pt_attr['price'] = $pt_attr['pt_price'];
  223. }
  224. }
  225. if ($open) {
  226. $attr = json_encode($pt_activity_goods['attr']);
  227. }
  228. $price = $pt_activity_goods['attr'][0]['pt_price'];
  229. }
  230. $is_level = false;
  231. }
  232. $activityModel = MdGroupActivitiesGoods::find()->alias('mgag')->leftJoin(['mga'=>MdGroupActivities::tableName()],'mga.id=mgag.activities_id')->where(['goods_id'=>$goods->id,'mgag.is_delete'=>0])->andWhere(['>=','mga.end_time',time()])->andWhere(['mga.is_delete'=>0])->asArray()->select('mgag.*,mga.start_time,mga.end_time')->one();
  233. if($activityModel){
  234. $attr = $activityModel['attr'];
  235. $price = $activityModel['price'];
  236. }
  237. $goodsData = [
  238. 'attr' => $attr,
  239. 'price' => $price,
  240. 'is_level' => $is_level,
  241. 'mch_id' => $goods->mch_id,
  242. 'full_minus' => $GoodsFullMinus,
  243. 'unit' => $goods->unit,
  244. 'use_attr' => $goods->use_attr,
  245. ];
  246. $res = CommonGoods::currentGoodsAttr($goodsData, (array) $this->attr_list, [], $this->number);
  247. $user = get_user();
  248. if($user && $goods['stbz_goods_id']){
  249. // $res['num'] % 2 && $res['num'] = 0;
  250. $addressData = \app\models\Address::find()->where([
  251. 'user_id' => get_saas_user_id(),
  252. 'is_default' => 1,
  253. 'is_delete' => 0,
  254. ])->limit(1)->one();
  255. if($addressData){
  256. $params = [];
  257. $params['address'] = [
  258. "area"=>$addressData['district'],//区
  259. "city"=>$addressData['city'],//市
  260. "consignee"=>$addressData['name'],//收件人
  261. "description"=>$addressData['detail'],//详细地址
  262. "phone"=>$addressData['mobile'],//联系电话
  263. "province"=>$addressData['province'],//省
  264. "street"=>'',//街道
  265. "freight"=>1 * 100,//运费 单位分
  266. ];
  267. $spu = [
  268. 'number' => 1,
  269. 'sku' => $res['no'],
  270. ];
  271. $params['spu'] = $spu;
  272. // debug_log('胜天半子可售检测' . json_encode($spu));
  273. $checkData = \stbz_client()->getApiResponse('get', '/v2/order/availableCheck', $params);
  274. // var_dump($params, $checkData);die;
  275. $checkData = \json_decode($checkData, true);
  276. $res['availableCheck'] = $checkData;
  277. // debug_log('胜天半子可售检测' . json_encode($checkData));
  278. if ($checkData['code'] == 1) {
  279. if($checkData['data']['code'] == 1){
  280. if($checkData['data']['data']['ban']){
  281. $res['num'] = 0;
  282. }
  283. }
  284. }
  285. }
  286. }
  287. return [
  288. 'code' => 0,
  289. 'data' => $res
  290. ];
  291. }
  292. }