GoodsAttrInfoForm.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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\admin\models\cashier;
  16. use app\models\Attr;
  17. use app\models\Goods;
  18. use app\models\GoodsFullMinus;
  19. use app\models\MdGoods;
  20. use app\models\SeckillActivity;
  21. use app\models\SeckillActivityGoods;
  22. use app\models\SupplierSetting;
  23. use app\modules\client\models\v1\common\CommonGoods;
  24. use yii\base\Model;
  25. use app\models\User;
  26. use app\models\Level;
  27. use app\constants\OptionSetting;
  28. use app\models\Option;
  29. use app\models\SaasUser;
  30. class GoodsAttrInfoForm extends Model
  31. {
  32. public $goods_id;
  33. public $attr_list;
  34. public $type;
  35. public $number = 1;
  36. public $user_id;
  37. public $store_id;
  38. protected $user;
  39. protected $level;
  40. protected $address;
  41. protected $integral;
  42. protected $saas_user;
  43. public $miaosha_goods;
  44. public function rules()
  45. {
  46. return [
  47. [['goods_id', 'attr_list'], 'required'],
  48. [['user_id'], 'safe'],
  49. [['type'], 'default', 'value' => 's']
  50. ];
  51. }
  52. // 走过验证后 查询相应数据
  53. public function afterValidate()
  54. {
  55. $this->user = User::findOne($this->user_id);
  56. $this->level = $this->getLevelData();
  57. $this->integral = [
  58. 'forehead' => 0,
  59. 'forehead_integral' => 0,
  60. 'integration' => Option::get(OptionSetting::STORE_INTEGRATION, get_store_id(), 'gift', Option::get(OptionSetting::STORE_INTEGRATION, get_store_id(), 'store')['value'])['value']
  61. ];
  62. $this->saas_user = SaasUser::findOne(['mobile' => $this->user->binding]);
  63. parent::afterValidate();
  64. }
  65. protected function getLevelData()
  66. {
  67. $level = Level::find()->select([
  68. 'name', 'level', 'discount',
  69. ])->where(['level' => $this->user->level, 'store_id' => $this->store_id, 'is_delete' => 0])
  70. ->asArray()->one();
  71. return $level;
  72. }
  73. public function search()
  74. {
  75. if (!$this->validate()) {
  76. return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
  77. }
  78. $this->attr_list = json_decode($this->attr_list, true);
  79. $goods = Goods::findOne($this->goods_id);
  80. if (!$goods) {
  81. return [
  82. 'code' => 0,
  83. 'msg' => '商品不存在'
  84. ];
  85. }
  86. // $res = $goods->getAttrInfo($this->attr_list);
  87. $GoodsFullMinus = GoodsFullMinus::find()
  88. ->select('*')
  89. ->where(['store_id' => get_store_id(),'goods_id' => $goods->id])
  90. ->orderBy('full_minus_num ASC')->asArray()->all();
  91. // 门店逻辑
  92. $attr = $goods->attr;
  93. $price = $goods->price;
  94. if (get_md_id()) {
  95. $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]);
  96. if ($md_goods) {
  97. $attr = $md_goods->attr;
  98. $price = $md_goods->price;
  99. }
  100. }
  101. //秒杀活动
  102. $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $goods->id])
  103. ->leftJoin(['sa' => SeckillActivity::tableName()], 'sag.activity_id = sa.id')
  104. ->andWhere(['AND', ['sa.is_delete' => 0], ['>', 'sa.end_time', time()], ['sag.is_delete' => 0]])
  105. ->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();
  106. $seckill_activity_arr = [];
  107. if (!empty($seckill_activity_goods)) {
  108. $last_names = array_column($seckill_activity_goods,'start_time');
  109. array_multisort($last_names, SORT_ASC, $seckill_activity_goods);
  110. foreach ($seckill_activity_goods as $activity_good) {
  111. $activity_good['progress'] = sprintf('%.2f', (($activity_good['sale_num'] + $activity_good['virtual_sales']) / ($activity_good['seckill_num'] + $activity_good['virtual_sales'])) * 100);
  112. $activity_good['price'] = $goods->price;
  113. if ($activity_good['start_time'] < time()) { //活动进行中 前端展示距离结束
  114. $activity_good['status'] = 1;
  115. $seckill_activity_arr = $activity_good;
  116. goto seckill_activity_arr;
  117. }
  118. if ($activity_good['start_time'] >= time()) {//活动进行中 前端展示距离开始
  119. $activity_good['status'] = 2;
  120. $seckill_activity_arr = $activity_good;
  121. goto seckill_activity_arr;
  122. }
  123. }
  124. seckill_activity_arr:
  125. }
  126. if (!empty($seckill_activity_arr)) {
  127. $seckill_activity_arr['attr'] = json_decode($seckill_activity_arr['attr'], true);
  128. $GoodsFullMinus = [];
  129. $goods->is_level = 0;
  130. // if ((int)$goods->use_attr === 1 && !empty($seckill_activity_arr['attr'])) {
  131. $open = false;
  132. foreach ($seckill_activity_arr['attr'] as $sag_attr) {
  133. $sag_attr_id = array_column($sag_attr['attr_list'], 'attr_id');
  134. $new_attr[] = $sag_attr;
  135. //与购物车添加的规格id数组比较
  136. if (empty(array_diff($sag_attr_id, $this->attr_list))) {
  137. $open = true;
  138. }
  139. }
  140. if ($open) {
  141. foreach ($seckill_activity_arr['attr'] as &$sag_attr) {
  142. $num = $sag_attr['seckill_num'] - $seckill_activity_arr['sale_num'];
  143. $sag_attr['price'] = $sag_attr['seckill_price'];
  144. $sag_attr['num'] = $num > 0 ? $num : 0;
  145. }
  146. $attr = json_encode($seckill_activity_arr['attr']);
  147. }
  148. $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  149. // } else {
  150. // $price = $seckill_activity_arr['attr'][0]['seckill_price'];
  151. // }
  152. }
  153. $otherData = [
  154. 'goods_id' => $goods->id,
  155. 'user_id' => $this->user_id
  156. ];
  157. $this->user && $otherData = array_merge($otherData, ['user'=> $this->user]);
  158. $goodsData = [
  159. 'attr' => $attr,
  160. 'price' => $price,
  161. 'is_level' => $goods->is_level,
  162. 'mch_id' => $goods->mch_id,
  163. 'full_minus' => $GoodsFullMinus,
  164. 'unit' => $goods->unit,
  165. 'use_attr' => $goods->use_attr,
  166. ];
  167. $res = CommonGoods::currentGoodsAttr($goodsData, (array) $this->attr_list, $otherData, $this->number);
  168. foreach($res['attr_list'] as &$item){
  169. $item['attr_group_id'] = Attr::findOne($item['attr_id'])->attr_group_id;
  170. }
  171. $warn_goods_timeout = Goods::warn_goods_timeout($goods->store_id);
  172. $res['timeout_day'] = $goods->time_made_day ? date('Y-m-d', $goods->time_made_day + 86400 * $goods->time_shelf_life) : '';
  173. $res['is_warn_goods_timeout'] = ($goods->time_made_day && ($goods->time_made_day + 86400 * $goods->time_shelf_life) < (time() + $warn_goods_timeout * 86400)) ? 1 : 0;
  174. return [
  175. 'code' => 0,
  176. 'data' => $res
  177. ];
  178. }
  179. }