Apply.php 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. <?php
  2. namespace app\common\validate;
  3. use think\Db;
  4. use think\Validate;
  5. class Apply extends Validate{
  6. protected $rule = [
  7. 'approval_id' => 'require|gt:0',
  8. 'org_id' => 'require|gt:0',
  9. 'user_id' => 'require|gt:0',
  10. 'title' => 'require',
  11. 'approval_required' => 'require|in:0,1',
  12. 'approval_visible' => 'require|in:0,1',
  13. 'form_json' => 'require|checkFormJson',
  14. 'flow_json' => 'require|checkFlowJson',
  15. ];
  16. protected $message = [
  17. 'approval_id.require' => '参数错误',
  18. 'approval_id.gt' => '参数错误',
  19. 'org_id.require' => '参数错误',
  20. 'org_id.gt' => '参数错误',
  21. 'user_id.require' => '参数错误',
  22. 'user_id.gt' => '参数错误',
  23. 'title.require' => '参数错误',
  24. ];
  25. protected $scene = [
  26. ];
  27. protected function checkFlowJson($value,$rule,$data=[])
  28. {
  29. $flowjson = json_decode($value,true);
  30. if(!$flowjson){
  31. return '参数错误';
  32. }
  33. // 检查是否有审批人
  34. $except = [1,5,9];
  35. foreach ($flowjson as $k=>$v){
  36. if(!in_array($v['type'],$except) && empty($v['userList'])){
  37. if($v['type'] == 3){
  38. return $v['name'].'没有抄送人员';
  39. }else{
  40. return $v['name'].'没有审批人员';
  41. }
  42. }
  43. }
  44. return true;
  45. }
  46. protected function checkFormJson($value,$rule,$data=[])
  47. {
  48. $formjson = json_decode($value,true);
  49. if(!$formjson){
  50. return '参数错误';
  51. }
  52. // 检查必填参数
  53. foreach ($formjson as $k=>$v){
  54. if(isset($v['defaultImportant']) && $v['defaultImportant']){
  55. if(empty($v['values']) && empty($v['values2']) && !empty($data['unique'])){
  56. return $v['defaultLable'].'必填';
  57. }else if(!empty($data['unique']) && !empty($v['components'])){
  58. foreach ($v['components'] as $kk=>$vv){
  59. if(empty($vv['values']) && empty($vv['values2'])){
  60. return $vv['defaultLable'].'必填';
  61. }
  62. }
  63. }
  64. }
  65. if($v['componentName'] == 'tableareafield' && !empty($v['components'])){ // 区域
  66. foreach ($v['components'] as $kk=>$vv){
  67. if(isset($v['defaultImportant']) && $v['defaultImportant'] && empty($vv['values']) && empty($vv['values2'])){
  68. return $vv['defaultLable'].'必填';
  69. }
  70. }
  71. } else if($v['componentName'] == 'tablefield'){ // 明细
  72. if($v['values2']){
  73. foreach ($v['values2'] as $kk=>$vv){
  74. foreach ($vv as $key=>$val){
  75. if(isset($v['defaultImportant']) && $v['defaultImportant'] && empty($vv['values']) && empty($vv['values2'])){
  76. return $vv['defaultLable'].'必填';
  77. }
  78. }
  79. }
  80. }
  81. }
  82. }
  83. // 高级组件条件检查
  84. switch ($data['advanced']){
  85. case 1: // 请假
  86. return $this->checkLeave($data,$formjson);
  87. break;
  88. case 3: // 合同会签
  89. return $this->checkContract($data,$formjson);
  90. break;
  91. case 4: // 追加合同
  92. return $this->checkContractAppend($data,$formjson);
  93. break;
  94. case 5: // 合同支付,只能处理一个
  95. return $this->checkContractPay($data,$formjson);
  96. break;
  97. case 6: // 会议室预定
  98. return $this->checkMeetingRoom($data,$formjson);
  99. break;
  100. case 7: // 合同收款,只能处理一个
  101. return $this->checkContractGet($data,$formjson);
  102. break;
  103. case 8: // 销假
  104. return $this->checkLeaveTerminate($data,$formjson);
  105. break;
  106. case 9: // 离京报告
  107. return $this->checkLeaveBj($data,$formjson);
  108. break;
  109. case 10: // 办公物品
  110. return $this->checkOffice($data,$formjson);
  111. break;
  112. case 11: // 车辆
  113. // return $this->checkCar($data,$formjson);
  114. return true;
  115. break;
  116. case 12: // 离职/退休
  117. return $this->checkDeparture($data,$formjson);
  118. break;
  119. case 13: // 资产领取
  120. return $this->checkAsset($data,$formjson);
  121. break;
  122. case 14: // 资产退库
  123. return $this->checkAssetWithdraw($data,$formjson);
  124. break;
  125. case 15: // 资产维修
  126. return $this->checkAssetRepair($data,$formjson);
  127. break;
  128. case 16: // 资产处置
  129. return $this->checkAssetDisposal($data,$formjson);
  130. break;
  131. case 17: // 预算
  132. return $this->checkBudget($data,$formjson);
  133. break;
  134. case 18: // 用印
  135. return true;
  136. break;
  137. case 19: // 中心发文
  138. return $this->checkPost($data,$formjson);
  139. break;
  140. case 20: // 因私出国
  141. return true;
  142. case 21: // 日常开支
  143. return $this->checkOverhead($data,$formjson);
  144. break;
  145. default:
  146. return true;
  147. break;
  148. }
  149. }
  150. private function checkOverhead($data,$formjson){
  151. $type = 0;
  152. $bdid = 0;
  153. $money = 0;
  154. foreach ($formjson as $k=>$v){
  155. if($v['componentName'] == 'ddoverheadfield'){
  156. foreach ($v['components'] as $key=>$val){
  157. switch ($val['idx']){
  158. case '0':
  159. $money = isset($val['money'])&&!empty($money)?$val['money']:0;
  160. break;
  161. case '1':
  162. $typetext = isset($val['values'])?$val['values']:'预算内';
  163. $type = $typetext == '预算内'?1:2;
  164. break;
  165. case '2':
  166. $val['values'] = isset($val['values'])?$val['values']:'';
  167. if($val['values']){
  168. $d = json_decode($val['values'],true);
  169. $bdid = $d['id'];
  170. }else{
  171. $bdid = 0;
  172. }
  173. break;
  174. }
  175. }
  176. break;
  177. }
  178. }
  179. if($type == 1){ //预算内
  180. $bdinfo = Db::name('budget_dep')->where('id',$bdid)->find();
  181. if(!$bdinfo){
  182. return '预算项记录不存在';
  183. }
  184. if($bdinfo['dep_id'] != $data['dep_id']){
  185. return '预算部门与预算项不一致';
  186. }
  187. if($bdinfo['real_money'] < $money){
  188. return '预算剩余小于支出金额';
  189. }
  190. $info = Db::name('budget_pay')
  191. ->where('del',0)
  192. ->where('status',0)
  193. ->where('type',1)
  194. ->where('dep_id',$data['dep_id'])
  195. ->where('apply_status','<>',2)
  196. ->where('bdid',$bdid)
  197. ->find();
  198. if($info){
  199. return '该部门有未处理的请款单';
  200. }
  201. }
  202. return true;
  203. }
  204. private function checkPost($data,$formjson){
  205. $values = '';
  206. foreach ($formjson as $k=>$v){
  207. if($v['componentName'] == 'ddpostfield'){
  208. foreach ($v['components'] as $key=>$val){
  209. switch ($val['idx']){
  210. case '0':
  211. $values = isset($val['values'])?$val['values']:'';
  212. break;
  213. }
  214. }
  215. break;
  216. }
  217. }
  218. if($values == '发改基建' || $values == '发改基人'){
  219. return true;
  220. }
  221. $val = explode('[',$values);
  222. $type = $val[0];
  223. $val2 = explode(']',$val[1]);
  224. $sn = $val2[0];
  225. // 检查该编号是否可以申请
  226. $ret = Db::name('post_apply')
  227. ->where('year',date('Y'))
  228. ->where('type',$type)
  229. ->where('sn',$sn)
  230. ->where('status','in','0,1')
  231. ->find();
  232. if($ret){
  233. return '该编号正在审核中,不能提交申请';
  234. }
  235. return true;
  236. }
  237. private function checkBudget($data,$formjson){
  238. $values = '';
  239. foreach ($formjson as $k=>$v){
  240. if($v['componentName'] == 'ddbudgetfield'){
  241. foreach ($v['components'] as $key=>$val){
  242. switch ($val['idx']){
  243. case '0':
  244. $values = $val['values'];
  245. break;
  246. }
  247. }
  248. break;
  249. }
  250. }
  251. $values = json_decode($values,true);
  252. $items = $values['items'];
  253. $budgetId = $items[0]['budgetId'];
  254. $depId = $data['dep_id'];
  255. $companyId = $items[0]['companyId'];
  256. //检查是否有权限提交
  257. // $budget = Db::name('budget_auth')
  258. // ->alias('bd')
  259. // ->join('budget b','b.id = bd.budget_id')
  260. // ->where('b.del',0)
  261. // ->where('bd.dep_id',$depId)
  262. // ->where('bd.budget_id',$budgetId)
  263. // ->field('b.*')
  264. // ->order('b.id desc')
  265. // ->find();
  266. //检查是否有预算
  267. $budget = Db::name('budget')->where('id',$budgetId)->where('del',0)->find();
  268. if(!$budget){
  269. return '预算不存在';
  270. }
  271. if($budget['enable'] == 0){
  272. return '预算未发布,不能申请';
  273. }
  274. $curTime = date('Y-m-d');
  275. if($budget['start_time'] > $curTime || $budget['end_time'] < $curTime){
  276. return '预算申请不在要求时间范围内';
  277. }
  278. // 检查是否有权限提交
  279. $baret = Db::name('budget_auth')
  280. ->where('type',2)
  281. ->where('dep_id',$data['user_id'])
  282. ->where('budget_id',$budgetId)
  283. ->find();
  284. $badret = Db::name('budget_auth')
  285. ->where('type',0)
  286. ->where('dep_id',$depId)
  287. ->where('budget_id',$budgetId)
  288. ->find();
  289. if(!$baret && !$badret){
  290. return '无权限申请预算';
  291. }
  292. // 检查本人是否已经提交过申请
  293. $ret = Db::name('budget_apply')
  294. ->where('budget_id',$budgetId)
  295. ->where('company_id',$companyId)
  296. ->where('user_id',$data['user_id'])
  297. ->where('status','in','0,1')
  298. ->find();
  299. if($ret){
  300. return '您已提交过该类型的预算申请';
  301. }
  302. return true;
  303. }
  304. private function checkAssetDisposal($data,$formjson){
  305. $items = '';
  306. foreach ($formjson as $k=>$v){
  307. if($v['componentName'] == 'ddassetdisposalfield'){
  308. foreach ($v['components'] as $key=>$val){
  309. switch ($val['idx']){
  310. case '0':
  311. $items = $val['values'];
  312. break;
  313. }
  314. }
  315. break;
  316. }
  317. }
  318. $ids = [];
  319. $items = json_decode($items,true);
  320. $useids = model('AssetItems')->itemsuse($data['org_id']);
  321. foreach ($items as $k=>$v){
  322. if(in_array($v['id'],$useids)){
  323. return '编号:'.$v['sn'].'的资产已被使用';
  324. }else{
  325. $ids[] = $v['id'];
  326. $info = Db::name('asset_items')->where('id',$v['id'])->find();
  327. if(!$info || !in_array($info['enable'],[1,2])){
  328. return '编号:'.$v['sn'].'的资产不存在或已被使用';
  329. }
  330. }
  331. }
  332. return true;
  333. }
  334. private function checkAssetRepair($data,$formjson){
  335. $items = '';
  336. foreach ($formjson as $k=>$v){
  337. if($v['componentName'] == 'ddassetrepairfield'){
  338. foreach ($v['components'] as $key=>$val){
  339. switch ($val['idx']){
  340. case '0':
  341. $items = $val['values'];
  342. break;
  343. }
  344. }
  345. break;
  346. }
  347. }
  348. $ids = [];
  349. $items = json_decode($items,true);
  350. $useids = model('AssetItems')->itemsuse($data['org_id']);
  351. foreach ($items as $k=>$v){
  352. if(in_array($v['id'],$useids)){
  353. return '编号:'.$v['sn'].'的资产已被使用';
  354. }else{
  355. $ids[] = $v['id'];
  356. $info = Db::name('asset_items')->where('id',$v['id'])->find();
  357. if(!$info || !in_array($info['enable'],[1,2])){
  358. return '编号:'.$v['sn'].'的资产不存在或已被使用';
  359. }
  360. }
  361. }
  362. return true;
  363. }
  364. private function checkAssetWithdraw($data,$formjson){
  365. $items = '';
  366. foreach ($formjson as $k=>$v){
  367. if($v['componentName'] == 'ddassetwithdrawfield'){
  368. foreach ($v['components'] as $key=>$val){
  369. switch ($val['idx']){
  370. case '0':
  371. $items = $val['values'];
  372. break;
  373. }
  374. }
  375. break;
  376. }
  377. }
  378. $ids = [];
  379. $items = json_decode($items,true);
  380. $useids = model('AssetItems')->itemsuse($data['org_id']);
  381. foreach ($items as $k=>$v){
  382. if(in_array($v['id'],$useids)){
  383. return '编号:'.$v['sn'].'的资产已被使用';
  384. }else{
  385. $ids[] = $v['id'];
  386. $info = Db::name('asset_items')->where('id',$v['id'])->find();
  387. if(!$info || $info['enable'] != 2){
  388. return '编号:'.$v['sn'].'的资产不存在或已被使用';
  389. }
  390. if($info['user_id'] != $data['user_id']){
  391. return '编号:'.$v['sn'].'的资产不是您名下的资产,不能退库';
  392. }
  393. }
  394. }
  395. return true;
  396. }
  397. private function checkAsset($data,$formjson){
  398. $items = '';
  399. foreach ($formjson as $k=>$v){
  400. if($v['componentName'] == 'ddassetfield'){
  401. foreach ($v['components'] as $key=>$val){
  402. switch ($val['idx']){
  403. case '0':
  404. $items = $val['values'];
  405. break;
  406. }
  407. }
  408. break;
  409. }
  410. }
  411. $ids = [];
  412. $items = json_decode($items,true);
  413. $useids = model('AssetItems')->itemsuse($data['org_id']);
  414. foreach ($items as $k=>$v){
  415. if(in_array($v['id'],$useids)){
  416. return '编号:'.$v['sn'].'的资产已被使用';
  417. }else{
  418. $ids[] = $v['id'];
  419. $info = Db::name('asset_items')->where('id',$v['id'])->find();
  420. if(!$info || $info['enable'] != 1){
  421. return '编号:'.$v['sn'].'的资产不存在或已被使用';
  422. }
  423. }
  424. }
  425. return true;
  426. }
  427. private function checkDeparture($data,$formjson){
  428. // 检查用户状态
  429. $userinfo = Db::name('user_info')->where('user_id',$data['user_id'])->field('is_working')->find();
  430. if(!$userinfo){
  431. return '用户不存在';
  432. }
  433. if(in_array($userinfo['is_working'],[3,4])){
  434. return '用户此状态不能提交此申请单';
  435. }
  436. // 检查是否已提交过还未处理的审批单
  437. $ret = Db::name('apply')
  438. ->where('user_id',$data['user_id'])
  439. ->where('status',1)
  440. ->where('advanced',12)
  441. ->where('org_id',$data['org_id'])
  442. ->find();
  443. if($ret){
  444. return '你曾经的审批还未处理,请勿重复提交';
  445. }
  446. return true;
  447. }
  448. // 弃用,不用再验证
  449. private function checkCar($data,$formjson){
  450. $start = '';
  451. $end = '';
  452. $carId = 0;
  453. foreach ($formjson as $k=>$v){
  454. if($v['componentName'] == 'ddcarfield'){
  455. foreach ($v['components'] as $key=>$val){
  456. $val['values2'] = isset($val['values2'])?$val['values2']:[];
  457. $val['values'] = isset($val['values'])?$val['values']:'';
  458. switch ($val['idx']){
  459. case '2':
  460. $start = $val['values2'][0];
  461. $end = $val['values2'][1];
  462. break;
  463. case '4':
  464. if($val['values']){
  465. $d = json_decode($val['values'],true);
  466. $carId = $d['id'];
  467. }
  468. break;
  469. }
  470. }
  471. break;
  472. }
  473. }
  474. if($carId > 0){
  475. // 检查当前时间段内该车辆是否有预定
  476. $ret = Db::name('car_record')
  477. ->where('start_time','<=',$end)
  478. ->where('end_time','>=',$start)
  479. ->where('car_id',$carId)
  480. ->where('status','in','0,1')
  481. ->where('org_id',$data['org_id'])
  482. ->find();
  483. if($ret){
  484. return '该时间段与别的预约时间上有冲突';
  485. }
  486. }
  487. return true;
  488. }
  489. private function checkOffice($data,$formjson){
  490. $items = [];
  491. foreach ($formjson as $k=>$v){
  492. if($v['componentName'] == 'ddofficefield'){
  493. foreach ($v['components'] as $key=>$val){
  494. switch ($val['idx']){
  495. case '0':
  496. $items = !empty($val['values'])?json_decode($val['values'],true):[];
  497. break;
  498. }
  499. }
  500. break;
  501. }
  502. }
  503. if(!$items){
  504. return '未选择办公物品';
  505. }
  506. foreach ($items as $k=>$v){ // 检查库存
  507. $info = Db::name('office_items')
  508. ->where('enable',1)
  509. ->where('del',0)
  510. ->where('id',$v['id'])
  511. ->find();
  512. if(!$info){
  513. return $v['title']."不存在或已下架";
  514. }
  515. if($info['last_nums'] < $v['snums']){
  516. return $v['title']."库存不足";
  517. }
  518. }
  519. return true;
  520. }
  521. private function checkLeave($data,$formjson){
  522. $start = '';
  523. $end = '';
  524. $leavetype = 0;
  525. $isleavebj = '否'; // 默认不离京
  526. $lbjstart = '';
  527. $lbjend = '';
  528. $address = '';
  529. $type = 1; // 1=减去节假日 0=不减节假日
  530. foreach ($formjson as $k=>$v){
  531. if($v['componentName'] == 'ddleavefield'){
  532. foreach ($v['components'] as $key=>$val){
  533. switch ($val['idx']){
  534. case '0':
  535. $leave = json_decode($val['values'],true);
  536. $leavetype = $leave['id'];
  537. break;
  538. case '1':
  539. $start = $val['values'];
  540. break;
  541. case '2':
  542. $end = $val['values'];
  543. break;
  544. case '3':
  545. $isleavebj = isset($val['values'])?$val['values']:'否';
  546. break;
  547. case '4':
  548. $lbjstart = isset($val['values'])?$val['values']:'';
  549. break;
  550. case '5':
  551. $lbjend = isset($val['values'])?$val['values']:'';
  552. break;
  553. case '6':
  554. $address = isset($val['values'])?$val['values']:'';
  555. break;
  556. }
  557. }
  558. break;
  559. }
  560. }
  561. $info = Db::name('attendance_leave_type')
  562. ->where('id',$leavetype)
  563. ->where('enable',1)
  564. ->where('del',0)
  565. ->find();
  566. if(!$info){
  567. return '请假类型不存在';
  568. }
  569. if($leavetype == 6){ // 产假,不减节假日
  570. $type = 0;
  571. }
  572. // 计算请假天数
  573. $days = calculate_leave($start,$end,$type);
  574. if($days <= 0){
  575. return '请假日期不正确';
  576. }
  577. if($leavetype == 3){ // 年假,暂时只有年假限制天数
  578. $userleave = Db::name('user_info')->where('user_id',$data['user_id'])->value('annual_leave');
  579. if($days > $userleave){
  580. return '年假余额不足';
  581. }
  582. }
  583. // if($leavetype == 1 && time() >= strtotime('2022-01-01')){ // 自2022-01-01日期事假也扣除年假
  584. // $userleave = Db::name('user_info')->where('user_id',$data['user_id'])->value('annual_leave');
  585. // if($days > $userleave){
  586. // return '年假余额不足';
  587. // }
  588. // }
  589. if($isleavebj == '是'){
  590. if(!$lbjstart || !$lbjend){
  591. return '离京必须填写离京及返京日期';
  592. } else if(!$address){
  593. return '离京必须填写目的地';
  594. }
  595. // 计算请假天数
  596. $ljdays = calculate_leave($lbjstart,$lbjend,0);
  597. if($ljdays <= 0){
  598. return '离京日期不正确';
  599. }
  600. }
  601. //检查该时间范围是否已有请假记录
  602. $starts = explode(' ',$start);
  603. $ends = explode(' ',$end);
  604. if($starts[1] == '上午'){
  605. $startTime = $starts[0].' 00:00:00';
  606. }else{
  607. $startTime = $starts[0].' 12:00:00';
  608. }
  609. if($ends[1] == '上午'){
  610. $endTime = $ends[0].' 11:59:59';
  611. }else{
  612. $endTime = $ends[0].' 23:59:59';
  613. }
  614. $map1 = [
  615. ['cur_days','>',0],
  616. ['status','in','0,1'],
  617. ['org_id','=',$data['org_id']],
  618. ['user_id','=',$data['user_id']],
  619. ['start_time','>=',$startTime],
  620. ['start_time','<=',$endTime]
  621. ];
  622. $map2 = [
  623. ['cur_days','>',0],
  624. ['status','in','0,1'],
  625. ['org_id','=',$data['org_id']],
  626. ['user_id','=',$data['user_id']],
  627. ['end_time','>=',$startTime],
  628. ['end_time','<=',$endTime]
  629. ];
  630. $ret = Db::name('attendance_leave')
  631. ->whereOr([ $map1, $map2])
  632. ->find();
  633. if($ret){
  634. return '该时间段内已有请假记录';
  635. }
  636. return true;
  637. }
  638. private function checkLeaveBj($data,$formjson){
  639. $start = '';
  640. $end = '';
  641. foreach ($formjson as $k=>$v){
  642. if($v['componentName'] == 'ddleavebjfield'){
  643. foreach ($v['components'] as $key=>$val){
  644. switch ($val['idx']){
  645. case '0':
  646. $start = $val['values'];
  647. break;
  648. case '1':
  649. $end = $val['values'];
  650. break;
  651. }
  652. }
  653. break;
  654. }
  655. }
  656. // 计算请假天数
  657. $days = calculate_leave($start,$end,0);
  658. if($days <= 0){
  659. return '离京日期不正确';
  660. }
  661. //检查该时间范围是否已有请假记录
  662. $starts = explode(' ',$start);
  663. $ends = explode(' ',$end);
  664. if($starts[1] == '上午'){
  665. $startTime = $starts[0].' 00:00:00';
  666. }else{
  667. $startTime = $starts[0].' 12:00:00';
  668. }
  669. if($ends[1] == '上午'){
  670. $endTime = $ends[0].' 11:59:59';
  671. }else{
  672. $endTime = $ends[0].' 23:59:59';
  673. }
  674. $map1 = [
  675. ['status','in','0,1'],
  676. ['org_id','=',$data['org_id']],
  677. ['user_id','=',$data['user_id']],
  678. ['start_time','>=',$startTime],
  679. ['start_time','<=',$endTime]
  680. ];
  681. $map2 = [
  682. ['status','in','0,1'],
  683. ['org_id','=',$data['org_id']],
  684. ['user_id','=',$data['user_id']],
  685. ['end_time','>=',$startTime],
  686. ['end_time','<=',$endTime]
  687. ];
  688. $ret = Db::name('leave_bj')
  689. ->whereOr([ $map1, $map2])
  690. ->find();
  691. if($ret){
  692. return '该时间段内已有离京报告记录';
  693. }
  694. return true;
  695. }
  696. private function checkContractAppend($data,$formjson){
  697. //获取关联合同
  698. $parent_apply_id = 0;
  699. foreach ($formjson as $k=>$v){
  700. if($v['componentName'] == 'ddaddcontractfield'){
  701. foreach ($v['components'] as $key=>$val){
  702. switch ($val['idx']){
  703. case '10':
  704. $parent_apply_id = $val['values2'][0]['id'];
  705. break;
  706. }
  707. }
  708. break;
  709. }
  710. }
  711. $info = Db::name('contract')
  712. ->where('apply_id',$parent_apply_id)
  713. ->where('status',1)
  714. ->where('type',0)
  715. ->find();
  716. if(!$info){
  717. return '关联的审批单不是合同';
  718. }
  719. return true;
  720. }
  721. private function checkContract($data,$formjson){
  722. //获取关联合同
  723. $companyId = 0;
  724. $programId = 0;
  725. foreach ($formjson as $k=>$v){
  726. if($v['componentName'] == 'ddjjcontractfield'){
  727. foreach ($v['components'] as $key=>$val){
  728. switch ($val['idx']){
  729. case '0':
  730. $company = json_decode($val['values'],true);
  731. $companyId = $company['id'];
  732. break;
  733. case '1':
  734. $program = json_decode($val['values'],true);
  735. $programId = $program['id'];
  736. break;
  737. }
  738. }
  739. break;
  740. }
  741. }
  742. $info = Db::name('program')
  743. ->where('id',$programId)
  744. ->find();
  745. if(!$info){
  746. return '项目不存在';
  747. }
  748. if($info['company_id'] != $companyId){
  749. return '项目与单位不关联,请重新选择';
  750. }
  751. return true;
  752. }
  753. private function checkContractPay($data,$formjson){
  754. //获取关联合同
  755. $pay_apply_id = 0;
  756. $money = 0;
  757. $last = 0;
  758. $attachment = 0;
  759. $completion = 0;
  760. foreach ($formjson as $k=>$v){
  761. if($v['componentName'] == 'ddpaycontractfield'){
  762. foreach ($v['components'] as $key=>$val){
  763. switch ($val['idx']){
  764. case '0':
  765. $pay_apply_id = $val['values2'][0]['id'];
  766. break;
  767. case '1':
  768. $money = $val['values'];
  769. break;
  770. case '3':
  771. $last = $val['values'] == '是'?1:0;
  772. break;
  773. case '5':
  774. $attachment = empty($val['values'])?0:1;
  775. break;
  776. case '6':
  777. $completion = isset($val['values'])?$val['values']:0;
  778. break;
  779. }
  780. }
  781. break;
  782. }
  783. }
  784. if($completion > 0 && !$attachment){
  785. return '填写竣工结算金额,必须上传附件说明';
  786. }
  787. $info = Db::name('contract')
  788. ->where('apply_id',$pay_apply_id)
  789. ->where('status',1)
  790. ->where('ispay',1)
  791. ->find();
  792. if(!$info){
  793. return '关联的审批单不是付款合同';
  794. }
  795. if($info['finish'] == 1){
  796. return '合同已结清';
  797. }
  798. $paymoney = $info['pay_money'] + $money;
  799. if($last == 1 && $paymoney != $info['money'] && $attachment != 1){ // 是尾款
  800. return '结算价与合同价不同,必须上传附件说明';
  801. }
  802. $ret = Db::name('contract_pay')
  803. ->where('ispay',1)
  804. ->where('status',0)
  805. ->where('pay_apply_id',$pay_apply_id)
  806. ->find();
  807. if($ret){
  808. return '本合同还有未处理的付款,请处理后再提交';
  809. }
  810. return true;
  811. }
  812. private function checkContractGet($data,$formjson){
  813. $pay_apply_id = 0;
  814. $money = 0;
  815. $last = 0;
  816. $attachment = 0;
  817. foreach ($formjson as $k=>$v){
  818. if($v['componentName'] == 'ddgetcontractfield'){
  819. foreach ($v['components'] as $key=>$val){
  820. switch ($val['idx']){
  821. case '0':
  822. $pay_apply_id = $val['values2'][0]['id'];
  823. break;
  824. case '1':
  825. $money = $val['values'];
  826. break;
  827. case '3':
  828. $last = $val['values'] == '是'?1:0;
  829. break;
  830. case '5':
  831. $attachment = empty($val['values'])?0:1;
  832. break;
  833. }
  834. }
  835. break;
  836. }
  837. }
  838. $info = Db::name('contract')
  839. ->where('apply_id',$pay_apply_id)
  840. ->where('status',1)
  841. ->where('ispay',2)
  842. ->find();
  843. if(!$info){
  844. return '关联的审批单不是收款合同';
  845. }
  846. if($info['finish'] == 1){
  847. return '合同已结清';
  848. }
  849. $paymoney = $info['pay_money'] + $money;
  850. if($last == 1 && $paymoney != $info['money'] && $attachment != 1){ // 是尾款
  851. return '结算价与合同价不同,必须上传附件说明';
  852. }
  853. $ret = Db::name('contract_pay')
  854. ->where('status',0)
  855. ->where('ispay',2)
  856. ->where('pay_apply_id',$pay_apply_id)
  857. ->find();
  858. if($ret){
  859. return '本合同还有未处理的收款,请处理后再提交';
  860. }
  861. return true;
  862. }
  863. private function checkLeaveTerminate($data,$formjson){
  864. $parent_apply_id = 0;
  865. $days = 0;
  866. foreach ($formjson as $k=>$v){
  867. if($v['componentName'] == 'ddleaveterminatefield'){
  868. foreach ($v['components'] as $key=>$val){
  869. switch ($val['idx']){
  870. case '0':
  871. $parent_apply_id = $val['values2'][0]['id'];
  872. break;
  873. case '1':
  874. $days = $val['values'];
  875. break;
  876. }
  877. }
  878. break;
  879. }
  880. }
  881. if($days <= 0){
  882. return '销假天数必须大于0';
  883. }
  884. $info = Db::name('attendance_leave')
  885. ->where('apply_id',$parent_apply_id)
  886. ->where('status',1)
  887. ->find();
  888. if(!$info){
  889. return '关联的审批单不是请假单';
  890. }
  891. if($info['user_id'] != $data['user_id']){
  892. return '只能选择自己申请的请假单';
  893. }
  894. if($info['cur_days'] < $days){
  895. return '销假天数不能大于请假天数';
  896. }
  897. $ret = Db::name('attendance_leave_terminate')
  898. ->where('status',0)
  899. ->where('parent_apply_id',$parent_apply_id)
  900. ->find();
  901. if($ret){
  902. return '还有未处理的销假申请,请处理后再提交';
  903. }
  904. return true;
  905. }
  906. private function checkMeetingRoom($data,$formjson){
  907. $start = '';
  908. $end = '';
  909. $meetingRoomId = 0;
  910. $sn = '';
  911. $options = [];
  912. $ty = '';
  913. $hf = '';
  914. foreach ($formjson as $k=>$v){
  915. if($v['componentName'] == 'ddmeetingroomfield'){
  916. foreach ($v['components'] as $key=>$val){
  917. $val['values2'] = isset($val['values2'])?$val['values2']:[];
  918. $val['values'] = isset($val['values'])?$val['values']:'';
  919. switch ($val['idx']){
  920. case '2':
  921. $start = $val['values2'][0];
  922. $end = $val['values2'][1];
  923. break;
  924. case '1':
  925. $d = json_decode($val['values'],true);
  926. $meetingRoomId = $d['id'];
  927. break;
  928. case '0':
  929. $sn = isset($val['values'])?$val['values']:'';
  930. break;
  931. case '6':
  932. $options = $val['values2'];
  933. break;
  934. case '9':
  935. $ty = isset($val['values'])?$val['values']:'';
  936. break;
  937. case '7':
  938. $hf = isset($val['values'])?$val['values']:'';
  939. break;
  940. }
  941. }
  942. break;
  943. }
  944. }
  945. if($sn){ // sn不为空,需要检查,是否已存在
  946. $ret = Db::name('meeting_room_book')
  947. ->where('sn',$sn)
  948. ->find();
  949. if($ret){
  950. return '编号已存在,请修改后提交';
  951. }
  952. }
  953. if(in_array('投影',$options)&&!$ty){
  954. return '未输入会议议题';
  955. }
  956. if(in_array('横幅',$options)&&!$hf){
  957. return '未输入横幅文字';
  958. }
  959. $start = date('Y-m-d H:i:s',strtotime($start));
  960. $end = date('Y-m-d H:i:s',strtotime($end));
  961. // 检查时间是否有冲突
  962. $ret = Db::name('meeting_room_book')
  963. ->where('meeting_room_id',$meetingRoomId)
  964. ->where('status','in','0,1')
  965. ->where('enable',1)
  966. ->where('start_time','<=',$end)
  967. ->where('end_time','>=',$start)
  968. ->find();
  969. if($ret){
  970. return '该时间段与别的预约时间上有冲突';
  971. }
  972. return true;
  973. }
  974. }