Task.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\ActivityApply;
  4. use app\common\model\ActivityApplyItem;
  5. use app\common\model\ActivityPrice;
  6. use app\common\model\ArticleItem;
  7. use app\common\model\DatumUrl;
  8. use app\common\model\GoodsOrder;
  9. use app\common\model\GoodsOrderItem;
  10. use app\common\model\LabelMessage;
  11. use app\common\model\StoreGoodsItem;
  12. use app\common\model\TopSearch;
  13. use app\common\model\User;
  14. use app\common\model\UserFacility;
  15. use app\common\model\UserMessage;
  16. use app\common\model\UserSearch;
  17. use app\common\model\VideoUrl;
  18. use app\common\service\UserSynth;
  19. use think\Db;
  20. /**
  21. * @title 定时任务
  22. * Class Task
  23. * @controller Task
  24. * @group base
  25. */
  26. class Task extends Base
  27. {
  28. /**
  29. * @title 标签推送[根据标签id]
  30. * @desc 标签推送
  31. * @author qc
  32. * @url /api/Task/taskUserMessage
  33. */
  34. public function taskUserMessage(){
  35. $list = UserMessage::field('id,user_id,content')->where('jg_type',1)->where('jg_status',0)->limit(0,50)->order('id')->select();
  36. foreach ($list as $v) {
  37. UserMessage::where(['id'=>$v['id']])->update(['jg_status'=>1]);
  38. UserMessage::Jpush($v['user_id'],$v['content']);
  39. }
  40. }
  41. /**
  42. * @title 标签推送[根据标签id]
  43. * @desc 标签推送
  44. * @author qc
  45. * @url /api/Task/taskLabelMessage
  46. */
  47. //按照标签推送
  48. public function taskLabelMessage()
  49. {
  50. $list = LabelMessage::where('jg_status',0)->where('is_deleted',0)->select()->toArray();
  51. foreach ($list as $v) {
  52. LabelMessage::where(['id'=>$v['id']])->update(['jg_status'=>1]);
  53. // 全部推送
  54. if(!$v['label']) {
  55. $user_arr = User::where('status',1)->where('is_deleted',0)->column('id');
  56. foreach ($user_arr as $user_id) {
  57. if($v['type'] == 2){
  58. $res = UserMessage::Jpush($user_id,$v['content']);
  59. }else if($v['type'] == 3) {
  60. if(in_array($v['module'],['video','article','datum'])) {
  61. $res = UserMessage::Jpush($user_id,$v['content'],$v['module'],'',$v['first_id'],$v['second_id']);
  62. }else{
  63. $res = UserMessage::Jpush($user_id,$v['content'],$v['module'],'',$v['first_id']);
  64. }
  65. }
  66. }
  67. }else{
  68. // 搜索内容推送
  69. $label_arr = explode(',',$v['label']);
  70. $where_str = '';
  71. $search_arr=[];
  72. foreach ($label_arr as $t){
  73. $search_arr[] = " title like '".'%'.$t."%'" .' ';
  74. }
  75. if(!empty($search_arr)) $where_str = implode(' OR ',$search_arr);
  76. $user_arr = UserSearch::where($where_str)->column('user_id');
  77. foreach (array_unique($user_arr) as $user_id) {
  78. if($v['type'] == 2){
  79. $res = UserMessage::Jpush($user_id,$v['content']);
  80. }else if($v['type'] == 3) {
  81. if(in_array($v['module'],['video','article','datum'])) {
  82. $res = UserMessage::Jpush($user_id,$v['content'],$v['module'],'',$v['first_id'],$v['second_id']);
  83. }else{
  84. $res = UserMessage::Jpush($user_id,$v['content'],$v['module'],'',$v['first_id']);
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. /**
  92. * @title 半年清理一次设备号
  93. * @desc
  94. * @author qc
  95. * @url /api/Task/removeFacility
  96. */
  97. public function removeFacility(){
  98. UserFacility::where(['set_time','< time',date('Y-m-d H:i:s',strtotime('-180 days'))])->update(['facility'=>'','set_time'=>date('Y-m-d H:i:s')]);
  99. }
  100. /**
  101. * @title 定时取消活动订单
  102. * @desc
  103. * @author qc
  104. * @url /api/Task/cancelApplyOrder
  105. */
  106. public function cancelApplyOrder()
  107. {
  108. $list = ActivityApply::with(['itemList'])
  109. ->where([['create_at','< time',date('Y-m-d H:i:s',strtotime('-5 minutes'))],['pay_type','<>',9],['pay_state','=',0],['cancel_state','=',0]])
  110. ->select()->toArray();
  111. foreach ($list as $v) {
  112. Db::startTrans();
  113. try {
  114. ActivityApply::where('id',$v['id'])->update(['cancel_state'=>1]);
  115. $act_title = \app\common\model\Activity::where('id',$v['act_id'])->value('title');
  116. $info_url = 'https://'.$_SERVER['HTTP_HOST'].'/dist/#/activity_order_info?id='.$v['id'];
  117. $message = '您报名的《'.$act_title."》活动订单,由于超时未支付,已为您取消";//,点击<a href=\"$info_url\">查看详情</a>";
  118. UserMessage::sendUserMessage($v['user_id'],'apply',4,0,0,$v['id'],$message,$v['id']);
  119. foreach ($v['item_list'] as $it) {
  120. ActivityPrice::where('id',$it['price_id'])->setInc('stock',$it['num']);
  121. }
  122. Db::commit();
  123. }catch (\Exception $e) {
  124. Db::rollback();
  125. }
  126. }
  127. }
  128. /**
  129. * @title 定时取消商城订单
  130. * @desc
  131. * @author qc
  132. * @url /api/Task/cancelGoodsOrder
  133. */
  134. public function cancelGoodsOrder()
  135. {
  136. $list = GoodsOrder::with(['orderItem'])
  137. ->where([['create_at','< time',date('Y-m-d H:i:s',strtotime('-1 day'))],['status','=',0],['pay_state','=',0],['cancel_state','=',0]])
  138. ->select()->toArray();
  139. // return json($list);
  140. $num = 0;
  141. foreach ($list as $v) {
  142. $order_id = $v['id'];
  143. Db::startTrans();
  144. try {
  145. $detail = $v;
  146. if($detail['status'] != 0) $this->exception('订单状态有误');
  147. // 取消订单状态
  148. GoodsOrder::update(['status'=>9,'cancel_state'=>1],['id'=>$order_id]);
  149. // 订单处理
  150. foreach ($detail['order_item'] as $item_info) {
  151. // 更改订单详情状态
  152. GoodsOrderItem::update(['status'=>9],['id'=>$item_info['id']]);
  153. StoreGoodsItem::stockChange($item_info['spec_id'],$item_info['goods_id'],$item_info['num']);
  154. }
  155. Db::commit();
  156. }catch (\Exception $e){
  157. $this->ret_msg = $e->getMessage();
  158. $this->is_commit = false;
  159. Db::rollback();
  160. }
  161. $num++;
  162. }
  163. $this->success('取消'.$num.'条订单');
  164. }
  165. /**
  166. * @title 定时自动收货
  167. * @desc
  168. * @author qc
  169. * @url /api/Task/confirmGoodsOrder
  170. */
  171. public function confirmGoodsOrder(){
  172. //express_send_at 发货时间
  173. $list = GoodsOrder::where([['pay_state','=',1],['status','=',2],['express_send_at','< time',date('Y-m-d H:i:s',strtotime('-2 days'))]])
  174. ->select()->toArray();
  175. foreach ($list as $detail) {
  176. Db::startTrans();
  177. try {
  178. $order_id = $detail['id'];
  179. // $detail = GoodsOrder::where('id',$order_id)->find()->toArray();
  180. if($detail['status'] == 0) $this->error('订单未支付');
  181. if($detail['status'] == 1) $this->error('订单未发货');
  182. if($detail['status'] == 3) $this->error('订单已收货');
  183. GoodsOrder::update(['status'=>3,'express_state'=>2],['id'=>$order_id]);
  184. GoodsOrderItem::update(['status'=>3,'express_state'=>2],['order_id'=>$order_id]);
  185. UserMessage::create(['user_id'=>$detail['user_id'],'type_id'=>3,'relation_id'=>$order_id,'content'=>'订单收货成功']);
  186. Db::commit();
  187. }catch (\Exception $e) {
  188. Db::rollback();
  189. }
  190. }
  191. $this->success('执行成功');
  192. }
  193. /**
  194. * @title 活动报名定时提醒
  195. * @desc
  196. * @author qc
  197. * @url /api/Task/activityReminder
  198. */
  199. public function activityReminder()
  200. {
  201. $where = [];
  202. $where[] = ['task_send','=',0];
  203. $where[] = ['start_time','> time',date('Y-m-d H:i:s',strtotime('-24 hours'))];
  204. $where[] = ['status','=',1];
  205. $where[] = ['is_deleted','=',0];
  206. $list = \app\common\model\Activity::where($where)->select()->toArray();
  207. foreach ($list as $act_info)
  208. {
  209. \app\common\model\Activity::where(['id'=>$act_info['id']])->update(['task_send'=>1]);
  210. $ticket_list = ActivityApplyItem::where(['act_id'=>$act_info['id'],'sh_status'=>1,'is_hx'=>0])->select();
  211. foreach ($ticket_list as $v) {
  212. // 短信通知
  213. if($v['phone_pre'] == '86' && $v['phone']) UserSynth::phoneMessageSend($v['phone'],0,['ActivityName'=>$act_info['title'], 'time'=>$act_info['start_time'], 'adress'=>$act_info['address']]);
  214. }
  215. }
  216. }
  217. /**
  218. * @title 热搜定时
  219. * @desc
  220. * @author qc
  221. * @url /api/Task/topSearchTask
  222. */
  223. public function topSearchTask()
  224. {
  225. $where[] = ['hot_time','< time',date('Y-m-d H:i:s',strtotime('-7 days'))];
  226. // 视频
  227. $list = VideoUrl::where($where)->column('id');
  228. array_walk($list,function ($v){
  229. VideoUrl::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  230. TopSearch::saveData($v,'video');
  231. });
  232. // 图文
  233. $list = ArticleItem::where($where)->column('id');
  234. array_walk($list,function ($v){
  235. ArticleItem::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  236. TopSearch::saveData($v,'article');
  237. });
  238. // 资料
  239. $list = DatumUrl::where($where)->column('id');
  240. array_walk($list,function ($v){
  241. DatumUrl::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  242. TopSearch::saveData($v,'datum');
  243. });
  244. // 活动
  245. $list = \app\common\model\Activity::where($where)->column('id');
  246. array_walk($list,function ($v){
  247. \app\common\model\Activity::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  248. TopSearch::saveData($v,'activity');
  249. });
  250. // 需求
  251. $list = \app\common\model\PlatformDemand::where($where)->column('id');
  252. array_walk($list,function ($v){
  253. \app\common\model\PlatformDemand::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  254. TopSearch::saveData($v,'demand');
  255. });
  256. // 新闻
  257. $list = \app\common\model\Press::where($where)->column('id');
  258. array_walk($list,function ($v){
  259. \app\common\model\Press::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  260. TopSearch::saveData($v,'press');
  261. });
  262. // 问答
  263. $list = \app\common\model\UserForum::where($where)->column('id');
  264. array_walk($list,function ($v){
  265. \app\common\model\UserForum::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  266. TopSearch::saveData($v,'forum');
  267. });
  268. // 招聘
  269. $list = \app\common\model\Recruit::where($where)->column('id');
  270. array_walk($list,function ($v){
  271. \app\common\model\Recruit::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  272. TopSearch::saveData($v,'recruit');
  273. });
  274. // 供应商
  275. $list = \app\common\model\SupplierGoods::where($where)->column('id');
  276. array_walk($list,function ($v){
  277. \app\common\model\SupplierGoods::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  278. TopSearch::saveData($v,'supplier_goods');
  279. });
  280. // 商品
  281. $list = \app\common\model\StoreGoods::where($where)->column('id');
  282. array_walk($list,function ($v){
  283. \app\common\model\StoreGoods::where('id',$v)->update(['hot_time'=>date('Y-m-d H:i:s'),'hot_num'=>0]);
  284. TopSearch::saveData($v,'goods');
  285. });
  286. $this->success('执行成功');
  287. }
  288. /**
  289. * @title 热搜定时1
  290. * @desc
  291. * @author qc
  292. * @url /api/Task/emptyTopSearchTask
  293. */
  294. public function emptyTopSearchTask()
  295. {
  296. //热搜规则
  297. //根据后台输入的热搜阅读量排序
  298. //每10分钟前端更新一次
  299. //后台热搜阅读量每天晚上的23:59点,清楚7天前的那一天所有新增的内容的热搜阅读量
  300. //如:
  301. //2023年11月5日,新增了2篇文章,1个视频(不关心是几点新增的)
  302. //2023年11月12日,晚上23:59,将新增的2篇文章跟1个视频的热搜阅读清0
  303. //热搜阅读量可以手动更改,每次有用户点击时,热搜阅读量也增加1
  304. //top_search hot_num
  305. $start_time = date('Y-m-d 00:00:00',strtotime('-7 days'));
  306. $end_time = date('Y-m-d 23:59:59',strtotime('-7 days'));
  307. // return $start_time.'---'.$end_time;
  308. $where[] = ['create_at','> time',$start_time];
  309. $where[] = ['create_at','< time',$end_time];
  310. $list = TopSearch::where($where)->column('id');
  311. return json($list);
  312. TopSearch::where($where)->update(['hot_num'=>0]);
  313. // foreach ($list as $k => $v){
  314. // TopSearch::where('id',$v)->update(['hot_num'=>0]);
  315. // }
  316. $this->success('执行成功');
  317. }
  318. /**
  319. * @title 定时取消商城订单
  320. * @desc
  321. * @author qc
  322. * @url /api/Task/cancelStoreGoods
  323. */
  324. public function cancelStoreGoods()
  325. {
  326. $list = GoodsOrder::with(['orderItem','orderRefund'])
  327. ->where([['pay_state','=',0],['status','=',0],['create_at','< time',date('Y-m-d H:i:s',strtotime('-1 days'))]])
  328. ->select()->toArray();
  329. foreach ($list as $detail) {
  330. // 取消订单状态
  331. GoodsOrder::update(['status'=>9,'cancel_state'=>1],['id'=>$detail['id']]);
  332. // 订单处理
  333. foreach ($detail['order_item'] as $item_info) {
  334. // 更改订单详情状态
  335. GoodsOrderItem::update(['status'=>9],['id'=>$item_info['id']]);
  336. StoreGoodsItem::stockChange($item_info['spec_id'],$item_info['goods_id'],$item_info['num']);
  337. }
  338. }
  339. $this->success('执行成功');
  340. }
  341. }