workercheck.php 27 KB

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