GroupBuyActivity.php 9.5 KB

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