'require|gt:0', 'org_id' => 'require|gt:0', 'user_id' => 'require|gt:0', 'title' => 'require', 'approval_required' => 'require|in:0,1', 'approval_visible' => 'require|in:0,1', 'form_json' => 'require|checkFormJson', 'flow_json' => 'require|checkFlowJson', ]; protected $message = [ 'approval_id.require' => '参数错误', 'approval_id.gt' => '参数错误', 'org_id.require' => '参数错误', 'org_id.gt' => '参数错误', 'user_id.require' => '参数错误', 'user_id.gt' => '参数错误', 'title.require' => '参数错误', ]; protected $scene = [ ]; protected function checkFlowJson($value,$rule,$data=[]) { $flowjson = json_decode($value,true); if(!$flowjson){ return '参数错误'; } // 检查是否有审批人 $except = [1,5,9]; foreach ($flowjson as $k=>$v){ if(!in_array($v['type'],$except) && empty($v['userList'])){ if($v['type'] == 3){ return $v['name'].'没有抄送人员'; }else{ return $v['name'].'没有审批人员'; } } } return true; } protected function checkFormJson($value,$rule,$data=[]) { $formjson = json_decode($value,true); if(!$formjson){ return '参数错误'; } // 检查必填参数 foreach ($formjson as $k=>$v){ if(isset($v['defaultImportant']) && $v['defaultImportant']){ if(empty($v['values']) && empty($v['values2']) && !empty($data['unique'])){ return $v['defaultLable'].'必填'; }else if(!empty($data['unique']) && !empty($v['components'])){ foreach ($v['components'] as $kk=>$vv){ if(empty($vv['values']) && empty($vv['values2'])){ return $vv['defaultLable'].'必填'; } } } } if($v['componentName'] == 'tableareafield' && !empty($v['components'])){ // 区域 foreach ($v['components'] as $kk=>$vv){ if(isset($v['defaultImportant']) && $v['defaultImportant'] && empty($vv['values']) && empty($vv['values2'])){ return $vv['defaultLable'].'必填'; } } } else if($v['componentName'] == 'tablefield'){ // 明细 if($v['values2']){ foreach ($v['values2'] as $kk=>$vv){ foreach ($vv as $key=>$val){ if(isset($v['defaultImportant']) && $v['defaultImportant'] && empty($vv['values']) && empty($vv['values2'])){ return $vv['defaultLable'].'必填'; } } } } } } // 高级组件条件检查 switch ($data['advanced']){ case 1: // 请假 return $this->checkLeave($data,$formjson); break; case 3: // 合同会签 return $this->checkContract($data,$formjson); break; case 4: // 追加合同 return $this->checkContractAppend($data,$formjson); break; case 5: // 合同支付,只能处理一个 return $this->checkContractPay($data,$formjson); break; case 6: // 会议室预定 return $this->checkMeetingRoom($data,$formjson); break; case 7: // 合同收款,只能处理一个 return $this->checkContractGet($data,$formjson); break; case 8: // 销假 return $this->checkLeaveTerminate($data,$formjson); break; case 9: // 离京报告 return $this->checkLeaveBj($data,$formjson); break; case 10: // 办公物品 return $this->checkOffice($data,$formjson); break; case 11: // 车辆 // return $this->checkCar($data,$formjson); return true; break; case 12: // 离职/退休 return $this->checkDeparture($data,$formjson); break; case 13: // 资产领取 return $this->checkAsset($data,$formjson); break; case 14: // 资产退库 return $this->checkAssetWithdraw($data,$formjson); break; case 15: // 资产维修 return $this->checkAssetRepair($data,$formjson); break; case 16: // 资产处置 return $this->checkAssetDisposal($data,$formjson); break; case 17: // 预算 return $this->checkBudget($data,$formjson); break; case 18: // 用印 return true; break; case 19: // 中心发文 return $this->checkPost($data,$formjson); break; case 20: // 因私出国 return true; case 21: // 日常开支 return $this->checkOverhead($data,$formjson); break; default: return true; break; } } private function checkOverhead($data,$formjson){ $type = 0; $bdid = 0; $money = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddoverheadfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $money = isset($val['money'])&&!empty($money)?$val['money']:0; break; case '1': $typetext = isset($val['values'])?$val['values']:'预算内'; $type = $typetext == '预算内'?1:2; break; case '2': $val['values'] = isset($val['values'])?$val['values']:''; if($val['values']){ $d = json_decode($val['values'],true); $bdid = $d['id']; }else{ $bdid = 0; } break; } } break; } } if($type == 1){ //预算内 $bdinfo = Db::name('budget_dep')->where('id',$bdid)->find(); if(!$bdinfo){ return '预算项记录不存在'; } if($bdinfo['dep_id'] != $data['dep_id']){ return '预算部门与预算项不一致'; } if($bdinfo['real_money'] < $money){ return '预算剩余小于支出金额'; } $info = Db::name('budget_pay') ->where('del',0) ->where('status',0) ->where('type',1) ->where('dep_id',$data['dep_id']) ->where('apply_status','<>',2) ->where('bdid',$bdid) ->find(); if($info){ return '该部门有未处理的请款单'; } } return true; } private function checkPost($data,$formjson){ $values = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddpostfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $values = isset($val['values'])?$val['values']:''; break; } } break; } } if($values == '发改基建' || $values == '发改基人'){ return true; } $val = explode('[',$values); $type = $val[0]; $val2 = explode(']',$val[1]); $sn = $val2[0]; // 检查该编号是否可以申请 $ret = Db::name('post_apply') ->where('year',date('Y')) ->where('type',$type) ->where('sn',$sn) ->where('status','in','0,1') ->find(); if($ret){ return '该编号正在审核中,不能提交申请'; } return true; } private function checkBudget($data,$formjson){ $values = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddbudgetfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $values = $val['values']; break; } } break; } } $values = json_decode($values,true); $items = $values['items']; $budgetId = $items[0]['budgetId']; $depId = $data['dep_id']; $companyId = $items[0]['companyId']; //检查是否有权限提交 // $budget = Db::name('budget_auth') // ->alias('bd') // ->join('budget b','b.id = bd.budget_id') // ->where('b.del',0) // ->where('bd.dep_id',$depId) // ->where('bd.budget_id',$budgetId) // ->field('b.*') // ->order('b.id desc') // ->find(); //检查是否有预算 $budget = Db::name('budget')->where('id',$budgetId)->where('del',0)->find(); if(!$budget){ return '预算不存在'; } if($budget['enable'] == 0){ return '预算未发布,不能申请'; } $curTime = date('Y-m-d'); if($budget['start_time'] > $curTime || $budget['end_time'] < $curTime){ return '预算申请不在要求时间范围内'; } // 检查是否有权限提交 $baret = Db::name('budget_auth') ->where('type',2) ->where('dep_id',$data['user_id']) ->where('budget_id',$budgetId) ->find(); $badret = Db::name('budget_auth') ->where('type',0) ->where('dep_id',$depId) ->where('budget_id',$budgetId) ->find(); if(!$baret && !$badret){ return '无权限申请预算'; } // 检查本人是否已经提交过申请 $ret = Db::name('budget_apply') ->where('budget_id',$budgetId) ->where('company_id',$companyId) ->where('user_id',$data['user_id']) ->where('status','in','0,1') ->find(); if($ret){ return '您已提交过该类型的预算申请'; } return true; } private function checkAssetDisposal($data,$formjson){ $items = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddassetdisposalfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $items = $val['values']; break; } } break; } } $ids = []; $items = json_decode($items,true); $useids = model('AssetItems')->itemsuse($data['org_id']); foreach ($items as $k=>$v){ if(in_array($v['id'],$useids)){ return '编号:'.$v['sn'].'的资产已被使用'; }else{ $ids[] = $v['id']; $info = Db::name('asset_items')->where('id',$v['id'])->find(); if(!$info || !in_array($info['enable'],[1,2])){ return '编号:'.$v['sn'].'的资产不存在或已被使用'; } } } return true; } private function checkAssetRepair($data,$formjson){ $items = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddassetrepairfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $items = $val['values']; break; } } break; } } $ids = []; $items = json_decode($items,true); $useids = model('AssetItems')->itemsuse($data['org_id']); foreach ($items as $k=>$v){ if(in_array($v['id'],$useids)){ return '编号:'.$v['sn'].'的资产已被使用'; }else{ $ids[] = $v['id']; $info = Db::name('asset_items')->where('id',$v['id'])->find(); if(!$info || !in_array($info['enable'],[1,2])){ return '编号:'.$v['sn'].'的资产不存在或已被使用'; } } } return true; } private function checkAssetWithdraw($data,$formjson){ $items = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddassetwithdrawfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $items = $val['values']; break; } } break; } } $ids = []; $items = json_decode($items,true); $useids = model('AssetItems')->itemsuse($data['org_id']); foreach ($items as $k=>$v){ if(in_array($v['id'],$useids)){ return '编号:'.$v['sn'].'的资产已被使用'; }else{ $ids[] = $v['id']; $info = Db::name('asset_items')->where('id',$v['id'])->find(); if(!$info || $info['enable'] != 2){ return '编号:'.$v['sn'].'的资产不存在或已被使用'; } if($info['user_id'] != $data['user_id']){ return '编号:'.$v['sn'].'的资产不是您名下的资产,不能退库'; } } } return true; } private function checkAsset($data,$formjson){ $items = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddassetfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $items = $val['values']; break; } } break; } } $ids = []; $items = json_decode($items,true); $useids = model('AssetItems')->itemsuse($data['org_id']); foreach ($items as $k=>$v){ if(in_array($v['id'],$useids)){ return '编号:'.$v['sn'].'的资产已被使用'; }else{ $ids[] = $v['id']; $info = Db::name('asset_items')->where('id',$v['id'])->find(); if(!$info || $info['enable'] != 1){ return '编号:'.$v['sn'].'的资产不存在或已被使用'; } } } return true; } private function checkDeparture($data,$formjson){ // 检查用户状态 $userinfo = Db::name('user_info')->where('user_id',$data['user_id'])->field('is_working')->find(); if(!$userinfo){ return '用户不存在'; } if(in_array($userinfo['is_working'],[3,4])){ return '用户此状态不能提交此申请单'; } // 检查是否已提交过还未处理的审批单 $ret = Db::name('apply') ->where('user_id',$data['user_id']) ->where('status',1) ->where('advanced',12) ->where('org_id',$data['org_id']) ->find(); if($ret){ return '你曾经的审批还未处理,请勿重复提交'; } return true; } // 弃用,不用再验证 private function checkCar($data,$formjson){ $start = ''; $end = ''; $carId = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddcarfield'){ foreach ($v['components'] as $key=>$val){ $val['values2'] = isset($val['values2'])?$val['values2']:[]; $val['values'] = isset($val['values'])?$val['values']:''; switch ($val['idx']){ case '2': $start = $val['values2'][0]; $end = $val['values2'][1]; break; case '4': if($val['values']){ $d = json_decode($val['values'],true); $carId = $d['id']; } break; } } break; } } if($carId > 0){ // 检查当前时间段内该车辆是否有预定 $ret = Db::name('car_record') ->where('start_time','<=',$end) ->where('end_time','>=',$start) ->where('car_id',$carId) ->where('status','in','0,1') ->where('org_id',$data['org_id']) ->find(); if($ret){ return '该时间段与别的预约时间上有冲突'; } } return true; } private function checkOffice($data,$formjson){ $items = []; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddofficefield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $items = !empty($val['values'])?json_decode($val['values'],true):[]; break; } } break; } } if(!$items){ return '未选择办公物品'; } foreach ($items as $k=>$v){ // 检查库存 $info = Db::name('office_items') ->where('enable',1) ->where('del',0) ->where('id',$v['id']) ->find(); if(!$info){ return $v['title']."不存在或已下架"; } if($info['last_nums'] < $v['snums']){ return $v['title']."库存不足"; } } return true; } private function checkLeave($data,$formjson){ $start = ''; $end = ''; $leavetype = 0; $isleavebj = '否'; // 默认不离京 $lbjstart = ''; $lbjend = ''; $address = ''; $type = 1; // 1=减去节假日 0=不减节假日 foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddleavefield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $leave = json_decode($val['values'],true); $leavetype = $leave['id']; break; case '1': $start = $val['values']; break; case '2': $end = $val['values']; break; case '3': $isleavebj = isset($val['values'])?$val['values']:'否'; break; case '4': $lbjstart = isset($val['values'])?$val['values']:''; break; case '5': $lbjend = isset($val['values'])?$val['values']:''; break; case '6': $address = isset($val['values'])?$val['values']:''; break; } } break; } } $info = Db::name('attendance_leave_type') ->where('id',$leavetype) ->where('enable',1) ->where('del',0) ->find(); if(!$info){ return '请假类型不存在'; } if($leavetype == 6){ // 产假,不减节假日 $type = 0; } // 计算请假天数 $days = calculate_leave($start,$end,$type); if($days <= 0){ return '请假日期不正确'; } if($leavetype == 3){ // 年假,暂时只有年假限制天数 $userleave = Db::name('user_info')->where('user_id',$data['user_id'])->value('annual_leave'); if($days > $userleave){ return '年假余额不足'; } } // if($leavetype == 1 && time() >= strtotime('2022-01-01')){ // 自2022-01-01日期事假也扣除年假 // $userleave = Db::name('user_info')->where('user_id',$data['user_id'])->value('annual_leave'); // if($days > $userleave){ // return '年假余额不足'; // } // } if($isleavebj == '是'){ if(!$lbjstart || !$lbjend){ return '离京必须填写离京及返京日期'; } else if(!$address){ return '离京必须填写目的地'; } // 计算请假天数 $ljdays = calculate_leave($lbjstart,$lbjend,0); if($ljdays <= 0){ return '离京日期不正确'; } } //检查该时间范围是否已有请假记录 $starts = explode(' ',$start); $ends = explode(' ',$end); if($starts[1] == '上午'){ $startTime = $starts[0].' 00:00:00'; }else{ $startTime = $starts[0].' 12:00:00'; } if($ends[1] == '上午'){ $endTime = $ends[0].' 11:59:59'; }else{ $endTime = $ends[0].' 23:59:59'; } $map1 = [ ['cur_days','>',0], ['status','in','0,1'], ['org_id','=',$data['org_id']], ['user_id','=',$data['user_id']], ['start_time','>=',$startTime], ['start_time','<=',$endTime] ]; $map2 = [ ['cur_days','>',0], ['status','in','0,1'], ['org_id','=',$data['org_id']], ['user_id','=',$data['user_id']], ['end_time','>=',$startTime], ['end_time','<=',$endTime] ]; $ret = Db::name('attendance_leave') ->whereOr([ $map1, $map2]) ->find(); if($ret){ return '该时间段内已有请假记录'; } return true; } private function checkLeaveBj($data,$formjson){ $start = ''; $end = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddleavebjfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $start = $val['values']; break; case '1': $end = $val['values']; break; } } break; } } // 计算请假天数 $days = calculate_leave($start,$end,0); if($days <= 0){ return '离京日期不正确'; } //检查该时间范围是否已有请假记录 $starts = explode(' ',$start); $ends = explode(' ',$end); if($starts[1] == '上午'){ $startTime = $starts[0].' 00:00:00'; }else{ $startTime = $starts[0].' 12:00:00'; } if($ends[1] == '上午'){ $endTime = $ends[0].' 11:59:59'; }else{ $endTime = $ends[0].' 23:59:59'; } $map1 = [ ['status','in','0,1'], ['org_id','=',$data['org_id']], ['user_id','=',$data['user_id']], ['start_time','>=',$startTime], ['start_time','<=',$endTime] ]; $map2 = [ ['status','in','0,1'], ['org_id','=',$data['org_id']], ['user_id','=',$data['user_id']], ['end_time','>=',$startTime], ['end_time','<=',$endTime] ]; $ret = Db::name('leave_bj') ->whereOr([ $map1, $map2]) ->find(); if($ret){ return '该时间段内已有离京报告记录'; } return true; } private function checkContractAppend($data,$formjson){ //获取关联合同 $parent_apply_id = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddaddcontractfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '10': $parent_apply_id = $val['values2'][0]['id']; break; } } break; } } $info = Db::name('contract') ->where('apply_id',$parent_apply_id) ->where('status',1) ->where('type',0) ->find(); if(!$info){ return '关联的审批单不是合同'; } return true; } private function checkContract($data,$formjson){ //获取关联合同 $companyId = 0; $programId = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddjjcontractfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $company = json_decode($val['values'],true); $companyId = $company['id']; break; case '1': $program = json_decode($val['values'],true); $programId = $program['id']; break; } } break; } } $info = Db::name('program') ->where('id',$programId) ->find(); if(!$info){ return '项目不存在'; } if($info['company_id'] != $companyId){ return '项目与单位不关联,请重新选择'; } return true; } private function checkContractPay($data,$formjson){ //获取关联合同 $pay_apply_id = 0; $money = 0; $last = 0; $attachment = 0; $completion = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddpaycontractfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $pay_apply_id = $val['values2'][0]['id']; break; case '1': $money = $val['values']; break; case '3': $last = $val['values'] == '是'?1:0; break; case '5': $attachment = empty($val['values'])?0:1; break; case '6': $completion = isset($val['values'])?$val['values']:0; break; } } break; } } if($completion > 0 && !$attachment){ return '填写竣工结算金额,必须上传附件说明'; } $info = Db::name('contract') ->where('apply_id',$pay_apply_id) ->where('status',1) ->where('ispay',1) ->find(); if(!$info){ return '关联的审批单不是付款合同'; } if($info['finish'] == 1){ return '合同已结清'; } $paymoney = $info['pay_money'] + $money; if($last == 1 && $paymoney != $info['money'] && $attachment != 1){ // 是尾款 return '结算价与合同价不同,必须上传附件说明'; } $ret = Db::name('contract_pay') ->where('ispay',1) ->where('status',0) ->where('pay_apply_id',$pay_apply_id) ->find(); if($ret){ return '本合同还有未处理的付款,请处理后再提交'; } return true; } private function checkContractGet($data,$formjson){ $pay_apply_id = 0; $money = 0; $last = 0; $attachment = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddgetcontractfield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $pay_apply_id = $val['values2'][0]['id']; break; case '1': $money = $val['values']; break; case '3': $last = $val['values'] == '是'?1:0; break; case '5': $attachment = empty($val['values'])?0:1; break; } } break; } } $info = Db::name('contract') ->where('apply_id',$pay_apply_id) ->where('status',1) ->where('ispay',2) ->find(); if(!$info){ return '关联的审批单不是收款合同'; } if($info['finish'] == 1){ return '合同已结清'; } $paymoney = $info['pay_money'] + $money; if($last == 1 && $paymoney != $info['money'] && $attachment != 1){ // 是尾款 return '结算价与合同价不同,必须上传附件说明'; } $ret = Db::name('contract_pay') ->where('status',0) ->where('ispay',2) ->where('pay_apply_id',$pay_apply_id) ->find(); if($ret){ return '本合同还有未处理的收款,请处理后再提交'; } return true; } private function checkLeaveTerminate($data,$formjson){ $parent_apply_id = 0; $days = 0; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddleaveterminatefield'){ foreach ($v['components'] as $key=>$val){ switch ($val['idx']){ case '0': $parent_apply_id = $val['values2'][0]['id']; break; case '1': $days = $val['values']; break; } } break; } } if($days <= 0){ return '销假天数必须大于0'; } $info = Db::name('attendance_leave') ->where('apply_id',$parent_apply_id) ->where('status',1) ->find(); if(!$info){ return '关联的审批单不是请假单'; } if($info['user_id'] != $data['user_id']){ return '只能选择自己申请的请假单'; } if($info['cur_days'] < $days){ return '销假天数不能大于请假天数'; } $ret = Db::name('attendance_leave_terminate') ->where('status',0) ->where('parent_apply_id',$parent_apply_id) ->find(); if($ret){ return '还有未处理的销假申请,请处理后再提交'; } return true; } private function checkMeetingRoom($data,$formjson){ $start = ''; $end = ''; $meetingRoomId = 0; $sn = ''; $options = []; $ty = ''; $hf = ''; foreach ($formjson as $k=>$v){ if($v['componentName'] == 'ddmeetingroomfield'){ foreach ($v['components'] as $key=>$val){ $val['values2'] = isset($val['values2'])?$val['values2']:[]; $val['values'] = isset($val['values'])?$val['values']:''; switch ($val['idx']){ case '2': $start = $val['values2'][0]; $end = $val['values2'][1]; break; case '1': $d = json_decode($val['values'],true); $meetingRoomId = $d['id']; break; case '0': $sn = isset($val['values'])?$val['values']:''; break; case '6': $options = $val['values2']; break; case '9': $ty = isset($val['values'])?$val['values']:''; break; case '7': $hf = isset($val['values'])?$val['values']:''; break; } } break; } } if($sn){ // sn不为空,需要检查,是否已存在 $ret = Db::name('meeting_room_book') ->where('sn',$sn) ->find(); if($ret){ return '编号已存在,请修改后提交'; } } if(in_array('投影',$options)&&!$ty){ return '未输入会议议题'; } if(in_array('横幅',$options)&&!$hf){ return '未输入横幅文字'; } $start = date('Y-m-d H:i:s',strtotime($start)); $end = date('Y-m-d H:i:s',strtotime($end)); // 检查时间是否有冲突 $ret = Db::name('meeting_room_book') ->where('meeting_room_id',$meetingRoomId) ->where('status','in','0,1') ->where('enable',1) ->where('start_time','<=',$end) ->where('end_time','>=',$start) ->find(); if($ret){ return '该时间段与别的预约时间上有冲突'; } return true; } }