Topic.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\topic\model;
  11. use app\model\BaseModel;
  12. use app\model\goods\Goods;
  13. use app\model\system\Cron;
  14. use app\model\upload\Upload;
  15. /**
  16. * 专题活动
  17. */
  18. class Topic extends BaseModel
  19. {
  20. /**
  21. * 添加专题活动
  22. * @param unknown $data
  23. */
  24. public function addTopic($data)
  25. {
  26. try {
  27. if (empty($data[ 'goods' ])) return $this->error('', '请选择活动商品');
  28. $topic_goods = $data[ 'goods' ];
  29. unset($data[ 'goods' ]);
  30. model('promotion_topic')->startTrans();
  31. $data[ 'status' ] = 1;
  32. if (time() > $data[ 'start_time' ] && time() < $data[ 'end_time' ]) {
  33. $data[ 'status' ] = 2;
  34. }
  35. $topic_id = model('promotion_topic')->add($data);
  36. $sku_list = [];
  37. $goods = new Goods();
  38. foreach ($topic_goods as $good_item) {
  39. if (count($good_item) > 1) array_multisort(array_column($good_item, 'topic_price'), SORT_ASC, $good_item);
  40. foreach ($good_item as $k => $sku_item) {
  41. array_push($sku_list, [
  42. 'topic_id' => $topic_id,
  43. 'start_time' => $data[ 'start_time' ],
  44. 'end_time' => $data[ 'end_time' ],
  45. 'site_id' => $data[ 'site_id' ],
  46. 'sku_id' => $sku_item[ 'sku_id' ],
  47. 'topic_price' => $sku_item[ 'topic_price' ],
  48. 'goods_id' => $sku_item[ 'goods_id' ],
  49. 'default' => $k == 0 ? 1 : 0
  50. ]);
  51. }
  52. $goods->modifyPromotionAddon($sku_item[ 'goods_id' ], [ 'topic' => $topic_id ]);
  53. }
  54. model('promotion_topic_goods')->addList($sku_list);
  55. $cron = new Cron();
  56. if ($data[ 'status' ] == 2) {
  57. $cron->addCron(1, 0, "专题活动关闭", "CloseTopic", $data[ 'end_time' ], $topic_id);
  58. } else {
  59. $cron->addCron(1, 0, "专题活动开启", "OpenTopic", $data[ 'start_time' ], $topic_id);
  60. $cron->addCron(1, 0, "专题活动关闭", "CloseTopic", $data[ 'end_time' ], $topic_id);
  61. }
  62. model('promotion_topic')->commit();
  63. return $this->success($topic_id);
  64. } catch (\Exception $e) {
  65. model('promotion_topic')->rollback();
  66. return $this->error('', $e->getMessage());
  67. }
  68. }
  69. /**
  70. * 修改专题活动
  71. * @param $data
  72. * @param $site_id
  73. * @param $del_id
  74. * @return array
  75. */
  76. public function editTopic($data, $site_id, $del_id)
  77. {
  78. try {
  79. if (empty($data[ 'goods' ])) return $this->error('', '请选择活动商品');
  80. $topic_goods = $data[ 'goods' ];
  81. unset($data[ 'goods' ]);
  82. model('promotion_topic')->startTrans();
  83. $data[ 'status' ] = 1;
  84. if (time() > $data[ 'start_time' ] && time() < $data[ 'end_time' ]) {
  85. $data[ 'status' ] = 2;
  86. }
  87. $topic_info = model('promotion_topic')->getInfo([ [ 'topic_id', '=', $data[ 'topic_id' ] ], [ 'site_id', '=', $site_id ] ]);
  88. if (!empty($topic_info[ 'topic_adv' ]) && !empty($data[ 'topic_adv' ]) && $topic_info[ 'topic_adv' ] != $data[ 'topic_adv' ]) {
  89. $upload_model = new Upload();
  90. $upload_model->deletePic($topic_info[ 'topic_adv' ], $site_id);
  91. }
  92. $res = model('promotion_topic')->update($data, [ [ 'topic_id', '=', $data[ 'topic_id' ] ], [ 'site_id', '=', $site_id ] ]);
  93. if (!empty($del_id)) {
  94. model('promotion_topic_goods')->delete([ [ 'id', 'in', explode(',', $del_id) ], [ 'topic_id', '=', $data[ 'topic_id' ] ], [ 'site_id', '=', $site_id ] ]);
  95. }
  96. $sku_list = [];
  97. foreach ($topic_goods as $good_item) {
  98. if (count($good_item) > 1) array_multisort(array_column($good_item, 'topic_price'), SORT_ASC, $good_item);
  99. foreach ($good_item as $k => $sku_item) {
  100. if (!empty($sku_item[ 'id' ])) {
  101. model('promotion_topic_goods')->update([
  102. 'topic_price' => $sku_item[ 'topic_price' ],
  103. 'start_time' => $data[ 'start_time' ],
  104. 'end_time' => $data[ 'end_time' ]
  105. ], [
  106. [ 'topic_id', '=', $data[ 'topic_id' ] ],
  107. [ 'id', '=', $sku_item[ 'id' ] ],
  108. [ 'goods_id', '=', $sku_item[ 'goods_id' ] ],
  109. [ 'sku_id', '=', $sku_item[ 'sku_id' ] ],
  110. ]);
  111. } else {
  112. array_push($sku_list, [
  113. 'topic_id' => $data[ 'topic_id' ],
  114. 'start_time' => $data[ 'start_time' ],
  115. 'end_time' => $data[ 'end_time' ],
  116. 'site_id' => $site_id,
  117. 'sku_id' => $sku_item[ 'sku_id' ],
  118. 'topic_price' => $sku_item[ 'topic_price' ],
  119. 'goods_id' => $sku_item[ 'goods_id' ],
  120. 'default' => $k == 0 ? 1 : 0
  121. ]);
  122. }
  123. }
  124. }
  125. model('promotion_topic_goods')->addList($sku_list);
  126. $cron = new Cron();
  127. if ($data[ 'status' ] == 2) {
  128. //活动商品启动
  129. $this->cronOpenTopic($data[ 'topic_id' ]);
  130. $cron->deleteCron([ [ 'event', '=', 'OpenTopic' ], [ 'relate_id', '=', $data[ 'topic_id' ] ] ]);
  131. $cron->deleteCron([ [ 'event', '=', 'CloseTopic' ], [ 'relate_id', '=', $data[ 'topic_id' ] ] ]);
  132. $cron->addCron(1, 0, "专题活动关闭", "CloseTopic", $data[ 'end_time' ], $data[ 'topic_id' ]);
  133. } else {
  134. $cron->deleteCron([ [ 'event', '=', 'OpenTopic' ], [ 'relate_id', '=', $data[ 'topic_id' ] ] ]);
  135. $cron->deleteCron([ [ 'event', '=', 'CloseTopic' ], [ 'relate_id', '=', $data[ 'topic_id' ] ] ]);
  136. $cron->addCron(1, 0, "专题活动开启", "OpenTopic", $data[ 'start_time' ], $data[ 'topic_id' ]);
  137. $cron->addCron(1, 0, "专题活动关闭", "CloseTopic", $data[ 'end_time' ], $data[ 'topic_id' ]);
  138. }
  139. model('promotion_topic')->commit();
  140. return $this->success($res);
  141. } catch (\Exception $e) {
  142. model('promotion_topic')->rollback();
  143. return $this->error('', $e->getMessage());
  144. }
  145. }
  146. /**
  147. * 删除专题活动
  148. * @param unknown $topic_id
  149. */
  150. public function deleteTopic($topic_id, $site_id)
  151. {
  152. try {
  153. model('promotion_topic')->startTrans();
  154. $topic_info = model('promotion_topic')->getInfo([ [ 'topic_id', '=', $topic_id ], [ 'site_id', '=', $site_id ] ]);
  155. if (!empty($topic_info[ 'topic_adv' ])) {
  156. $upload_model = new Upload();
  157. $upload_model->deletePic($topic_info[ 'topic_adv' ], $site_id);
  158. }
  159. $topic_list = model("promotion_topic_goods")->getList([ [ 'topic_id', '=', $topic_id ], [ 'site_id', '=', $site_id ] ]);
  160. $goods = new Goods();
  161. foreach ($topic_list as $k => $v) {
  162. $goods->modifyPromotionAddon($v[ 'goods_id' ], [ 'topic' => $topic_id ], true);
  163. }
  164. $res = model('promotion_topic')->delete([ [ 'topic_id', '=', $topic_id ], [ 'site_id', '=', $site_id ] ]);
  165. model('promotion_topic_goods')->delete([ [ 'topic_id', '=', $topic_id ], [ 'site_id', '=', $site_id ] ]);
  166. model('promotion_topic')->commit();
  167. return $this->success($res);
  168. } catch (\Exception $e) {
  169. model('promotion_topic')->rollback();
  170. return $this->error('', $e->getMessage());
  171. }
  172. }
  173. /**
  174. * 获取专题活动信息
  175. * @param array $condition
  176. * @param string $field
  177. */
  178. public function getTopicInfo($condition, $field = '*')
  179. {
  180. $res = model('promotion_topic')->getInfo($condition, $field);
  181. return $this->success($res);
  182. }
  183. /**
  184. * 获取专题活动详情
  185. * @param array $condition
  186. * @param string $field
  187. */
  188. public function getTopicDetail($condition)
  189. {
  190. $res = model('promotion_topic')->getInfo($condition, '*');
  191. if (!empty($res)) {
  192. $alias = 'nptg';
  193. $join = [
  194. [ 'goods g', 'nptg.goods_id = g.goods_id', 'inner' ],
  195. [ 'goods_sku ngs', 'nptg.sku_id = ngs.sku_id', 'inner' ],
  196. ];
  197. $field = 'nptg.id,nptg.sku_id,nptg.topic_price,nptg.goods_id,ngs.price,ngs.stock,ngs.sku_name,ngs.sku_image';
  198. $res[ 'goods_list' ] = model('promotion_topic_goods')->getList([ [ 'nptg.topic_id', '=', $res[ 'topic_id' ] ], [ 'g.goods_state', '=', 1 ], [ 'g.is_delete', '=', 0 ] ], $field, 'id asc', $alias, $join);
  199. foreach ($res[ 'goods_list' ] as $k => $v) {
  200. $res[ 'goods_list' ][ $k ][ 'stock' ] = numberFormat($res[ 'goods_list' ][ $k ][ 'stock' ]);
  201. }
  202. $res[ 'goods_list_count' ] = count($res[ 'goods_list' ]);
  203. }
  204. return $this->success($res);
  205. }
  206. /**
  207. * 获取专题活动列表
  208. * @param array $condition
  209. * @param string $field
  210. * @param string $order
  211. * @param string $limit
  212. */
  213. public function getTopicList($condition = [], $field = '*', $order = '', $limit = null)
  214. {
  215. $list = model('promotion_topic')->getList($condition, $field, $order, '', '', '', $limit);
  216. return $this->success($list);
  217. }
  218. /**
  219. * 获取专题分页列表
  220. * @param array $condition
  221. * @param number $page
  222. * @param string $page_size
  223. * @param string $order
  224. * @param string $field
  225. */
  226. public function getTopicPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'modify_time desc,create_time desc', $field = '*')
  227. {
  228. $list = model('promotion_topic')->pageList($condition, $field, $order, $page, $page_size);
  229. return $this->success($list);
  230. }
  231. /**
  232. * 开启专题活动
  233. * @param $groupbuy_id
  234. * @return array|\multitype
  235. */
  236. public function cronOpenTopic($topic_id)
  237. {
  238. $topic_info = model('promotion_topic')->getInfo([ [ 'topic_id', '=', $topic_id ] ], 'start_time,status');
  239. if (!empty($topic_info)) {
  240. if ($topic_info[ 'start_time' ] <= time() && $topic_info[ 'status' ] == 1) {
  241. $res = model('promotion_topic')->update([ 'status' => 2 ], [ [ 'topic_id', '=', $topic_id ] ]);
  242. return $this->success($res);
  243. } else {
  244. return $this->error("", "专题活动已开启或者关闭");
  245. }
  246. } else {
  247. return $this->error("", "专题活动不存在");
  248. }
  249. }
  250. /**
  251. * 关闭专题活动
  252. * @param $groupbuy_id
  253. * @return array|\multitype
  254. */
  255. public function cronCloseTopic($topic_id)
  256. {
  257. $topic_info = model('promotion_topic')->getInfo([ [ 'topic_id', '=', $topic_id ] ], 'start_time,status');
  258. if (!empty($topic_info)) {
  259. if ($topic_info[ 'status' ] != 3) {
  260. $res = model('promotion_topic')->update([ 'status' => 3 ], [ [ 'topic_id', '=', $topic_id ] ]);
  261. return $this->success($res);
  262. } else {
  263. return $this->error("", "该活动已结束");
  264. }
  265. } else {
  266. return $this->error("", "专题活动不存在");
  267. }
  268. }
  269. }