SceneFestival.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\scenefestival\model;
  11. use addon\coupon\model\Coupon;
  12. use addon\coupon\model\CouponType;
  13. use app\model\BaseModel;
  14. use app\model\member\MemberAccount;
  15. use app\model\system\Cron;
  16. use app\model\system\Config as ConfigModel;
  17. use think\facade\Cache;
  18. use think\facade\Db;
  19. /**
  20. * 活动
  21. */
  22. class SceneFestival extends BaseModel
  23. {
  24. public $status = [
  25. 0 => '未开始',
  26. 1 => '进行中',
  27. 2 => '已结束',
  28. 3 => '已关闭',
  29. ];
  30. /**
  31. * 添加活动
  32. * @param $game_data
  33. * @param $award_json
  34. * @return array
  35. */
  36. public function addFestival($festival_data, $award_arr)
  37. {
  38. Cache::clear();
  39. model('promotion_festival')->startTrans();
  40. try {
  41. $condition = [
  42. [ 'status', 'in', '0,1' ],
  43. [ 'site_id', '=', $festival_data[ 'site_id' ] ],
  44. [ '', 'exp', Db::raw('not ( (`push_time` > ' . $festival_data[ 'end_time' ] . ' and `push_time` > ' . $festival_data[ 'push_time' ] . ' ) or (`end_time` < ' . $festival_data[ 'push_time' ] . ' and `end_time` < ' . $festival_data[ 'end_time' ] . '))') ]
  45. ];
  46. $res = model('promotion_festival')->getList($condition, 'festival_id');
  47. if (!empty($res)) {
  48. return $this->error('', "当前时间段已有相同的活动");
  49. }
  50. $time = time();
  51. $festival_data[ 'create_time' ] = $time;
  52. if ($time > $festival_data[ 'push_time' ] && $time < $festival_data[ 'end_time' ]) {
  53. $festival_data[ 'status' ] = 1;
  54. } else {
  55. $festival_data[ 'status' ] = 0;
  56. }
  57. $festival_id = model('promotion_festival')->add($festival_data);
  58. $award_arr[ 'site_id' ] = $festival_data[ 'site_id' ];
  59. $award_arr[ 'festival_id' ] = $festival_id;
  60. model('promotion_festival_award')->add($award_arr);
  61. $cron = new Cron();
  62. if ($festival_data[ 'status' ] == 1) {//进行中
  63. $cron->addCron(1, 0, "节日有礼活动关闭", "cronCloseFestival", $festival_data[ 'end_time' ], $festival_id);
  64. } else {//未进行
  65. $cron->addCron(1, 0, "节日有礼活动开启", "cronOpenFestival", $festival_data[ 'push_time' ], $festival_id);
  66. $cron->addCron(1, 0, "节日有礼活动关闭", "cronCloseFestival", $festival_data[ 'end_time' ], $festival_id);
  67. }
  68. model('promotion_festival')->commit();
  69. return $this->success();
  70. } catch (\Exception $e) {
  71. model('promotion_festival')->rollback();
  72. return $this->error('', $e->getMessage());
  73. }
  74. }
  75. /**
  76. * 编辑活动
  77. * @param $condition
  78. * @param $game_data
  79. * @param $award_json
  80. * @return array
  81. */
  82. public function editGames($condition, $festival_data, $award_data)
  83. {
  84. $festival_info = model('promotion_festival')->getInfo($condition, 'festival_id,status');
  85. if (in_array($festival_info[ 'status' ], [ 2, 3 ])) {
  86. return $this->error('', '已关闭或已结束的活动不能编辑');
  87. }
  88. $festival_id = $festival_info[ 'festival_id' ];
  89. $verify_condition = [
  90. [ 'festival_id', '<>', $festival_id ],
  91. [ 'status', 'in', '1,2' ],
  92. [ 'site_id', '=', $festival_data[ 'site_id' ] ],
  93. [ '', 'exp', Db::raw('not ( (`push_time` > ' . $festival_data[ 'end_time' ] . ' and `push_time` > ' . $festival_data[ 'push_time' ] . ' ) or (`end_time` < ' . $festival_data[ 'push_time' ] . ' and `end_time` < ' . $festival_data[ 'end_time' ] . '))') ]
  94. ];
  95. $res = model('promotion_festival')->getList($verify_condition, 'festival_id');
  96. if (!empty($res)) {
  97. return $this->error('', "当前时间段已有相同的活动");
  98. }
  99. $time = time();
  100. $festival_data[ 'update_time' ] = $time;
  101. if ($time > $festival_data[ 'push_time' ] && $time < $festival_data[ 'end_time' ]) {
  102. $festival_data[ 'status' ] = 1;
  103. } else {
  104. $festival_data[ 'status' ] = 0;
  105. }
  106. model('promotion_festival')->startTrans();
  107. try {
  108. model('promotion_festival')->update($festival_data, $condition);
  109. model('promotion_festival_award')->update($award_data, [ [ 'festival_id', '=', $festival_id ] ]);
  110. $cron = new Cron();
  111. $cron->deleteCron([ [ 'event', '=', 'cronOpenFestival' ], [ 'relate_id', '=', $festival_id ] ]);
  112. $cron->deleteCron([ [ 'event', '=', 'cronCloseFestival' ], [ 'relate_id', '=', $festival_id ] ]);
  113. if ($festival_data[ 'status' ] == 1) {//进行中
  114. $cron->addCron(1, 0, "节日有礼活动关闭", "cronCloseFestival", $festival_data[ 'end_time' ], $festival_id);
  115. } else {
  116. //未进行
  117. $cron->addCron(1, 0, "节日有礼活动开启", "cronOpenFestival", $festival_data[ 'push_time' ], $festival_id);
  118. $cron->addCron(1, 0, "节日有礼活动关闭", "cronCloseFestival", $festival_data[ 'end_time' ], $festival_id);
  119. }
  120. model('promotion_festival')->commit();
  121. return $this->success();
  122. } catch (\Exception $e) {
  123. model('promotion_festival')->rollback();
  124. return $this->error('', $e->getMessage());
  125. }
  126. }
  127. /**
  128. * 获取活动奖励
  129. * @param array $condition
  130. * @param string $field
  131. */
  132. public function getGameAward($condition = [], $field = '*')
  133. {
  134. $award_info = model('promotion_festival_award')->getinfo($condition, $field);
  135. if (!empty($award_info)) {
  136. $award_info[ 'award_type' ] = explode(',', $award_info[ 'award_type' ]);
  137. //获取优惠券信息
  138. if (isset($award_info[ 'coupon' ]) && !empty($award_info[ 'coupon' ])) {
  139. //优惠券字段
  140. $coupon_field = 'coupon_type_id,type,coupon_name,image,money,discount,validity_type,fixed_term,status,is_limit,at_least,count,lead_count,end_time,goods_type,max_fetch';
  141. $model = new CouponType();
  142. $coupon = $model->getCouponTypeList([ [ 'coupon_type_id', 'in', $award_info[ 'coupon' ] ] ], $coupon_field);
  143. $award_info[ 'coupon_list' ] = $coupon[ 'data' ];
  144. }
  145. }
  146. return $this->success($award_info);
  147. }
  148. /**
  149. * 获取活动信息
  150. * @param array $condition
  151. * @param string $field
  152. */
  153. public function getGamesInfo($condition, $field = '*')
  154. {
  155. $res = model('promotion_festival')->getInfo($condition, $field);
  156. return $this->success($res);
  157. }
  158. /**
  159. * 活动有礼详情
  160. */
  161. public function getFestivalDetail($condition, $field, $alias = 'a', $join = [])
  162. {
  163. $res = model('promotion_festival')->getInfo($condition, $field, $alias, $join);
  164. if (!empty($res)) {
  165. $res[ 'award_type' ] = explode(',', $res[ 'award_type' ]);
  166. //获取优惠券信息
  167. if (isset($res[ 'coupon' ]) && !empty($res[ 'coupon' ])) {
  168. //优惠券字段
  169. $coupon_field = 'coupon_type_id,type,coupon_name,image,money,discount,validity_type,fixed_term,status,is_limit,at_least,count,lead_count,end_time,goods_type,max_fetch';
  170. $model = new CouponType();
  171. $coupon = $model->getCouponTypeList([ [ 'coupon_type_id', 'in', $res[ 'coupon' ] ] ], $coupon_field);
  172. $res[ 'coupon_list' ] = $coupon[ 'data' ];
  173. $res[ 'coupon_ids' ] = explode(',', $res[ 'coupon' ]);
  174. } else {
  175. $res[ 'coupon_ids' ] = [];
  176. }
  177. }
  178. return $this->success($res);
  179. }
  180. /**
  181. * 删除活动
  182. * @param $site_id
  183. * @param $game_id
  184. * @return array
  185. */
  186. public function deleteGames($site_id, $festival_id)
  187. {
  188. model('promotion_festival')->startTrans();
  189. try {
  190. model('promotion_festival')->delete([ [ 'site_id', '=', $site_id ], [ 'festival_id', '=', $festival_id ] ]);
  191. model('promotion_festival_award')->delete([ [ 'site_id', '=', $site_id ], [ 'festival_id', '=', $festival_id ] ]);
  192. model('promotion_festival')->commit();
  193. return $this->success();
  194. } catch (\Exception $e) {
  195. model('promotion_festival')->rollback();
  196. return $this->error('', $e->getMessage());
  197. }
  198. }
  199. /**
  200. * 获取活动列表
  201. * @param array $condition
  202. * @param string $field
  203. * @param string $order
  204. * @param null $limit
  205. * @return array
  206. */
  207. public function getFestivalList($condition = [], $field = '*', $order = '', $limit = null)
  208. {
  209. $list = model('promotion_festival')->getList($condition, $field, $order, '', '', '', $limit);
  210. return $this->success($list);
  211. }
  212. /**
  213. * 获取活动分页列表
  214. * @param array $condition
  215. * @param int $page
  216. * @param int $page_size
  217. * @param string $order
  218. * @param string $field
  219. * @return array
  220. */
  221. public function getGamesPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  222. {
  223. $list = model('promotion_festival')->pageList($condition, $field, $order, $page, $page_size);
  224. return $this->success($list);
  225. }
  226. /**
  227. * 关闭活动
  228. * @param $site_id
  229. * @param $game_id
  230. * @return array
  231. */
  232. public function finishGames($site_id, $festival_id)
  233. {
  234. $game_info = model('promotion_festival')->getInfo([ [ 'festival_id', '=', $festival_id ], [ 'site_id', '=', $site_id ] ], 'status');
  235. if (!empty($game_info)) {
  236. if ($game_info[ 'status' ] != 3) {
  237. $res = model('promotion_festival')->update([ 'status' => 3 ], [ [ 'festival_id', '=', $festival_id ] ]);
  238. // if ($res) {
  239. // $cron = new Cron();
  240. // $cron->deleteCron([ [ 'event', '=', 'OpenGame' ], [ 'relate_id', '=', $game_id ] ]);
  241. // $cron->deleteCron([ [ 'event', '=', 'CloseGame' ], [ 'relate_id', '=', $game_id ] ]);
  242. // }
  243. return $this->success($res);
  244. } else {
  245. $this->error('', '该活动已关闭');
  246. }
  247. } else {
  248. $this->error('', '该活动不存在');
  249. }
  250. }
  251. /**
  252. * 定时任务开启活动
  253. * @param $game_id
  254. * @return array|\multitype
  255. */
  256. public function cronOpenGames($game_id)
  257. {
  258. $game_info = model('promotion_festival')->getInfo([ [ 'festival_id', '=', $game_id ] ], 'start_time,status');
  259. if (!empty($game_info)) {
  260. if ($game_info[ 'push_time' ] <= time() && $game_info[ 'status' ] == 0) {
  261. $res = model('promotion_festival')->update([ 'status' => 1 ], [ [ 'festival_id', '=', $game_id ] ]);
  262. return $this->success($res);
  263. } else {
  264. return $this->error("", "活动已开启或者关闭");
  265. }
  266. } else {
  267. return $this->error("", "活动不存在");
  268. }
  269. }
  270. /**
  271. * 开启活动
  272. * @param $game_id
  273. * @return array|\multitype
  274. */
  275. public function startGames($festival_id)
  276. {
  277. $game_info = model('promotion_festival')->getInfo([ [ 'festival_id', '=', $festival_id ] ], 'end_time,status');
  278. if (!empty($game_info)) {
  279. if ($game_info[ 'end_time' ] >= time()) {
  280. $res = model('promotion_festival')->update([ 'status' => 1 ], [ [ 'festival_id', '=', $festival_id ] ]);
  281. return $this->success($res);
  282. } else {
  283. return $this->error("", "活动已结束");
  284. }
  285. } else {
  286. return $this->error("", "活动不存在");
  287. }
  288. }
  289. /**
  290. * 定时任务关闭活动
  291. * @param $game_id
  292. * @return array|\multitype
  293. */
  294. public function cronCloseGames($festival_id)
  295. {
  296. $game_info = model('promotion_festival')->getInfo([ [ 'festival_id', '=', $festival_id ] ], 'start_time,status');
  297. if (!empty($game_info)) {
  298. if ($game_info[ 'status' ] != 2) {
  299. $res = model('promotion_festival')->update([ 'status' => 2 ], [ [ 'festival_id', '=', $festival_id ] ]);
  300. return $this->success($res);
  301. } else {
  302. return $this->error("", "该活动已结束");
  303. }
  304. } else {
  305. return $this->error("", "活动不存在");
  306. }
  307. }
  308. /**
  309. * 节日有礼领取
  310. * @param $game_id
  311. * @param $member_id
  312. * @param $site_id
  313. */
  314. public function receive($festival_id, $member_id, $site_id)
  315. {
  316. $game_info = model('promotion_festival')->getInfo([ [ 'festival_id', '=', $festival_id ], [ 'site_id', '=', $site_id ] ]);
  317. if (empty($game_info)) return $this->error("", "未获取到活动信息");
  318. if ($game_info[ 'status' ] == 2 || $game_info[ 'status' ] == 3) return $this->error("", "活动已经结束");
  319. $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ], [ 'status', '=', 1 ] ], 'nickname,member_level,point');
  320. if (empty($member_info)) return $this->error("", "未获取到会员信息");
  321. if (!empty($game_info[ 'level_id' ])) {
  322. $level = explode(',', $game_info[ 'level_id' ]);
  323. if (!in_array($member_info[ 'member_level' ], $level)) {
  324. return $this->error("", "只有{$game_info['level_name']}等级的会员可参与该活动");
  325. }
  326. }
  327. model('promotion_festival_draw_record')->startTrans();
  328. try {
  329. $meber_account = new MemberAccount();
  330. $award_info = model('promotion_festival_award')->getInfo([ [ 'festival_id', '=', $festival_id ] ], 'award_id,festival_id,award_type,coupon,point,balance,balance_type,balance_money');
  331. if (!empty($award_info)) {
  332. $type_arr = explode(',', $award_info[ 'award_type' ]);
  333. foreach ($type_arr as $v) {
  334. switch ( $v ) {
  335. case 'point':
  336. // 积分
  337. $meber_account->addMemberAccount($site_id, $member_id, 'point', $award_info[ 'point' ], $game_info[ 'festival_type' ], $festival_id, "活动奖励发放");
  338. break;
  339. case 'balance':
  340. // 余额
  341. if ($award_info[ 'balance_type' ] == 0) {
  342. $meber_account->addMemberAccount($site_id, $member_id, 'balance', $award_info[ 'balance' ], $game_info[ 'festival_type' ], $festival_id, "活动奖励发放");
  343. } else {
  344. $meber_account->addMemberAccount($site_id, $member_id, 'balance_money', $award_info[ 'balance_money' ], $game_info[ 'festival_type' ], $festival_id, "活动奖励发放");
  345. }
  346. break;
  347. case 'coupon':
  348. // 优惠券
  349. $coupon = new Coupon();
  350. $coupon_array = explode(',', $award_info[ 'coupon' ]);
  351. $coupon_array = array_map(function($value) {
  352. return [ 'coupon_type_id' => $value, 'num' => 1 ];
  353. }, $coupon_array);
  354. $receive_res = $coupon->giveCoupon($coupon_array, $site_id, $member_id, 6);
  355. break;
  356. case 4:
  357. // 赠品
  358. break;
  359. }
  360. }
  361. $record[ 'award_id' ] = $award_info[ 'award_id' ];
  362. $record[ 'festival_id' ] = $award_info[ 'festival_id' ];
  363. $record[ 'festival_type' ] = $game_info[ 'festival_type' ];
  364. $record[ 'member_id' ] = $member_id;
  365. $record[ 'site_id' ] = $site_id;
  366. $record[ 'receive_time' ] = time();
  367. $record[ 'member_nick_name' ] = $member_info[ 'nickname' ];
  368. model('promotion_festival_draw_record')->add($record);
  369. }
  370. model('promotion_festival_draw_record')->commit();
  371. return $this->success([ 'status' => 1 ]);
  372. } catch (\Exception $e) {
  373. model('promotion_festival_draw_record')->rollback();
  374. return $this->error("", $e->getMessage());
  375. }
  376. }
  377. /**
  378. * 推广二维码
  379. * @param $game_id
  380. * @param $game_name
  381. * @param $url
  382. * @param $site_id
  383. * @param string $type
  384. * @return array
  385. */
  386. public function qrcode($festival_id, $game_name, $url, $site_id, $type = "create")
  387. {
  388. $data = [
  389. 'site_id' => $site_id,
  390. 'app_type' => "all", // all为全部
  391. 'type' => $type, // 类型 create创建 get获取
  392. 'data' => [
  393. "id" => $festival_id
  394. ],
  395. 'page' => $url,
  396. 'qrcode_path' => 'upload/qrcode/games',
  397. 'qrcode_name' => "games_qrcode_" . $festival_id
  398. ];
  399. event('Qrcode', $data, true);
  400. $app_type_list = config('app_type');
  401. $path = [];
  402. foreach ($app_type_list as $k => $v) {
  403. switch ( $k ) {
  404. case 'h5':
  405. $wap_domain = getH5Domain();
  406. $path[ $k ][ 'status' ] = 1;
  407. $path[ $k ][ 'url' ] = $wap_domain . $data[ 'page' ] . '?id=' . $festival_id;
  408. $path[ $k ][ 'img' ] = "upload/qrcode/games/games_qrcode_" . $festival_id . "_" . $k . ".png";
  409. break;
  410. case 'weapp' :
  411. $config = new ConfigModel();
  412. $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'WEAPP_CONFIG' ] ]);
  413. if (!empty($res[ 'data' ])) {
  414. if (empty($res[ 'data' ][ 'value' ][ 'qrcode' ])) {
  415. $path[ $k ][ 'status' ] = 2;
  416. $path[ $k ][ 'message' ] = '未配置微信小程序';
  417. } else {
  418. $path[ $k ][ 'status' ] = 1;
  419. $path[ $k ][ 'img' ] = $res[ 'data' ][ 'value' ][ 'qrcode' ];
  420. }
  421. } else {
  422. $path[ $k ][ 'status' ] = 2;
  423. $path[ $k ][ 'message' ] = '未配置微信小程序';
  424. }
  425. break;
  426. case 'wechat' :
  427. $config = new ConfigModel();
  428. $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'WECHAT_CONFIG' ] ]);
  429. if (!empty($res[ 'data' ])) {
  430. if (empty($res[ 'data' ][ 'value' ][ 'qrcode' ])) {
  431. $path[ $k ][ 'status' ] = 2;
  432. $path[ $k ][ 'message' ] = '未配置微信公众号';
  433. } else {
  434. $path[ $k ][ 'status' ] = 1;
  435. $path[ $k ][ 'img' ] = $res[ 'data' ][ 'value' ][ 'qrcode' ];
  436. }
  437. } else {
  438. $path[ $k ][ 'status' ] = 2;
  439. $path[ $k ][ 'message' ] = '未配置微信公众号';
  440. }
  441. break;
  442. }
  443. }
  444. $return = [
  445. 'path' => $path,
  446. 'game_name' => $game_name,
  447. ];
  448. return $this->success($return);
  449. }
  450. }