workercheck.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: sicilon_IT
  5. * Date: 2020/1/13
  6. * Time: 0:05
  7. */
  8. namespace app\index\logic;
  9. use app\index\model\gworkermodel;
  10. use app\index\model\prjlocationmodel;
  11. use app\index\model\transfermodel;
  12. use app\index\model\wheadmodel;
  13. use app\index\model\checkoprmodel;
  14. use app\index\model\ginfomodel;
  15. use app\index\model\pwrelationmodel;
  16. use app\index\model\checkinfomodel;
  17. use app\index\model\daycheckinfo;
  18. use app\index\model\pinfomodel;
  19. use app\index\model\gcmodel;
  20. use app\index\model\contactmodel;
  21. use app\index\model\complainmodel;
  22. use app\index\model\daypricerecodemodel;
  23. use app\index\model\workerindaymodel;
  24. use app\index\model\workersignmodel;
  25. use think\Log;
  26. class workercheck {
  27. public function isheaderbytel($tel) {
  28. /*
  29. * 20200304
  30. * 修改接口
  31. * 增加返回pid
  32. * 返回pnaem
  33. * eidt by 20250209
  34. *
  35. */
  36. $workertable = new gworkermodel();
  37. $workerid = $workertable->getidbytel($tel);
  38. if ($workerid === 0) {
  39. //电话不存在
  40. $res['r_code'] = 0;
  41. return $res;
  42. } else {
  43. //获取项目id
  44. $workerinfo = $workertable->getinfobyid($workerid);
  45. $pid = $workerinfo['cprojectid'];
  46. if ($pid > 0) {
  47. $t_prj = new pinfomodel();
  48. $pinfo = $t_prj->getbyid($pid);
  49. $pname = $pinfo['pname'];
  50. } else {
  51. $pname = '';
  52. }
  53. //获取组长ID
  54. $ghead = new wheadmodel();
  55. $gid = $ghead->getgidbywid($workerid);
  56. if ($gid === 0) {
  57. //不是班组长
  58. $res['r_code'] = 9902;
  59. $res['workerData']['wid'] = $workerid;
  60. $res['workerData']['pid'] = $pid;
  61. $res['workerData']['pname'] = $pname;
  62. return $res;
  63. } else {
  64. //是班组长,给合同名称
  65. $t_gc = new gcmodel();
  66. $gc = $t_gc->selcinfobygid($gid);
  67. if ($gc) {
  68. $t_c = new contactmodel();
  69. $cinfo = $t_c->selcinfobycid($gc['cid']);
  70. }
  71. $res['r_code'] = 200;
  72. $res['workerData']['gid'] = $gid;
  73. $res['workerData']['wid'] = $workerid;
  74. $res['workerData']['pid'] = $pid;
  75. if ($gc) {
  76. $res['workerData']['pname'] = $cinfo['contactname'];
  77. } else {
  78. $res['workerData']['pname'] = $pname;
  79. }
  80. return $res;
  81. }
  82. }
  83. }
  84. public function isheaderbytelV2($uinfo) {
  85. /*
  86. * 20200304
  87. * 修改接口
  88. * 增加返回pid
  89. * 返回pnaem
  90. * eidt by 20250209
  91. * 修改参数为数组而非电话
  92. * 增加打卡保存
  93. * 增加工人坐标在项目位置10公里以内
  94. * 增加班组长坐标在项目位置10公里以内的检查
  95. *
  96. * todo 增加判断是否有坐标参数
  97. *
  98. */
  99. $workertable = new gworkermodel();
  100. $tel = $uinfo['tel'];
  101. $paramhaslocation = 0;
  102. if (!empty($uinfo['gps_lng'])) {
  103. $paramhaslocation = 1;
  104. }
  105. log::info($paramhaslocation);
  106. $workerid = $workertable->getidbytel($tel);
  107. if ($workerid === 0) {
  108. //电话不存在
  109. $res['r_code'] = 0;
  110. return $res;
  111. } else {
  112. //获取项目id
  113. $workerinfo = $workertable->getinfobyid($workerid);
  114. $pid = $workerinfo['cprojectid'];
  115. if ($pid > 0) {
  116. $t_prj = new pinfomodel();
  117. $pinfo = $t_prj->getbyid($pid);
  118. $pname = $pinfo['pname'];
  119. } else {
  120. $pname = '';
  121. }
  122. //如果在正式藏在,获取项目地点,进行比较
  123. $inprjlocation = 0; //预设不在项目内;
  124. $distance = 0;
  125. if ($paramhaslocation == 0) {
  126. $inprjlocation = 1; //如果没有位置参数,则可以继续打卡
  127. }
  128. if ($paramhaslocation) {
  129. if ($pid > 3) {
  130. $t_pl = new prjlocationmodel();
  131. $ploaction = $t_pl->selinfobyprjid($pid);
  132. log::info($ploaction);
  133. if (!empty($ploaction)) {
  134. log::info('computergps');
  135. $p_lng = $ploaction['gps_lng'];
  136. $p_lat = $ploaction['gps_lat'];
  137. $distance = $this->calculateDistance($p_lat, $p_lng, $uinfo['gps_lat'], $uinfo['gps_lng']);
  138. if ($distance < 10) {
  139. $inprjlocation = 1;
  140. }
  141. }
  142. }
  143. //保存登录记录
  144. $singinfo['wid'] = $workerid;
  145. $singinfo['signdate'] = date('Y-m-d');
  146. $singinfo['signpid'] = $pid;
  147. $singinfo['signsuccess'] = $inprjlocation;
  148. $singinfo['gps_lng'] = $uinfo['gps_lng'];
  149. $singinfo['gps_lat'] = $uinfo['gps_lat'];
  150. $t_ws = new workersignmodel();
  151. $rs = $t_ws->insinfo($singinfo);
  152. }
  153. //获取组长ID
  154. $ghead = new wheadmodel();
  155. $gid = $ghead->getgidbywid($workerid);
  156. if ($gid === 0) {
  157. //不是班组长
  158. //如果正常项目,如果有位置参数,且不在范围内,移出项目,返回新的项目信息
  159. if ($paramhaslocation && $pid > 3 && $inprjlocation == 0) {
  160. $isleave = $this->transferworerfromprj($workerid, $workerinfo['wname'], $workerinfo['telno']); //移出项目
  161. $res['r_code'] = 9902;
  162. $res['workerData']['wid'] = $workerid;
  163. $res['workerData']['pid'] = 3;
  164. $res['workerData']['pname'] = '人才库';
  165. $res['workerData']['isleavejobbydistance'] = 1;
  166. return $res;
  167. } else {
  168. $res['r_code'] = 9902;
  169. $res['workerData']['wid'] = $workerid;
  170. $res['workerData']['pid'] = $pid;
  171. $res['workerData']['pname'] = $pname;
  172. return $res;
  173. }
  174. } else {
  175. //是班组长,给合同名称
  176. $t_gc = new gcmodel();
  177. $gc = $t_gc->selcinfobygid($gid);
  178. if ($gc) {
  179. $t_c = new contactmodel();
  180. $cinfo = $t_c->selcinfobycid($gc['cid']);
  181. $pname = $cinfo['contactname'];
  182. }
  183. $res['r_code'] = 200;
  184. $res['workerData']['gid'] = $gid;
  185. $res['workerData']['wid'] = $workerid;
  186. $res['workerData']['pid'] = $pid;
  187. $res['workerData']['pname'] = $pname;
  188. $res['workerData']['inproject'] = $inprjlocation;
  189. $res['workerData']['distance'] = $distance;
  190. return $res;
  191. }
  192. }
  193. }
  194. private function createshiftlist() {
  195. $datenow = date('Y-m-d ');
  196. $datestart = date('Y-m-d', strtotime('-1 day'));
  197. // $shift_arr[$datestart][1]=1;
  198. // $shift_arr[$datestart][2]=1;
  199. // $shift_arr[$datenow][1]=1;
  200. // $shift_arr[$datenow][2]=1;
  201. $shift_arr[0]['date'] = $datestart;
  202. $shift_arr[0]['shift'] = '1';
  203. $shift_arr[0]['ischeck'] = '1';
  204. $shift_arr[0]['index'] = 0;
  205. $shift_arr[1]['date'] = $datestart;
  206. $shift_arr[1]['shift'] = '2';
  207. $shift_arr[1]['ischeck'] = '1';
  208. $shift_arr[1]['index'] = 1;
  209. $shift_arr[2]['date'] = $datenow;
  210. $shift_arr[2]['shift'] = '1';
  211. $shift_arr[2]['ischeck'] = '1';
  212. $shift_arr[2]['index'] = 2;
  213. $shift_arr[3]['date'] = $datenow;
  214. $shift_arr[3]['shift'] = '2';
  215. $shift_arr[3]['ischeck'] = '1';
  216. $shift_arr[3]['index'] = 3;
  217. return $shift_arr;
  218. }
  219. private function subshiltlist($shift_arr) {
  220. $index = 0;
  221. $r_list = array();
  222. foreach ($shift_arr as $k => $v) {
  223. //var_dump($v);
  224. if ($v['ischeck'] == 1) {
  225. $r_list[$index]['index'] = $index;
  226. $r_list[$index]['date'] = $v['date'];
  227. $r_list[$index]['shift'] = $v['shift'];
  228. if ($v['shift'] == 1) {
  229. $r_list[$index]['disstr'] = $v['date'] . '日早班(0:00-12:00)';
  230. } else {
  231. $r_list[$index]['disstr'] = $v['date'] . '日晚班(12:00-24:00)';
  232. }
  233. $index += 1;
  234. }
  235. }
  236. return $r_list;
  237. }
  238. //获得记分班次
  239. public function getshiftbywid($wid) {
  240. $shift_arr = $this->createshiftlist();
  241. //每个班组长可以分次记一个班,避免一个班次人太多,记错的情况
  242. $r_list = $this->subshiltlist($shift_arr);
  243. return $r_list;
  244. }
  245. /*
  246. * 20200729
  247. * 获取班次同时获取班组已考勤人数
  248. */
  249. public function getshiftandcountbywid($wid, $gid) {
  250. $shift_arr = $this->createshiftlist();
  251. //每个班组长可以分次记一个班,避免一个班次人太多,记错的情况
  252. $r_list = $this->subshiltlist($shift_arr);
  253. $t_dc = new daycheckinfo();
  254. foreach ($r_list as &$kv) {
  255. $checkdate = $kv['date'];
  256. $shift = $kv['shift'];
  257. $count = $t_dc->selcountbygid($gid, $checkdate, $shift);
  258. $kv['checkcount'] = $count[0]['checkcount'];
  259. }
  260. return $r_list;
  261. }
  262. //获得记分日期
  263. /*
  264. * 20210303 修改成7天
  265. */
  266. public function getcheckdate() {
  267. // $datenow=date('Y-m-d ');
  268. // $datestart=date('Y-m-d',strtotime('-1 day'));
  269. // $datestart_begin=date('Y-m-d',strtotime('-2 day'));
  270. for ($i = 0; $i < 7; $i++) {
  271. $shift_arr[$i]['date'] = date('Y-m-d', strtotime('-' . (string) ($i) . ' day'));
  272. $shift_arr[$i]['shift'] = '1';
  273. $shift_arr[$i]['disstr'] = $shift_arr[$i]['date'] . '日';
  274. $shift_arr[$i]['index'] = $i;
  275. }
  276. // $shift_arr[0]['date']=$datestart_begin;$shift_arr[0]['shift']='1';$shift_arr[0]['disstr']=$datestart_begin.'日';;$shift_arr[0]['index']=0;
  277. // $shift_arr[1]['date']=$datestart;$shift_arr[1]['shift']='1';$shift_arr[1]['disstr']=$datestart.'日';;$shift_arr[1]['index']=1;
  278. // $shift_arr[2]['date']=$datenow;$shift_arr[2]['shift']='2';$shift_arr[2]['disstr']=$datenow.'日';$shift_arr[2]['index']=2;
  279. return $shift_arr;
  280. }
  281. public function getworkerlistbyhead($gid, $checkdate, $shift, $wid) {
  282. //获取项目工人
  283. //获取是那个项目的
  284. $ginfo = new ginfomodel();
  285. $pid = $ginfo->getpidbygid($gid);
  286. if ($pid === 0) {
  287. $res['r_code'] = 9910;
  288. return $res;
  289. } else {
  290. //预判合法性,Gw关系是合法的,因为在实时读取,所以本判断还是坚持原来的作用,对异常进行判定
  291. if ($wid > 0) {
  292. //$wid>0,只有传了才检查,
  293. $t_gworker = new gworkermodel();
  294. $queryuserinfo = $t_gworker->getinfobyid($wid, $gid);
  295. if ($queryuserinfo) {
  296. //如果返回有值再检查
  297. if ($pid != $queryuserinfo['cprojectid']) {
  298. $res['r_code'] = 9910;
  299. return $res;
  300. }
  301. }
  302. }
  303. //根据项目获取工人
  304. //目前先采用跨表联查获取,人数多了再采用内存中优化 20200113
  305. $worktable = new pwrelationmodel();
  306. $workerlist = $worktable->getworkerunlist($pid, $checkdate, $shift);
  307. // $workerlist=$worktable->getworkerlistbypid($pid); //20200113 标准方法,先获取班组工人,暂时不用
  308. if (empty($workerlist)) {
  309. //没有工人
  310. $res['r_code'] = 9911;
  311. $res['pid'] = $pid;
  312. return $res;
  313. } else {
  314. /**
  315. *
  316. 这一段原来采用分表查询,但是由于需要对两个数组循环,先直接采用数据表联查方法 20200113
  317. //去掉已考勤人员
  318. //获得已考勤人员
  319. $checktable=new checkinfomodel();
  320. $c_list=$checktable->getcheckworkerlistbydate($checkdate,$shift,$pid);
  321. //去掉重复
  322. // foreach($c_list)
  323. */
  324. $res['r_code'] = 1;
  325. $res['pid'] = $pid;
  326. $res['wlist'] = $workerlist;
  327. return $res;
  328. }
  329. }
  330. }
  331. //20200203日停止使用
  332. public function oprcheckinfo($checklist, $checkoprinfo) {
  333. //存入考勤详情数据
  334. $checktable = new checkinfomodel();
  335. // var_dump($checklist);
  336. $savecount = $checktable->savechecklist($checklist);
  337. //存入考勤
  338. $oprtable = new checkoprmodel();
  339. $checkoprinfo['oprtime'] = date('Y:m:d H:i:s');
  340. $checkoprinfo['wnum'] = $savecount;
  341. //任取一条记录的pid
  342. $checkoprinfo['pid'] = $checklist[0]['pid'];
  343. $oprtable->saveOprRecord($checkoprinfo);
  344. return $savecount;
  345. }
  346. //20200203后采用,按日记考勤
  347. /*
  348. * 20200307
  349. * 修改,有gid时记录gid,没有gid时获取gid
  350. */
  351. public function savedaycheckinfo($checklist, $checkoprinfo) {
  352. $day_table = new daycheckinfo();
  353. $icount = 0;
  354. //判断是否有有效gid,没有的话根据班组长id获取
  355. if ($checkoprinfo['gid'] > 0) {
  356. $gid = $checkoprinfo['gid'];
  357. } else {
  358. $headid = $checkoprinfo['headid'];
  359. $t_head = new wheadmodel();
  360. $gid = $t_head->getgidbywid($headid);
  361. $checkoprinfo['gid'] = $gid;
  362. }
  363. //逐条存入考勤详情
  364. foreach ($checklist as $key => $v) {
  365. $check = array();
  366. $check['pid'] = $v['pid'];
  367. $check['wid'] = $v['wid'];
  368. $check['wname'] = $v['wname'];
  369. if (array_key_exists('dayprice', $v)) {
  370. if (is_numeric($v['dayprice'])) {
  371. $check['dayprice'] = $v['dayprice'];
  372. } else {
  373. $check['dayprice'] = 0;
  374. }
  375. }
  376. $check['checkdate'] = $v['checkdate'];
  377. if ($v['checkorder'] == 1) {
  378. $check['score_1'] = $v['workscore'];
  379. $check['headid_1'] = $v['checkheadid'];
  380. $check['gid_1'] = $gid;
  381. $check['oprtime_1'] = $v['oprtime'];
  382. } else {
  383. $check['score_2'] = $v['workscore'];
  384. $check['headid_2'] = $v['checkheadid'];
  385. $check['gid_2'] = $gid;
  386. $check['oprtime_2'] = $v['oprtime'];
  387. }
  388. $id = $day_table->addnewcheck($check);
  389. if ($id > 0) {
  390. $icount++;
  391. };
  392. }
  393. $oprtable = new checkoprmodel();
  394. $checkoprinfo['oprtime'] = date('Y:m:d H:i:s');
  395. $checkoprinfo['wnum'] = $icount;
  396. //任取一条记录的pid
  397. $checkoprinfo['pid'] = $checklist[0]['pid'];
  398. $oprtable->saveOprRecord($checkoprinfo);
  399. return $icount;
  400. }
  401. public function getworkercheckinfobyid($wid) {
  402. //20200203后停用班次数据,采用日记录
  403. // $checkinfo=new checkinfomodel();
  404. //20200216日起,APP不调用此端口,改为调用按月查询接口
  405. $checkinfo = new daycheckinfo(); //20200203启用日数据表
  406. $r_list = $checkinfo->getusercheckinfobywid($wid);
  407. return $r_list;
  408. }
  409. /*
  410. * 20200216
  411. * steelxu
  412. * 按月查询工人的记分记录,提交给APP端
  413. */
  414. public function getworkercheckinfobyidwithmonth($wid, $month) {
  415. $checkinfo = new daycheckinfo();
  416. $r_list = $checkinfo->getusercheckinfobywidwithmonth($wid, $month);
  417. return $r_list;
  418. }
  419. public function gettotallistbywid($wid) {
  420. $checkinfo = new daycheckinfo(); //20200203启用日数据表
  421. $r_list = $checkinfo->totalcheckbymonthwithwid($wid);
  422. return $r_list;
  423. }
  424. /*
  425. * 20200317
  426. * 按月度,按班组返回员工考勤分数
  427. *
  428. */
  429. public function getScoreGroupbyWidWithMonth($arr) {
  430. //准备
  431. $wid = $arr['wid'];
  432. $month = $arr['strmonth'];
  433. $grouplist = array();
  434. $gidlist = array();
  435. $checkinfo = new daycheckinfo();
  436. $t_g = new ginfomodel();
  437. $t_p = new pinfomodel();
  438. //获取基础数据
  439. $r_list = $checkinfo->getusercheckinfobywidwithmonth($wid, $month);
  440. //汇总班组数据
  441. foreach ($r_list as $k) {
  442. $gid = $k['gid_1'];
  443. if ($gid && (!(in_array($gid, $gidlist)))) {
  444. //新班组
  445. $gitem['gid'] = $gid;
  446. $ginfo = $t_g->selginfobygid($gid);
  447. $gitem['gname'] = $ginfo['gname'];
  448. $pid = $ginfo['pid'];
  449. $pinfo = $t_p->getbyid($pid);
  450. $gitem['prjname'] = $pinfo['pname'];
  451. array_push($grouplist, $gitem);
  452. array_push($gidlist, $gid);
  453. }
  454. $gid = $k['gid_2'];
  455. if ($gid && (!(in_array($gid, $gidlist)))) {
  456. //新班组
  457. $gitem['gid'] = $gid;
  458. $ginfo = $t_g->selginfobygid($gid);
  459. $gitem['gname'] = $ginfo['gname'];
  460. $pid = $ginfo['pid'];
  461. $pinfo = $t_p->getbyid($pid);
  462. $gitem['prjname'] = $pinfo['pname'];
  463. array_push($grouplist, $gitem);
  464. array_push($gidlist, $gid);
  465. }
  466. }
  467. $rlist['grouplist'] = $grouplist;
  468. $rlist['dayscorelist'] = $r_list;
  469. //返回总数据
  470. return $rlist;
  471. }
  472. /*
  473. * 2020531
  474. * 根据项目,日期,班次,获取未记考勤的员工
  475. */
  476. public function getunchecklist($arr) {
  477. $pid = $arr['pid'];
  478. $checkdate = $arr['checkdate'];
  479. $shift = $arr['checkshift'];
  480. $worktable = new pwrelationmodel();
  481. $workerlist = $worktable->selunwlistforupdate($pid, $checkdate, $shift);
  482. return $workerlist;
  483. }
  484. /*
  485. * 20210421
  486. */
  487. public function savecomplaininf($arr) {
  488. $arr['complaindate'] = date('Y-m-d');
  489. $t_c = new complainmodel();
  490. if ($arr['complaintype'] == 1) {
  491. $t_w = new gworkermodel();
  492. $winfo = $t_w->getinfobyid($arr['complainuser']);
  493. $arr['complainusername'] = $winfo['wname'];
  494. }
  495. $id = $t_c->insinfo($arr);
  496. return $id;
  497. }
  498. /*
  499. * 20210421
  500. */
  501. public function getcomplainlist() {
  502. $t_c = new complainmodel();
  503. $list = $t_c->sellistbyunopr();
  504. return $list;
  505. }
  506. /*
  507. * 20230215
  508. * 由于原始数据中没有工地数据
  509. * 采用join方式,数据量巨大,
  510. * 所以获取所有的投诉之后
  511. * 轮巡检查是否某公司的项目
  512. * 经检查 ,只能用daycheckinfo
  513. */
  514. public function getcomplainlistbycid($arr) {
  515. $cid = $arr['companyid'];
  516. $t_c = new complainmodel();
  517. $list = $t_c->sellistbyunopr();
  518. $t_p = new pinfomodel();
  519. $plist = $t_p->sellistbycid($cid);
  520. $p_arr = array();
  521. foreach ($plist as $prj) {
  522. array_push($p_arr, $prj['id']);
  523. }
  524. $t_dc = new daycheckinfo();
  525. $clist = array();
  526. foreach ($list as $complain) {
  527. $coprid = $complain['checkinfoid'];
  528. $hcinfo = $t_dc->selinfobyid($coprid);
  529. $cpid = $hcinfo['pid'];
  530. if (in_array($cpid, $p_arr)) {
  531. array_push($clist, $complain);
  532. }
  533. }
  534. return $clist;
  535. }
  536. /*
  537. * 20230303
  538. */
  539. public function oprinencloseinfo($arr) {
  540. $nowstauts = $arr['nowstatus'];
  541. $prjid = $arr['prjid'];
  542. $wid = $arr['wid'];
  543. $recdate = $arr['checkdate'];
  544. $t_wi = new workerindaymodel();
  545. $lastrec = $t_wi->selinfobywid($wid, $recdate, $prjid);
  546. $arrreturn['status'] = 0;
  547. $arrreturn['msg'] = '';
  548. $arrreturn['data'] = array();
  549. if (!$lastrec) {
  550. //当天第一条
  551. $newrec['nowstatus'] = $nowstauts;
  552. $newrec['peid'] = $prjid;
  553. $newrec['wid'] = $wid;
  554. $newrec['checkdate'] = $recdate;
  555. $newrec['lastupdatetime'] = $arr['updatetime'];
  556. /* 需要处理,避免进入围栏后再开机的漏洞
  557. if($nowstauts==1){
  558. //如果是一开始不在现场,则增加最开始在现场的时间
  559. $newhours=substr($arr['updatetime'],12,2);
  560. $newrec['todayinhours']=$newhours;
  561. }
  562. */
  563. $rid = $t_wi->insinfo($newrec);
  564. if ($rid) {
  565. $arrreturn['status'] = '1';
  566. $arrreturn['msg'] = '新增当日围栏状态成功';
  567. return $arrreturn;
  568. } else {
  569. $arrreturn['msg'] = '新增当日围栏状态失败';
  570. return $arrreturn;
  571. }
  572. } else {
  573. $oldstatus = $lastrec['nowstatus'];
  574. if ($oldstatus == $nowstauts) {
  575. $arrreturn['msg'] = '状态未变更';
  576. return $arrreturn;
  577. }
  578. if ($nowstauts == 1) {
  579. $updatearr['nowstatus'] = 1;
  580. $updatearr['lastupdatetime'] = $arr['updatetime'];
  581. $rec = $t_wi->updateinstatus($wid, $recdate, $prjid, $updatearr);
  582. if ($rec) {
  583. $arrreturn['status'] = '1';
  584. $arrreturn['msg'] = '更改为围栏内状态';
  585. return $arrreturn;
  586. } else {
  587. $arrreturn['msg'] = '更改为围栏内状态失败';
  588. return $arrreturn;
  589. }
  590. }
  591. if ($nowstauts == 2) {
  592. $updatearr['nowstatus'] = 2;
  593. $updatearr['lastupdatetime'] = $arr['updatetime'];
  594. //计算时长
  595. $oldhours = substr($lastrec['lastupdatetime'], 11, 2);
  596. log::info($oldhours);
  597. $newhours = substr($arr['updatetime'], 11, 2);
  598. log::info($newhours);
  599. $newhourcount = (int) $newhours - (int) $oldhours;
  600. $oldhourcount = $lastrec['todayinhours'];
  601. $newhourcount = $newhourcount + $oldhourcount;
  602. $updatearr['todayinhours'] = $newhourcount;
  603. //
  604. $rec = $t_wi->updateoutstatus($wid, $recdate, $prjid, $updatearr);
  605. if ($rec) {
  606. $arrreturn['status'] = '1';
  607. $arrreturn['msg'] = '更改为出围栏状态';
  608. return $arrreturn;
  609. } else {
  610. $arrreturn['msg'] = '更改出围栏状态失败';
  611. return $arrreturn;
  612. }
  613. }
  614. }
  615. }
  616. private function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit = 'km') {
  617. // 将角度转换为弧度
  618. $lat1 = deg2rad($lat1);
  619. $lon1 = deg2rad($lon1);
  620. $lat2 = deg2rad($lat2);
  621. $lon2 = deg2rad($lon2);
  622. log::info($lat1);
  623. log::info($lat2);
  624. log::info($lon1);
  625. log::info($lon2);
  626. // 计算经纬度差值
  627. $dLat = $lat2 - $lat1;
  628. $dLon = $lon2 - $lon1;
  629. // Haversine 公式的中间计算部分
  630. $a = sin($dLat / 2) * sin($dLat / 2) +
  631. cos($lat1) * cos($lat2) *
  632. sin($dLon / 2) * sin($dLon / 2);
  633. $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
  634. log::info($c);
  635. // 地球半径,单位:千米
  636. $earthRadius = 6371;
  637. // 计算距离
  638. $distance = $earthRadius * $c;
  639. // 根据单位进行转换
  640. if ($unit === 'mi') {
  641. $distance = $distance * 0.621371; // 千米转换为英里
  642. }
  643. return $distance;
  644. }
  645. /*
  646. * 调离项目
  647. */
  648. public function transferworerfromprj($wid, $wname, $wtel) {
  649. $newdate = date('Y-m-d ');
  650. $r_tale = new pwrelationmodel();
  651. $w_table = new gworkermodel();
  652. $t_gheader = new wheadmodel();
  653. $t_trans = new transfermodel();
  654. $icount = 0;
  655. //获取名字
  656. $transoutname = '后台自动调离';
  657. //var_dump($worker_arr);
  658. //组织数据
  659. $relation['pid'] = 3;
  660. $relation['wid'] = $wid;
  661. $relation['startdate'] = $newdate;
  662. $relation['checkstatus'] = 1;
  663. $w_table->updateprj(3, $wid);
  664. $rid = $r_tale->addnewrelation($relation);
  665. if ($rid > 0) {
  666. $icount = 1;
  667. }
  668. //如果是组长去掉组长权限
  669. $change = $t_gheader->changeghead($wid);
  670. //插入调动表记录
  671. $trans['wname'] = $wname;
  672. $trans['wid'] = $wid;
  673. $trans['rectime'] = date('Y-m-d H:i:s');
  674. $trans['telno'] = $wtel;
  675. $trans['transoutman'] = $transoutname;
  676. $trans['transoutid'] = 0; //设置 后台调出为0
  677. $rid = $t_trans->insinfo($trans);
  678. return $icount;
  679. }
  680. /**
  681. * 获取工人日工资列表
  682. *
  683. * @return void
  684. * @author wj
  685. * @date 2025-02-17
  686. */
  687. public function getdaypricerecodelist($arr) {
  688. $m_dr = new daypricerecodemodel();
  689. $where = [];
  690. if (isset($arr['userid']) && !empty($arr['userid'])) {
  691. $where['user_id'] = $arr['userid'];
  692. }
  693. if (isset($arr['createtime']) && is_array($arr['createtime'])) {
  694. $times = array_filter($arr['createtime']);
  695. if (is_array($times) && count($times) == 2) {
  696. $where['createtime'] = ['between', [$times[0], $times[1]]];
  697. }
  698. }
  699. $page = isset($arr['page']) && !empty($arr['page']) && is_numeric($arr['page']) ? $arr['page'] : 1;
  700. $size = isset($arr['size']) && !empty($arr['size']) && is_numeric($arr['size']) ? $arr['size'] : 10;
  701. $count = $m_dr->getList($where, 'count');
  702. $arrreturn['status'] = 0;
  703. $arrreturn['msg'] = '无数据';
  704. $arrreturn['data'] = [];
  705. if ($count <= 0) {
  706. return $arrreturn;
  707. }
  708. $list = $m_dr->getList($where, "*", $page, $size, "id desc");
  709. $arrreturn['status'] = 1;
  710. $arrreturn['msg'] = '查询成功';
  711. $data = [
  712. "pageSize" => 10,
  713. "pageNum" => 1,
  714. 'count' => $count,
  715. 'list' => $list,
  716. ];
  717. $arrreturn['data'] = $data;
  718. return $arrreturn;
  719. }
  720. }