GroupBuyActive.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace addons\GroupBuy\common\models;
  3. use addons\GroupBuy\common\enums\GroupBuyEnum;
  4. use common\enums\OrderStatusEnum;
  5. use common\enums\StatusEnum;
  6. use common\models\base\BaseActiveRecord;
  7. use common\models\goods\Goods;
  8. use common\models\goods\GoodsAttr;
  9. use common\models\goods\GoodsMarketing;
  10. use Yii;
  11. /**
  12. * This is the model class for table "qimall_addons_group_buy_goods".
  13. *
  14. * @property int $id 拼团商品活动id
  15. * @property int $mall_id 商城id
  16. * @property int $cate_id 拼团分类
  17. * @property int $goods_id 商品id;对应goods主表
  18. * @property string $start_at 拼团开始时间
  19. * @property string $end_at 拼团结束时间
  20. * @property int $effective_time 拼团有效时间(分钟)
  21. * @property int $group_size 成团人数
  22. * @property int $give_score 团长赠送积分
  23. * @property int $give_balance 团长赠送余额
  24. * @property int $virtual_group_type 虚拟成团类型【1全部 2拼团人数大于】
  25. * @property int $virtual_group_size 虚拟成团人数
  26. * @property int $gt_group_size 拼团人数大于N,则虚拟成团
  27. * @property int $goods_stock 拼团库存
  28. * @property int $limit_buy_num 限制购买数量
  29. * @property string $commander_level_limit 团长等级限制
  30. * @property string $user_level_limit 团员等级限制
  31. * @property int $is_virtual 是否开启虚拟成团
  32. * @property int $group_status 拼团商品状态;0未开始;1开团中;已结束2
  33. * @property int $total_num 已团件数
  34. * @property int $total_orders 成团订单数
  35. * @property int $total_orders_price 成团订单金额
  36. * @property int $status 状态[-1:删除;0:禁用;1启用]
  37. * @property int $created_at
  38. * @property int $updated_at
  39. * @property int $is_initiator_free 发起人免费开团
  40. * @property int $virtual_group_sub_type "参团结束开团" 出现的选项
  41. * @property int $expired_auto_complete_min_num 当参团人数≥ x 人,拼团有效期结束后,自动成团
  42. * @property int $is_show_participant_nickname 是否显示团长昵称 0否 1是
  43. * @property int $is_show_virtual_avatar 是否显示虚拟拼团头像 0否 1是
  44. * @property string title 拼团活动名称
  45. */
  46. class GroupBuyActive extends BaseActiveRecord
  47. {
  48. /**
  49. * {@inheritdoc}
  50. */
  51. public static function tableName()
  52. {
  53. return '{{%addons_group_buy_active}}';
  54. }
  55. /**
  56. * {@inheritdoc}
  57. */
  58. public function rules()
  59. {
  60. return [
  61. [['mall_id','cate_id', 'goods_id','title'], 'required'],
  62. [['mall_id', 'cate_id','goods_id', 'effective_time', 'group_size', 'give_score', 'give_balance', 'virtual_group_type', 'virtual_group_size', 'gt_group_size', 'goods_stock', 'limit_buy_num', 'is_virtual', 'group_status', 'total_num', 'total_orders', 'status', 'created_at', 'updated_at','start_at','end_at', 'is_initiator_free', 'virtual_group_sub_type', 'expired_auto_complete_min_num', 'is_show_participant_nickname', 'is_show_virtual_avatar'], 'integer'],
  63. [['total_orders_price'], 'number'],
  64. [['restrict_rule_num'], 'integer'],
  65. [['commander_level_limit', 'user_level_limit','title'], 'string', 'max' => 255],
  66. ];
  67. }
  68. /**
  69. * {@inheritdoc}
  70. */
  71. public function attributeLabels()
  72. {
  73. return [
  74. 'id' => '拼团商品活动id',
  75. 'mall_id' => '商城id',
  76. 'cate_id' => '拼团分类',
  77. 'goods_id' => '商品id;对应goods主表',
  78. 'start_at' => '拼团开始时间',
  79. 'end_at' => '拼团结束时间',
  80. 'effective_time' => '拼团有效时间(分钟)',
  81. 'group_size' => '成团人数',
  82. 'give_score' => '团长赠送积分',
  83. 'give_balance' => '团长赠送余额',
  84. 'virtual_group_type' => '虚拟成团类型【1全部 2拼团人数大于】',
  85. 'virtual_group_size' => '虚拟成团人数',
  86. 'gt_group_size' => '拼团人数大于N,则虚拟成团',
  87. 'goods_stock' => '拼团库存',
  88. 'limit_buy_num' => '限制购买数量',
  89. 'commander_level_limit' => '团长等级限制',
  90. 'user_level_limit' => '团员等级限制',
  91. 'is_virtual' => '是否开启虚拟成团',
  92. 'group_status' => '拼团商品状态;0未开始;1开团中;已结束2',
  93. 'status' => '状态[-1:删除;0:禁用;1启用]',
  94. 'created_at' => 'Created At',
  95. 'updated_at' => 'Update At',
  96. 'is_initiator_free' => '发起人是否免费',
  97. 'virtual_group_sub_type' => 'Virtual Group Sub Type',
  98. 'expired_auto_complete_min_num' => 'Expired Auto Complete Min Num',
  99. 'is_show_participant_nickname' => '是否显示参团人员昵称',
  100. 'is_show_virtual_avatar' => '是否显示虚拟拼团头像',
  101. 'restrict_rule_num' => '参团限制次数',
  102. 'title' => '拼团活动名称',
  103. ];
  104. }
  105. // 关联模型
  106. public function getGoods()
  107. {
  108. return $this->hasOne(Goods::class, ['id' => 'goods_id']);
  109. }
  110. public function getActiveGoodsAttr()
  111. {
  112. return $this->hasMany(GroupBuyActiveGoodsAttr::class, ['group_buy_active_id' => 'id'])->andWhere(['status' => [StatusEnum::ENABLED]]);
  113. }
  114. public static function setData(array $params)
  115. {
  116. $t = Yii::$app->db->beginTransaction();
  117. try {
  118. $param = $params['group_buy_goods'];
  119. $param['mall_id'] = $params['mall_id'];
  120. $model = new self();
  121. $model->loadDefaultValues();
  122. if (!empty($param['start_at']))$param['start_at'] = strtotime($param['start_at']);
  123. if (!empty($param['end_at'])) $param['end_at'] = strtotime($param['end_at']);
  124. if (!$model->load($param, '')) throw new \Exception($model->getErrorMessage());
  125. if ($model->start_at < time()) $model->group_status = GroupBuyEnum::OPEN_GROUP;
  126. if ($model->end_at < time()) $model->group_status = GroupBuyEnum::GROUP_FINISH;
  127. if($param['is_virtual']){
  128. if($param['virtual_group_type']==1 || $param['virtual_group_type'] == 3){
  129. $model->virtual_group_size = $param['group_size']-1;
  130. }else{
  131. $model->virtual_group_size = $param['group_size'] - $param['gt_group_size'];
  132. }
  133. }
  134. if($params['form']['is_attr']) $model->goods_stock = array_sum(array_column($params['form']['attr'],'stock'));
  135. if (!$model->save()) throw new \Exception($model->getErrorMessage());
  136. $params['group_buy_active_id'] = $model->id;
  137. $res = GroupBuyActiveGoodsAttr::setData($params);
  138. if ($res == false) throw new \Exception(GroupBuyActiveGoodsAttr::getStaticError());
  139. $param['marketing_id'] = $model->id;
  140. $param['marketing_type'] = GroupBuyEnum::ADDONS_NAME;
  141. $res = GoodsMarketing::setData($param);
  142. if ($res == false) throw new \Exception(GoodsMarketing::getStaticError());
  143. $t->commit();
  144. return $model;
  145. } catch (\Exception $e) {
  146. $t->rollBack();
  147. self::$static_error = $e->getMessage();
  148. return false;
  149. }
  150. }
  151. public static function delData($params)
  152. {
  153. $t = Yii::$app->db->beginTransaction();
  154. try {
  155. $res = GroupBuyOrder::findOne(['group_buy_active_id'=>$params['id'],'order_status'=>[GroupBuyEnum::JOINING],'status'=>StatusEnum::ENABLED]);
  156. if($res) throw new \Exception('该活动有会员参团');
  157. $res = self::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'id' => $params['id']]);
  158. if ($res == false) throw new \Exception(GroupBuyActiveGoodsAttr::getStaticError());
  159. GroupBuyActiveGoodsAttr::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'group_buy_active_id' => $params['id']]);
  160. $params['marketing_id'] = $params['id'];
  161. $params['marketing_type'] = GroupBuyEnum::ADDONS_NAME;
  162. $params['status'] = StatusEnum::DELETE;
  163. $res = GoodsMarketing::setData($params);
  164. if ($res == false) throw new \Exception(GoodsMarketing::getStaticError());
  165. $t->commit();
  166. return true;
  167. } catch (\Exception $e) {
  168. $t->rollBack();
  169. self::$static_error = $e->getMessage();
  170. return false;
  171. }
  172. }
  173. public static function getActiveListByDiy($mall_id,$post){
  174. $where[] = ['mall_id' => $mall_id];
  175. $where[] = ['status' => StatusEnum::ENABLED];
  176. $where[] = ['group_status' => [GroupBuyEnum::OPEN_GROUP]];
  177. if (!empty($post['keyword'])) {
  178. $goods_list = Goods::lists(['where' => [['mall_id' => $mall_id], ['like', 'goods_name', trim($post['keyword']) . '%', false], ['status' => StatusEnum::ENABLED]], 'select' => 'id']);
  179. $goods_id_arr = array_column($goods_list, 'id');
  180. $where[] = ['goods_id' => $goods_id_arr];
  181. }
  182. $params['where'] = $where;
  183. $params['order'] = 'id DESC';
  184. $params['with'] = ['goods' => function ($query) {
  185. $query->where(['status' => StatusEnum::ENABLED]);
  186. }];
  187. $params['limit'] = 10;
  188. $params['select']='id,goods_id,created_at,title';
  189. $list = GroupBuyActive::listPage($params,false,true);
  190. if(!empty($list['list'])){
  191. foreach ($list['list'] as &$item){
  192. $item['img'] = $item['goods']['cover_pic'];
  193. $item['sales_num'] = $item['goods']['sales_num'];
  194. $item['price'] = '';
  195. $item['original_price'] = '';
  196. $item['subtitle'] = '';
  197. unset($item['goods']);
  198. unset($item['goods_id']);
  199. }
  200. }
  201. return $list;
  202. }
  203. public static function checkActive($id, $mall_id)
  204. {
  205. $active = self::findOne(['mall_id' => $mall_id, 'id' => $id]);
  206. if ($active->start_at < time()) $active->group_status = GroupBuyEnum::OPEN_GROUP;
  207. if ($active->end_at < time()) $active->group_status = GroupBuyEnum::GROUP_FINISH;
  208. $active->save();
  209. }
  210. /**
  211. * @desc:活动列表
  212. * @Author: hua
  213. * @Date: 2021/12/22
  214. * @Time: 18:41
  215. * @Copyright: copyright (c) 2021 广东七件事集团
  216. * @param $where
  217. * @param false $is_page
  218. * @return array|mixed|void
  219. */
  220. public static function getActiveList($where,$is_page=false){
  221. $params['where'] = $where;
  222. $params['order'] = 'id DESC';
  223. $params['select'] = 'id,goods_id,start_at,end_at,group_size,total_num,group_status,title';
  224. $params['with'] = [
  225. 'goods' => function ($query) {
  226. $query->where(['status' => StatusEnum::ENABLED])->select('id,goods_name,cover_pic');
  227. },
  228. 'activeGoodsAttr' => function ($query) {
  229. $query->where(['status' => StatusEnum::ENABLED])->select('attr_id,group_buy_active_id,group_buy_price,goods_id')
  230. ->with(['goodsAttr']);
  231. }
  232. ];
  233. $function = function(&$item){
  234. $item['group_buy_price'] = $item['activeGoodsAttr'][0]['group_buy_price'];
  235. $item['price'] = $item['activeGoodsAttr'][0]['goodsAttr']['price'];
  236. $item['sheng'] = $item['price']>$item['group_buy_price']?bcsub($item['price'] , $item['group_buy_price'],2):0;
  237. $item['goods_name'] = $item['goods']['goods_name'];
  238. $item['cover_pic'] = $item['goods']['cover_pic'];
  239. $item['goods_id'] = $item['goods']['id'];
  240. $item['title'] = empty($item['title']) ? $item['goods_name'] : $item['title'];
  241. unset($item['activeGoodsAttr']);
  242. unset($item['goods']);
  243. return $item;
  244. };
  245. if($is_page){
  246. $list = GroupBuyActive::listPage($params, false);
  247. if ($list === false) return [];
  248. if(!empty($list['list'])){
  249. foreach ($list['list'] as &$item){
  250. $function($item);
  251. }
  252. }
  253. }else{
  254. // $params['index']= 'id';
  255. $list = GroupBuyActive::lists($params);
  256. if ($list === false) return [];
  257. if(!empty($list)){
  258. foreach ($list as &$item){
  259. $function($item);
  260. }
  261. }
  262. }
  263. return $list;
  264. }
  265. }