+----------------------------------------------------------------------------------------------- */ declare (strict_types = 1); namespace app\api\controller; use app\api\BaseController; use think\facade\Db; class Check extends BaseController { //获取审核流程 public function get_flows($check_name='') { $cate_id = Db::name('FlowCate')->where(['name' => $check_name,'status'=>1])->value('id'); $flow = Db::name('Flow')->where(['cate_id' => $cate_id,'status'=>1,'delete_time'=>0])->select()->toArray(); return to_assign(0, '', $flow); } //获取审核步骤人员 public function get_flow_users($id=0) { $flow = Db::name('Flow')->where(['id' => $id])->find(); $flow_data = unserialize($flow['flow_list']); if(!empty($flow_data)){ foreach ($flow_data as $key => &$val) { $val['check_position'] = ''; if($val['check_role'] == 1){ $val['check_uids'] = get_department_leader($this->uid); } if($val['check_role'] == 2){ $val['check_uids'] = get_department_leader($this->uid,1); } if($val['check_role'] == 3){ $val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title'); $check_uids = Db::name('Admin')->where(['position_id'=>$val['check_position_id'],'status'=>1])->column('id'); $val['check_uids'] = implode(',',$check_uids); } $val['check_uids_info'] = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray(); } } else{ $flow_data = []; } $data['copy_uids'] = $flow['copy_uids']; $data['copy_unames'] =''; if(!empty($flow['copy_uids'])){ $copy_unames = Db::name('Admin')->where('id', 'in', $flow['copy_uids'])->column('name'); $data['copy_unames'] = implode(',', $copy_unames); } $data['flow_data'] = $flow_data; return to_assign(0, '', $data); } //提交审批申请 public function submit_check() { $param = get_params(); $flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find(); $flow_list = Db::name('Flow')->where('id',$param['flow_id'])->value('flow_list'); $flow = unserialize($flow_list); $subject = $flow_cate['title']; $check_table = $flow_cate['check_table']; //var_dump($flow);exit; //删除原来的审核流程和审核记录 Db::name('FlowStep')->where(['action_id'=>$param['action_id'],'flow_id'=>$param['flow_id'],'delete_time'=>0])->update(['delete_time'=>time()]); Db::name('FlowRecord')->where(['action_id'=>$param['action_id'],'check_table'=>$check_table,'delete_time'=>0])->update(['delete_time'=>time()]); $recordData=array( 'action_id' => $param['action_id'], 'check_table' => $check_table, 'step_id' => 0, 'check_uid' => $this->uid, 'flow_id' => $param['flow_id'], 'check_time' => time(), 'check_status' => 0, 'content' => '提交申请', 'create_time' => time() ); if (!isset($param['check_uids'])) { //非自由审批模式 $step=[]; $sort=0; foreach ($flow as $key => &$value){ if($value['check_role'] == 1){ $value['check_uids'] = get_department_leader($this->uid); $value['flow_name'] = '当前部门负责人'; $value['check_position_id']=0; } if($value['check_role'] == 2){ $value['check_uids'] = get_department_leader($this->uid,1); $value['flow_name'] = '上级部门负责人'; $value['check_position_id']=0; } if($value['check_role'] == 3){ $check_position = Db::name('Position')->where('id',$value['check_position_id'])->value('title'); $check_uids = Db::name('Admin')->where(['position_id'=>$value['check_position_id'],'status'=>1])->column('id'); $value['check_uids'] = implode(',',$check_uids); $value['flow_name'] = $check_position; } if($value['check_role'] == 4){ $value['flow_name'] = '指定人员'; $value['check_position_id']=0; } if($value['check_role'] == 5){ $value['flow_name'] = '指定人员'; $value['check_position_id']=0; $value['check_types']=1; } if(!empty($value['check_uids'])){ $step[]=[ 'action_id' => $param['action_id'], 'flow_id' => $param['flow_id'], 'flow_name' => $value['flow_name'], 'check_position_id' => $value['check_position_id'], 'check_role' => $value['check_role'], 'check_types' => $value['check_types'], 'check_uids' => $value['check_uids'], 'create_time' => time(), 'sort'=>$sort ]; $sort++; } } if(empty($step)){ return to_assign(1,'审批流程设置有问题,无法提交审批申请,请联系HR或者管理员重新设置审批流程'); } $res = Db::name('FlowStep')->strict(false)->field(true)->insertAll($step); if($res!=false){ Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData); Db::name($check_table)->strict(false)->field(true)->update([ 'id'=>$param['action_id'], 'check_flow_id'=>$param['flow_id'], 'check_status'=>1, 'check_step_sort'=>0, 'check_uids'=>$step[0]['check_uids'], 'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:'' ]); //发送消息通知 if($flow_cate['template_id']>0){ $msg=[ 'from_uid'=>$this->uid,//发送人 'to_uids'=>$step[0]['check_uids'],//接收人 'template_id'=>$flow_cate['template_id'],//消息模板ID 'template_field'=>'0',//消息模板字段 'content'=>[ //消息内容 'create_time'=>date('Y-m-d H:i:s'), 'action_id'=>$param['action_id'], 'title' => $subject ] ]; event('SendMessage',$msg); } return to_assign(); } else{ return to_assign(1,'操作失败'); } } else{ //自由审批模式 $flow_step = array( 'action_id' => $param['action_id'], 'flow_id' => $param['flow_id'], 'flow_name' => '自由审批', 'check_uids' => $param['check_uids'], 'create_time' => time() ); $res = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step); if($res!=false){ Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData); Db::name($check_table)->strict(false)->field(true)->update([ 'id'=>$param['action_id'], 'check_flow_id'=>$param['flow_id'], 'check_status'=>1, 'check_step_sort'=>0, 'check_uids'=>$param['check_uids'], 'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:'' ]); //发送消息通知 if($flow_cate['template_id']>0){ $msg=[ 'from_uid'=>$this->uid,//发送人 'to_uids'=>$param['check_uids'],//接收人 'template_id'=>$flow_cate['template_id'],//消息模板ID 'template_field'=>'0',//消息模板字段 'content'=>[ //消息内容 'create_time'=>date('Y-m-d H:i:s'), 'action_id'=>$param['action_id'], 'title' => $subject ] ]; event('SendMessage',$msg); } return to_assign(); } else{ return to_assign(1,'操作失败'); } } } //获取审核流程节点 public function get_flow_nodes($check_name='',$action_id=0,$flow_id=0) { $flow_cate = Db::name('FlowCate')->where(['name' => $check_name])->find(); if($action_id==0){ $did = $this->did; $map = []; $map[] = ['cate_id','=',$flow_cate['id']]; $map[] = ['status','=',1]; $map[] = ['delete_time','=',0]; $map1=[ ['department_ids','=',''] ]; $map2=[ ['', 'exp', Db::raw("FIND_IN_SET('{$did}',department_ids)")] ]; $whereOr =[$map1,$map2]; $flow = Db::name('Flow') ->where($map) ->where(function ($query) use($whereOr) { if (!empty($whereOr)){ $query->whereOr($whereOr); } }) ->select()->toArray(); return to_assign(0, '', $flow); } $check_table = $flow_cate['check_table']; $detail = Db::name($check_table)->where('id',$action_id)->field('id,admin_id,check_status,check_flow_id,check_step_sort,check_uids,check_copy_uids')->find(); //创建人 $is_creater=0; if($detail['admin_id'] == $this->uid){ $is_creater=1; } $detail['is_creater'] = $is_creater; $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); //当前审批人 $is_checker=0; if(in_array($this->uid,explode(',',$detail['check_uids']))){ $is_checker=1; } $detail['is_checker'] = $is_checker; //审批记录 $check_record = Db::name('FlowRecord') ->field('f.*,a.name') ->alias('f') ->join('Admin a', 'a.id = f.check_uid', 'left') ->where(['f.action_id' => $action_id,'f.check_table'=>$check_table])->select()->toArray(); foreach ($check_record as $kk => &$vv) { $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']); $vv['status_str'] = '提交'; if($vv['check_status'] == 1){ $vv['status_str'] = '审核通过'; } else if($vv['check_status'] == 2){ $vv['status_str'] = '审核拒绝'; } if($vv['check_status'] == 3){ $vv['status_str'] = '撤销'; } if($vv['check_status'] == 4){ $vv['status_str'] = '反确认'; } } $detail['check_record'] = $check_record; if($detail['check_status']==0 || $detail['check_status']==4){ $flow = Db::name('Flow')->where(['cate_id' => $flow_cate['id'],'status'=>1,'delete_time'=>0])->select()->toArray(); $detail['flow'] = $flow; } else{ //当前审批人 $detail['check_unames']='-'; if(!empty($detail['check_uids'])){ $check_unames = Db::name('Admin')->where('id','in',$detail['check_uids'])->column('name'); $detail['check_unames'] = implode(',',$check_unames); } //抄送人 $detail['copy_unames']='-'; if(!empty($detail['check_copy_uids'])){ $copy_uids = Db::name('Admin')->where('id','in',$detail['check_copy_uids'])->column('name'); $detail['copy_unames'] = implode(',',$copy_uids); } //审批节点步骤 $nodes = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'delete_time'=>0])->order('sort asc')->select()->toArray(); foreach ($nodes as $key => &$val) { $check_uids_info = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray(); foreach ($check_uids_info as $k => &$v) { $v['check_time'] = 0; $v['content'] = ''; $v['check_status'] = 0; $check_array = Db::name('FlowRecord')->where(['check_uid' => $v['id'],'step_id' => $val['id']])->order('check_time desc')->select()->toArray(); if(!empty($check_array)){ $checked = $check_array[0]; $v['check_time'] = date('Y-m-d H:i', $checked['check_time']); $v['content'] = $checked['content']; $v['check_status'] = $checked['check_status']; } } $val['check_uids_info'] = $check_uids_info; if(!empty($val['check_position_id'])){ $val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title'); } else{ $val['check_position'] = ''; } $check_list = []; foreach ($check_record as $kkk => $vvv) { if($vvv['step_id'] == $val['id']) $check_list[] = $vvv; } $val['check_list'] = $check_list; } $detail['nodes'] = $nodes; //当前审核节点 $step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find(); $detail['step'] = $step; } return to_assign(0, '', $detail); } //流程审核 public function flow_check() { $param = get_params(); $flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find(); $subject = $flow_cate['title']; $action_id = $param['action_id']; $check_table = $flow_cate['check_table']; //审核内容详情 $detail = Db::name($check_table)->where(['id' => $action_id])->find(); if (empty($detail)){ return to_assign(1,'审批数据错误'); } //当前审核节点详情 $step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find(); //审核通过时 if($param['check'] == 1){ $check_uids = explode(",",strval($detail['check_uids'])); if (!in_array($this->uid, $check_uids)){ return to_assign(1,'您没权限审核该审批'); } //审批通过 if($step['check_role'] == 0){ //自由人审批 if($param['check_node'] == 2){ $next_step = $detail['check_step_sort']+1; $flow_step = array( 'action_id' => $action_id, 'sort' => $next_step, 'flow_id' => $detail['check_flow_id'], 'check_uids' => $param['check_uids'], 'create_time' => time() ); $fid = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step); //下一步审核步骤 $param['check_step_sort'] = $next_step; $param['check_status'] = 1; } else{ //不存在下一步审核,审核结束 $param['check_status'] = 2; $param['check_uids'] =''; } } else{ //查询当前步骤审批记录数 $check_count = Db::name('FlowRecord')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'step_id'=>$step['id']])->count(); //当前当前步骤审批应有记录数 $flow_count = explode(',', $step['check_uids']); $param['check_status'] = 1; $uids_array = explode(',',$detail['check_uids']); $new_uids= array_diff($uids_array, [$this->uid]); $param['check_uids'] = implode(',',$new_uids); if((($check_count+1) >= count($flow_count) && $step['check_types']==1) || $step['check_types']==2){ //会签 $next_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']+1),'delete_time'=>0])->find(); if($next_step){ //存在下一步审核 if($next_step['check_role'] == 1){ $param['check_uids'] = get_department_leader($detail['admin_id']); } else if($next_step['check_role'] == 2){ $param['check_uids'] = get_department_leader($detail['admin_id'],1); } else if($next_step['check_role'] == 3){ $uids = Db::name('Admin')->where(['position_id'=>$next_step['check_position_id'],'status'=>1])->column('id'); $param['check_uids'] = implode(',' ,$uids); } else{ $param['check_uids'] = $next_step['check_uids']; } $param['check_step_sort'] = $detail['check_step_sort']+1; $param['check_status'] = 1; } else{ //不存在下一步审核,审核结束 $param['check_status'] = 2; $param['check_uids'] =''; } } } if($param['check_status'] == 1 && empty($param['check_uids'])){ return to_assign(1,'找不到下一步的审批人,该审批流程设置有问题,请联系HR或者管理员'); } //添加历史审核人 if(empty($detail['check_history_uids'])){ $param['check_history_uids'] = $this->uid; } else{ $param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid; } $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param); if($res!==false){ $checkData=array( 'action_id' => $action_id, 'check_table' => $check_table, 'step_id' => $step['id'], 'check_uid' => $this->uid, 'flow_id' => $detail['check_flow_id'], 'check_time' => time(), 'check_status' => $param['check'], 'content' => $param['content'], 'create_time' => time() ); $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); add_log('check', $action_id, $param,$subject); //发送消息通知 if($param['check_status'] == 1){ if($flow_cate['template_id']>0){ $msg=[ 'from_uid'=>$detail['admin_id'],//发送人 'to_uids'=>$param['check_uids'],//接收人 'template_id'=>$flow_cate['template_id'],//消息模板ID 'template_field'=>'0',//消息模板字段 'content'=>[ //消息内容 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), 'action_id'=>$action_id, 'title' => $subject ] ]; event('SendMessage',$msg); } } if($param['check_status'] == 2){ if($flow_cate['template_id']>0){ $msg=[ 'from_uid'=>$this->uid,//发送人 'to_uids'=>$detail['admin_id'],//接收人 'template_id'=>$flow_cate['template_id'],//消息模板ID 'template_field'=>'1',//消息模板字段 'content'=>[ //消息内容 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), 'action_id'=>$action_id, 'title' => $subject ] ]; event('SendMessage',$msg); } } return to_assign(); } else{ return to_assign(1,'操作失败'); } } else if($param['check'] == 2){ $check_uids = explode(",",strval($detail['check_uids'])); if (!in_array($this->uid, $check_uids)){ return to_assign(1,'您没权限审核该审批'); } //拒绝审核,数据操作 $param['check_status'] = 3; //添加历史审核人 if(empty($detail['check_history_uids'])){ $param['check_history_uids'] = $this->uid; } else{ $param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid; } $param['check_uids'] =''; if($step['check_role'] == 5){ //获取上一步的审核信息 $prev_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']-1),'delete_time'=>0])->find(); if($prev_step){ //存在上一步审核 $param['check_step_sort'] = $prev_step['sort']; $param['check_uids'] = $prev_step['check_uids']; $param['check_status'] = 1; } else{ //不存在上一步审核,审核初始化步骤 $param['check_step_sort'] = 0; $param['check_uids'] = ''; $param['check_status'] = 0; } } $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param); if($res!==false){ $checkData=array( 'action_id' => $action_id, 'check_table' => $check_table, 'step_id' => $step['id'], 'check_uid' => $this->uid, 'flow_id' => $detail['check_flow_id'], 'check_time' => time(), 'check_status' => $param['check'], 'content' => $param['content'], 'create_time' => time() ); $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); add_log('refue', $action_id, $param,$subject); //发送消息通知 if($flow_cate['template_id']>0){ $msg=[ 'from_uid'=>$this->uid,//发送人 'to_uids'=>$detail['admin_id'],//接收人 'template_id'=>$flow_cate['template_id'],//消息模板ID 'template_field'=>'2',//消息模板字段 'content'=>[ //消息内容 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), 'action_id'=>$detail['id'], 'title' => $subject ] ]; event('SendMessage',$msg); } return to_assign(); } else{ return to_assign(1,'操作失败'); } } else if($param['check'] == 3){ //审批撤回 if($detail['admin_id'] != $this->uid){ return to_assign(1,'你没权限操作'); } //撤销审核,数据操作 $param['check_status'] = 4; $param['check_uids'] =''; $param['check_step_sort'] =0; $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param); if($res!==false){ $checkData=array( 'action_id' => $action_id, 'check_table' => $check_table, 'step_id' => $step['id'], 'check_uid' => $this->uid, 'flow_id' => $detail['check_flow_id'], 'check_time' => time(), 'check_status' => $param['check'], 'content' => $param['content'], 'create_time' => time() ); $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); add_log('back', $action_id, $param,$subject); return to_assign(); }else{ return to_assign(1,'操作失败'); } } else if($param['check'] == 4){ //审批反确认 //反确认审核,数据回到待提交审批 $param['check_status'] = 0; $param['check_uids'] =''; $param['check_step_sort'] =0; $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param); if($res!==false){ $checkData=array( 'action_id' => $action_id, 'check_table' => $check_table, 'step_id' => $step['id'], 'check_uid' => $this->uid, 'flow_id' => $detail['check_flow_id'], 'check_time' => time(), 'check_status' => $param['check'], 'content' => $param['content'], 'create_time' => time() ); $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); add_log('back', $action_id, $param,$subject); return to_assign(); }else{ return to_assign(1,'操作失败'); } } } }