Ai.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. <?php
  2. namespace app\admin\controller;
  3. use app\common\util\AppMsg;
  4. use think\Db;
  5. use think\Exception;
  6. use think\exception\DbException;
  7. class Ai extends Auth
  8. {
  9. static $types = [
  10. 1 =>'报修',
  11. 2 =>'保洁',
  12. 3 =>'运送',
  13. 4 =>'安保',
  14. ];
  15. public function space()
  16. {
  17. return $this->fetch();
  18. }
  19. public function dispatchCenter()
  20. {
  21. $configId = Db::name('config')
  22. ->where('name', 'org_ai_send')
  23. ->value('id');
  24. $ai= Db::name('config_org')
  25. ->where('config_id', $configId)
  26. ->where('value', 1)
  27. ->where('org_id', $this->orgId)
  28. ->findOrEmpty();
  29. $ai = $ai ? 1 : 0;
  30. $this->assign('ai',$ai);
  31. return $this->fetch();
  32. }
  33. public function config($id = 6)
  34. {
  35. $type = [6=>'Ai'];
  36. $list = Db::name("config")
  37. ->where(['status'=>1,'group'=>$id,'cate'=>2])
  38. ->field('id,name,title,extra,value,remark,type')
  39. ->order('sort asc')
  40. ->select();
  41. $list = $list?$list:[];
  42. foreach ($list as $k=>$v){
  43. $value = Db::name('config_org')->where('config_id',$v['id'])->where('org_id',$this->orgId)->find();
  44. $list[$k]['value'] = $value?$value['value']:'';
  45. }
  46. $this->assign('list',$list);
  47. $this->assign('type',$type);
  48. $this->assign('id',$id);
  49. return $this->fetch();
  50. }
  51. public function configSave(){
  52. $config = request()->post();
  53. if($config && is_array($config)){
  54. foreach ($config as $name => $value) {
  55. if($name == 'org_ai_send'){
  56. cache('ai_send',null);
  57. }elseif ($name == 'org_ai_time'){
  58. cache('ai_time_' . $this->orgId, null);
  59. }
  60. $info = Db::name('config')->where('name',$name)->find();
  61. if(!$info){
  62. continue;
  63. }
  64. $oinfo = Db::name('config_org')->where('config_id',$info['id'])->where('org_id',$this->orgId)->find();
  65. if($oinfo){
  66. Db::name('config_org')->where('id',$oinfo['id'])->update(['value'=>$value]);
  67. }else{
  68. Db::name('config_org')->insert([
  69. 'config_id' => $info['id'],
  70. 'org_id' => $this->orgId,
  71. 'value' => $value
  72. ]);
  73. }
  74. }
  75. }
  76. $this->success('保存成功');
  77. }
  78. public function userSkill(){
  79. if(request()->isAjax()){
  80. //分页参数
  81. $length = input('rows',10,'intval'); //每页条数
  82. $page = input('page',1,'intval'); //第几页
  83. $start = ($page - 1) * $length; //分页开始位置
  84. //排序
  85. $sortRow = input('sidx','u.id','trim'); //排序列
  86. $sort = input('sord','desc','trim'); //排序方式
  87. $order = $sortRow.' '.$sort;
  88. $title = input('title','','trim');
  89. if($title){
  90. $map[] = ['u.account|u.real_name|u.mobile','like','%'.$title.'%'];
  91. }
  92. $enable = input('enable','','trim');
  93. if($enable != ''){
  94. $map[] = ['u.enable','=',$enable];
  95. }
  96. $depId = input('depId','','trim');
  97. if($depId != ''){
  98. $uids = Db::name('user_dep')->where('dep_id',$depId)->column('user_id');
  99. $map[] = ['u.id','in',$uids];
  100. }
  101. $roles = (new \app\common\model\WorkTypeMode())->getRoles(1, $this->orgId);
  102. $roleIds = Db::name('roles')
  103. ->whereIn('parent_id',array_column($roles,'id'))
  104. ->where('org_id',$this->orgId)
  105. ->where('del',0)
  106. ->where('enable',1)
  107. ->column('id');
  108. $map[] = ['u.del','=',0];
  109. $map[] = ['u.type','=',0];
  110. $map[] = ['uo.org_id','=',$this->orgId];
  111. $map[] = ['ur.roles_id','in',$roleIds];
  112. $map= empty($map) ? true: $map;
  113. $query = Db::name('user')
  114. ->alias('u')
  115. ->join('user_org uo','u.id=uo.user_id')
  116. ->join('user_roles ur','u.id=ur.user_id')
  117. ->join('roles r','r.id=ur.roles_id')
  118. ->where($map)
  119. ->field('u.*,uo.org_id,r.name as roles_name');
  120. $lists =$query
  121. ->limit($start,$length)
  122. ->order(['u.sort'=>'asc','u.id'=>'desc'])
  123. ->select();
  124. $orderType = Db::name('order_type')
  125. ->where('parent_id',0)
  126. ->where('enable',1)
  127. ->where('del',0)
  128. ->where('org_id',$this->orgId)
  129. ->column('title','id');
  130. foreach ($lists as $k=>$v){
  131. $lists[$k]['dep_name'] = Db::name('user_dep')
  132. ->alias('ud')
  133. ->join('dep d','d.id=ud.dep_id')
  134. ->where('ud.user_id',$v['id'])
  135. ->where('d.org_id',$v['org_id'])
  136. ->value('d.title');
  137. $labels = $v['label'] ? explode(',',$v['label']) : [];
  138. if ($labels){
  139. foreach ($labels as &$label){
  140. $label = $orderType[$label]??'';
  141. }
  142. unset($label);
  143. $lists[$k]['label'] = implode(',',$labels);
  144. }
  145. }
  146. //数据返回
  147. $totalCount = $query
  148. ->removeOption('limit')
  149. ->count();
  150. $totalPage = ceil($totalCount/$length);
  151. $result['page'] = $page;
  152. $result['total'] = $totalPage;
  153. $result['records'] = $totalCount;
  154. $result['rows'] = $lists;
  155. return json($result);
  156. }else{
  157. $deps = model('Dep')->getList();
  158. $this->assign('deps',$deps);
  159. return $this->fetch();
  160. }
  161. }
  162. public function editUser($id=0,$type = 1){
  163. if(request()->isPost()){
  164. if ($type == 1){
  165. $res = Db::name('user')->where(['id'=>$id])->update(['label'=>input('label','')]);
  166. }else if ($type == 2){
  167. $res = Db::name('dep')->where(['id'=>$id])->update(['users'=>input('users','')]);
  168. }else{
  169. $res = Db::name('address')->where(['id'=>$id])->update(['users'=>input('users','')]);
  170. }
  171. if($res){
  172. $this->success('操作成功',url('index'));
  173. }else{
  174. $this->error(model('User')->getError());
  175. }
  176. }else{
  177. if($id){
  178. $config = [
  179. 1 => ['table' => 'user', 'field' => 'label'],
  180. 2 => ['table' => 'dep', 'field' => 'users'],
  181. ];
  182. $current = $config[$type] ?? ['table' => 'address', 'field' => 'users'];
  183. $info = db($current['table'])
  184. ->where('id', $id)
  185. ->find();
  186. if ($info) {
  187. $field = $current['field'];
  188. $info[$field] = empty($info[$field])
  189. ? []
  190. : explode(',', $info[$field]);
  191. }
  192. $this->assign('info',$info);
  193. }
  194. if ($type == 1){
  195. $orderType =model('OrderType')->list();
  196. $this->assign('orderType',$orderType);
  197. }else{
  198. $roles = (new \app\common\model\WorkTypeMode())->getRoles($type == 2 ? 1 : 3, $this->orgId);
  199. $roleIds = Db::name('roles')
  200. ->whereIn('parent_id',array_column($roles,'id'))
  201. ->where('org_id',$this->orgId)
  202. ->where('del',0)
  203. ->where('enable',1)
  204. ->column('id');
  205. $user = Db::name('user_roles')
  206. ->alias('ur')
  207. ->join('user u','u.id = ur.user_id')
  208. ->join('user_dep ud','ud.user_id = u.id')
  209. ->where('u.del',0)
  210. ->where('u.enable',1)
  211. ->whereIn('ur.roles_id',$roleIds)
  212. ->where('u.work',1)
  213. ->field('u.id,u.real_name as title')
  214. ->select();
  215. $this->assign('users',$user);
  216. }
  217. $this->assign('type',$type);
  218. return $this->fetch();
  219. }
  220. }
  221. public function dep(){
  222. if(request()->isAjax()){
  223. //分页参数
  224. $length = input('rows',10,'intval'); //每页条数
  225. $page = input('page',1,'intval'); //第几页
  226. $start = ($page - 1) * $length; //分页开始位置
  227. //排序
  228. $sortRow = input('sidx','id','trim'); //排序列
  229. $sort = input('sord','desc','trim'); //排序方式
  230. $order = $sortRow.' '.$sort;
  231. $title = input('title','','trim');
  232. if($title){
  233. $map[] = ['title','like','%'.$title.'%'];
  234. }
  235. $enable = input('enable','','trim');
  236. if($enable != ''){
  237. $map[] = ['enable','=',$enable];
  238. }
  239. $map[] = ['del','=',0];
  240. $map[] = ['org_id','=',$this->orgId];
  241. $map= empty($map) ? true: $map;
  242. //数据查询
  243. $lists = Db::name('dep')
  244. ->where($map)
  245. ->limit($start,$length)
  246. ->order($order)
  247. ->select();
  248. $roles = (new \app\common\model\WorkTypeMode())->getRoles(1, $this->orgId);
  249. $roleIds = Db::name('roles')
  250. ->whereIn('parent_id',array_column($roles,'id'))
  251. ->where('org_id',$this->orgId)
  252. ->where('del',0)
  253. ->where('enable',1)
  254. ->column('id');
  255. $userList = Db::name('user_roles')
  256. ->alias('ur')
  257. ->join('user u','u.id = ur.user_id')
  258. ->where('u.del',0)
  259. ->where('u.enable',1)
  260. ->whereIn('ur.roles_id',$roleIds)
  261. ->where('u.work',1)
  262. ->column('u.real_name','u.id');
  263. foreach ($lists as $k=>$v){
  264. $users = $v['users'] ? explode(',',$v['users']) : [];
  265. if ($users){
  266. foreach ($users as &$user){
  267. $user = $userList[$user]??'';
  268. }
  269. unset($user);
  270. $lists[$k]['users'] = implode(',',$users);
  271. }
  272. }
  273. //数据返回
  274. $totalCount = Db::name('dep')->where($map)->count();
  275. $totalPage = ceil($totalCount/$length);
  276. $result['page'] = $page;
  277. $result['total'] = $totalPage;
  278. $result['records'] = $totalCount;
  279. $result['rows'] = $lists;
  280. return json($result);
  281. }else{
  282. return $this->fetch();
  283. }
  284. }
  285. public function address(){
  286. if(request()->isAjax()){
  287. //分页参数
  288. $length = input('rows',10,'intval'); //每页条数
  289. $page = input('page',1,'intval'); //第几页
  290. $start = ($page - 1) * $length; //分页开始位置
  291. //排序
  292. $sortRow = input('sidx','id','trim'); //排序列
  293. $sort = input('sord','desc','trim'); //排序方式
  294. $order = $sortRow.' '.$sort;
  295. $title = input('title','','trim');
  296. if($title){
  297. $map[] = ['title','like','%'.$title.'%'];
  298. }
  299. $enable = input('enable','','trim');
  300. if($enable != ''){
  301. $map[] = ['enable','=',$enable];
  302. }
  303. $map[] = ['del','=',0];
  304. $map[] = ['org_id','=',$this->orgId];
  305. $map[]=['','exp',Db::raw("FIND_IN_SET(2,types)")];
  306. $map= empty($map) ? true: $map;
  307. //数据查询
  308. $query = Db::name('address')->where($map);
  309. $lists = $query
  310. ->limit($start,$length)
  311. ->order($order)
  312. ->select();
  313. $roles = (new \app\common\model\WorkTypeMode())->getRoles(3, $this->orgId);
  314. $roleIds = Db::name('roles')
  315. ->whereIn('parent_id',array_column($roles,'id'))
  316. ->where('org_id',$this->orgId)
  317. ->where('del',0)
  318. ->where('enable',1)
  319. ->column('id');
  320. $userList = Db::name('user_roles')
  321. ->alias('ur')
  322. ->join('user u','u.id = ur.user_id')
  323. ->where('u.del',0)
  324. ->where('u.enable',1)
  325. ->whereIn('ur.roles_id',$roleIds)
  326. ->where('u.work',1)
  327. ->column('u.real_name','u.id');
  328. foreach ($lists as $k=>$v){
  329. $users = $v['users'] ? explode(',',$v['users']) : [];
  330. if ($users){
  331. foreach ($users as &$user){
  332. $user = $userList[$user]??'';
  333. }
  334. unset($user);
  335. $lists[$k]['users'] = implode(',',$users);
  336. }
  337. }
  338. //数据返回
  339. $totalCount = $query->removeOption('limit')->count();
  340. $totalPage = ceil($totalCount/$length);
  341. $result['page'] = $page;
  342. $result['total'] = $totalPage;
  343. $result['records'] = $totalCount;
  344. $result['rows'] = $lists;
  345. return json($result);
  346. }else{
  347. return $this->fetch();
  348. }
  349. }
  350. //TODO 给todo表和orders加上索引
  351. public function show()
  352. {
  353. if(request()->isAjax()){
  354. $today = date('Ymd');
  355. $echart = Db::name('todo')
  356. ->where('org_id', $this->orgId)
  357. ->where('del', 0)
  358. ->where('create_yyyymmdd', '>=',date('Ymd',strtotime('-7 days')))
  359. ->where('create_yyyymmdd', '<=',$today)
  360. ->field('create_yyyymmdd, SUM(create_user_id = -1) as ai, SUM(create_user_id != -1) as user')
  361. ->group('create_yyyymmdd')
  362. ->order('create_yyyymmdd')
  363. ->select();
  364. $statsByDate = [];
  365. foreach ($echart as $item) {
  366. $statsByDate[$item['create_yyyymmdd']] = $item;
  367. }
  368. $dates = [];
  369. for ($i = 6; $i >= 0; $i--) {
  370. $date = date('Ymd', strtotime("-$i days"));
  371. $aiData[] = isset($statsByDate[$date]) ? (int)$statsByDate[$date]['ai'] : 0;
  372. $userData[] = isset($statsByDate[$date]) ? (int)$statsByDate[$date]['user'] : 0;
  373. $dates[] = date('m-d', strtotime("-$i days"));;
  374. }
  375. $records = Db::name('ai_send_success')
  376. ->where('org_id', $this->orgId)
  377. ->field('mode')
  378. ->group('mode')
  379. ->column('COUNT(*)', 'mode');
  380. $done = [
  381. 'total' => array_sum($records),
  382. 'bx' => $records[1] ?? 0,
  383. 'bj' => $records[2] ?? 0,
  384. 'ys' => $records[3] ?? 0,
  385. 'ab' => $records[4] ?? 0
  386. ];
  387. $orders = Db::name('orders')
  388. ->where('org_id',$this->orgId)
  389. ->where('del',0)
  390. ->where('create_yyyymmdd',$today)
  391. ->where('order_mode',1)
  392. ->whereNotExists(function ($query) {
  393. $query->table('ai_send_fail')
  394. ->whereColumn('ai_send_fail.order_id', 'orders.id');
  395. })
  396. ->field('work_type_mode')
  397. ->group('work_type_mode')
  398. ->column('COUNT(*)', 'work_type_mode');
  399. $fail = Db::name('ai_send_fail')
  400. ->where('org_id', $this->orgId)
  401. ->where('status', 0)
  402. ->whereTime('create_time', 'today')
  403. ->count();
  404. $bh = Db::name('todo')
  405. ->where('org_id', $this->orgId)
  406. ->where('create_user_id', -1)
  407. ->where('todo_mode', 4)
  408. ->whereTime('create_time', 'today')
  409. ->count();
  410. $undo = [
  411. 'total' => array_sum($orders),
  412. 'bx' => $orders[1] ?? 0,
  413. 'bj' => $orders[2] ?? 0,
  414. 'ys' => $orders[3] ?? 0,
  415. 'ab' => $orders[4] ?? 0,
  416. 'yc'=>$fail,
  417. 'bh'=>$bh
  418. ];
  419. $data = [
  420. 'ai' =>$aiData,
  421. 'user' =>$userData,
  422. 'date'=>$dates,
  423. 'done'=>$done,
  424. 'undo'=>$undo,
  425. ];
  426. return json($data);
  427. }else{
  428. $configId = Db::name('config')
  429. ->where('name', 'org_ai_send')
  430. ->value('id');
  431. $ai= Db::name('config_org')
  432. ->where('config_id', $configId)
  433. ->where('value', 1)
  434. ->where('org_id', $this->orgId)
  435. ->findOrEmpty();
  436. $ai = $ai ? 1 : 0;
  437. $this->assign('ai',$ai);
  438. return $this->fetch();
  439. }
  440. }
  441. public function todoList()
  442. {
  443. $size = input('size',10,'intval');
  444. $page = input('page',1,'intval');
  445. $mode= input('mode',0,'intval');
  446. // $query = Db::name('todo')
  447. // ->alias('t')
  448. // ->join('orders o','t.order_id = o.id')
  449. // ->where('t.org_id', $this->orgId)
  450. // ->where('t.del', 0)
  451. // ->where('t.create_yyyymmdd', date('Ymd'))
  452. // ->when($mode > 0,function ($query) use($mode){
  453. // $query->where('t.work_type_mode', $mode);
  454. // })
  455. // ->where('t.create_user_id',-1)
  456. // ->field('o.id,o.sn,o.work_type_mode,o.user_id,t.id as tid,t.create_time,t.to_user_id');
  457. $query = Db::name('ai_send_success')
  458. ->alias('a')
  459. ->join('orders o','a.order_id = o.id')
  460. ->where('a.org_id', $this->orgId)
  461. ->whereTime('a.create_time', 'today')
  462. ->when($mode > 0,function ($query) use($mode){
  463. $query->where('a.mode', $mode);
  464. })
  465. ->field('a.user_id,a.todo_id,a.mode,a.create_time,o.sn,o.user_id as uid,o.id');
  466. $todoList = $query
  467. ->order('a.create_time desc')
  468. ->limit(($page -1) * $size,$size)
  469. ->select();
  470. $total = $query->removeOption('limit')->count();
  471. $userIds = array_column($todoList,'uid');
  472. $toUserIds = array_column($todoList,'user_id');
  473. $allIds = array_unique(array_merge($toUserIds,$userIds));
  474. $users = Db::name('user')->whereIn('id',$allIds)->column('real_name','id');
  475. foreach ($todoList as &$v){
  476. $v['user'] = $users[$v['uid']]??'';
  477. $v['toUser'] = $users[$v['user_id']]??'';
  478. $v['type'] = self::$types[$v['mode']]??'';
  479. }
  480. unset($v);
  481. return json(['data'=>$todoList,'total'=>$total]);
  482. }
  483. public function orderList()
  484. {
  485. $size = input('size',10,'intval');
  486. $page = input('page',1,'intval');
  487. $query = Db::name('orders')
  488. ->where('org_id',$this->orgId)
  489. ->where('del',0)
  490. ->where('create_yyyymmdd',date('Ymd'))
  491. ->whereIn('work_type_mode',[1,2,3,4])
  492. ->whereNotExists(function ($query) {
  493. $query->table('ai_send_fail')
  494. ->whereColumn('ai_send_fail.order_id', 'orders.id');
  495. })
  496. ->where('order_mode',1)
  497. ->field('id,sn,work_type_mode,user_id');
  498. $orderList = $query
  499. ->limit(($page -1) * $size,$size)
  500. ->select();
  501. $total = $query->removeOption('limit')->count();
  502. $users = Db::name('user') ->whereIn('id',array_unique(array_column($orderList,'user_id'))) ->column('real_name','id');
  503. $i = 1;
  504. foreach ($orderList as &$v2){
  505. $v2['user'] = $users[$v2['user_id']]??'';
  506. $v2['type'] = self::$types[$v2['work_type_mode']]??'';
  507. $v2['flag'] = 0;
  508. if ($i <= 20){
  509. $v2['flag'] = 1;
  510. $i ++;
  511. }
  512. }
  513. unset($v2);
  514. return json(['data'=>$orderList,'total'=>$total]);
  515. }
  516. public function send($id, $mode = 1,$type = 0) {//type=0表示重新派单,1-手动派单,2-被驳回重新派
  517. $model = new \app\common\model\Orders();
  518. if (request()->isGet()) {
  519. $user = '';
  520. if ($type != 1){
  521. $user = Db::name('todo')
  522. ->alias('t')
  523. ->join('user u','t.to_user_id = u.id')
  524. ->where('t.id', $id)
  525. ->value('u.real_name');
  526. }
  527. $this->assign('user', $user);
  528. $this->assign('id', $id);
  529. $this->assign('mode', $mode);
  530. $this->assign('type', $type);
  531. $this->assign('send_user_num', $model->sendUserNum($mode, $this->orgId));
  532. $this->assign('user_list', (new \app\common\model\WorkTypeMode())->getRolesUserByNum($mode, $this->orgId, 1));
  533. $two_dispatch_roles = model('user')->get_two_dispatch_role($this->orgId, $mode);
  534. $this->assign('dispatch_roles', $two_dispatch_roles);
  535. $this->assign('dispatch_type', check_two_dispatch($this->userId));
  536. $this->assign('two_dispatch_off', two_dispatch_off($this->orgId));
  537. return $this->fetch();
  538. }
  539. else {
  540. $time = getTime();
  541. $data = request()->post();
  542. $info = in_array($type,[0,2]) ? Db::name('todo')->where('id',$id)->find(): Db::name('orders')->where('id',$id)->find();
  543. $orderId = in_array($type,[0,2]) ? $info['order_id'] : $info['id'];
  544. $pusharr = []; // 需要推送给工人
  545. if (!isset($data['to_user_id']) || empty($data['to_user_id'])) {
  546. $this->error('请选择执行人');
  547. }
  548. if ($type == 0 && $info['todo_mode'] != 1){
  549. $this->error('当前状态无法重新派单');
  550. }
  551. Db::startTrans();
  552. try {
  553. if ($type == 0){
  554. Db::name('todo')->where('id',$id)->update(['del'=>1]);
  555. Db::name('task')->where('bus_id',$id)->delete();
  556. Db::name('ai_send_success')->where('todo_id', $id)
  557. ->update(['del' => 1]);
  558. }elseif ($type == 1){
  559. Db::name('ai_send_fail')->where('order_id', $orderId)
  560. ->update(['status' => 1,'user_id',$this->userId]);
  561. }elseif ($type == 2){
  562. Db::name('todo')->where('id',$id)->update(['todo_mode'=>7]);
  563. Db::name('task')->where('bus_id',$id)->delete();
  564. }
  565. $send_user_num = $model->sendUserNum($info['work_type_mode'],$info['org_id']);
  566. $users = explode(',', $data['to_user_id']);
  567. if($send_user_num==1 && count($users) >1){
  568. $this->error('执行人只能选择单人');
  569. }
  570. $to_user_id = array_unique($users);
  571. $todoData = [
  572. 'order_id' => $orderId,
  573. 'todo_content' => $data['todo_content'],
  574. 'create_user_id' => $this->userId,
  575. 'org_id' => $info['org_id'],
  576. 'create_time' => $time,
  577. 'todo_mode' => 1,
  578. 'work_type_mode' => $info['work_type_mode'],
  579. 'create_yyyy' => date('Y'),
  580. 'create_yyyymm' => date('Ym'),
  581. 'create_yyyymmdd' => date('Ymd'),
  582. ];
  583. $taskData = [
  584. 'org_id' => $info['org_id'],
  585. 'type' => 1,
  586. 'start_time' => $time,
  587. 'create_time' => $time,
  588. ];
  589. if ($type == 0){
  590. if($info['work_type_mode']==1){
  591. $orderRepair = Db::name('order_repair')
  592. ->where('order_id',$info['id'])
  593. ->find();
  594. $taskData['priority'] = !empty($orderRepair) && $orderRepair['repair_priority']==3?1:0;
  595. }else if ($info['work_type_mode']==3){
  596. $order_convey = Db::name('order_convey')
  597. ->where('order_id',$info['id'])
  598. ->find();
  599. $taskData['priority'] = !empty($order_convey) && $order_convey['priority']==3?2:0;
  600. }
  601. }
  602. $sns = [];
  603. foreach ($to_user_id as $k => $v) {
  604. if(empty($v)){
  605. continue;
  606. }
  607. $todoData['to_user_id'] = $v;
  608. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  609. while (true){
  610. if(in_array($todoData['sn'],$sns)){
  611. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  612. }else{
  613. $sns[] = $todoData['sn'];
  614. break;
  615. }
  616. }
  617. $res = Db::name('todo')
  618. ->insertGetId($todoData);
  619. if (!$res) {
  620. \exception('执行人:' . $v . '派单失败');
  621. }
  622. $pusharr[] = [
  623. 'user_id' => $v,
  624. 'todo_id' => $res
  625. ];
  626. $taskData['user_id'] = $v;
  627. $taskData['bus_id'] = $res;
  628. $res = Db::name('task')
  629. ->insert($taskData);
  630. if (!$res) {
  631. \exception('执行人:' . $v . '任务保存失败');
  632. }
  633. }
  634. $res = Db::name('orders')->where('id', $orderId)
  635. ->update(['order_mode' => 4, 'send_time' => $time]);
  636. if (!$res) {
  637. \exception('订单更新失败');
  638. }
  639. Db::commit();
  640. if($pusharr){
  641. foreach ($pusharr as $k=>$v){
  642. // 极光推送
  643. send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);
  644. }
  645. }
  646. $this->success('操作成功');
  647. }catch (DbException $e){
  648. Db::rollback();
  649. $this->error($e->getMessage());
  650. }
  651. }
  652. }
  653. public function history(){
  654. $mode = input('mode',0,'intval');
  655. if(request()->isAjax()){
  656. //分页参数
  657. $length = input('rows',10,'intval'); //每页条数
  658. $page = input('page',1,'intval'); //第几页
  659. $start = ($page - 1) * $length; //分页开始位置
  660. //排序
  661. $sortRow = input('sidx','a.id','trim'); //排序列
  662. $sort = input('sord','desc','trim'); //排序方式
  663. $order = $sortRow.' '.$sort;
  664. $sn = input('sn','','trim');
  665. $s = input('start','');
  666. $e= input('end','');
  667. $del= input('del','');
  668. $query = Db::name('ai_send_success')
  669. ->alias('a')
  670. ->join('orders o','a.order_id = o.id')
  671. ->where('a.org_id', $this->orgId)
  672. ->when($mode > 0,function ($query) use($mode){
  673. $query->where('a.mode', $mode);
  674. })->when($del != '',function ($query) use($del){
  675. $query->where('a.del', $del);
  676. }) ->when($s,function ($query) use($s){
  677. $query->where('a.create_time','>=', $s);
  678. })->when($e,function ($query) use($e){
  679. $query->where('a.create_time','<=', $e);
  680. })->when($sn,function ($query) use($sn){
  681. $query->where('o.sn', $sn);
  682. })
  683. ->field('a.*,o.sn,o.user_id as uid');
  684. //数据查询
  685. $todoList = $query
  686. ->order('a.create_time desc')
  687. ->limit(($page -1) * $length,$length)
  688. ->select();
  689. $userIds = array_column($todoList,'uid');
  690. $toUserIds = array_column($todoList,'user_id');
  691. $allIds = array_unique(array_merge($toUserIds,$userIds));
  692. $users = Db::name('user')->whereIn('id',$allIds)->column('real_name','id');
  693. foreach ($todoList as &$v){
  694. $v['user'] = $users[$v['uid']]??'';
  695. $v['toUser'] = $users[$v['user_id']]??'';
  696. $v['type'] = self::$types[$v['mode']]??'';
  697. }
  698. unset($v);
  699. //数据返回
  700. $totalCount = $query->removeOption('limit')->count();
  701. $totalPage = ceil($totalCount/$length);
  702. $result['page'] = $page;
  703. $result['total'] = $totalPage;
  704. $result['records'] = $totalCount;
  705. $result['rows'] = $todoList;
  706. return json($result);
  707. }else{
  708. $this->assign('mode',$mode);
  709. $this->assign('types',self::$types);
  710. return $this->fetch();
  711. }
  712. }
  713. public function UnDispatched(){
  714. $mode = input('mode',0,'intval');
  715. if(request()->isAjax()){
  716. //分页参数
  717. $length = input('rows',10,'intval'); //每页条数
  718. $page = input('page',1,'intval'); //第几页
  719. $start = ($page - 1) * $length; //分页开始位置
  720. //排序
  721. $sortRow = input('sidx','a.id','trim'); //排序列
  722. $sort = input('sord','desc','trim'); //排序方式
  723. $order = $sortRow.' '.$sort;
  724. $sn = input('sn',null,'trim');
  725. $query = Db::name('orders')
  726. ->where('org_id',$this->orgId)
  727. ->where('order_mode',1)
  728. ->where('del',0)
  729. ->whereIn('work_type_mode',[1,2,3,4])
  730. ->when($mode > 0,function ($query) use($mode){
  731. $query->where('work_type_mode', $mode);
  732. })
  733. ->where('create_yyyymmdd',date('Ymd'))
  734. ->whereNotExists(function ($query) {
  735. $query->table('ai_send_fail')
  736. ->whereColumn('ai_send_fail.order_id', 'orders.id');
  737. })
  738. ->where('order_mode',1)
  739. ->when(!is_null($sn),function ($query) use($sn){
  740. $query->where('sn', $sn);
  741. })
  742. ->field('id,sn,work_type_mode,user_id');
  743. //数据查询
  744. $orderList = $query
  745. ->limit(($page -1) * $length,$length)
  746. ->select();
  747. $users = Db::name('user') ->whereIn('id',array_unique(array_column($orderList,'user_id'))) ->column('real_name','id');
  748. $i = 1;
  749. foreach ($orderList as &$v2){
  750. $v2['user'] = $users[$v2['user_id']]??'';
  751. $v2['type'] = self::$types[$v2['work_type_mode']]??'';
  752. $v2['flag'] = 0;
  753. if ($i <= 20){
  754. $v2['flag'] = 1;
  755. $i ++;
  756. }
  757. }
  758. unset($v2);
  759. //数据返回
  760. $totalCount = $query->removeOption('limit')->count();
  761. $totalPage = ceil($totalCount/$length);
  762. $result['page'] = $page;
  763. $result['total'] = $totalPage;
  764. $result['records'] = $totalCount;
  765. $result['rows'] = $orderList;
  766. return json($result);
  767. }else{
  768. $this->assign('mode',$mode);
  769. $this->assign('types',self::$types);
  770. return $this->fetch();
  771. }
  772. }
  773. public function abnormal()
  774. {
  775. $type= input('type',0,'intval');
  776. if(request()->isAjax()) {
  777. $sn = input('sn','','trim');
  778. if ($type == 1) { //异常
  779. $query = Db::name('ai_send_fail')
  780. ->alias('a')
  781. ->join('orders o', 'a.order_id = o.id')
  782. ->where('a.org_id', $this->orgId)
  783. ->where('a.status', 0)
  784. // ->whereTime('a.create_time', 'today')
  785. ->when($sn,function ($query) use($sn){
  786. $query->where('o.sn', $sn);
  787. })
  788. ->field('o.sn,o.user_id,o.work_type_mode,o.id');
  789. } else {//驳回
  790. $query = Db::name('todo')
  791. ->alias('a')
  792. ->join('orders o', 'a.order_id = o.id')
  793. ->where('a.org_id', $this->orgId)
  794. ->where('a.create_user_id', -1)
  795. ->where('a.todo_mode', 4)
  796. // ->whereTime('a.create_time', 'today')
  797. ->when($sn,function ($query) use($sn){
  798. $query->where('o.sn', $sn);
  799. })
  800. ->field('o.sn,o.user_id,o.work_type_mode,a.id,a.to_user_id');
  801. }
  802. $lists = $query->order('o.id desc')->select();
  803. $users = Db::name('user')->whereIn('id', array_unique(array_column($lists, 'user_id')))->column('real_name', 'id');
  804. foreach ($lists as &$v2) {
  805. $v2['user'] = $users[$v2['user_id']] ?? '';
  806. $v2['type'] = self::$types[$v2['work_type_mode']] ?? '';
  807. if ($type == 2) {
  808. $v2['toUser'] = Db::name('user')->where('id',$v2['to_user_id'])->value('real_name')??'';
  809. }
  810. $v2['status'] = '派单未匹配';
  811. }
  812. unset($v2);
  813. //数据返回
  814. $totalCount = $query->count();
  815. $totalPage = 1;
  816. $result['page'] = 1;
  817. $result['total'] = $totalPage;
  818. $result['records'] = $totalCount;
  819. $result['rows'] = $lists;
  820. return json($result);
  821. }else{
  822. $this->assign('type',$type);
  823. return $this->fetch();
  824. }
  825. }
  826. }