GroupBuyLbActivity.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <?php
  2. namespace app\store\model\groupbuylb;
  3. use app\common\model\groupbuylb\GroupBuyLbActivity as GroupBuyLbActivityModel;
  4. use app\common\model\groupbuylb\GroupBuyLbActivityAction as GroupBuyLbActivityActionModel;
  5. use app\common\model\groupbuylb\GroupBuyLbGoods as GroupBuyLbGoodsModel;
  6. use app\common\model\groupbuylb\GroupBuyLbCoupon as GroupBuyLbCouponModel;
  7. use think\facade\Log;
  8. /**
  9. * 拼团活动模型
  10. * @package app\store\model\coupon
  11. */
  12. class GroupBuyLbActivity extends GroupBuyLbActivityModel
  13. {
  14. protected $append = ['activity_status'];
  15. public function getActivityStatusAttr($value,$data){
  16. if($data['status'] == 0 ){
  17. return ['code'=>4,'text'=>'已作废'];
  18. }
  19. if($data['start_time']>date('Y-m-d H:i:s')){
  20. return ['code'=>2,'text'=>'未开始'];
  21. }
  22. if($data['start_time']<=date('Y-m-d H:i:s')&&$data['end_time']>=date('Y-m-d H:i:s')){
  23. return ['code'=>1,'text'=>'进行中'];
  24. }
  25. if($data['end_time']<date('Y-m-d H:i:s')){
  26. return ['code'=>3,'text'=>'已结束'];
  27. }
  28. return ['code'=>1,'text'=>'进行中'];
  29. }
  30. /**
  31. * 获取列表
  32. * @param array $param 查询条件
  33. * @param int $listRows 分页数量
  34. * @return mixed
  35. * @throws \think\db\exception\DbException
  36. */
  37. public function getList(array $param = [], int $listRows = 15)
  38. {
  39. // 检索查询条件
  40. $filter = $this->getQueryFilter($param);
  41. // 执行查询
  42. return $this->alias('group_buy_lb_activity')->with(['goodsExcept'])
  43. ->leftJoin('group_buy_lb_goods gg','group_buy_lb_activity.id=gg.group_buy_lb_activity_id')
  44. ->leftJoin('goods goods','gg.goods_id=goods.goods_id')
  45. ->where($filter)
  46. ->field('group_buy_lb_activity.*')
  47. ->order(['audit_status'=>'asc','group_buy_lb_activity.create_time'=>'desc'])
  48. ->paginate($listRows)->each(function (&$item){
  49. //成团数
  50. $item['group_cnt'] = GroupBuyLbJoin::countActJoin($item['id']);
  51. //商品销量
  52. $item['sale_sum'] = GroupBuyLbHelp::sumActGoodsNum($item['id']);
  53. });
  54. }
  55. /**
  56. * 检索查询条件
  57. * @param array $param
  58. * @return \think\db\BaseQuery
  59. */
  60. private function getQueryFilter(array $param)
  61. {
  62. // 商品列表获取条件
  63. $params = $this->setQueryDefaultValue($param, [
  64. // 'is_delete' => 0,
  65. ]);
  66. // 筛选条件
  67. $filter = [];
  68. // 活动起止时间
  69. if (!empty($params['betweenTime'])) {
  70. $times = between_date($params['betweenTime']);
  71. $filter[] = ['start_time', '>=', $times['start_date']];
  72. $filter[] = ['end_time', '<=', $times['end_date']];
  73. }
  74. // 活动名称
  75. !empty($params['name']) && $filter[] = ['name', 'like', "%{$params['name']}%"];
  76. !empty($params['goods_name']) && $filter[] = ['goods.goods_name', 'like', "%{$params['goods_name']}%"];
  77. // 审核状态 0待审核 1审核通过 2审核不通过
  78. if(isset($params['auditStatus'])&&$params['auditStatus']>-1){
  79. $filter[] = ['audit_status','=',$params['auditStatus']];
  80. }
  81. //启用状态0禁用 1启用
  82. if(isset($params['status'])&&$params['status']>-1){
  83. $filter[] = ['status','=',$params['status']];
  84. }
  85. //活动状态
  86. if(isset($params['statusText'])&&$params['statusText']>0){
  87. switch ($params['statusText']){
  88. case 1://进行中
  89. $filter[] = ['start_time','<=',date('Y-m-d H:i:s')];
  90. $filter[] = ['end_time','>=',date('Y-m-d H:i:s')];
  91. $filter[] = ['audit_status','=',1];
  92. $filter[] = ['group_buy_lb_activity.status','=',1];
  93. break;
  94. case 2://未开始
  95. $filter[] = ['start_time','>',date('Y-m-d H:i:s')];
  96. $filter[] = ['group_buy_lb_activity.status','=',1];
  97. break;
  98. case 3://已结束
  99. $filter[] = ['end_time','<',date('Y-m-d H:i:s')];
  100. $filter[] = ['group_buy_lb_activity.status','=',1];
  101. break;
  102. case 4://已作废
  103. $filter[] = ['group_buy_lb_activity.status','=',0];
  104. break;
  105. }
  106. }
  107. // 实例化新查询对象
  108. return $filter;
  109. }
  110. /**
  111. * 启用 禁用,0:作废,1:启用
  112. * @param array $data
  113. * @return bool
  114. */
  115. public function status(array $data): bool
  116. {
  117. $act = GroupBuyLbActivityModel::detail($data['activity_id']);
  118. if ( $data['status'] == 1 && $this->checkGoodsValid($act))return false;
  119. $this->transaction(function () use ($data) {
  120. $this->save($data);
  121. });
  122. return true;
  123. }
  124. /**
  125. * 审核
  126. * @param array $data
  127. * @return bool
  128. */
  129. public function audit(array $data): bool
  130. {
  131. $act = GroupBuyLbActivityModel::detail($data['activity_id']);
  132. if ($data['audit_status'] == 1 && $this->checkGoodsValid($act))return false;
  133. $this->transaction(function () use ($data) {
  134. $this->save($data);
  135. $this->addAction($data['activity_id'],$data);
  136. });
  137. return true;
  138. }
  139. /**
  140. * 新增记录
  141. * @param array $data
  142. * @return int
  143. */
  144. public function addOne(array $data)
  145. {
  146. //检查是否已经有有效活动时间重叠了
  147. $flag = $this->checkGoodsValid($data);
  148. if ($flag){
  149. return 3;}
  150. $data['code'] = strval(mt_rand(100000000,999999999));
  151. $data['status'] = 1;
  152. try {
  153. $this->transaction(function () use ($data) {
  154. $this->save($data);
  155. // 选择的拼团商品
  156. $groupBuyLbGoodsModel = new GroupBuyLbGoodsModel();
  157. $groupBuyLbGoodsModel->add($this->id,$data['goods']??[]);
  158. $groupBuyLbCouponModel = new GroupBuyLbCouponModel();
  159. $groupBuyLbCouponModel->add($this->id,$data['coupons']??[]);
  160. //写入行为记录
  161. //$data['audit_status'] = 0;
  162. $this->addAction($this->id,$data);
  163. });
  164. }catch (\Exception $e){
  165. Log::error(__METHOD__.'::'.$e->getMessage());
  166. return 2;
  167. }
  168. return 1;
  169. }
  170. //添加行为记录
  171. public function addAction($coupon_activity_id,$data){
  172. $behavior = '';
  173. switch ($data['audit_status']){
  174. case 0:$behavior = '提交审核'; break;
  175. case 1:$behavior = '同意并发布活动'; break;
  176. case 2:$behavior = '不同意'; break;
  177. case 3:$behavior = '再次编辑'; break;
  178. }
  179. $refuse['group_buy_lb_activity_id'] = $coupon_activity_id;
  180. $refuse['audit_status'] = $data['audit_status'];
  181. $refuse['audit_reason'] = $data['audit_reason']??'';
  182. $refuse['behavior'] = $behavior;
  183. $refuse['audit_time'] = date("Y-m-d H:i:s",time());
  184. $refuse['audit_user'] = $data['audit_user'];
  185. $refuse['audit_admin_id'] = $data['audit_admin_id'];
  186. $refuseModel = new GroupBuyLbActivityActionModel();
  187. $refuseModel->save($refuse);
  188. }
  189. /**
  190. * 更新记录
  191. * @param array $data
  192. * @return bool
  193. */
  194. public function updOne(array $data)
  195. {
  196. if ($this->checkGoodsValid($data))return 3;
  197. try {
  198. $this->transaction(function () use ($data) {
  199. $this->save($data);
  200. // 写入商品信息
  201. $couponActivityCouponModel = new GroupBuyLbGoodsModel();
  202. $couponActivityCouponModel->add($this->id,$data['goods']??[]);
  203. $groupBuyLbCouponModel = new GroupBuyLbCouponModel();
  204. $groupBuyLbCouponModel->add($this->id,$data['coupons']??[]);
  205. //写入行为记录
  206. $this->addAction($this->id,$data);
  207. });
  208. }catch (\Exception $e){
  209. Log::error(__METHOD__.'::'.$e->getMessage());
  210. return 2;
  211. }
  212. return 1;
  213. }
  214. /**
  215. * 更新记录
  216. * @param array $data
  217. * @return bool
  218. */
  219. public function editOne(array $data)
  220. {
  221. try {
  222. $this->transaction(function () use ($data) {
  223. $this->save($data);
  224. $data['audit_status'] = 3;
  225. //写入行为记录
  226. $this->addAction($this->id,$data);
  227. });
  228. }catch (\Exception $e){
  229. Log::error(__METHOD__.'::'.$e->getMessage());
  230. return 2;
  231. }
  232. return 1;
  233. }
  234. //当前的进行中的活动id
  235. public function getActivityGoodIdArray($activity_id =0){
  236. $filter[] = ['start_time','<=',date('Y-m-d H:i:s')];
  237. $filter[] = ['end_time','>=',date('Y-m-d H:i:s')];
  238. $filter[] = ['status','=',1];
  239. // $filter[] = ['audit_status_zg','=',10];
  240. // $filter[] = ['is_up','=',1];
  241. $id_array = $this->where($filter)->column("id");
  242. if($activity_id>0){
  243. $id_array = array_diff($id_array,[$activity_id]);
  244. }
  245. $goods_id_array = GroupBuyLbGoodsModel::where("group_buy_lb_activity_id","in",$id_array)->column("goods_id");
  246. return $goods_id_array;
  247. }
  248. /**
  249. * 校验同款商品不能和正在有效期的活动时间交叉
  250. * @param $data
  251. * @return false
  252. */
  253. public function checkGoodsValid($data){
  254. $now = date('Y-m-d H:i:s');
  255. $filter[] = ['start_time','<',$now];
  256. $filter[] = ['end_time','>',$now];
  257. $filter[] = ['audit_status','=',1];
  258. $filter[] = ['status','=',1];
  259. $goodsId = $data['goods'][0]['goods_id']??0;
  260. $m = self::alias('ma')->field('ag.goods_id,ag.group_buy_lb_activity_id')
  261. ->where('ma.status',1)
  262. ->leftJoin('group_buy_lb_goods ag','ag.group_buy_lb_activity_id = ma.id');
  263. if (!empty($data['id'])){
  264. $m->where('ma.id','<>',$data['id']);
  265. }
  266. return $m->where('ag.goods_id','=',$goodsId)
  267. ->where(function ($s) use ($data){
  268. $s->whereOr(function($query) use ($data){
  269. $query->whereBetweenTime('ma.start_time', $data['start_time'], $data['end_time']);
  270. })->whereOr(function ($query) use ($data){
  271. $query->whereBetweenTime('ma.end_time',$data['start_time'],$data['end_time']);
  272. })->whereOr(function ($query) use ($data){
  273. $query->where('ma.start_time','<',$data['start_time'])->where('end_time','>',$data['end_time']);
  274. });
  275. })->find();
  276. }
  277. //操作关联
  278. public function relcoupon(){
  279. return $this->hasMany(GroupBuyLbCouponModel::class,'group_buy_lb_activity_id','id');
  280. }
  281. }