Timer.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\CleanTask;
  4. use app\common\model\Config;
  5. use app\common\model\Daily;
  6. use app\common\model\DailyTask;
  7. use app\common\model\DeviceTask;
  8. use app\common\model\PatrolTask;
  9. use app\common\model\QualityTask;
  10. use app\common\util\AppMsg;
  11. use think\Controller;
  12. use think\Db;
  13. /**
  14. * 定时任务控制器
  15. * Class Timer
  16. * @package app\api\controller
  17. */
  18. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/patrol > timer.log 2>&1 &
  19. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/addPatrolTask > /dev/null 2>&1 &
  20. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/cleantask > /dev/null 2>&1 &
  21. //*/1 * * * * /usr/bin/curl http://127.0.0.1/Timer/daily > /dev/null 2>&1 &
  22. //*/1 * * * * /usr/bin/curl http://127.0.0.1/Timer/addDailyTask > /dev/null 2>&1 &
  23. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/device > /dev/null 2>&1 &
  24. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/addDeviceTask > /dev/null 2>&1 &
  25. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/waste > /dev/null 2>&1 &
  26. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/patrolStart > /dev/null 2>&1 &
  27. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/dailyStart > /dev/null 2>&1 &
  28. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/deviceStart > /dev/null 2>&1 &
  29. //0 8 * * * /usr/bin/curl http://127.0.0.1/api/Timer/cleanStart > /dev/null 2>&1 &
  30. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/patrolPlan > /dev/null 2>&1 &
  31. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/cancelGorder > /dev/null 2>&1 &
  32. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/cancelDelay > /dev/null 2>&1 &
  33. //20 1 * * * /usr/bin/curl http://127.0.0.1/api/Timer/attendance > /dev/null 2>&1 &
  34. //30 1 * * * /usr/bin/curl http://127.0.0.1/api/Timer/attendanceReissue > /dev/null 2>&1 &
  35. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/attendanceResult > /dev/null 2>&1 &
  36. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/deviceTaskRemind > /dev/null 2>&1 &
  37. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/quality > /dev/null 2>&1 &
  38. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/addQualityTask > /dev/null 2>&1 &
  39. //*/1 * * * * /usr/bin/curl http://127.0.0.1/api/Timer/complain > /dev/null 2>&1 &
  40. class Timer extends Controller
  41. {
  42. public function ypconvey(){
  43. $lists = Db::connect('db_config_jili')->name('wlps')->where('is_deal',0)->where('is_qx','N')->select();
  44. $lists = $lists?$lists:[];
  45. foreach ($lists as $k=>$v){
  46. (new \app\common\model\Wlps())->deal_wlps($v);
  47. }
  48. }
  49. public function tt(){
  50. echo 'test';
  51. }
  52. //处理已超时的巡更任务,并从任务栏删除
  53. public function patrol(){
  54. set_time_limit(0);
  55. ini_set("memory_limit","1024M");
  56. (new PatrolTask())->timer_action();
  57. }
  58. //近12个小时的巡更任务加入到任务栏
  59. public function addPatrolTask(){
  60. (new PatrolTask())->addPatrolTask();
  61. }
  62. //处理已超时的专项保洁任务
  63. public function cleantask(){
  64. set_time_limit(0);
  65. ini_set("memory_limit","1024M");
  66. (new CleanTask())->timer_action();
  67. }
  68. //处理已超时日常工作任务,并从任务栏删除
  69. public function daily(){
  70. (new DailyTask())->timer_action();
  71. }
  72. //近12个小时的日常工作任务加入到任务栏
  73. public function addDailyTask(){
  74. (new DailyTask())->addDailyTask();
  75. }
  76. //处理已超时设备台账任务,并从任务栏删除
  77. public function device(){
  78. set_time_limit(0);
  79. ini_set("memory_limit","1024M");
  80. (new DeviceTask())->timer_action();
  81. }
  82. //近12个小时的设备台账任务加入到任务栏
  83. public function addDeviceTask(){
  84. (new DeviceTask())->addDeviceTask();
  85. }
  86. // 取消过期的延期申请
  87. public function cancelDelay(){
  88. Db::name('device_task_delay')
  89. ->where('status',0)
  90. ->where('end_time','<=',date('Y-m-d H:i:s'))
  91. ->update(['status'=>3,'update_time'=>date('Y-m-d H:i:s')]);
  92. }
  93. //医废未转运提醒 每分钟执行一次
  94. public function waste(){
  95. set_time_limit(0);
  96. ini_set("memory_limit","1024M");
  97. $orgids = Db::name('config_org')
  98. ->alias('co')
  99. ->join('config c','c.id = co.config_id')
  100. ->where('c.name','org_waste_status')
  101. ->where('co.value',1)
  102. ->column('co.org_id');
  103. if(!$orgids){
  104. exit();
  105. }
  106. $orgids2 = Db::name('config_org')
  107. ->alias('co')
  108. ->join('config c','c.id = co.config_id')
  109. ->where('c.name','org_waste_time')
  110. ->where('co.value',date('H:i'))
  111. ->column('co.org_id');
  112. if(!$orgids2){
  113. exit();
  114. }
  115. $orgids = array_unique(array_intersect($orgids,$orgids2));
  116. if(!$orgids){
  117. exit();
  118. }
  119. $users = [];
  120. foreach ($orgids as $v){
  121. //检查是否有未转运订单
  122. $ret = Db::name('waste_record')
  123. ->where('org_id',$v)
  124. ->where('status','in',[0,1])
  125. ->find();
  126. if(!$ret){
  127. continue;
  128. }
  129. // 检查是否设置通知人员
  130. $uids = model('Config')->getConfig('org_waste_user',$v);
  131. if($uids){
  132. $users = array_merge($users,explode(',',$uids));
  133. }
  134. }
  135. if($users){ //推送
  136. $length = 1000;
  137. $count = ceil(count($users)/$length);
  138. for ($i=0;$i<$count;$i++){
  139. $uids = array();
  140. $min = $i*$length;
  141. $max = $min + $length;
  142. if($max > count($users)){
  143. $max = count($users);
  144. }
  145. for($j=$min;$j<$max;$j++){
  146. $uids[] = $users[$j];
  147. }
  148. send_jpush($uids,AppMsg::PUSH_WASTE_UNFINISH);
  149. }
  150. }
  151. }
  152. // 巡更任务将要开始提醒 每分钟执行一次
  153. public function patrolStart(){
  154. $curTime = date('Y-m-d H:i').':00';
  155. $users = Db::name('patrol_task_user')
  156. ->alias('ptu')
  157. ->join('patrol_task pt','pt.id = ptu.patrol_task_id')
  158. ->where('pt.del',0)
  159. ->where('pt.status',0)
  160. ->where('pt.start_time',$curTime)
  161. ->field('ptu.user_id,patrol_mode')
  162. ->select();
  163. $userids1 = $userids2 = $userids3 = $userids4 = [];
  164. foreach ($users as $k=>$v){
  165. if($v['patrol_mode'] == 1 && !in_array($v['user_id'],$userids1)){
  166. $userids1[] = $v['user_id'];
  167. }else if($v['patrol_mode'] == 2 && !in_array($v['user_id'],$userids2)){
  168. $userids2[] = $v['user_id'];
  169. }else if($v['patrol_mode'] == 3 && !in_array($v['user_id'],$userids3)){
  170. $userids3[] = $v['user_id'];
  171. }else if($v['patrol_mode'] == 4 && !in_array($v['user_id'],$userids4)){
  172. $userids4[] = $v['user_id'];
  173. }
  174. }
  175. if($userids1){
  176. send_jpush($userids1,AppMsg::PUSH_PATROL,'您有新的巡更任务将要开始,请及时执行。');
  177. }
  178. if($userids2){
  179. send_jpush($userids2,AppMsg::PUSH_PATROL,'您有新的巡视任务将要开始,请及时执行。');
  180. }
  181. if($userids3){
  182. send_jpush($userids3,AppMsg::PUSH_PATROL,'您有新的巡查任务将要开始,请及时执行。');
  183. }
  184. if($userids4){
  185. send_jpush($userids4,AppMsg::PUSH_PATROL,'您有新的巡检任务将要开始,请及时执行。');
  186. }
  187. }
  188. // 专项保洁任务将要开始提醒 每天早上6点执行一次
  189. public function cleanStart(){
  190. $curTime = date('Y-m-d');
  191. $users = Db::name('clean_task_user')
  192. ->alias('ptu')
  193. ->join('clean_task pt','pt.id = ptu.task_id')
  194. ->where('pt.del',0)
  195. ->where('pt.status',0)
  196. ->where('pt.start_time',$curTime)
  197. ->column('ptu.user_id');
  198. if($users){
  199. send_jpush($users,AppMsg::PUSH_CLEAN,'您有新的专项保洁任务将要开始,请及时执行。');
  200. }
  201. }
  202. // 日常工作任务将要开始提醒 每分钟执行一次
  203. public function dailyStart(){
  204. $curTime = date('Y-m-d H:i').':00';
  205. $users = Db::name('daily_task_user')
  206. ->alias('ptu')
  207. ->join('daily_task pt','pt.id = ptu.task_id')
  208. ->where('pt.del',0)
  209. ->where('pt.status',0)
  210. ->where('pt.start_time',$curTime)
  211. ->column('ptu.user_id');
  212. if($users){
  213. send_jpush($users,AppMsg::PUSH_DAILY_TASK,'您有新的日常工作任务将要开始,请及时执行。');
  214. }
  215. }
  216. // 设备台账任务将要开始提醒 每分钟执行一次
  217. public function deviceStart(){
  218. $curTime = date('Y-m-d H:i').':00';
  219. $users = Db::name('device_task_user')
  220. ->alias('ptu')
  221. ->join('device_task pt','pt.id = ptu.task_id')
  222. ->where('pt.del',0)
  223. ->where('pt.status',0)
  224. ->where('pt.start_time',$curTime)
  225. ->column('ptu.user_id');
  226. if($users){
  227. send_jpush($users,AppMsg::PUSH_DEVICE_TASK,'您有新的设备台账任务将要开始,请及时执行。');
  228. }
  229. }
  230. //商城取消未支付订单
  231. public function cancelGorder(){
  232. $list = Db::name('g_orders')
  233. ->where('status',0)
  234. ->select();
  235. foreach ($list as $k=>$v){
  236. if(strtotime($v['create_time']) < (time()-30*60)){
  237. Db::name('g_orders')
  238. ->where('id',$v['id'])
  239. ->update([
  240. 'status'=>3,
  241. 'cancel_time'=>getTime()
  242. ]);
  243. $goods = Db::name('g_order_goods')
  244. ->where('order_id',$v['id'])
  245. ->select();
  246. foreach ($goods as $k1=>$v1){
  247. Db::name('g_goods')
  248. ->where('id',$v1['goods_id'])
  249. ->setInc('stock',$v1['nums']);
  250. }
  251. }
  252. }
  253. }
  254. // 修改巡更计划状态 1分钟执行一次
  255. public function patrolPlan(){
  256. $curDay = date('Y-m-d');
  257. Db::name('patrol_plan')
  258. ->where('del',0)
  259. ->where('status',0)
  260. ->where('start_time','<=',$curDay)
  261. ->update(['status'=>1,'update_time'=>date('Y-m-d H:i:s')]);
  262. Db::name('patrol_plan')
  263. ->where('del',0)
  264. ->where('status','in',[0,1])
  265. ->where('end_time','<',$curDay)
  266. ->update(['status'=>2,'update_time'=>date('Y-m-d H:i:s')]);
  267. }
  268. // 更新打卡状态,每天执行一次
  269. public function attendance(){
  270. $yday = date('Y-m-d',time() - 86400);
  271. // 昨天不跨天进行中的状态改为已完成
  272. $map1[] = ['day','=',$yday];
  273. $map1[] = ['next','=',0];
  274. $map1[] = ['status','=',0];
  275. $yyday = date('Y-m-d',time() - 2*86400);
  276. // 昨天跨天进行中的状态改为已完成
  277. $map2[] = ['day','=',$yyday];
  278. $map2[] = ['next','=',1];
  279. $map2[] = ['status','=',0];
  280. $lists = Db::name('attendance_user_class')
  281. ->whereOr([ $map1, $map2 ])
  282. ->field('id,content')
  283. ->select();
  284. $lists = $lists?$lists:[];
  285. foreach ($lists as $k=>$v){
  286. $dates = json_decode($v['content'],true);
  287. foreach ($dates as $kk=>$vv){
  288. $dates[$kk]['sstatus'] = 1;
  289. $dates[$kk]['estatus'] = 1;
  290. }
  291. Db::name('attendance_user_class')->where('id',$v['id'])->update([
  292. 'content' => json_encode($dates),
  293. 'status' => 1,
  294. 'update_time' => date('Y-m-d H:i:s')
  295. ]);
  296. }
  297. }
  298. // 昨日未打卡的日期,每天执行一次
  299. public function attendanceReissue(){
  300. $yday = date('Y-m-d',time() - 86400);
  301. model('AttendanceUserClass')->attendanceReissueFixed($yday); // 固定班制
  302. model('AttendanceUserClass')->attendanceReissueClass($yday); // 排班制
  303. }
  304. // 生成考勤结果,每分钟执行一次
  305. public function attendanceResult(){
  306. $lists = Db::name('attendance_user_class')->where('status',1)->where('result',0)->field('id,content')->limit(500)->select();
  307. $lists = $lists?$lists:[];
  308. foreach ($lists as $k=>$v){
  309. $content = json_decode($v['content'],true);
  310. $result = 1;
  311. $count = 0; // 打卡次数
  312. foreach ($content as $kk=>$vv){
  313. if($result != 1){
  314. continue;
  315. }
  316. if($vv['ssign']){
  317. $count++;
  318. if($vv['ssign'] > $vv['stime']){
  319. $result = 2;
  320. }
  321. }
  322. if($vv['esign']){
  323. $count++;
  324. if($vv['esign'] < $vv['etime']){
  325. $result = 2;
  326. }
  327. }
  328. }
  329. if($count == 0){
  330. $result = 3;
  331. }
  332. Db::name('attendance_user_class')->where('id',$v['id'])->update(['result' => $result]);
  333. }
  334. }
  335. //提前五分钟提醒
  336. public function deviceTaskRemind(){
  337. $curStr= time() - 60*5;
  338. $date = date('Y-m-d H:i',$curStr).':00';
  339. $users = Db::name('device_task_user')
  340. ->alias('ptu')
  341. ->join('device_task pt','pt.id = ptu.task_id')
  342. ->where('pt.del',0)
  343. ->where('pt.status',0)
  344. ->where('pt.start_time',$date)
  345. ->column('ptu.user_id');
  346. send_jpush($users,AppMsg::PUSH_DEVICE_TASK,'您有新的设备维保任务将要开始,请及时执行。');
  347. }
  348. //处理已超时的巡更任务,并从任务栏删除
  349. public function quality(){
  350. set_time_limit(0);
  351. ini_set("memory_limit","1024M");
  352. (new QualityTask())->timerAction();
  353. }
  354. //近12个小时的品控任务加入到任务栏
  355. public function addQualityTask(){
  356. (new QualityTask())->addPatrolTask();
  357. }
  358. public function complain(){
  359. $lists = Db::name('config_org')
  360. ->alias('a')
  361. ->join('config b','a.config_id = b.id')
  362. ->where('b.name','org_complain_hour')
  363. ->field('a.org_id,a.value')
  364. ->select();
  365. $lists = $lists?$lists:[];
  366. foreach ($lists as $k=>$v){
  367. if($v['value'] > 0){
  368. // 获取当前组织是否设置人员,设置人员才发送超时提醒
  369. $users = (new Config())->getConfig('org_complain_user',$v['org_id']);
  370. if($users){
  371. $uids = Db::name('user')->where('id','in',$users)->where('del',0)->where('enable')->column('id');
  372. if($uids){
  373. // 检查是否有超时未处理投诉
  374. $map = [];
  375. $endTime = date('Y-m-d H:i:s',time() - $v['value']*60*60);
  376. $map[] = ['create_time','<',$endTime];
  377. $map[] = ['status','=',0];
  378. $map[] = ['org_id','=',$v['org_id']];
  379. $map[] = ['del','=',0];
  380. $ret = Db::name('complain')
  381. ->where($map)
  382. ->field('id,content,create_time,status,order_id')
  383. ->find();
  384. if($ret){
  385. send_jpush($uids,AppMsg::PUSH_COMPLAIN_TIMEOUT);
  386. }
  387. }
  388. }
  389. }
  390. }
  391. }
  392. }