ImportantRecord.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. <?php
  2. namespace app\common\model;
  3. use app\hander\HelpHander;
  4. use think\Db;
  5. use think\Exception;
  6. use think\Model;
  7. class ImportantRecord extends Model
  8. {
  9. public function add(){
  10. $data = [
  11. 'id' => input('id/d',0),
  12. 'user_id' => input('uid/d',0),
  13. 'content' => input('content','','trim'),
  14. 'end_time' => input('endTime','','trim'),
  15. 'org_id' => input('orgId/d',0),
  16. 'pid' => input('pid/d',0),
  17. 'important_id' => input('importantId/d',0),
  18. ];
  19. $result = validate('ImportantRecord')->check($data,[],'');
  20. if(true !== $result){
  21. HelpHander::error(validate('ImportantRecord')->getError());
  22. }
  23. $id = $data['id'];
  24. unset($data['id']);
  25. Db::startTrans();
  26. try{
  27. if($id > 0){
  28. $ret = $this->allowField(true)->save($data,['id'=>$id]);
  29. }else{
  30. $data['status'] = 1; //所有人员默认同意
  31. $data['create_time'] = date('Y-m-d H:i:s');
  32. $ret = $this->allowField(true)->save($data);
  33. }
  34. if(!$ret){
  35. \exception('操作失败');
  36. }
  37. if($id <= 0){
  38. $id = $this->id;
  39. model('Message')->add(3,$id,14,$data['user_id'],$data['org_id'],'有一项重要事项需要您办理.');
  40. }
  41. Db::commit();
  42. }catch (Exception $e){
  43. Db::rollback();
  44. HelpHander::error($e->getMessage());
  45. }
  46. return true;
  47. }
  48. public function info($id){
  49. $info = $this->where('id',$id)->find();
  50. if(!$info){
  51. HelpHander::error('数据不存在');
  52. }
  53. $info = $info->toArray();
  54. $info['user_name'] = Db::name('user_info')->where('user_id',$info['user_id'])->value('name');
  55. $pinfo = Db::name('user_info')
  56. ->alias('ui')
  57. ->join('important_record ir','ir.user_id = ui.user_id')
  58. ->where('ir.id',$info['pid'])
  59. ->field('ui.name,ui.user_id')
  60. ->find();
  61. $info['pname'] = $pinfo?$pinfo['name']:'';
  62. $info['puser_id'] = $pinfo?$pinfo['user_id']:'';
  63. $info['annotations'] = model('ImportantRecordAnnotation')->lists($info['id']);
  64. return $info;
  65. }
  66. public function lists($orgId,$userId){
  67. $page = input('page/d',1);
  68. $size = input('size/d',10);
  69. $title = input('title','','trim');
  70. $sn = input('sn','','trim');
  71. $enable = input('enable/d',-1);
  72. $transfer = input('transfer/d',-1);
  73. $degree = input('degree/d',-1);
  74. $status = input('status/d',-1);
  75. $dep = input('dep','','trim');
  76. $user = input('user','','trim');
  77. $source = input('source','','trim');
  78. $proof = input('proof','','trim');
  79. $startTime = input('startTime','','trim');
  80. $endTime = input('endTime','','trim');
  81. $prop = input('prop','','trim');
  82. $order = input('order','','trim');
  83. if($prop == 'transferId'){
  84. $prop = 'i.transfer_id';
  85. }else if($prop == 'endTime'){
  86. $prop = 'i.end_time';
  87. }else if($prop == 'createTime'){
  88. $prop = 'i.create_time';
  89. }else if($prop == 'enable'){
  90. $prop = 'i.status';
  91. }
  92. if($prop && $order == 'ascending'){
  93. $orderby = $prop.' asc, ir.id desc';
  94. }else if($prop && $order == 'descending'){
  95. $orderby = $prop.' desc, ir.id desc';
  96. }else{
  97. $orderby = 'ir.id desc';
  98. }
  99. if($title != ''){
  100. $map[] = ['i.title','like','%'.$title.'%'];
  101. }
  102. if($sn != ''){
  103. $map[] = ['i.sn','like','%'.$sn.'%'];
  104. }
  105. if($source != ''){
  106. $map[] = ['i.source','like','%'.$source.'%'];
  107. }
  108. if($proof != ''){
  109. $map[] = ['i.proof','like','%'.$proof.'%'];
  110. }
  111. if($enable >= 0){
  112. $map[] = ['i.status','=',$enable];
  113. }
  114. if($transfer >= 0){
  115. $map[] = ['i.transfer','=',$transfer];
  116. }
  117. if($degree >= 0){
  118. $map[] = ['i.degree','=',$degree];
  119. }
  120. if($status >= 0){
  121. $map[] = ['ir.status','=',$status];
  122. }
  123. $map[] = ['i.del','=',0];
  124. $map[] = ['ir.org_id','=',$orgId];
  125. $map[] = ['ir.user_id','=',$userId];
  126. $ids = [];
  127. if($dep){
  128. $ids1 = Db::name('important_user')
  129. ->alias('iu')
  130. ->join('dep d','d.id = iu.bus_id')
  131. ->where('iu.type',0)
  132. ->where('d.name','like','%'.$dep.'%')
  133. ->column('iu.important_id');
  134. $ids1 = $ids1?$ids1:[];
  135. $ids = array_merge($ids,$ids1);
  136. }
  137. if($user){
  138. $ids2 = Db::name('important_user')
  139. ->alias('iu')
  140. ->join('user_info d','d.user_id = iu.bus_id')
  141. ->where('iu.type',2)
  142. ->where('d.name','like','%'.$user.'%')
  143. ->column('iu.important_id');
  144. $ids2 = $ids2?$ids2:[];
  145. $ids = array_merge($ids,$ids2);
  146. }
  147. $ids = array_unique($ids);
  148. if($ids){
  149. $map[] = ['i.id','in',$ids];
  150. }
  151. if($startTime && $endTime){
  152. $map[] = ['ir.create_time','>=',$startTime.' 00:00:00'];
  153. $map[] = ['ir.create_time','<=',$endTime.' 23:59:59'];
  154. }
  155. $lists = Db::name('important_record')
  156. ->alias('ir')
  157. ->join('important i','i.id = ir.important_id')
  158. ->where($map)
  159. ->page($page,$size)
  160. ->order($orderby)
  161. ->field('ir.*,i.title,i.sn,i.source,i.proof,i.title,i.superior_opinion,i.degree,i.status as istatus,
  162. i.transfer,i.remark,i.transfer_id,i.cbusers,i.deps')
  163. ->select();
  164. $lists = $lists?$lists:[];
  165. foreach($lists as $k=>$v){
  166. $cbusers = $v['cbusers']?json_decode($v['cbusers'],true):[];
  167. $names = [];
  168. foreach ($cbusers as $kk=>$vv){
  169. if($vv['type'] == 0){ // 部门
  170. $names[] = Db::name('dep')->where('id',$vv['id'])->value('name');
  171. }else{ // 用户
  172. $names[] = Db::name('user_info')->where('user_id',$vv['id'])->value('name');
  173. }
  174. }
  175. $lists[$k]['bus_name'] = implode(',',$names);
  176. $deps = $v['deps']?json_decode($v['deps'],true):[];
  177. $dnames = [];
  178. foreach ($deps as $kk=>$vv){
  179. if($vv['type'] == 0){ // 部门
  180. $dnames[] = Db::name('dep')->where('id',$vv['id'])->value('name');
  181. }else{ // 用户
  182. $dnames[] = Db::name('user_info')->where('user_id',$vv['id'])->value('name');
  183. }
  184. }
  185. $lists[$k]['deps_name'] = implode(',',$dnames);
  186. $child1 = Db::name('important_record')->where('pid',$v['id'])->where('status',2)->find();
  187. if($child1){
  188. $lists[$k]['cstatus'] = 2;
  189. }else{
  190. $child2 = Db::name('important_record')->where('pid',$v['id'])->where('status','in',[0,1,2,5])->find();
  191. if($child2){
  192. $lists[$k]['cstatus'] = 1;
  193. }else{
  194. $lists[$k]['cstatus'] = 0;
  195. }
  196. }
  197. }
  198. $total = Db::name('important_record')
  199. ->alias('ir')
  200. ->join('important i','i.id = ir.important_id')
  201. ->where($map)->count();
  202. $data = [
  203. 'total' => $total,
  204. 'list' => $lists
  205. ];
  206. return $data;
  207. }
  208. // 获取事项某一人的下级
  209. public function getNextList($importantId,$pid){
  210. $lists = Db::name('important_record')
  211. ->where('important_id',$importantId)
  212. ->where('pid',$pid)
  213. ->order('id asc')
  214. ->select();
  215. $lists = $lists?$lists:[];
  216. $curTime = date('Y-m-d H:i:s');
  217. foreach ($lists as $k=>$v){
  218. $lists[$k]['end_status'] = 0;
  219. if(in_array($v['status'],[0,1]) && $curTime > $v['end_time']){
  220. $lists[$k]['end_status'] = 1;
  221. }
  222. }
  223. return $lists;
  224. }
  225. // 获取事项某一人的所有下级
  226. public function getNextAll($importantId,$pid){
  227. $lists = [];
  228. $pids = [$pid];
  229. while (true){
  230. if(!$pids){
  231. break;
  232. }
  233. $lists2 = Db::name('important_record')
  234. ->where('important_id',$importantId)
  235. ->where('pid','in',$pids)
  236. ->order('id asc')
  237. ->select();
  238. $lists2 = $lists2?$lists2:[];
  239. $pids = [];
  240. foreach ($lists2 as $k=>$v){
  241. $pids[] = $v['id'];
  242. $lists2[$k]['user_name'] = Db::name('user_info')->where('user_id',$v['user_id'])->value('name');
  243. $lists2[$k]['pname'] = Db::name('user_info')
  244. ->alias('ui')
  245. ->join('important_record ir','ir.user_id = ui.user_id')
  246. ->where('ir.id',$v['pid'])
  247. ->value('ui.name');
  248. $lists2[$k]['annotations'] = model('ImportantRecordAnnotation')->lists($v['id']);
  249. }
  250. $lists = array_merge($lists,$lists2);
  251. }
  252. $lists = $lists?$lists:[];
  253. $curTime = date('Y-m-d H:i:s');
  254. foreach ($lists as $k=>$v){
  255. $lists[$k]['end_status'] = 0;
  256. if(in_array($v['status'],[0,1]) && $curTime > $v['end_time']){
  257. $lists[$k]['end_status'] = 1;
  258. }
  259. }
  260. return $lists;
  261. }
  262. // 撤销
  263. public function backout($id){
  264. $info = $this->info($id);
  265. if($info['status'] != 0){
  266. HelpHander::error('此状态无法撤销');
  267. }
  268. $ret = Db::name('important_record')->where('id',$id)->update(['status' => 4,'cancel_time' => date('Y-m-d H:i:s')]);
  269. if(!$ret){
  270. HelpHander::error('操作失败');
  271. }
  272. return true;
  273. }
  274. // 同意/拒绝办结
  275. public function deal($id,$type,$userId){
  276. $info = $this->info($id);
  277. if($info['status'] != 2 || $info['puser_id'] != $userId){
  278. HelpHander::error('无权限操作');
  279. }
  280. if($type == 1){ //同意
  281. $ret = Db::name('important_record')->where('id',$id)->update(['status' => 5]);
  282. if(!$ret){
  283. HelpHander::error('操作失败');
  284. }
  285. }else{ // 拒绝
  286. $ret = Db::name('important_record')->where('id',$id)->update(['status' => 1]);
  287. if(!$ret){
  288. HelpHander::error('操作失败');
  289. }
  290. // 发通知
  291. model('Message')->add(3,$id,14,$info['user_id'],$info['org_id'],'您办结的重要事项被拒绝,请知晓。');
  292. }
  293. return true;
  294. }
  295. // 接受/退回
  296. public function confirm($id,$status){
  297. $info = $this->info($id);
  298. // if($info['pid'] > 0 && $info['status'] != 0){
  299. // HelpHander::error('此状态无法执行此操作');
  300. // }
  301. // if($info['pid'] == 0 && $info['status'] != 1){
  302. // HelpHander::error('此状态无法执行此操作');
  303. // }
  304. if($info['status'] != 1){
  305. HelpHander::error('此状态无法执行此操作');
  306. }
  307. Db::startTrans();
  308. try{
  309. $ret = Db::name('important_record')->where('id',$id)->update(['status' => $status,'confirm_time' => date('Y-m-d H:i:s')]);
  310. if(!$ret){
  311. \exception('操作失败');
  312. }
  313. if($info['pid'] > 0 && $status == 3){
  314. //推送给上级不同意
  315. $precord = Db::name('important_record')->where('id',$info['pid'])->find();
  316. if($precord){
  317. $title = Db::name('important')->where('id',$precord['important_id'])->value('title');
  318. model('Message')->add(3,$precord['id'],14,$precord['user_id'],$precord['org_id'],$info['user_name'].':重要事项['.$title.']已退回,请知晓。');
  319. }
  320. }else if($info['pid'] > 0 && $status == 1){
  321. //推送给上级同意
  322. $precord = Db::name('important_record')->where('id',$info['pid'])->find();
  323. if($precord){
  324. $title = Db::name('important')->where('id',$precord['important_id'])->value('title');
  325. model('Message')->add(3,$precord['id'],14,$precord['user_id'],$precord['org_id'],$info['user_name'].':重要事项['.$title.']已同意,请知晓。');
  326. }
  327. }
  328. Db::commit();
  329. }catch (Exception $e){
  330. Db::rollback();
  331. HelpHander::error($e->getMessage());
  332. }
  333. return true;
  334. }
  335. // 转交
  336. public function tranfer($id,$userId,$toUserId){
  337. $info = $this->info($id);
  338. if($info['user_id'] != $userId){
  339. HelpHander::error('无权限操作');
  340. }
  341. if($info['status'] != 0){
  342. HelpHander::error('此状态无法执行此操作');
  343. }
  344. Db::startTrans();
  345. try{
  346. $ret = Db::name('important_record')->where('id',$id)->update(['status' => 4,'cancel_time' => date('Y-m-d H:i:s')]);
  347. if(!$ret){
  348. \exception('操作失败');
  349. }
  350. $data = [
  351. 'user_id' => $toUserId,
  352. 'content' => $info['content'],
  353. 'end_time' => $info['end_time'],
  354. 'org_id' => $info['org_id'],
  355. 'pid' => $info['pid'],
  356. 'important_id' => $info['important_id'],
  357. 'create_time' => date('Y-m-d H:i:s')
  358. ];
  359. $recordId = Db::name('important_record')->insertGetId($data);
  360. if(!$recordId){
  361. \exception('操作失败');
  362. }
  363. model('Message')->add(3,$recordId,14,$data['user_id'],$data['org_id'],'有一项重要事项需要您办理.');
  364. Db::commit();
  365. }catch (Exception $e){
  366. Db::rollback();
  367. HelpHander::error('操作失败');
  368. }
  369. return true;
  370. }
  371. // 办结
  372. public function finish(){
  373. $data = [
  374. 'id' => input('id/d',0),
  375. 'user_id' => input('userId/d',0),
  376. // 'content' => input('content','','trim'),
  377. // 'files' => input('files','','trim'),
  378. 'org_id' => input('orgId/d',0),
  379. ];
  380. if($data['id'] <= 0){
  381. HelpHander::error('参数错误');
  382. }
  383. // if(!$data['content']){
  384. // HelpHander::error('未填写办理进展');
  385. // }
  386. $info = $this->info($data['id']);
  387. if($info['user_id'] != $data['user_id']){
  388. HelpHander::error('无权限操作');
  389. }
  390. if($info['status'] != 1){
  391. HelpHander::error('此记录已处理');
  392. }
  393. // 检查是否有下级
  394. $child = Db::name('important_record')->where('pid',$data['id'])->count();
  395. if($child == 0 && empty($info['annotations'])){ // 无下级必须填写办理进度
  396. HelpHander::error('未填写办理进度,不能办结');
  397. }
  398. if($child > 0){ // 有下级,检查下级是否都已完成
  399. $res = Db::name('important_record')->where('pid',$data['id'])->whereIn('status',[0,1,2])->count();
  400. if($res){
  401. HelpHander::error('下级任务还未完成,不能办结');
  402. }
  403. }
  404. Db::startTrans();
  405. try{
  406. $status = 2;
  407. if($info['pid'] == 0){ //无上级办结无需审核,直接完成
  408. $status = 5;
  409. }
  410. $ret = Db::name('important_record')->where('id',$data['id'])->update(['status' => $status,'progress' => 100,'finish_time' => date('Y-m-d H:i:s')]);
  411. if(!$ret){
  412. \exception('操作失败');
  413. }
  414. if($info['pid'] > 0){
  415. //推送给上级已办结待审核
  416. $precord = Db::name('important_record')->where('id',$info['pid'])->find();
  417. if($precord){
  418. $title = Db::name('important')->where('id',$precord['important_id'])->value('title');
  419. model('Message')->add(3,$precord['id'],14,$precord['user_id'],$precord['org_id'],$info['user_name'].':重要事项['.$title.']已办结,请审核。');
  420. }
  421. }
  422. /*$ann = Db::name('important_record_annotation')
  423. ->where('important_record_id',$data['id'])
  424. ->where('user_id',$data['user_id'])
  425. ->where('del',0)
  426. ->order('id asc')
  427. ->find();
  428. if($ann){
  429. $ret = Db::name('important_record_annotation')
  430. ->where('id',$ann['id'])
  431. ->update([
  432. 'content' => $data['content'],
  433. 'files' => $data['files'],
  434. 'update_time' => date('Y-m-d H:i:s')
  435. ]);
  436. }else{
  437. $ret = Db::name('important_record_annotation')
  438. ->insert([
  439. 'important_record_id' => $data['id'],
  440. 'org_id' => $data['org_id'],
  441. 'user_id' => $data['user_id'],
  442. 'content' => $data['content'],
  443. 'files' => $data['files'],
  444. 'create_time' => date('Y-m-d H:i:s'),
  445. 'update_time' => date('Y-m-d H:i:s')
  446. ]);
  447. }
  448. if(!$ret){
  449. \exception('操作失败');
  450. }*/
  451. Db::commit();
  452. }catch (Exception $e){
  453. Db::rollback();
  454. HelpHander::error($e->getMessage());
  455. }
  456. return true;
  457. }
  458. public function progress($id,$progress){
  459. $info = $this->info($id);
  460. if($info['status'] == 2){
  461. HelpHander::error('已办结状态不能修改进度');
  462. }
  463. $ret = Db::name('important_record')->where('id',$id)->update(['progress' => $progress]);
  464. if(!$ret){
  465. HelpHander::error('操作失败');
  466. }
  467. return true;
  468. }
  469. public function unapply($userId){
  470. $lists = Db::name('important_record')
  471. ->alias('ir')
  472. ->join('important i','i.id = ir.important_id')
  473. ->where('ir.user_id',$userId)
  474. ->where('i.del',0)
  475. ->where('ir.status','in',[0,1])
  476. ->field('ir.id,i.title,ir.create_time')
  477. ->select();
  478. $lists = $lists?$lists:[];
  479. foreach ($lists as $k=>$v){
  480. $child1 = Db::name('important_record')->where('pid',$v['id'])->where('status',2)->find();
  481. if($child1){
  482. $lists[$k]['status'] = 2;
  483. $lists[$k]['status2'] = 3; // 办结确认
  484. }else{
  485. $child2 = Db::name('important_record')->where('pid',$v['id'])->where('status','in',[0,1,2,5])->find();
  486. if($child2){
  487. $lists[$k]['status'] = 1;
  488. $lists[$k]['status2'] = 2; // 已指派
  489. }else{
  490. $lists[$k]['status'] = 0;
  491. $lists[$k]['status2'] = 1; // 新收到
  492. }
  493. }
  494. }
  495. return $lists;
  496. }
  497. }