Seckill.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\seckill\shop\controller;
  11. use app\shop\controller\BaseShop;
  12. use addon\seckill\model\Seckill as SeckillModel;
  13. /**
  14. * 秒杀控制器
  15. */
  16. class Seckill extends BaseShop
  17. {
  18. /**
  19. * 秒杀时间段列表
  20. */
  21. public function lists()
  22. {
  23. if (request()->isAjax()) {
  24. $condition[] = [ 'site_id', '=', $this->site_id ];
  25. $order = 'seckill_start_time asc';
  26. $field = '*';
  27. $seckill_model = new SeckillModel();
  28. $res = $seckill_model->getSeckillTimeList($condition, $field, $order, null);
  29. foreach ($res[ 'data' ] as $key => $val) {
  30. $val = $seckill_model->transformSeckillTime($val);
  31. $res[ 'data' ][ $key ][ 'seckill_start_time_show' ] = "{$val['start_hour']}:{$val['start_minute']}:{$val['start_second']}";
  32. $res[ 'data' ][ $key ][ 'seckill_end_time_show' ] = "{$val['end_hour']}:{$val['end_minute']}:{$val['end_second']}";
  33. }
  34. return $res;
  35. } else {
  36. $this->forthMenu();
  37. return $this->fetch("seckill/lists");
  38. }
  39. }
  40. /**
  41. * 添加秒杀时间段
  42. */
  43. public function add()
  44. {
  45. if (request()->isAjax()) {
  46. $start_hour = input('start_hour', 0);
  47. $start_minute = input('start_minute', 0);
  48. $start_second = input('start_second', 0);
  49. $end_hour = input('end_hour', 0);
  50. $end_minute = input('end_minute', 0);
  51. $end_second = input('end_second', 0);
  52. $data = [
  53. 'site_id' => $this->site_id,
  54. 'name' => input('name', ''),
  55. 'seckill_start_time' => $start_hour * 3600 + $start_minute * 60 + $start_second,
  56. 'seckill_end_time' => $end_hour * 3600 + $end_minute * 60 + $end_second,
  57. 'create_time' => time(),
  58. ];
  59. $seckill_model = new SeckillModel();
  60. return $seckill_model->addSeckillTime($data);
  61. } else {
  62. return $this->fetch("seckill/add");
  63. }
  64. }
  65. /**
  66. * 编辑秒杀时间段
  67. */
  68. public function edit()
  69. {
  70. $seckill_model = new SeckillModel();
  71. if (request()->isAjax()) {
  72. $start_hour = input('start_hour', 0);
  73. $start_minute = input('start_minute', 0);
  74. $start_second = input('start_second', 0);
  75. $end_hour = input('end_hour', 0);
  76. $end_minute = input('end_minute', 0);
  77. $end_second = input('end_second', 0);
  78. $data = [
  79. 'name' => input('name', ''),
  80. 'seckill_start_time' => $start_hour * 3600 + $start_minute * 60 + $start_second,
  81. 'seckill_end_time' => $end_hour * 3600 + $end_minute * 60 + $end_second,
  82. 'create_time' => time(),
  83. 'id' => input('id', 0),
  84. ];
  85. return $seckill_model->editSeckillTime($data, $this->site_id);
  86. } else {
  87. $id = input('id', 0);
  88. $this->assign('id', $id);
  89. //秒杀详情
  90. $time_info = $seckill_model->getSeckillTimeInfo([ [ 'id', '=', $id ] ]);
  91. if (!empty($time_info[ 'data' ])) {
  92. $time_info[ 'data' ] = $seckill_model->transformSeckillTime($time_info[ 'data' ]);
  93. }
  94. $this->assign('time_info', $time_info[ 'data' ]);
  95. return $this->fetch("seckill/edit");
  96. }
  97. }
  98. /**
  99. * 删除秒杀时间段
  100. */
  101. public function delete()
  102. {
  103. if (request()->isAjax()) {
  104. $seckill_time_id = input('id', 0);
  105. $seckill_model = new SeckillModel();
  106. return $seckill_model->deleteSeckillTime($seckill_time_id);
  107. }
  108. }
  109. /**
  110. * 添加秒杀商品
  111. */
  112. public function addGoods()
  113. {
  114. $seckill_model = new SeckillModel();
  115. if (request()->isAjax()) {
  116. $data = [
  117. 'seckill_name' => input('seckill_name', ''),
  118. 'remark' => input('remark', ''),
  119. 'seckill_time_id' => input('seckill_time_id', ''),
  120. 'start_time' => strtotime(input('start_time', '')),
  121. 'end_time' => strtotime(input('end_time', '')),
  122. 'site_id' => $this->site_id,
  123. 'goods_data' => input('goods_data', ''),
  124. 'goods_ids' => input('goods_ids', ''),
  125. 'sort' => input('sort', '')
  126. ];
  127. $res = $seckill_model->addSeckillGoods($data);
  128. return $res;
  129. } else {
  130. $seckill_time_list = $seckill_model->getSeckillTimeList([ [ 'site_id', '=', $this->site_id ] ]);
  131. foreach ($seckill_time_list[ 'data' ] as $key => $val) {
  132. $val = $seckill_model->transformSeckillTime($val);
  133. $seckill_time_list[ 'data' ][ $key ][ 'seckill_start_time_show' ] = "{$val['start_hour']}:{$val['start_minute']}:{$val['start_second']}";
  134. $seckill_time_list[ 'data' ][ $key ][ 'seckill_end_time_show' ] = "{$val['end_hour']}:{$val['end_minute']}:{$val['end_second']}";
  135. }
  136. $this->assign('seckill_time_list', $seckill_time_list);
  137. return $this->fetch("seckill/addgoods");
  138. }
  139. }
  140. /**
  141. * 更新商品(秒杀价格)
  142. */
  143. public function updateGoods()
  144. {
  145. $seckill_model = new SeckillModel();
  146. if (request()->isAjax()) {
  147. $data = [
  148. 'seckill_name' => input('seckill_name', ''),
  149. 'remark' => input('remark', ''),
  150. 'seckill_time_id' => input('seckill_time_id', ''),
  151. 'start_time' => strtotime(input('start_time', '')),
  152. 'end_time' => strtotime(input('end_time', '')),
  153. 'site_id' => $this->site_id,
  154. 'sku_list' => input('sku_list', ''),
  155. 'goods_ids' => input('goods_ids', ''),
  156. 'id' => input('id', ''),
  157. 'sort' => input('sort', '0'),
  158. ];
  159. $res = $seckill_model->editSeckillGoods($data);
  160. return $res;
  161. } else {
  162. $seckill_id = input('id', '');
  163. $seckill_info = $seckill_model->getSeckillDetail([ [ 'id', '=', $seckill_id ] ]);
  164. $seckill_time_id = trim($seckill_info[ 'data' ][ 'seckill_time_id' ], ',');
  165. $time_list = $seckill_model->getSeckillTimeList([ [ 'id', 'in', $seckill_time_id ] ]);
  166. $this->assign('seckill_info', $seckill_info[ 'data' ]);
  167. $this->assign('time_list', $time_list[ 'data' ]);
  168. return $this->fetch("seckill/editgoods");
  169. }
  170. }
  171. public function seckillSort()
  172. {
  173. $sort = input('sort', 0);
  174. $id = input('id', 0);
  175. $seckill_model = new SeckillModel();
  176. return $seckill_model->seckillSort($id, $sort);
  177. }
  178. /**
  179. * 删除商品
  180. */
  181. public function deleteGoods()
  182. {
  183. if (request()->isAjax()) {
  184. $seckill_id = input('id', 0);
  185. $site_id = $this->site_id;
  186. $seckill_model = new SeckillModel();
  187. return $seckill_model->deleteSeckillGoods($seckill_id, $site_id);
  188. }
  189. }
  190. /**
  191. * 秒杀场次
  192. *
  193. */
  194. public function sessionList()
  195. {
  196. if (request()->isAjax()) {
  197. } else {
  198. $this->forthMenu();
  199. return $this->fetch("seckill/goodslist");
  200. }
  201. }
  202. /**
  203. * 秒杀商品
  204. */
  205. public function goodslist()
  206. {
  207. $seckill_time_id = input('seckill_time_id', '');
  208. if (request()->isAjax()) {
  209. $page = input('page', 1);
  210. $page_size = input('page_size', PAGE_LIST_ROWS);
  211. $goods_name = input('goods_name', '');
  212. $status = input('status', '');
  213. $condition = [];
  214. $condition[] = [ 'site_id', '=', $this->site_id ];
  215. $condition[] = [ 'goods_name', 'like', '%' . $goods_name . '%' ];
  216. if ($status !== '') $condition[] = [ 'status', '=', $status ];
  217. //排序
  218. $link_sort = input('order', 'start_time');
  219. $sort = input('sort', 'desc');
  220. if ($link_sort == 'sort') {
  221. $order_by = $link_sort . ' ' . $sort;
  222. } else {
  223. $order_by = $link_sort . ' ' . $sort . ',sort desc';
  224. }
  225. if (!empty($seckill_time_id)) {
  226. $condition[] = [ '', 'exp', \think\facade\Db::raw("FIND_IN_SET({$seckill_time_id},seckill_time_id)") ];
  227. }
  228. $start_time = input('start_time', '');
  229. $end_time = input('end_time', '');
  230. if ($start_time && !$end_time) {
  231. $condition[] = [ 'end_time', '>=', date_to_time($start_time) ];
  232. } elseif (!$start_time && $end_time) {
  233. $condition[] = [ 'start_time', '<=', date_to_time($end_time) ];
  234. } elseif ($start_time && $end_time) {
  235. $start_timestamp = date_to_time($start_time);
  236. $end_timestamp = date_to_time($end_time);
  237. $sql = "start_time between {$start_timestamp} and {$end_timestamp}";
  238. $sql .= " or end_time between {$start_timestamp} and {$end_timestamp}";
  239. $sql .= " or (start_time <= {$start_timestamp} and end_time >= {$end_timestamp})";
  240. $condition[] = [ '', 'exp', \think\facade\Db::raw($sql) ];
  241. }
  242. $seckill_model = new SeckillModel();
  243. $seckill_list = $seckill_model->getSeckillPageList($condition, $page, $page_size, $order_by);
  244. $seckill_condition[] = [ 'site_id', '=', $this->site_id ];
  245. $time_list = $seckill_model->getSeckillTimeList($seckill_condition);
  246. foreach ($seckill_list[ 'data' ][ 'list' ] as $k => $v) {
  247. $seckill_list[ 'data' ][ 'list' ][ $k ][ 'time_list' ] = [];
  248. foreach ($time_list[ 'data' ] as $index => $item) {
  249. if (strpos(',' . $v[ 'seckill_time_id' ] . ',', ',' . $item[ 'id' ] . ',') !== false) {
  250. $seckill_list[ 'data' ][ 'list' ][ $k ][ 'time_list' ][] = $item;
  251. }
  252. }
  253. }
  254. return $seckill_list;
  255. } else {
  256. $this->forthMenu();
  257. $condition[] = [ 'site_id', '=', $this->site_id ];
  258. $order = 'seckill_start_time asc';
  259. $field = '*';
  260. $seckill_model = new SeckillModel();
  261. $res = $seckill_model->getSeckillTimeList($condition, $field, $order, null);
  262. $this->assign('seckill_time_id', $seckill_time_id);
  263. $this->assign('res', $res[ 'data' ]);
  264. return $this->fetch("seckill/goodslist");
  265. }
  266. }
  267. /**
  268. * 秒杀时段
  269. */
  270. public function seckilltimeselect()
  271. {
  272. if (request()->isAjax()) {
  273. $condition[] = [ 'site_id', '=', $this->site_id ];
  274. $order = 'seckill_start_time asc';
  275. $field = '*';
  276. $seckill_model = new SeckillModel();
  277. $res = $seckill_model->getSeckillTimeList($condition, $field, $order, null);
  278. foreach ($res[ 'data' ] as $key => $val) {
  279. $val = $seckill_model->transformSeckillTime($val);
  280. $res[ 'data' ][ $key ][ 'seckill_start_time_show' ] = "{$val['start_hour']}:{$val['start_minute']}:{$val['start_second']}";
  281. $res[ 'data' ][ $key ][ 'seckill_end_time_show' ] = "{$val['end_hour']}:{$val['end_minute']}:{$val['end_second']}";
  282. }
  283. return $res;
  284. } else {
  285. $this->forthMenu();
  286. return $this->fetch("seckill/seckilltimeselect");
  287. }
  288. }
  289. /**
  290. * 获取商品列表
  291. * @return array
  292. */
  293. public function getSkuList()
  294. {
  295. if (request()->isAjax()) {
  296. $seckill_model = new SeckillModel();
  297. $seckill_id = input('seckill_id', '');
  298. $goods_list = $seckill_model->getSeckillGoodsList($seckill_id);
  299. return $goods_list;
  300. }
  301. }
  302. /**
  303. * 手动关闭秒杀
  304. * @return array
  305. */
  306. public function closeSeckill()
  307. {
  308. if (request()->isAjax()) {
  309. $seckill_model = new SeckillModel();
  310. $seckill_id = input('seckill_id', '');
  311. $goods_list = $seckill_model->closeSeckill($seckill_id);
  312. return $goods_list;
  313. }
  314. }
  315. /**
  316. * 秒杀推广
  317. */
  318. public function seckillUrl()
  319. {
  320. $seckill_id = input('seckill_id', '');
  321. $seckill_model = new SeckillModel();
  322. // $seckill_info = $seckill_model->getSeckillInfo($seckill_id);
  323. // $seckill_info = $seckill_info[ 'data' ];
  324. // $res = $seckill_model->qrcode($seckill_info[ 'id' ], $seckill_info['seckill_name'], $seckill_info[ 'site_id' ]);
  325. $res = $seckill_model->urlQrcode('/pages_promotion/seckill/detail', [ 'id' => $seckill_id ], 'seckill', $this->site_id);
  326. return $res;
  327. }
  328. }