Approval.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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 Approval extends Model
  8. {
  9. public function add(){
  10. $data = [
  11. 'id' => input('id/d',0),
  12. 'org_id' => input('orgId/d',0),
  13. 'title' => input('title','','trim'),
  14. 'cate_id' => input('cateId/d','0'),
  15. 'icon' => input('icon','','trim'),
  16. 'remark' => input('remark','','trim'),
  17. 'approval_tips' => input('approvalTips','','trim'),
  18. 'approval_required' => input('approvalRequired/d',0),
  19. 'approval_visible' => input('approvalVisible/d',0),
  20. 'form_json' => input('formJson','','trim'),
  21. 'flow_json' => input('flowJson','','trim'),
  22. 'type_Id' => input('typeId/d',0),
  23. 'advanced' => input('advanced/d',0),
  24. 'approvalSponsor' => input('approvalSponsor','','trim'),
  25. 'max_day' => input('maxDay/d',0)
  26. ];
  27. $logdata = json_encode($data);
  28. $result = validate('Approval')->check($data,[],'add');
  29. if(true !== $result){
  30. HelpHander::error(validate('Approval')->getError());
  31. }
  32. $approvalSponsor = $data['approvalSponsor'];
  33. unset($data['approvalSponsor']);
  34. $id = $data['id'];
  35. unset($data['id']);
  36. $this->startTrans();
  37. try{
  38. $approvalId = $id;
  39. if($id > 0){
  40. $data['update_time'] = date('Y-m-d H:i:s');
  41. $ret = $this->allowField(true)->save($data,['id'=>$id]);
  42. }else{
  43. $data['create_time'] = date('Y-m-d H:i:s');
  44. $ret = $this->allowField(true)->save($data);
  45. $approvalId = $this->id;
  46. }
  47. if(!$ret){
  48. \exception('数据保存失败');
  49. }
  50. // 添加权限
  51. if($id > 0){
  52. Db::name('approval_sponsor')->where('approval_id',$id)->delete();
  53. }
  54. $approvalSponsor = json_decode($approvalSponsor,true);
  55. $sponsor = [];
  56. foreach ($approvalSponsor as $k=>$v){
  57. $sponsor[] = [
  58. 'sponsor_id' => $v['sponsorId'],
  59. 'approval_id' => $approvalId,
  60. 'type' => $v['type'],
  61. 'org_id' => $data['org_id']
  62. ];
  63. }
  64. Db::name('approval_sponsor')->insertAll($sponsor);
  65. $this->commit();
  66. }catch (Exception $e){
  67. $this->rollback();
  68. HelpHander::error('操作失败'.$e->getMessage());
  69. }
  70. if($id > 0){
  71. $content = '修改审批流程';
  72. }else{
  73. $content = '添加审批流程';
  74. }
  75. model('ActionLog')->add(2,$content,0,$logdata);
  76. return true;
  77. }
  78. public function lists($orgId){
  79. if($orgId){
  80. $map[] = ['org_id','=',$orgId];
  81. }
  82. $map[] = ['del','=',0];
  83. $lists = $this
  84. ->where($map)
  85. ->order('id asc')
  86. ->select();
  87. return $lists?$lists->toArray():[];
  88. }
  89. public function info($id,$userId,$orgId){
  90. $info = $this->where('id',$id)->where('del',0)->find();
  91. if(!$info){
  92. HelpHander::error('数据不存在');
  93. }
  94. $info = $info->toArray();
  95. $approvalSponsor = Db::name('approval_sponsor')->where('approval_id',$id)->select();
  96. $info['approval_sponsor'] = $approvalSponsor;
  97. $info['dep_list'] = model('Dep')->getUserDep($userId,$orgId);
  98. $flowJson = json_decode($info['flow_json'],true);
  99. $nodeList = $flowJson['nodeList'];
  100. $flowJson['nodeList'] = $this->formatNodeList($nodeList,$userId);
  101. $info['flow_json'] = json_encode($flowJson,JSON_UNESCAPED_UNICODE);
  102. if($info['advanced'] == 19){ //中心发文,把当前编号添加的选择项中
  103. $maxsn1 = Db::name('post_apply')
  104. ->where('status',1)
  105. ->where('type','新华')
  106. ->where('year',date('Y'))
  107. ->order('id desc')
  108. ->value('sn');
  109. $sn1 = $maxsn1>0?$maxsn1 + 1:1;
  110. $maxsn2 = Db::name('post_apply')
  111. ->where('status',1)
  112. ->where('type','新华人字')
  113. ->where('year',date('Y'))
  114. ->order('id desc')
  115. ->value('sn');
  116. $sn2 = $maxsn2>0?$maxsn2 + 1:1;
  117. $defaultOptions = [
  118. ['idx'=>1,'text'=>'发改基建'],
  119. ['idx'=>2,'text'=>'发改基人'],
  120. ['idx'=>3,'text'=>'新华['.$sn1.']号'],
  121. ['idx'=>4,'text'=>'新华人字['.$sn2.']号'],
  122. ];
  123. $formJson = json_decode($info['form_json'],true);
  124. foreach ($formJson as $k=>$v){
  125. if($v['componentName'] == 'ddpostfield'){
  126. foreach ($v['components'] as $kk => $vv){
  127. if($vv['idx'] == 0){
  128. $formJson[$k]['components'][$kk]['defaultOptions'] = $defaultOptions;
  129. }
  130. }
  131. }
  132. }
  133. $info['form_json'] = json_encode($formJson,JSON_UNESCAPED_UNICODE);
  134. }
  135. trace($info);
  136. return $info;
  137. }
  138. // 格式化节点人员
  139. private function formatNodeList($nodeList,$userId){
  140. foreach ($nodeList as $k=>$v){
  141. if($v['type'] == 2){ // 审批节点
  142. $approval = $v['approval'];
  143. // 1=指定成员 2=角色 3=主管 4=发起人自选 5=发起人自己
  144. $users = [];
  145. if($approval['type'] == 1){ //指定成员
  146. if(!empty($approval['selectUser'])){
  147. foreach ($approval['selectUser'] as $key=>$val){
  148. $users[] = [
  149. 'name' => $val['name'],
  150. 'userId' => $val['id']
  151. ];
  152. }
  153. }
  154. } else if($approval['type'] == 2){ //角色
  155. if(!empty($approval['rolesId'])){
  156. $users = Db::name('user_roles')
  157. ->alias('ur')
  158. ->join('user u','u.id = ur.user_id')
  159. ->join('user_info ui','u.id = ui.user_id')
  160. ->where('ur.roles_id',$approval['rolesId'])
  161. ->where('u.del',0)
  162. ->where('u.enable',1)
  163. ->field('u.id as userId,ui.name')
  164. ->select();
  165. $users = $users?$users:[];
  166. }
  167. } else if ($approval['type'] == 3){ //主管
  168. $leaderids = Db::name('user_job')
  169. ->alias('uj')
  170. ->join('job j','j.id = uj.job_id')
  171. ->where('uj.user_id',$userId)
  172. ->where('j.del',0)
  173. ->where('j.enable',1)
  174. ->column('j.leader');
  175. if($leaderids){
  176. $jobs = Db::name('job')
  177. ->where('del',0)
  178. ->where('enable',1)
  179. ->where('id','in',$leaderids)
  180. ->field('id,name')
  181. ->select();
  182. $jobs = $jobs?$jobs:[];
  183. foreach ($jobs as $kk=>$vv){
  184. $userNameDtos = Db::name('user_job')
  185. ->alias('uj')
  186. ->join('user u','uj.user_id = u.id')
  187. ->join('user_info ui','ui.user_id = u.id')
  188. ->where('uj.job_id',$vv['id'])
  189. ->where('u.del',0)
  190. ->where('u.enable',1)
  191. ->field('u.id as userId,ui.name')
  192. ->select();
  193. $jobs[$kk]['userNameDtos'] = $userNameDtos?$userNameDtos:[];
  194. }
  195. $users = $jobs;
  196. }
  197. } else if ($approval['type'] == 4){ //发起人自选
  198. if($approval['optionalMode'] == 2){ // 指定人员
  199. if($approval['optionalUsers']){
  200. foreach ($approval['optionalUsers'] as $key=>$val){
  201. $users[] = [
  202. 'name' => $val['name'],
  203. 'userId' => $val['id']
  204. ];
  205. }
  206. }
  207. } else if($approval['optionalMode'] == 3){ // 指定角色
  208. if(!empty($approval['optionalRolesId'])){
  209. $users = Db::name('user_roles')
  210. ->alias('ur')
  211. ->join('user u','u.id = ur.user_id')
  212. ->join('user_info ui','u.id = ui.user_id')
  213. ->where('ur.roles_id',$approval['optionalRolesId'])
  214. ->where('u.del',0)
  215. ->where('u.enable',1)
  216. ->field('u.id as userId,ui.name')
  217. ->select();
  218. $users = $users?$users:[];
  219. }
  220. }
  221. }
  222. $approval['approverList'] = $users;
  223. $nodeList[$k]['approval'] = $approval;
  224. }
  225. }
  226. return $nodeList;
  227. }
  228. public function del($id){
  229. $ret = $this->where('id',$id)->setField('del',1);
  230. if(!$ret){
  231. HelpHander::error('删除失败');
  232. }
  233. $logdata = json_encode(['id' => $id]);
  234. model('ActionLog')->add(2,'删除审批流程',0,$logdata);
  235. return true;
  236. }
  237. public function changeStatus($id,$enable){
  238. $ret = $this->where('id',$id)->setField('enable',$enable);
  239. if(!$ret){
  240. HelpHander::error('操作失败');
  241. }
  242. return true;
  243. }
  244. // 获取用户流程
  245. public function queryApprovalCateList($userId,$orgId){
  246. // 获取用户的部门及所有上级部门
  247. $depids = model('Dep')->getUserDepIds($userId,$orgId);
  248. $map1 = [
  249. ['type','=',2],
  250. ['org_id','=',$orgId]
  251. ];
  252. $map2 = [
  253. ['type','=',0],
  254. ['sponsor_id','=',$userId]
  255. ];
  256. if(!$depids){
  257. $depids = [-1]; // 未开查询
  258. }
  259. $map3 = [
  260. ['type','=',1],
  261. ['sponsor_id','in',$depids]
  262. ];
  263. $approvalIds = Db::name('approval_sponsor')->whereOr([$map1, $map2, $map3])->column('approval_id');
  264. $lists = Db::name('approval_cate')
  265. ->where('org_id',$orgId)
  266. ->field('id,name')
  267. ->order('sort asc,id asc')
  268. ->select();
  269. $lists = $lists?$lists:[];
  270. $lists[] = [
  271. 'id' => 0,
  272. 'name' => '综合'
  273. ];
  274. $map[] = ['del','=',0];
  275. $map[] = ['enable','=',1];
  276. if($approvalIds){
  277. $map[] = ['id','in',$approvalIds];
  278. }
  279. foreach ($lists as $k=>$v){
  280. $approvalList = Db::name('approval')
  281. ->where('cate_id',$v['id'])
  282. ->where($map)
  283. ->field('id,title,remark,cate_id,icon')
  284. ->order('sort asc,id asc')
  285. ->select();
  286. $approvalList = $approvalList?$approvalList:[];
  287. foreach ($approvalList as $kk=>$vv){
  288. $approval_sponsor = Db::name('approval_sponsor')->where('approval_id',$vv['id'])->select();
  289. $approvalList[$kk]['approval_sponsors'] = $approval_sponsor?$approval_sponsor:[];
  290. }
  291. $lists[$k]['approval_sponsor_dto_list'] = $approvalList?$approvalList:[];
  292. }
  293. return $lists;
  294. }
  295. }