Attendance.php 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  1. <?php
  2. namespace addons\qingdong\controller;
  3. use addons\qingdong\model\Approval;
  4. use addons\qingdong\model\Attendance as AttendanceModel;
  5. use addons\qingdong\model\AttendanceRule;
  6. use addons\qingdong\model\AttendanceAddress;
  7. use addons\qingdong\model\AttendanceTime;
  8. use addons\qingdong\model\AttendanceCard;
  9. use addons\qingdong\model\ExamineRecord;
  10. use addons\qingdong\model\AttendanceStatisc;
  11. use addons\qingdong\model\File;
  12. use addons\qingdong\model\Form;
  13. use addons\qingdong\model\FormApproval;
  14. use addons\qingdong\model\Leave;
  15. use addons\qingdong\model\Message;
  16. use addons\qingdong\model\Staff;
  17. use addons\qingdong\model\Flow;
  18. use think\Db;
  19. use think\Exception;
  20. /**
  21. * 考勤
  22. */
  23. class Attendance extends StaffApi
  24. {
  25. protected $noNeedLogin = ['autotask'];
  26. protected $noNeedRight = [];
  27. //规则列表
  28. public function rule_list()
  29. {
  30. $list = AttendanceRule::where([])->select();
  31. foreach ($list as $k => $v) {
  32. $address = AttendanceAddress::where([])->limit(6)->column('address');
  33. $list[$k]['address_info'] = '';
  34. if ($address) {
  35. $list[$k]['address_info'] = implode(',', $address);
  36. }
  37. $list[$k]['staff_info'] = '';
  38. $staff = Staff::where(array('id' => array('in', $v['staff_id'])))->limit(6)->column('name');
  39. if ($staff) {
  40. $list[$k]['staff_info'] = implode(',', $staff);
  41. }
  42. $time = AttendanceTime::where([])->limit(6)->select();
  43. $monday = false;
  44. $tuesday = false;
  45. $wednesday = false;
  46. $thursday = false;
  47. $friday = false;
  48. $saturday = false;
  49. $weekday = false;
  50. foreach ($time as $ks => $vs) {
  51. if ($vs['monday'] == 1) {
  52. $monday = true;
  53. }
  54. if ($vs['tuesday'] == 1) {
  55. $tuesday = true;
  56. }
  57. if ($vs['wednesday'] == 1) {
  58. $wednesday = true;
  59. }
  60. if ($vs['thursday'] == 1) {
  61. $thursday = true;
  62. }
  63. if ($vs['friday'] == 1) {
  64. $friday = true;
  65. }
  66. if ($vs['saturday'] == 1) {
  67. $saturday = true;
  68. }
  69. if ($vs['weekday'] == 1) {
  70. $weekday = true;
  71. }
  72. }
  73. $list[$k]['time_info'] = '';
  74. if ($monday && $tuesday && $wednesday && $thursday && !$friday && !$saturday && !$weekday) {
  75. $list[$k]['time_info'] = '周一至周四';
  76. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && !$saturday && !$weekday) {
  77. $list[$k]['time_info'] = '周一至周五';
  78. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && !$weekday) {
  79. $list[$k]['time_info'] = '周一至周六';
  80. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && $weekday) {
  81. $list[$k]['time_info'] = '周一至周日';
  82. } else {
  83. $timeArr = array(
  84. $monday ? '周一' : '',
  85. $tuesday ? '周二' : '',
  86. $wednesday ? '周三' : '',
  87. $thursday ? '周四' : '',
  88. $friday ? '周五' : '',
  89. $saturday ? '周六' : '',
  90. $weekday ? '周日' : '',
  91. );
  92. $timeArr = array_filter($timeArr);
  93. if ($timeArr) {
  94. $list[$k]['time_info'] = implode(',', $timeArr);
  95. }
  96. }
  97. }
  98. $this->success('请求成功', $list);
  99. }
  100. //规则详情
  101. public function rule_detail()
  102. {
  103. $params = $this->request->post();
  104. $id = $params['id'];
  105. if (!isset($params['id']) || !$params['id']) {
  106. $this->error('ID不能为空');
  107. }
  108. $list = AttendanceRule::where(['id' => $id])->find();
  109. if ($list) {
  110. $address = AttendanceAddress::where([])->limit(6)->column('address');
  111. $list['address_info'] = '';
  112. if ($address) {
  113. $list['address_info'] = implode(',', $address);
  114. }
  115. $list['staff_info'] = [];
  116. $staff = Staff::where(array('id' => array('in', $list['staff_id'])))->field('id,img,name')->select();
  117. if ($staff) {
  118. $list['staff_info'] = $staff;
  119. }
  120. $time = AttendanceTime::where([])->limit(6)->select();
  121. $monday = false;
  122. $tuesday = false;
  123. $wednesday = false;
  124. $thursday = false;
  125. $friday = false;
  126. $saturday = false;
  127. $weekday = false;
  128. $list['time_info'] = '';
  129. if ($time) {
  130. foreach ($time as $ks => $vs) {
  131. if ($vs['monday'] == 1) {
  132. $monday = true;
  133. }
  134. if ($vs['tuesday'] == 1) {
  135. $tuesday = true;
  136. }
  137. if ($vs['wednesday'] == 1) {
  138. $wednesday = true;
  139. }
  140. if ($vs['thursday'] == 1) {
  141. $thursday = true;
  142. }
  143. if ($vs['friday'] == 1) {
  144. $friday = true;
  145. }
  146. if ($vs['saturday'] == 1) {
  147. $saturday = true;
  148. }
  149. if ($vs['weekday'] == 1) {
  150. $weekday = true;
  151. }
  152. }
  153. if ($monday && $tuesday && $wednesday && $thursday && !$friday && !$saturday && !$weekday) {
  154. $list['time_info'] = '周一至周四';
  155. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && !$saturday && !$weekday) {
  156. $list['time_info'] = '周一至周五';
  157. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && !$weekday) {
  158. $list['time_info'] = '周一至周六';
  159. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && $weekday) {
  160. $list['time_info'] = '周一至周日';
  161. } else {
  162. $timeArr = array(
  163. $monday ? '周一' : '',
  164. $tuesday ? '周二' : '',
  165. $wednesday ? '周三' : '',
  166. $thursday ? '周四' : '',
  167. $friday ? '周五' : '',
  168. $saturday ? '周六' : '',
  169. $weekday ? '周日' : '',
  170. );
  171. $timeArr = array_filter($timeArr);
  172. if ($timeArr) {
  173. $list['time_info'] = implode(',', $timeArr);
  174. }
  175. }
  176. }
  177. }
  178. $this->success('请求成功', $list);
  179. }
  180. //规则添加
  181. public function rule_add()
  182. {
  183. $params = $this->request->post();
  184. if (!isset($params['name']) || !$params['name']) {
  185. $this->error('规则名称不能为空');
  186. }
  187. if (!isset($params['staff_id']) || !$params['staff_id']) {
  188. $this->error('打卡人员不能为空');
  189. }
  190. $ret = array(
  191. 'name' => $params['name'],
  192. 'staff_id' => $params['staff_id'],
  193. 'type' => $params['type'],
  194. );
  195. Db::startTrans();
  196. try {
  197. $result = AttendanceRule::create($ret);
  198. if (!$result) {
  199. throw new Exception('添加失败');
  200. }
  201. Db::commit();
  202. } catch (Exception $e) {
  203. Db::rollback();
  204. $this->error($e->getMessage());
  205. }
  206. $this->success('添加成功');
  207. }
  208. //规则修改
  209. public function rule_update()
  210. {
  211. $params = $this->request->post();
  212. $id = $params['id'];
  213. if (!isset($params['id']) || !$params['id']) {
  214. $this->error('ID不能为空');
  215. }
  216. if (!isset($params['name']) || !$params['name']) {
  217. $this->error('规则名称不能为空');
  218. }
  219. if (!isset($params['staff_id']) || !$params['staff_id']) {
  220. $this->error('打卡人员不能为空');
  221. }
  222. $ret = array(
  223. 'name' => $params['name'],
  224. 'staff_id' => $params['staff_id'],
  225. 'type' => $params['type'],
  226. );
  227. Db::startTrans();
  228. try {
  229. $result = AttendanceRule::where(array('id' => $id))->update($ret);
  230. if ($result === false) {
  231. throw new Exception('修改失败');
  232. }
  233. Db::commit();
  234. } catch (Exception $e) {
  235. Db::rollback();
  236. $this->error($e->getMessage());
  237. }
  238. $this->success('修改成功');
  239. }
  240. //规则删除
  241. public function rule_dels()
  242. {
  243. $params = $this->request->post();
  244. $id = $params['id'];
  245. if (!isset($params['id']) || !$params['id']) {
  246. $this->error('ID不能为空');
  247. }
  248. $ret = array(
  249. 'updatetime' => time(),
  250. 'deletetime' => time(),
  251. );
  252. Db::startTrans();
  253. try {
  254. $result = AttendanceRule::where(array('id' => $id))->update($ret);
  255. if (!$result) {
  256. throw new Exception('删除失败');
  257. }
  258. Db::commit();
  259. } catch (Exception $e) {
  260. Db::rollback();
  261. $this->error($e->getMessage());
  262. }
  263. $this->success('修改成功');
  264. }
  265. //时间段列表
  266. public function time_list()
  267. {
  268. $list = AttendanceTime::where([])->select();
  269. $datainfo = [];
  270. $number = '';
  271. $timeR = '';
  272. $kinfo = 0;
  273. foreach ($list as $k => $v) {
  274. $monday = false;
  275. $tuesday = false;
  276. $wednesday = false;
  277. $thursday = false;
  278. $friday = false;
  279. $saturday = false;
  280. $weekday = false;
  281. if ($v['monday'] == 1) {
  282. $monday = true;
  283. }
  284. if ($v['tuesday'] == 1) {
  285. $tuesday = true;
  286. }
  287. if ($v['wednesday'] == 1) {
  288. $wednesday = true;
  289. }
  290. if ($v['thursday'] == 1) {
  291. $thursday = true;
  292. }
  293. if ($v['friday'] == 1) {
  294. $friday = true;
  295. }
  296. if ($v['saturday'] == 1) {
  297. $saturday = true;
  298. }
  299. if ($v['weekday'] == 1) {
  300. $weekday = true;
  301. }
  302. $time_info = '';
  303. $timeR = $v['start_time'];
  304. if ($number != $v['number']) {
  305. if ($monday && $tuesday && $wednesday && $thursday && !$friday && !$saturday && !$weekday) {
  306. $time_info = '周一至周四';
  307. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && !$saturday && !$weekday) {
  308. $time_info = '周一至周五';
  309. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && !$weekday) {
  310. $time_info = '周一至周六';
  311. } elseif ($monday && $tuesday && $wednesday && $thursday && $friday && $saturday && $weekday) {
  312. $time_info = '周一至周日';
  313. } else {
  314. $timeArr = array(
  315. $monday ? '周一' : '',
  316. $tuesday ? '周二' : '',
  317. $wednesday ? '周三' : '',
  318. $thursday ? '周四' : '',
  319. $friday ? '周五' : '',
  320. $saturday ? '周六' : '',
  321. $weekday ? '周日' : '',
  322. );
  323. $timeArr = array_filter($timeArr);
  324. if ($timeArr) {
  325. $time_info = implode(',', $timeArr);
  326. }
  327. }
  328. $datainfo[] = array(
  329. 'number' => $v['number'],
  330. 'week' => $time_info,
  331. 'time' => $timeR . '-' . $v['end_time'],
  332. );
  333. $kinfo = $k;
  334. } else {
  335. $datainfo[$kinfo]['time'] = $timeR . '-' . $v['end_time'];
  336. }
  337. $number = $v['number'];
  338. }
  339. $this->success('请求成功', $datainfo);
  340. }
  341. //时间段详情
  342. public function time_detail()
  343. {
  344. $params = $this->request->post();
  345. if (!isset($params['number']) || !$params['number']) {
  346. $this->error('参数不正确');
  347. }
  348. $list = AttendanceTime::where(array('number' => $params['number']))->select();
  349. $data = [];
  350. $time = [];
  351. if ($list) {
  352. foreach ($list as $k => $v) {
  353. $time[] = array(
  354. 'start_time' => $v['start_time'],
  355. 'end_time' => $v['end_time'],
  356. 'ustart_time' => $v['ustart_time'],
  357. 'uend_time' => $v['uend_time'],
  358. 'dstart_time' => $v['dstart_time'],
  359. 'dend_time' => $v['dend_time'],
  360. 'start_status' => $v['start_status'],
  361. 'end_status' => $v['end_status'],
  362. 'start_next' => $v['start_next'],
  363. 'end_next' => $v['end_next'],
  364. );
  365. }
  366. $settime = '';
  367. if ($time) {
  368. $count = count($time);
  369. if ($time[0]['start_next'] == 1) {
  370. $set_starttime = '次日' . $time[0]['start_time'];
  371. } else {
  372. $set_starttime = $time[0]['start_time'];
  373. }
  374. if ($time[$count - 1]['end_next'] == 1) {
  375. $set_endtime = '次日' . $time[$count - 1]['end_time'];
  376. } else {
  377. $set_endtime = $time[$count - 1]['end_time'];
  378. }
  379. $settime = $set_starttime . '-' . $set_endtime;
  380. }
  381. $data = array(
  382. 'number' => $params['number'],
  383. 'time' => $time,
  384. 'settime' => $settime,
  385. 'monday' => $list[0]['monday'],
  386. 'tuesday' => $list[0]['tuesday'],
  387. 'wednesday' => $list[0]['wednesday'],
  388. 'thursday' => $list[0]['thursday'],
  389. 'friday' => $list[0]['friday'],
  390. 'saturday' => $list[0]['saturday'],
  391. 'weekday' => $list[0]['weekday'],
  392. );
  393. }
  394. $this->success('请求成功', $data);
  395. }
  396. //时间段增加
  397. public function time_add()
  398. {
  399. $params = $this->request->post();
  400. if (!isset($params['time']) || !$params['time'] || !is_array($params['time'])) {
  401. // $this->error('请设置打卡时段');
  402. }
  403. $number = time() . rand(11111, 99999);
  404. $resultTime = false;
  405. foreach ($params['time'] as $k => $v) {
  406. $rettime = array(
  407. 'number' => $number,
  408. 'start_time' => $v['start_time'],
  409. 'end_time' => $v['end_time'],
  410. 'ustart_time' => $v['ustart_time'],
  411. 'uend_time' => $v['uend_time'],
  412. 'dstart_time' => $v['dstart_time'],
  413. 'dend_time' => $v['dend_time'],
  414. 'start_status' => $v['start_status'],
  415. 'end_status' => $v['end_status'],
  416. 'start_next' => $v['start_next'],
  417. 'end_next' => $v['end_next'],
  418. 'monday' => $params['monday'],
  419. 'tuesday' => $params['tuesday'],
  420. 'wednesday' => $params['wednesday'],
  421. 'thursday' => $params['thursday'],
  422. 'friday' => $params['friday'],
  423. 'saturday' => $params['saturday'],
  424. 'weekday' => $params['weekday'],
  425. );
  426. $resultTime = AttendanceTime::create($rettime);
  427. $ids[] = AttendanceTime::getLastInsID();
  428. }
  429. if (!$resultTime) {
  430. $this->error('添加失败');
  431. }
  432. $this->success('添加成功', ['id' => implode(',', $ids)]);
  433. }
  434. //时间段修改
  435. public function time_update()
  436. {
  437. $params = $this->request->post();
  438. if (!isset($params['number']) || !$params['number']) {
  439. $this->error('时间段编号不能为空');
  440. }
  441. if (!isset($params['time']) || !$params['time'] || !is_array($params['time'])) {
  442. $this->error('请设置打卡时段');
  443. }
  444. AttendanceTime::where(['number' => $params['number']])->update(array('deletetime' => time()));
  445. $number = time() . rand(11111, 99999);
  446. $resultTime = false;
  447. foreach ($params['time'] as $k => $v) {
  448. $rettime = array(
  449. 'number' => $number,
  450. 'start_time' => $v['start_time'],//开始时间
  451. 'end_time' => $v['end_time'],//结束时间
  452. 'ustart_time' => $v['ustart_time'],//可打卡开始时间
  453. 'uend_time' => $v['uend_time'],//可打卡结束时间
  454. 'dstart_time' => $v['dstart_time'],//下班可打卡开始时间
  455. 'dend_time' => $v['dend_time'],//下班可打卡结束时间
  456. 'start_next' => $v['start_next'],//0:非次日 1:次日
  457. 'end_next' => $v['end_next'],//0:非次日 1:次日
  458. 'start_status' => $v['start_status'],//上班打卡0:开启 1:关闭
  459. 'end_status' => $v['end_status'],//下班打卡0:开启 1:关闭
  460. 'monday' => $params['monday'],//周一 0未选择 1:已选择
  461. 'tuesday' => $params['tuesday'],
  462. 'wednesday' => $params['wednesday'],
  463. 'thursday' => $params['thursday'],
  464. 'friday' => $params['friday'],
  465. 'saturday' => $params['saturday'],
  466. 'weekday' => $params['weekday'],//周日
  467. );
  468. $resultTime = AttendanceTime::create($rettime);
  469. $ids[] = AttendanceTime::getLastInsID();
  470. }
  471. $rule = AttendanceRule::where([])->find();
  472. if ($rule) {
  473. // AttendanceRule::where(array('id' => ['egt', 1]))->update(array('time_id' => implode(',', $ids)));
  474. }
  475. if (!$resultTime) {
  476. $this->error('修改失败');
  477. }
  478. $this->success('修改成功', ['id' => implode(',', $ids)]);
  479. }
  480. //时间段删除
  481. public function time_del()
  482. {
  483. $params = $this->request->post();
  484. if (!isset($params['number']) || !$params['number']) {
  485. $this->error('参数不正确');
  486. }
  487. $number = $params['number'];
  488. $resultTime = AttendanceTime::where(array('number' => $number))->update(array('deletetime' => time()));
  489. if (!$resultTime) {
  490. $this->error('删除失败');
  491. }
  492. $this->success('删除成功');
  493. }
  494. //星期是否设置
  495. public function is_week()
  496. {
  497. $list = AttendanceTime::where([])->select();
  498. $monday = 0;
  499. $tuesday = 0;
  500. $wednesday = 0;
  501. $thursday = 0;
  502. $friday = 0;
  503. $saturday = 0;
  504. $weekday = 0;
  505. foreach ($list as $k => $v) {
  506. if ($v['monday'] == 1) {
  507. $monday = 1;
  508. }
  509. if ($v['tuesday'] == 1) {
  510. $tuesday = 1;
  511. }
  512. if ($v['wednesday'] == 1) {
  513. $wednesday = 1;
  514. }
  515. if ($v['thursday'] == 1) {
  516. $thursday = 1;
  517. }
  518. if ($v['friday'] == 1) {
  519. $friday = 1;
  520. }
  521. if ($v['saturday'] == 1) {
  522. $saturday = 1;
  523. }
  524. if ($v['weekday'] == 1) {
  525. $weekday = 1;
  526. }
  527. }
  528. $data = array(
  529. 'monday' => $monday,
  530. 'tuesday' => $tuesday,
  531. 'wednesday' => $wednesday,
  532. 'thursday' => $thursday,
  533. 'friday' => $friday,
  534. 'saturday' => $saturday,
  535. 'weekday' => $weekday,
  536. );
  537. $this->success('请求成功', $data);
  538. }
  539. //地址列表
  540. public function address_list()
  541. {
  542. $list = AttendanceAddress::where([])->select();
  543. $this->success('请求成功', $list);
  544. }
  545. //地址详情
  546. public function address_detail()
  547. {
  548. $params = $this->request->post();
  549. if (!isset($params['id']) || !$params['id']) {
  550. $this->error('参数不正确');
  551. }
  552. $list = AttendanceAddress::where(array('id' => ['in', $params['id']]))->find();
  553. $this->success('请求成功', $list);
  554. }
  555. //地址增加
  556. public function address_add()
  557. {
  558. $params = $this->request->post();
  559. if (!$params['address']) {
  560. $this->error('地址不能为空');
  561. }
  562. if (!$params['distance']) {
  563. $this->error('距离不能为空');
  564. }
  565. if (!$params['lng'] || !$params['lat']) {
  566. $this->error('经纬度不能为空');
  567. }
  568. $retaddr = array(
  569. 'address' => $params['address'],
  570. 'address_detail' => $params['address_detail'],
  571. 'distance' => $params['distance'],
  572. 'lng' => $params['lng'],
  573. 'lat' => $params['lat'],
  574. );
  575. $resultAddr = AttendanceAddress::create($retaddr);
  576. if (!$resultAddr) {
  577. $this->error('添加失败');
  578. }
  579. $id = AttendanceAddress::getLastInsID();
  580. $this->success('添加成功', ['id' => $id]);
  581. }
  582. //地址修改
  583. public function address_update()
  584. {
  585. $params = $this->request->post();
  586. if (!$params['id']) {
  587. $this->error('参数不正确');
  588. }
  589. if (!$params['address']) {
  590. $this->error('地址不能为空');
  591. }
  592. if (!$params['distance']) {
  593. $this->error('距离不能为空');
  594. }
  595. if (!$params['lng'] || !$params['lat']) {
  596. $this->error('经纬度不能为空');
  597. }
  598. $retaddr = array(
  599. 'address' => $params['address'],
  600. 'address_detail' => $params['address_detail'],
  601. 'distance' => $params['distance'],
  602. 'lng' => $params['lng'],
  603. 'lat' => $params['lat'],
  604. );
  605. $resultAddr = AttendanceAddress::where(array('id' => $params['id']))->update($retaddr);
  606. if (!$resultAddr) {
  607. $this->error('修改失败');
  608. }
  609. $this->success('修改成功');
  610. }
  611. //地址删除
  612. public function address_del()
  613. {
  614. $params = $this->request->post();
  615. if (!isset($params['id']) || !$params['id']) {
  616. $this->error('参数不正确');
  617. }
  618. $id = $params['id'];
  619. $resultTime = AttendanceAddress::where(array('id' => $id))->update(array('deletetime' => time()));
  620. if (!$resultTime) {
  621. $this->error('删除失败');
  622. }
  623. $this->success('删除成功');
  624. }
  625. /**
  626. * 打卡
  627. */
  628. public function card_add()
  629. {
  630. $params = $this->request->post();
  631. if (!isset($params['type'])) { //0:上下班 1:外出
  632. $this->error('类型不能为空');
  633. }
  634. if (!$params['lng'] || !$params['lat']) {
  635. $this->error('经纬度不能为空');
  636. }
  637. //判断距离
  638. $address = AttendanceAddress::where([])->select();
  639. $disinfo = false;
  640. foreach ($address as $k => $v) {
  641. $distance = getdistance($params['lng'], $params['lat'], $v['lng'], $v['lat']);
  642. if ($v['distance'] >= $distance) {
  643. $disinfo = true;
  644. $address = $v['address'];
  645. }
  646. }
  647. if (!$disinfo) {
  648. $this->error('您不在打卡范围');
  649. }
  650. $id = input('id', 0, 'intval');
  651. $find = AttendanceStatisc::where(['id' => $id])->find();
  652. if (empty($find)) {
  653. $this->error('打卡信息不存在');
  654. }
  655. //判断打卡是否为次日
  656. $today = AttendanceStatisc::where(['time' => $find['time']])->select();
  657. $today = collection($today)->toArray();
  658. $start = $today[0]['ustart_time'];
  659. $nowtime = time();
  660. //当天首次打卡时间
  661. $todaytime1 = strtotime($find['time'] . $start);
  662. //上班
  663. $s1 = strtotime($find['time'] . $find['start_time']);
  664. //下班打卡
  665. $s2 = strtotime($find['time'] . $find['end_time']);
  666. $s1 = ($s1 < $todaytime1) ? $s1 + 86400 : $s1;//是否为次日
  667. $s2 = ($s2 < $todaytime1) ? $s2 + 86400 : $s2;//
  668. //早退
  669. $staff = Staff::info();
  670. $row = array(
  671. 'staff_id' => $staff->id,
  672. 'statisc_id' => $id,
  673. 'type' => $params['type'],
  674. 'time' => date('Y-m-d H:i:s'),
  675. 'address' => $address,
  676. 'type_name' => $params['type_name'],
  677. 'lng' => $params['lng'],
  678. 'lat' => $params['lat'],
  679. 'remarks' => $params['remarks']??'',
  680. 'file_ids' => $params['file_ids']??'',
  681. );
  682. Db::startTrans();
  683. try {
  684. $statisc = new AttendanceStatisc();
  685. if ($params['type'] == 0) {//上下班打卡
  686. if ($params['type_name'] == 0) {//上班打卡
  687. if ($nowtime > $s1) {
  688. $clock_in_status=3;//迟到
  689. $row['late'] = 1;//迟到
  690. $row['late_time'] = intval(($nowtime - $s1) / 60);//分
  691. } else {
  692. $row['late'] = 0;
  693. $row['late_time'] = 0;
  694. $clock_in_status=0;//正常
  695. }
  696. $statisc->save(['clock_in' => date('Y-m-d H:i:s'),
  697. 'clock_in_status'=>$clock_in_status,
  698. 'late_time' => $row['late_time']], ['id' => $id]);
  699. } elseif ($params['type_name'] == 1) {//下班打卡
  700. if ($nowtime < $s2) {
  701. $row['leaver'] = 1;//早退
  702. $row['leaver_time'] = intval(($s2 - $nowtime) / 60);//分
  703. $clock_out_status=3;
  704. } else {
  705. $row['leaver'] = 0;
  706. $row['leaver_time'] = 0;
  707. $clock_out_status=0;
  708. }
  709. $statisc->save(['clock_out' => date('Y-m-d H:i:s'),
  710. 'clock_out_status'=>$clock_out_status,
  711. 'leaver_time' => $row['leaver_time']], ['id' => $id]);
  712. }
  713. }
  714. $model = new AttendanceModel();
  715. $result = $model->save($row);
  716. $row['id'] = $model->id;
  717. if (!$result) {
  718. throw new Exception('打卡失败');
  719. }
  720. Db::commit();
  721. } catch (Exception $e) {
  722. Db::rollback();
  723. $this->error($e->getMessage());
  724. }
  725. $this->success('打卡成功', $row);
  726. }
  727. /**
  728. * 获取打卡详情
  729. */
  730. public function get_attendance_detail(){
  731. $id=input('id',0,'intval');
  732. $cards=AttendanceModel::where(['id'=>$id])->order('id desc')->with(['createStaff'])->find();
  733. if($cards['file_ids']){
  734. $cards['file_ids'] = File::where(['id' => ['in', $cards['file_ids']]])
  735. ->field('id,types,name,file_path')->select();
  736. }
  737. //标记通知已读
  738. Message::setRead(Message::CARD_TYPE, $id, $this->auth->id);
  739. $this->success('请求成功',$cards);
  740. }
  741. /**
  742. * 外勤打卡
  743. */
  744. public function other_card()
  745. {
  746. $params = $this->request->post();
  747. if (!isset($params['type'])) { //0:上下班 1:外出
  748. $this->error('类型不能为空');
  749. }
  750. if (!$params['lng'] || !$params['lat']) {
  751. $this->error('经纬度不能为空');
  752. }
  753. $staff = Staff::info();
  754. $row = array(
  755. 'staff_id' => $staff->id,
  756. 'type' => $params['type'],
  757. 'time' => date('Y-m-d H:i:s'),
  758. 'address' => $params['address'],
  759. 'type_name' => $params['type_name'],
  760. 'lng' => $params['lng'],
  761. 'lat' => $params['lat'],
  762. 'remarks' => $params['remarks']??'',
  763. 'file_ids' => $params['file_ids']??'',
  764. );
  765. Db::startTrans();
  766. try {
  767. $result = AttendanceModel::create($row);
  768. if (!$result) {
  769. throw new Exception('打卡失败');
  770. }
  771. Db::commit();
  772. } catch (Exception $e) {
  773. Db::rollback();
  774. $this->error($e->getMessage());
  775. }
  776. $this->success('打卡成功', $row);
  777. }
  778. /**
  779. * 补卡
  780. */
  781. public function card_late()
  782. {
  783. $params = $this->request->post();
  784. if (empty($params['statisc_id'])) {
  785. $this->error('打卡ID不能为空');
  786. }
  787. if (empty($params['title'])) {
  788. $this->error('补卡原因不能为空');
  789. }
  790. if (empty($params['time'])) {
  791. $this->error('补卡时间不能为空');
  792. }
  793. if (empty($params['remark'])) {
  794. $this->error('补卡事由不能为空');
  795. }
  796. $ret = array(
  797. 'statisc_id' => $params['statisc_id'],
  798. 'type' => $params['type'],
  799. 'time' => $params['time'],
  800. 'remark' => $params['remark'],
  801. 'file_ids' => $params['file_ids'],
  802. );
  803. $staff = Staff::info();
  804. if (!empty($staff)) {
  805. $ret['create_staff_id'] = $staff->id;
  806. }
  807. $flow = Flow::getsteplist(Flow::CARD_STATUS);
  808. if (!$flow) {
  809. $this->error('请先配置补卡审批流');
  810. }
  811. $ret['flow_id'] = $flow['flow_id'];
  812. $ret['order_id'] = $flow['order_id'];
  813. if ($flow['status'] == 0) {//发起人自选
  814. $ret['flow_staff_ids'] = trim($params['flow_staff_ids']);
  815. } else {
  816. $ret['flow_staff_ids'] = trim($flow['flow_staff_ids']);
  817. }
  818. Db::startTrans();
  819. try {
  820. $result = AttendanceCard::create($ret);
  821. if (!$result) {
  822. throw new Exception('补卡失败');
  823. }
  824. $lastId = AttendanceCard::getLastInsID();
  825. if ($flow['status'] == 1) {//固定审批
  826. if (empty($params['flow_staff_ids'])) {
  827. throw new Exception('审批人必须选择');
  828. }
  829. //发送审批通知
  830. Flow::sendStepRecord($flow, Flow::CARD_STATUS, $lastId);
  831. } else {//发起人自选 依次审批
  832. $staff_id = explode(',', $params['flow_staff_ids'])[0];
  833. if ($staff_id) {
  834. ExamineRecord::addExaminse(ExamineRecord::CARD_TYPE, $lastId, $staff_id);
  835. }
  836. }
  837. Db::commit();
  838. } catch (Exception $e) {
  839. Db::rollback();
  840. $this->error($e->getMessage());
  841. }
  842. $this->success('补卡成功');
  843. }
  844. /**
  845. * 获取补卡记录
  846. */
  847. public function get_card_late(){
  848. $limit = input("limit/d", 10);
  849. $cards=AttendanceCard::where(['create_staff_id'=>$this->auth->id])->order('id desc')->with(['createStaff'])->paginate($limit);
  850. $this->success('请求成功',$cards);
  851. }
  852. /**
  853. * 获取补卡详情
  854. */
  855. public function get_card_detail(){
  856. $id=input('id',0,'intval');
  857. $cards=AttendanceCard::where(['id'=>$id])->order('id desc')->with(['createStaff'])->find();
  858. $cards['file_ids'] = File::where(['id' => ['in', explode(',', $cards['file_ids'])]])->field('id,types,name,file_path')->select();
  859. //标记通知已读
  860. Message::setRead(Message::CARD_TYPE, $id, $this->auth->id);
  861. $this->success('请求成功',$cards);
  862. }
  863. /*
  864. * 获取考勤详情
  865. */
  866. public function get_statisc()
  867. {
  868. $statisc_id = input('statisc_id');
  869. $statisc = AttendanceStatisc::where(['id' => $statisc_id])->find();
  870. if (empty($statisc)) {
  871. $this->error('数据不存在');
  872. }
  873. $this->success('请求成功', $statisc);
  874. }
  875. /**
  876. * 是否可以打卡
  877. */
  878. public function is_card()
  879. {
  880. $params = $this->request->post();
  881. if (!$params['lng'] || !$params['lat']) {
  882. $this->error('经纬度不能为空');
  883. }
  884. //判断距离
  885. $address = AttendanceAddress::where([])->select();
  886. $disinfo = false;
  887. foreach ($address as $k => $v) {
  888. $distance = getdistance($params['lng'], $params['lat'], $v['lng'], $v['lat']);
  889. if ($v['distance'] >= $distance) {
  890. $disinfo = true;
  891. }
  892. }
  893. if (!$disinfo) {
  894. $this->success('请求成功', ['is_card' => 0, 'msg' => '不在打卡范围内!']);
  895. }
  896. //判断打卡是否为次日
  897. $today = AttendanceStatisc::where(['time' => date('Y-m-d')])->select();
  898. $today = collection($today)->toArray();
  899. if (empty($today)) {
  900. $this->success('请求成功', ['is_card' => 0, 'msg' => '不在打卡范围内!!']);
  901. }
  902. $start = $today[0]['ustart_time'];
  903. $nowtime = time();
  904. //当天首次打卡时间
  905. $todaytime1 = strtotime(date('Y-m-d ') . $start);
  906. if ($nowtime < $todaytime1) {//如果小于开始打卡时间 说明是次日
  907. $clockDate = date('Y-m-d ', strtotime('-1 day'));
  908. } else {
  909. $clockDate = date('Y-m-d ');
  910. }
  911. $staff = Staff::info();
  912. //判断是否打卡时间 0未选择 1:已选择
  913. $statisc = AttendanceStatisc::where(['time' => $clockDate, 'staff_id' => $staff->id])->select();
  914. $statisc = collection($statisc)->toArray();
  915. if (empty($statisc)) {
  916. $this->success('请求成功', ['is_card' => 0, 'msg' => '不在打卡时间范围内!']);
  917. }
  918. $intime = null;
  919. $is_end = null;
  920. foreach ($statisc as $v) {
  921. //上班
  922. $s1 = strtotime($clockDate . $v['ustart_time']);
  923. $s2 = strtotime($clockDate . $v['uend_time']);
  924. //下班打卡
  925. $d1 = strtotime($clockDate . $v['dstart_time']);
  926. $d2 = strtotime($clockDate . $v['dend_time']);
  927. $s1 = ($s1 < $todaytime1) ? $s1 + 86400 : $s1;//是否为次日
  928. $s2 = ($s2 < $todaytime1) ? $s2 + 86400 : $s2;//是否为次日
  929. if ($nowtime >= $s1 && $nowtime <= $s2 && $v['start_status'] == 0) {
  930. if (empty($v['clock_in'])) {
  931. $intime = ['type' => '上班打卡', 'time' => $v['start_time'], 'id' => $v['id'],
  932. 'text' => "请在{$v['start_time']}之前打卡", 'type_name' => 0];
  933. break;
  934. }
  935. }
  936. $d1 = ($d1 < $todaytime1) ? $d1 + 86400 : $d1;//是否为次日
  937. $d2 = ($d2 < $todaytime1) ? $d2 + 86400 : $d2;//是否为次日
  938. if ($nowtime >= $d1 && $nowtime <= $d2 && $v['end_status'] == 0) {
  939. $e = strtotime($clockDate . $v['end_time']);
  940. $e = ($e < $todaytime1) ? $e + 86400 : $e;//是否为次日
  941. if ($e > $nowtime) {
  942. $is_leaver = $e - $nowtime;
  943. } else {
  944. $is_leaver = 0;
  945. }
  946. if (empty($v['clock_out'])) {
  947. $intime = ['type' => '下班打卡', 'time' => $v['end_time'], 'id' => $v['id'], 'is_leaver' => $is_leaver,
  948. 'text' => "请在{$v['end_time']}之后打卡", 'type_name' => 1];
  949. break;
  950. }
  951. }
  952. if ((empty($v['clock_in']) || empty($v['clock_out'])) && empty($is_end)) {
  953. $is_end = $v;
  954. }
  955. }
  956. if (!empty($is_end) && empty($intime)) {//还需要打卡 且没有打卡
  957. if (empty($is_end['clock_in'])) {
  958. $this->success('请求成功', ['is_card' => 0, 'msg' => '不在上班打卡时间范围内!!']);
  959. } else {
  960. $this->success('请求成功', ['is_card' => 0, 'msg' => '不在下班打卡时间范围内!!']);
  961. }
  962. }
  963. if (empty($intime)) {
  964. //最后一次打卡
  965. $attendance = AttendanceModel::where([
  966. 'staff_id' => $staff->id,
  967. 'time' => ['like', date('Y-m-d') . '%']])->order('id desc')->find();
  968. $this->success('请求成功', ['is_card' => 2, 'msg' => '今日打卡已完成',
  969. 'intime' => $intime, 'attendance' => $attendance]);
  970. }
  971. $this->success('请求成功', ['is_card' => 1, 'msg' => '您已在打卡范围内', 'intime' => $intime]);
  972. }
  973. /**
  974. * 统计
  975. */
  976. public function statistics()
  977. {
  978. $date = input('date');
  979. if (empty($date)) {
  980. $this->error('日期不存在');
  981. }
  982. $staff = Staff::info();
  983. $date = date('Y-m-d', strtotime($date));
  984. $staff_id = $staff->id;
  985. $statisc = AttendanceStatisc::where(['time' => $date, 'staff_id' => $staff_id])->select();
  986. $other = AttendanceModel::where(['type' => 1, 'staff_id' => $staff_id,
  987. 'time' => ['like', "{$date}%"]])->select();
  988. $this->success('请求成功', ['statisc' => $statisc, 'other' => $other]);
  989. }
  990. /**
  991. * 月统计
  992. */
  993. public function month_statistics()
  994. {
  995. $month = input('month');
  996. if (empty($month)) {
  997. $this->error('月统计不存在');
  998. }
  999. $month = date('Y-m', strtotime($month));
  1000. $staff = Staff::info();
  1001. $statisc = AttendanceStatisc::where(['time' => ['like', "{$month}%"], 'staff_id' => $staff->id])->select();
  1002. $data = [];
  1003. foreach ($statisc as $v) {
  1004. $data[$v['time']][] = [
  1005. 'clock_in' => $v['clock_in'],//上班打卡
  1006. 'leaver_time' => $v['leaver_time'],
  1007. 'clock_out' => $v['clock_out'],
  1008. 'late_time' => $v['late_time'],//迟到时间
  1009. 'start_time' => $v['start_time'],
  1010. 'end_time' => $v['end_time'],
  1011. ];
  1012. }
  1013. $leave = 0;//早退
  1014. $leave_time = 0;//早退时间
  1015. $late = 0;//迟到
  1016. $late_time = 0;//迟到时间
  1017. $work = 0;//旷工
  1018. $work_time = 0;//旷工时间
  1019. $card = 0;//缺卡
  1020. $normal = 0;//正常
  1021. $error = 0;//异常
  1022. $overtime=0;//加班
  1023. foreach ($data as $day => $time) {
  1024. $is_normal = 1;//正常
  1025. $is_error = 0;//异常
  1026. foreach ($time as $t) {
  1027. if (empty($t['clock_in']) && !empty($t['clock_out'])) {//缺卡
  1028. $card += 1;
  1029. }
  1030. if (empty($t['clock_out']) && !empty($t['clock_in'])) {//缺卡
  1031. $card += 1;
  1032. }
  1033. if (empty($t['clock_in']) && empty($t['clock_out'])) {
  1034. $work += 1;
  1035. $end_time = strtotime(date('Y-m-d ') . $v['end_time']);
  1036. $start_time = strtotime(date('Y-m-d ') . $v['start_time']);
  1037. $end_time = $end_time > $start_time ? $end_time : $end_time + 86400;
  1038. //旷工时长
  1039. $wtime = intval(($end_time - $start_time) / 60);
  1040. $work_time += $wtime;
  1041. }
  1042. if ($t['leaver_time'] > 0) {//早退
  1043. $leave += 1;
  1044. $leave_time += $t['leaver_time'];
  1045. }
  1046. if ($t['late_time'] > 0) {//迟到
  1047. $late += 1;
  1048. $late_time += $t['late_time'];
  1049. }
  1050. if (empty($t['clock_in']) || empty($t['clock_out'])
  1051. || $t['late_time'] != 0 || $t['leaver_time'] != 0) {//不正常卡
  1052. $is_normal = 0;
  1053. $is_error = 1;
  1054. }
  1055. //工作日加班
  1056. if ($t['clock_out'] && $leave_time == 0) {
  1057. $clock_out = strtotime($t['clock_out']);
  1058. $date = date('Y-m-d ', $clock_out);
  1059. $end_time = $date . $t['end_time'];
  1060. $end_time = strtotime($end_time);
  1061. if ($end_time < $clock_out) {
  1062. $end_time = $end_time + 86400;
  1063. }
  1064. $overtime += intval(($end_time - $clock_out) / 60);
  1065. }
  1066. }
  1067. if ($is_normal == 1) {
  1068. $normal += 1;
  1069. }
  1070. if ($is_error == 1) {
  1071. $error += 1;
  1072. }
  1073. }
  1074. //外勤
  1075. $other = AttendanceModel::where(['type' => 1, 'staff_id' => $staff->id, 'time' => ['like', "{$month}%"]])->count();
  1076. $this->success('请求成功', [
  1077. 'leave' => $leave,
  1078. 'leave_time' => $leave_time,
  1079. 'late' => $late,
  1080. 'late_time' => $late_time,
  1081. 'work' => $work,
  1082. 'work_time' => $work_time,
  1083. 'card' => $card,
  1084. 'normal' => $normal,
  1085. 'error' => $error,
  1086. 'other' => $other,
  1087. 'overtime' => $overtime,
  1088. ]);
  1089. }
  1090. /**
  1091. * 日统计
  1092. */
  1093. public function day_statistics(){
  1094. $month = input('month');
  1095. $type=input('type');//类型 leave 早退 late 迟到 work 旷工 card 缺卡
  1096. if (empty($month)) {
  1097. $this->error('月统计不存在');
  1098. }
  1099. if (empty($type)) {
  1100. $this->error('类型不存在');
  1101. }
  1102. $month = date('Y-m', strtotime($month));
  1103. $staff = Staff::info();
  1104. $statisc = AttendanceStatisc::where(['time' => ['like', "{$month}%"], 'staff_id' => $staff->id])->select();
  1105. $data = [];
  1106. foreach ($statisc as $v) {
  1107. $data[$v['time']][] = [
  1108. 'clock_in' => $v['clock_in'],//上班打卡
  1109. 'leaver_time' => $v['leaver_time'],
  1110. 'clock_out' => $v['clock_out'],
  1111. 'late_time' => $v['late_time'],//迟到时间
  1112. 'start_time' => $v['start_time'],
  1113. 'end_time' => $v['end_time'],
  1114. ];
  1115. }
  1116. $result=[];
  1117. foreach ($data as $day=>$time) {
  1118. $leave = 0;//早退
  1119. $leave_time = 0;//早退时间
  1120. $late = 0;//迟到
  1121. $late_time = 0;//迟到时间
  1122. $work = 0;//旷工
  1123. $work_time = 0;//旷工时间
  1124. $card = 0;//缺卡
  1125. foreach ($time as $t) {
  1126. if (empty($t['clock_in']) && !empty($t['clock_out'])) {//缺卡
  1127. $card += 1;
  1128. }
  1129. if (empty($t['clock_out']) && !empty($t['clock_in'])) {//缺卡
  1130. $card += 1;
  1131. }
  1132. if (empty($t['clock_in']) && empty($t['clock_out'])) {
  1133. $work += 1;
  1134. $end_time = strtotime(date('Y-m-d ') . $v['end_time']);
  1135. $start_time = strtotime(date('Y-m-d ') . $v['start_time']);
  1136. $end_time = $end_time > $start_time ? $end_time : $end_time + 86400;
  1137. //旷工时长
  1138. $wtime = intval(($end_time - $start_time) / 60);
  1139. $work_time += $wtime;
  1140. }
  1141. if ($t['leaver_time'] > 0) {//早退
  1142. $leave += 1;
  1143. $leave_time += $t['leaver_time'];
  1144. }
  1145. if ($t['late_time'] > 0) {//迟到
  1146. $late += 1;
  1147. $late_time += $t['late_time'];
  1148. }
  1149. }
  1150. if($type == 'leave' && $leave_time > 0 ){//早退
  1151. $result[]=['day'=>$day,'msg'=>'早退'.$leave_time.'分钟'];
  1152. }
  1153. if($type == 'late' && $late_time > 0){//迟到
  1154. $result[]=['day'=>$day,'msg'=>'迟到'.$late_time.'分钟'];
  1155. }
  1156. if($type == 'work' && $work_time > 0){//旷工
  1157. $result[]=['day'=>$day,'msg'=>'旷工'.$work_time.'分钟'];
  1158. }
  1159. if ($type == 'card' && $card > 0) {//缺卡
  1160. $result[] = ['day' => $day, 'msg' => '缺卡' . $card . '次'];
  1161. }
  1162. }
  1163. $this->success('请求成功',$result);
  1164. }
  1165. /**
  1166. * 请假
  1167. */
  1168. public function leave()
  1169. {
  1170. $data = $this->request->post();
  1171. if (empty($data)) {
  1172. $this->error('数据不能为空');
  1173. }
  1174. try {
  1175. //请假单
  1176. Leave::createLeave($data);
  1177. Db::commit();
  1178. } catch (Exception $e) {
  1179. Db::rollback();
  1180. $this->error($e->getMessage());
  1181. }
  1182. $this->success('提交成功');
  1183. }
  1184. /**
  1185. * 获取请假记录
  1186. */
  1187. public function get_leave(){
  1188. $limit = input("limit/d", 10);
  1189. $type=input('type');
  1190. $cards=Leave::where(['create_staff_id'=>$this->auth->id])->order('id desc')->with(['createStaff'])->paginate($limit);
  1191. $this->success('请求成功',$cards);
  1192. }
  1193. /**
  1194. * 获取请假详情
  1195. */
  1196. public function get_leave_detail(){
  1197. $id=input('id',0,'intval');
  1198. $leave=Leave::where(['id'=>$id])->order('id desc')->with(['createStaff'])->find();
  1199. $leave['file_ids'] = File::where(['id' => ['in', explode(',', $leave['file_ids'])]])->field('id,types,name,file_path')->select();
  1200. //标记通知已读
  1201. Message::setRead(Message::LEAVE_TYPE, $id, $this->auth->id);
  1202. $this->success('请求成功',$leave);
  1203. }
  1204. /**
  1205. * 计算请假时间
  1206. */
  1207. public function getleavetime()
  1208. {
  1209. $start_time = input('start_time');
  1210. $end_time = input('end_time');
  1211. if(empty($start_time) || empty($end_time)){
  1212. $this->error('参数错误');
  1213. }
  1214. $start_time= strtotime($start_time);
  1215. $end_time= strtotime($end_time);
  1216. $start_date = strtotime(date('Y-m-d', $start_time));
  1217. $end_date = strtotime(date('Y-m-d', $end_time));
  1218. $fields = [
  1219. 1 => 'monday',
  1220. 2 => 'tuesday',
  1221. 3 => 'wednesday',
  1222. 4 => 'thursday',
  1223. 5 => 'friday',
  1224. 6 => 'saturday',
  1225. 0 => 'weekday',
  1226. ];
  1227. $hour=0;
  1228. for ($start_date; $start_date <= $end_date; $start_date = $start_date + 86400) {
  1229. $w = date('w', $start_date);
  1230. $attendances = AttendanceTime::where([$fields[$w] => 1])->select();
  1231. foreach ($attendances as $a) {
  1232. $start = strtotime(date('Y-m-d ', $start_date) . $a['start_time']);
  1233. $end = strtotime(date('Y-m-d ', $start_date) . $a['end_time']);
  1234. $end = $start < $end ? $end : $end + 86400;
  1235. if ($start_time < $start && $end_time > $end) {
  1236. $hour += ceil(($end - $start) / (60 * 60));
  1237. }
  1238. if ($start_time < $start && $end_time < $end) {
  1239. $hour += ceil(($end_time - $start) / (60 * 60));
  1240. }
  1241. if ($start_time > $start && $end_time > $end) {
  1242. $hour += ceil(($end - $start_time) / (60 * 60));
  1243. }
  1244. if ($start_time > $start && $end_time < $end) {
  1245. $hour += ceil(($end_time - $start_time) / (60 * 60));
  1246. }
  1247. }
  1248. }
  1249. $this->success('请求成功',['hour'=>$hour]);
  1250. }
  1251. }