Attendance.php 49 KB

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