QcMjSendActivity.php 9.6 KB

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