pre($time.'添加成功!'); die; } //园区车辆进出统计 public function vehicle_statistics(){ $map['is_del'] = array('in','1'); $vehicle_count = Db::name('vehicle')->where($map)->field('id')->count(); $park_info = Db::name('perimeter')->where('id',1)->field('vehicle_count,enter_vehicle,out_vehicle')->find(); $count = $vehicle_count - $park_info['vehicle_count']; $arr['vehicle_count'] = $vehicle_count; if ($count >= 0){ $arr['enter_vehicle'] = $park_info['enter_vehicle'] + $count; }else{ $arr['out_vehicle'] = $park_info['out_vehicle'] + abs($count); } if (100 >= $count){ Db::name('perimeter')->where('id',1)->update($arr);//增加入园车次或出园车次 }else{ $arr['enter_vehicle'] = $park_info['enter_vehicle'] + 0; $arr['out_vehicle'] = $park_info['out_vehicle'] + 0; Db::name('perimeter')->where('id',1)->update($arr);//增加入园车次或出园车次 } $enterprise_list = Db::name('perimeter')->where(['region_type'=>6,'is_del'=>1])->field('id,stop_vehicle,vehicle_count,enter_vehicle,out_vehicle')->select(); foreach ($enterprise_list as $k => $v){ $map['perimeter_id'] = $v['id']; $vehicle_per_count = Db::name('vehicle')->where($map)->field('id')->count(); $per_count = $vehicle_per_count - $v['vehicle_count']; $per_arr['vehicle_count'] = $vehicle_per_count; if ($per_count >= 0){ $per_arr['enter_vehicle'] = $v['enter_vehicle'] + $per_count; $per_arr['out_vehicle'] = $v['out_vehicle']; }else{ $per_arr['enter_vehicle'] = $v['enter_vehicle']; $per_arr['out_vehicle'] = $v['out_vehicle'] + abs($per_count); } if (100 >= $per_count){ Db::name('perimeter')->where('id',$v['id'])->update($per_arr); } if ($vehicle_per_count > $v['stop_vehicle']){ $info = Db::name('vehicle')->where($map)->field('id,vehicleNo,longitude,latitude')->find(); $id = Db::name('enterprise_police')->whereTime('create_time','d')->where('mount_license',$info['vehicleNo'])->value('id'); if (!$id){ $police_arr = [ 'name' => '企业超最大可进入数', 'mount_license' => $info['vehicleNo'], 'perimeter' => $v['id'],//周界id 'stop_number' => $v['stop_vehicle'],//企业区域可停车辆数 'current_number' => $vehicle_per_count,//当前停止车辆数 'perimeter_point' => $info['longitude'].','.$info['latitude'], 'create_time' => date('Y-m-d H:i:s'), ]; Db::name('enterprise_police')->insert($police_arr); } } } $this->pre('更新成功!'); die; } public function vehicle_statistics_log(){ $perimeter_list = Db::name('perimeter')->field('id,name,region_type,vehicle_count,enter_vehicle,out_vehicle')->select(); $arr = [ 'content' => json_encode($perimeter_list), 'create_time' => date('Y-m-d H:i:s'), ]; Db::name('perimeter_log')->insert($arr); $up_arr = [ 'vehicle_count' => 0, 'enter_vehicle' => 0, 'out_vehicle' => 0, ]; Db::name('perimeter')->where('is_del',1)->update($up_arr); $this->pre('更新成功!'); die; } //定时更新车辆信息 public function update_info(){ $map['is_del'] = array('in','1,2'); $vehicle_list = Db::name('vehicle')->field('vehicleNo,positionTime')->where($map)->select(); if ($vehicle_list){ foreach ($vehicle_list as $k => $v){ $where['vehicleNo'] = $v['vehicleNo']; $where['positionTime'] = array('egt',date("Y-m-d H:i:s", strtotime("-3 day"))); $is_exist = Db::name('vehicle')->where($where)->value('id'); if (!$is_exist){ Db::name('vehicle')->where('vehicleNo',$v['vehicleNo'])->update(['is_del'=>3]); }else{ } } } $this->pre('操作成功!'); die; } //定时更新小围栏车辆信息(清除1) public function enclosure_info(){ $vehicle_list = Db::name('vehicle')->field('vehicleNo,longitude,latitude')->select(); //小围栏坐标集 $max_path = "107.01527,29.895601;106.997876,29.89281;106.991391,29.887939;106.985853,29.880405;106.981835,29.871026;106.960543,29.849142;106.950737,29.83564;106.945862,29.824089;106.943563,29.814148;106.945054,29.799754;106.942764,29.783607;106.970332,29.766519;106.983273,29.751322;107.017612,29.737776;107.050425,29.734115;107.064458,29.737683;107.064744,29.739318;107.058942,29.748447;107.055205,29.762378;107.071581,29.77504;107.086248,29.789923;107.088111,29.796775;107.084106,29.807387;107.080959,29.81142;107.068298,29.813474;107.06422,29.813406;107.060435,29.82112;107.050628,29.827207;107.04726,29.828623;107.046543,29.829966;107.04701,29.830878;107.04712,29.834263;107.044827,29.838826;107.053757,29.842875;107.056479,29.849047;107.057124,29.85153;107.056802,29.853468;107.060415,29.86047;107.061665,29.864841;107.054919,29.881592;107.052508,29.894119;107.040451,29.898403;107.028579,29.89536;107.014946,29.895825;106.997804,29.89278"; foreach ($vehicle_list as $k => $v) { $jc_point = [ 'lng' => $v['longitude'], 'lat' => $v['latitude'], ]; $big = explode(';',$max_path); $jc_arr = []; foreach ($big as $bigK => $bigV) { $arr = explode(',', $bigV); $jc_arr[] = [ 'lng' => $arr[0], 'lat' => $arr[1], ]; } $jcs = $this->is_point_in_polygon($jc_point,$jc_arr); if ($jcs){ }else{ Db::name('vehicle')->where('vehicleNo',$v['vehicleNo'])->update(['is_del'=>3]); } } $this->pre('操作成功!'); die; } //定时记录园区围栏进出日志(暂未用) public function vehicle_log(){ //园区区域围栏 $max_path_json = '[{"lng":"107.01527","lat":"29.895601"},{"lng":"106.997876","lat":"29.89281"},{"lng":"106.991391","lat":"29.887939"},{"lng":"106.985853","lat":"29.880405"},{"lng":"106.981835","lat":"29.871026"},{"lng":"106.960543","lat":"29.849142"},{"lng":"106.950737","lat":"29.83564"},{"lng":"106.945862","lat":"29.824089"},{"lng":"106.943563","lat":"29.814148"},{"lng":"106.945054","lat":"29.799754"},{"lng":"106.942764","lat":"29.783607"},{"lng":"106.970332","lat":"29.766519"},{"lng":"106.983273","lat":"29.751322"},{"lng":"107.017612","lat":"29.737776"},{"lng":"107.050425","lat":"29.734115"},{"lng":"107.064458","lat":"29.737683"},{"lng":"107.064744","lat":"29.739318"},{"lng":"107.058942","lat":"29.748447"},{"lng":"107.055205","lat":"29.762378"},{"lng":"107.071581","lat":"29.77504"},{"lng":"107.086248","lat":"29.789923"},{"lng":"107.088111","lat":"29.796775"},{"lng":"107.084106","lat":"29.807387"},{"lng":"107.080959","lat":"29.81142"},{"lng":"107.068298","lat":"29.813474"},{"lng":"107.06422","lat":"29.813406"},{"lng":"107.060435","lat":"29.82112"},{"lng":"107.050628","lat":"29.827207"},{"lng":"107.04726","lat":"29.828623"},{"lng":"107.046543","lat":"29.829966"},{"lng":"107.04701","lat":"29.830878"},{"lng":"107.04712","lat":"29.834263"},{"lng":"107.044827","lat":"29.838826"},{"lng":"107.053757","lat":"29.842875"},{"lng":"107.056479","lat":"29.849047"},{"lng":"107.057124","lat":"29.85153"},{"lng":"107.056802","lat":"29.853468"},{"lng":"107.060415","lat":"29.86047"},{"lng":"107.061665","lat":"29.864841"},{"lng":"107.054919","lat":"29.881592"},{"lng":"107.052508","lat":"29.894119"},{"lng":"107.040451","lat":"29.898403"},{"lng":"107.028579","lat":"29.89536"},{"lng":"107.014946","lat":"29.895825"},{"lng":"106.997804","lat":"29.89278"}]'; $max_path_arr = json_decode($max_path_json,true); //当日围栏车辆 $line_info = Db::name('vehicle_line')->whereTime('create_time','d')->where('is_del',1)->select(); if ($line_info){ $processedCount = 0; $inParkCount = 0; // 在园区内的车辆数 $outParkCount = 0; // 在园区外的车辆数 foreach ($line_info as $k => $v){ //当日车辆坐标集 $vehicle_coordinate = json_decode($v['line'],true); if (!is_array($vehicle_coordinate) || empty($vehicle_coordinate)) { continue; } // 遍历每个坐标点,判断进出状态 foreach ($vehicle_coordinate as $o => $i) { if (empty($i['coordinate'])) { continue; } $vehicle_arr = explode(',', $i['coordinate']); if (count($vehicle_arr) < 2) { continue; } $point = [ 'lng' => floatval($vehicle_arr[0]), 'lat' => floatval($vehicle_arr[1]), ]; // 判断当前点是否在园区内 $vehicle_exist = $this->is_point_in_polygon($point, $max_path_arr); if ($vehicle_exist) { $inParkCount++; } else { $outParkCount++; } // 判断上一个点是否在园区内 $up_exist = false; if ($o > 0 && isset($vehicle_coordinate[$o-1]['coordinate'])) { $up_arr = explode(',', $vehicle_coordinate[$o-1]['coordinate']); if (count($up_arr) >= 2) { $up_point = [ 'lng' => floatval($up_arr[0]), 'lat' => floatval($up_arr[1]), ]; $up_exist = $this->is_point_in_polygon($up_point, $max_path_arr); } } // 检查该车辆今天是否已有进出记录 $hasEnterLog = Db::name('vehicle_park_line_log') ->where('vehicleNo', $v['vehicleNo']) ->where('type', 1) ->whereTime('create_time', 'd') ->where('is_del', 'in', '1,2') ->count(); $hasOutLog = Db::name('vehicle_park_line_log') ->where('vehicleNo', $v['vehicleNo']) ->where('type', 2) ->whereTime('create_time', 'd') ->where('is_del', 'in', '1,2') ->count(); // 判断是否发生进出变化 if ($vehicle_exist && !$up_exist) { // 从园区外进入园区内 - 进园 // 如果是第一个点且在园区内,也记录为进园(假设是从园区外进入的) // 或者如果状态是2但没有记录,说明之前处理失败,重新处理 $shouldProcess = false; if ($o == 0) { // 第一个点且在园区内 $shouldProcess = true; } elseif (isset($vehicle_coordinate[$o-1]['max_enter_status'])) { if ($vehicle_coordinate[$o-1]['max_enter_status'] == 1) { // 状态为1,正常处理 $shouldProcess = true; } elseif ($vehicle_coordinate[$o-1]['max_enter_status'] == 2 && !$hasEnterLog) { // 状态为2但没有记录,说明之前处理失败,重新处理 $shouldProcess = true; } } if ($shouldProcess && !$hasEnterLog) { $up_coord = $o > 0 ? $vehicle_coordinate[$o-1]['coordinate'] : '初始位置'; $vehicle_log_arr = [ 'vehicleNo' => $v['vehicleNo'], 'up_coordinate' => $up_coord, 'coordinate' => $i['coordinate'], 'type' => 1, // 进园 'create_time' => isset($i['create_time']) ? $i['create_time'] : date('Y-m-d H:i:s'), 'is_del' => 1, ]; try { Db::name('vehicle_park_line_log')->insert($vehicle_log_arr); if ($o > 0) { $vehicle_coordinate[$o-1]['max_enter_status'] = 2; } $processedCount++; } catch (\Exception $e) { // 插入失败,记录错误但继续处理 continue; } } } elseif (!$vehicle_exist && $up_exist && $o > 0) { // 从园区内离开到园区外 - 出园 // 检查该车辆今天是否已有出园记录(避免重复记录) // 注意:这里允许同一车辆多次出园,只要不是同一个轨迹点重复记录 $shouldProcess = false; if (isset($vehicle_coordinate[$o-1]['max_out_status'])) { if ($vehicle_coordinate[$o-1]['max_out_status'] == 1) { // 状态为1,正常处理 $shouldProcess = true; } elseif ($vehicle_coordinate[$o-1]['max_out_status'] == 2 && !$hasOutLog) { // 状态为2但没有记录,说明之前处理失败,重新处理 $shouldProcess = true; } } else { // 如果没有设置状态,默认可以处理 $shouldProcess = true; } if ($shouldProcess) { $up_coord = $vehicle_coordinate[$o-1]['coordinate']; // 检查是否已记录过这个出园点(避免重复) $existingOutLog = Db::name('vehicle_park_line_log') ->where('vehicleNo', $v['vehicleNo']) ->where('type', 2) ->where('up_coordinate', $up_coord) ->where('coordinate', $i['coordinate']) ->whereTime('create_time', 'd') ->where('is_del', 'in', '1,2') ->find(); if (!$existingOutLog) { $vehicle_log_arr = [ 'vehicleNo' => $v['vehicleNo'], 'up_coordinate' => $up_coord, 'coordinate' => $i['coordinate'], 'type' => 2, // 出园 'create_time' => isset($i['create_time']) ? $i['create_time'] : date('Y-m-d H:i:s'), 'is_del' => 1, ]; try { Db::name('vehicle_park_line_log')->insert($vehicle_log_arr); $vehicle_coordinate[$o-1]['max_out_status'] = 2; $processedCount++; } catch (\Exception $e) { // 插入失败,记录错误但继续处理 continue; } } } } // 更新当前点的状态 if ($vehicle_exist) { if (!isset($vehicle_coordinate[$o]['max_enter_status']) || $vehicle_coordinate[$o]['max_enter_status'] == 1) { $vehicle_coordinate[$o]['max_enter_status'] = 2; } } else { if (!isset($vehicle_coordinate[$o]['max_out_status']) || $vehicle_coordinate[$o]['max_out_status'] == 1) { $vehicle_coordinate[$o]['max_out_status'] = 2; } } } // 更新轨迹数据 Db::name('vehicle_line') ->where('id', $v['id']) ->update(['line' => json_encode($vehicle_coordinate)]); } $result = [ 'processed_count' => $processedCount, 'in_park_count' => $inParkCount, 'out_park_count' => $outParkCount, 'total_vehicles' => count($line_info) ]; $this->success('更新成功,处理了' . $processedCount . '条进出记录,时间:'.date("Y-m-d H:i:s"), $result); }else{ $this->success('当天无车辆记录', ['processed_count' => 0]); } } //定时记录企业围栏进出日志(暂未用) public function enclosure_log(){ //企业区域围栏 $enterprise_region = Db::name('perimeter')->where(['region_type'=>6,'is_del'=>1])->whereNotNull('info')->field('id,name,info')->select(); //当日围栏车辆 $line_info = Db::name('vehicle_line')->whereTime('create_time','d')->where('is_del',1)->select(); if ($line_info){ foreach ($line_info as $k => $v){ //当日车辆坐标集 $vehicle_coordinate = json_decode($v['line'],true); foreach ($vehicle_coordinate as $o => $i) { $vehicle_arr = explode(',', $i['coordinate']); $point = [ 'lng' => $vehicle_arr[0], 'lat' => $vehicle_arr[1], ]; foreach ($enterprise_region as $key => $value){ $arr = []; if (!empty($value['info'])){ $region_arr = explode(';',$value['info']); foreach ($region_arr as $regionK => $regionV){ $ar = explode(',',$regionV); $arr[] = [ 'lng' => $ar[0], 'lat' => $ar[1], ]; } } $is_exist = $this->is_point_in_polygon($point,$arr); if ($is_exist){ //TODO 是否是首个下标(是则直接为进入处理) if ($o == 0){ //是否处理(如last_coordinate_status为2则当前坐标已处理) if ($vehicle_coordinate[$o]['last_coordinate_status'] == 1){ $vehicle_log_arr = [ 'vehicleNo' => $v['vehicleNo'], 'up_coordinate' => '初始值', 'coordinate' => $vehicle_coordinate[$o]['coordinate'], 'perimeter_id' => $value['id'], 'type' => 1,//入园 'create_time' =>$i['create_time'], ]; //新增进入日志 Db::name('vehicle_line_log')->insert($vehicle_log_arr); //更新当前坐标状态 $vehicle_coordinate[$o]['last_coordinate_status'] = 2; Db::name('vehicle_line')->where('vehicleNo',$v['vehicleNo'])->whereTime('create_time','d')->update(['line'=>json_encode($vehicle_coordinate)]); } }else{ if ($vehicle_coordinate[$o-1]['last_coordinate_status'] == 1){ $up_arr = explode(',',$vehicle_coordinate[$o-1]['coordinate']); $up_point = [ 'lng' => $up_arr[0], 'lat' => $up_arr[1], ]; $up_exist = $this->is_point_in_polygon($up_point,$arr); if ($up_exist){ //更新当前坐标状态 $vehicle_coordinate[$o]['last_coordinate_status'] = 2; Db::name('vehicle_line')->where('vehicleNo',$v['vehicleNo'])->whereTime('create_time','d')->update(['line'=>json_encode($vehicle_coordinate)]); }else{ $vehicle_log_arr = [ 'vehicleNo' => $v['vehicleNo'], 'up_coordinate' => $up_arr[0].','.$up_arr[1], 'coordinate' => $i['coordinate'], 'perimeter_id' => $value['id'], 'type' => 1,//入园 'create_time' => $i['create_time'], ]; //新增进入日志 Db::name('vehicle_line_log')->insert($vehicle_log_arr); //更新上一个坐标状态 $vehicle_coordinate[$o-1]['last_coordinate_status'] = 2; Db::name('vehicle_line')->where('vehicleNo',$v['vehicleNo'])->whereTime('create_time','d')->update(['line'=>json_encode($vehicle_coordinate)]); } } }//入园流程处理 } //TODO 是否超出最后一个坐标 if ($o+1 != count($vehicle_coordinate)){ if ($vehicle_coordinate[$o+1]['next_coordinate_status'] == 1){ //当前坐标点(下标+1) $_arr = explode(',',$vehicle_coordinate[$o+1]['coordinate']); $_point = [ 'lng' => $_arr[0], 'lat' => $_arr[1], ]; $_exist = $this->is_point_in_polygon($_point,$arr); if (!$_exist){ //上个坐标点位置 $up_arr = explode(',',$vehicle_coordinate[$o]['coordinate']); $up_point = [ 'lng' => $up_arr[0], 'lat' => $up_arr[1], ]; $up_exist = $this->is_point_in_polygon($up_point,$arr); if ($up_exist){ $vehicle_log_arr = [ 'vehicleNo' => $v['vehicleNo'], 'up_coordinate' => $up_arr[0].','.$up_arr[1], 'coordinate' => $_arr[0].','.$_arr[1], 'perimeter_id' => $value['id'], 'type' => 2,//出园 'create_time' =>$i['create_time'], ]; //新增出去日志 Db::name('vehicle_line_log')->insert($vehicle_log_arr); //更新下一个坐标状态 $vehicle_coordinate[$o+1]['next_coordinate_status'] = 2; Db::name('vehicle_line')->where('vehicleNo',$v['vehicleNo'])->whereTime('create_time','d')->update(['line'=>json_encode($vehicle_coordinate)]); //消除车辆 Db::name('vehicle')->where('vehicleNo',$v['vehicleNo'])->update(['is_del'=>3]); } } }//出去流程处理 }//出园入园流程处理 }//企业围栏判断 }//车辆列表判断 } $this->pre('更新成功,时间:'.date("Y-m-d H:i:s")); }else{ $this->pre('当天无车辆记录,更新失败,时间:'.date("Y-m-d H:i:s")); } die; } //定时更新车辆二维码状态 public function update_vehicle_code(){ $map['is_del'] = array('in','1,2'); $vehicle_list = Db::name($this->api_vehicle)->where($map)->field('vehicleNo,qr_color')->select(); foreach ($vehicle_list as $k => $v){ $police_where['license'] = $v['vehicleNo']; $police_where['is_reset'] = 0; $police_where['type'] = array('in','1,2,3,4,5,6'); $count = Db::name($this->api_call_the_police)->where($police_where)->count(); if ($count >= 2){ if ($v['qr_color'] != 3){ if ($v['qr_color'] == 1){ $name = '将绿码更新为红码'; }elseif ($v['qr_color'] == 2){ $name = '将黄码更新为红码'; } $code_arr = [ 'os_type' => 'web', 'os_record' => $name, 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>3]); } }else{ if ($v['qr_color'] == 2){ $waybill_id = Db::name($this->api_waybill)->where('tow_license',$v['vehicleNo'])->whereTime('waybill_date','d')->value('id'); $apply_time = Db::name($this->api_apply)->whereTime('apply_time','d')->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>1])->order('id desc')->value('apply_time');//是否存在装/卸货入园申请(当天内有效) $apply_arr['tractor_license'] = $v['vehicleNo']; $apply_arr['status'] = 1; $apply_arr['mission'] = array('in',[2,5,6,7,8]); $apply_clean_apply_time = Db::name($this->api_apply)->where($apply_arr)->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) $apply_permanent_apply_time = Db::name($this->api_apply)->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>3])->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(7天内有效) $name = ''; if ($waybill_id || $apply_time){ $name = '将黄码更新为绿码'; }else{ if (time() < strtotime($apply_clean_apply_time)){ $name = '将黄码更新为绿码'; } if (time() < strtotime($apply_permanent_apply_time)){ $name = '将黄码更新为绿码'; } } if ($name){ $code_arr = [ 'os_type' => 'web', 'os_record' => $name, 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>1]); } }else{ $waybill_id = Db::name($this->api_waybill)->where('tow_license',$v['vehicleNo'])->whereTime('waybill_date','d')->value('id'); $apply_time = Db::name($this->api_apply)->whereTime('apply_time','d')->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>1])->order('id desc')->value('apply_time');//是否存在装/卸货入园申请(当天内有效) $apply_arr['tractor_license'] = $v['vehicleNo']; $apply_arr['status'] = 1; $apply_arr['mission'] = array('in',[2,5,6,7,8]); $apply_clean_apply_time = Db::name($this->api_apply)->where($apply_arr)->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) $apply_permanent_apply_time = Db::name($this->api_apply)->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>3])->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) if (time() > strtotime($apply_clean_apply_time)){ $apply_clean_apply_time = ''; } if (time() > strtotime($apply_permanent_apply_time)){ $apply_permanent_apply_time = ''; } if (!$waybill_id && !$apply_time && !$apply_clean_apply_time && !$apply_permanent_apply_time){ $code_arr = [ 'os_type' => 'web', 'os_record' => '将绿码更新为黄码', 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>2]); } } } } $this->pre('操作成功!'); die; } //定时更新车辆二维码状态(隐藏车辆) public function update_vehicle_code_hide(){ $map['is_del'] = array('in','3'); $vehicle_list = Db::name($this->api_vehicle)->where($map)->field('vehicleNo,qr_color')->select(); foreach ($vehicle_list as $k => $v){ $count = Db::name($this->api_call_the_police)->where(['license'=>$v['vehicleNo'],'is_reset'=>0])->count(); if ($count >= 5){ if ($v['qr_color'] != 3){ if ($v['qr_color'] == 1){ $name = '将绿码更新为红码'; }elseif ($v['qr_color'] == 2){ $name = '将黄码更新为红码'; } $code_arr = [ 'os_type' => 'web', 'os_record' => $name, 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>3]); } }else{ if ($v['qr_color'] == 2){ $waybill_id = Db::name($this->api_waybill)->where('tow_license',$v['vehicleNo'])->whereTime('waybill_date','d')->value('id'); $apply_time = Db::name($this->api_apply)->whereTime('apply_time','d')->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>1])->order('id desc')->value('apply_time');//是否存在装/卸货入园申请(当天内有效) $apply_arr['tractor_license'] = $v['vehicleNo']; $apply_arr['status'] = 1; $apply_arr['mission'] = array('in',[2,5,6,7,8]); $apply_clean_apply_time = Db::name($this->api_apply)->where($apply_arr)->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) $apply_permanent_apply_time = Db::name($this->api_apply)->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>3])->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(7天内有效) $name = ''; if ($waybill_id || $apply_time){ $name = '将黄码更新为绿码'; }else{ if (time() < strtotime($apply_clean_apply_time)){ $name = '将黄码更新为绿码'; } if (time() < strtotime($apply_permanent_apply_time)){ $name = '将黄码更新为绿码'; } } if ($name){ $code_arr = [ 'os_type' => 'web', 'os_record' => $name, 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>1]); } }else{ $waybill_id = Db::name($this->api_waybill)->where('tow_license',$v['vehicleNo'])->whereTime('waybill_date','d')->value('id'); $apply_time = Db::name($this->api_apply)->whereTime('apply_time','d')->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>1])->order('id desc')->value('apply_time');//是否存在装/卸货入园申请(当天内有效) $apply_arr['tractor_license'] = $v['vehicleNo']; $apply_arr['status'] = 1; $apply_arr['mission'] = array('in',[2,5,6,7,8]); $apply_clean_apply_time = Db::name($this->api_apply)->where($apply_arr)->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) $apply_permanent_apply_time = Db::name($this->api_apply)->where(['tractor_license'=>$v['vehicleNo'],'status'=>1,'mission'=>3])->order('id desc')->value('apply_time');//是否存在清洗/维修入园申请(3天内有效) if (time() > strtotime($apply_clean_apply_time)){ $apply_clean_apply_time = ''; } if (time() > strtotime($apply_permanent_apply_time)){ $apply_permanent_apply_time = ''; } if (!$waybill_id && !$apply_time && !$apply_clean_apply_time && !$apply_permanent_apply_time){ $code_arr = [ 'os_type' => 'web', 'os_record' => '将绿码更新为黄码', 'os_time' => date('Y-m-d H:i:s'), 'os_vehicleNo' => $v['vehicleNo'], ]; Db::name('qrrecord')->insert($code_arr); Db::name($this->api_vehicle)->where('vehicleNo',$v['vehicleNo'])->update(['qr_color'=>2]); } } } } $this->pre('操作成功!'); die; } //定时更新高速路段车辆信息(清除2) public function update_high_speed(){ $map['is_del'] = array('in','1,2'); $vehicle_list = Db::name('vehicle')->where($map)->field('vehicleNo,longitude,latitude')->select(); //高速坐标集(右边) $right_path = '107.031761,29.822778;107.032247,29.822289;107.035775,29.824699;107.036981,29.825839;107.038996,29.827026;107.040038,29.826995;107.040828,29.827026;107.041439,29.827450;107.041368,29.828358;107.041081,29.828593;107.044727,29.830701;107.044834,29.829636;107.045174,29.828416;107.045927,29.827432;107.047128,29.826749;107.048114,29.826443;107.049154,29.826168;107.049405,29.826906;107.047290,29.827440;107.046340,29.828092;107.045677,29.829421;107.045606,29.830893;107.048297,29.830800;107.050789,29.830694;107.053082,29.831045;107.054874,29.832053;107.055340,29.832638;107.054821,29.833086;107.053980,29.832309;107.052993,29.831766;107.051112,29.831402;107.048513,29.831475;107.046289,29.831555;107.045661,29.831474;107.045501,29.832382;107.046506,29.833060;107.046632,29.833797;107.046219,29.834422;107.045036,29.834948;107.043926,29.838344;107.044159,29.839598;107.044519,29.840727;107.045991,29.841564;107.049058,29.842022;107.051961,29.842565;107.053233,29.843189;107.053591,29.843568;107.052947,29.844188;107.052087,29.843333;107.049936,29.842766;107.047103,29.842322;107.045058,29.841827;107.044645,29.841558;107.044196,29.841227;107.043388,29.840018;107.043208,29.838812;107.043405,29.838029;107.044192,29.835008;107.044479,29.833803;107.044317,29.833050;107.044011,29.832610;107.043508,29.832123;107.042826,29.831792;107.041927,29.831477;107.041047,29.831053;107.040472,29.830677;107.039914,29.830097;107.039734,29.828968;107.039518,29.828389;107.038888,29.827716;107.035489,29.825343;107.032643,29.823352;107.031761,29.822794'; //高速坐标集(左边) $left_path = '106.951213,29.776296;106.951678,29.776187;106.951874,29.777295;106.952490,29.779036;106.953258,29.780960;106.954357,29.782953;106.955402,29.784420;106.956690,29.786094;106.958443,29.787884;106.959668,29.788725;106.961234,29.789273;106.962604,29.790278;106.962872,29.792069;106.963114,29.793090;106.963750,29.794078;106.963123,29.794383;106.962290,29.793385;106.960805,29.792009;106.959614,29.790879;106.956913,29.789733;106.956600,29.789038;106.956762,29.786871;106.955322,29.785163;106.954661,29.784259;106.953517,29.782406;106.952766,29.780898;106.951864,29.778610;106.951204,29.776296'; foreach ($vehicle_list as $k => $v) { $point = [ 'lng' => $v['longitude'], 'lat' => $v['latitude'], ]; $right_high_speed = explode(';',$right_path); $right_high_speed_arr = []; foreach ($right_high_speed as $rK => $rV) { $arr = explode(',', $rV); $right_high_speed_arr[] = [ 'lng' => $arr[0], 'lat' => $arr[1], ]; } $r_exist = $this->is_point_in_polygon($point,$right_high_speed_arr); $left_high_speed = explode(';',$left_path); $left_high_speed_arr = []; foreach ($left_high_speed as $rK => $rV) { $arr = explode(',', $rV); $left_high_speed_arr[] = [ 'lng' => $arr[0], 'lat' => $arr[1], ]; } $l_exist = $this->is_point_in_polygon($point,$left_high_speed_arr); if ($r_exist || $l_exist){ Db::name('vehicle')->where('vehicleNo',$v['vehicleNo'])->update(['is_del'=>3]); } } $this->pre('操作成功!'); die; } //经开区大围栏坐标集 public function submit_test_paper(){ $str = '(107.012211,29.812966) (107.012211,29.811595) (107.012242,29.811529) (107.012278,29.811497) (107.01235,29.811474) (107.012481,29.811466) (107.012602,29.811462) (107.012723,29.811466) (107.01447,29.81147) (107.014529,29.81147) (107.014623,29.811501) (107.014663,29.811525) (107.014722,29.811572) (107.014767,29.811627) (107.014798,29.811662) (107.014857,29.8129) (107.014857,29.812919) (107.014825,29.812939) (107.014785,29.812947) (107.012287,29.812959) (107.012216,29.812966) '; $str = str_replace('(','',$str); $str = str_replace(')','',$str); $result = array(); // 转换后的结果 $tokens = preg_split('/[\r\n]+/', $str); foreach ($tokens as $token) { if (false !== strpos($token, '=')) { list($key, $value) = explode('=', $token, 2); $result[$key] = $value; } else $result[] = $token; } // $path = ''; foreach ($result as $k => $v){ if ($v){ $Varr = explode(',',$v); $res = $this->bd_decrypt($Varr[0],$Varr[1]); $url = number_format($res['gg_lon'],6).','.number_format($res['gg_lat'],6); $path .= $url.';'; // $this->pre($res);die; // $path += $url.';'; } } $path_arr = explode(';',$path); $this->pre($path);die; foreach ($path_arr as $k => $v){ // $this->pre($v); $aa['content'] = $v; // $this->pre($aa); // Db::name('abc')->insert($aa); } $this->pre(123); die; } //BD-09(百度) 坐标转换成 GCJ-02(火星,高德) 坐标 //@param bd_lon 百度经度 //@param bd_lat 百度纬度 public function bd_decrypt($bd_lon,$bd_lat) { $x_pi = 3.14159265358979324 * 3000.0 / 180.0; $x = $bd_lon - 0.0065; $y = $bd_lat - 0.006; $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi); $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi); $data['gg_lon'] = $z * cos($theta); $data['gg_lat'] = $z * sin($theta); return $data; } public function sss(){ $start = date('Y-m-01',strtotime('-1 month')); $end = date('Y-m-t',strtotime('-1 month')); $arrdateone = $start; $arrdatetwo = $end.' 23:59:59'; $map['create_time'] = array(array('egt',$arrdateone),array('elt',$arrdatetwo),'AND'); $map['is_del'] = array('neq', -1); $count = Db::name($this->api_call_the_police)->where($map)->count(); } /** * 判断一个坐标是否在一个多边形内(由多个坐标围成的) * 基本思想是利用射线法,计算射线与多边形各边的交点,如果是偶数,则点在多边形外,否则在多边形内 * @param $point //指定点坐标 * @param $pts //多边形坐标,顺时针方向 * @return bool */ public function is_point_in_polygon($point, $pts) { $N = count($pts); $boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true $intersectCount = 0;//cross points count of x $precision = 2e-10; //浮点类型计算时候与0比较时候的容差 $p1 = 0;//neighbour bound vertices $p2 = 0; $p = $point; //测试点 $p1 = $pts[0];//left vertex for ($i = 1; $i <= $N; ++$i) {//check all rays if ($p['lng'] == $p1['lng'] && $p['lat'] == $p1['lat']) { return $boundOrVertex;//p is an vertex } $p2 = $pts[$i % $N];//right vertex if ($p['lat'] < min($p1['lat'], $p2['lat']) || $p['lat'] > max($p1['lat'], $p2['lat'])) {//ray is outside of our interests $p1 = $p2; continue;//next ray left point } if ($p['lat'] > min($p1['lat'], $p2['lat']) && $p['lat'] < max($p1['lat'], $p2['lat'])) {//ray is crossing over by the algorithm (common part of) if($p['lng'] <= max($p1['lng'], $p2['lng'])){//x is before of ray if ($p1['lat'] == $p2['lat'] && $p['lng'] >= min($p1['lng'], $p2['lng'])) {//overlies on a horizontal ray return $boundOrVertex; } if ($p1['lng'] == $p2['lng']) {//ray is vertical if ($p1['lng'] == $p['lng']) {//overlies on a vertical ray return $boundOrVertex; } else {//before ray ++$intersectCount; } } else {//cross point on the left side $xinters = ($p['lat'] - $p1['lat']) * ($p2['lng'] - $p1['lng']) / ($p2['lat'] - $p1['lat']) + $p1['lng'];//cross point of lng if (abs($p['lng'] - $xinters) < $precision) {//overlies on a ray return $boundOrVertex; } if ($p['lng'] < $xinters) {//before ray ++$intersectCount; } } } } else {//special case when ray is crossing through the vertex if ($p['lat'] == $p2['lat'] && $p['lng'] <= $p2['lng']) {//p crossing over p2 $p3 = $pts[($i+1) % $N]; //next vertex if ($p['lat'] >= min($p1['lat'], $p3['lat']) && $p['lat'] <= max($p1['lat'], $p3['lat'])) { //p.lat lies between p1.lat & p3.lat ++$intersectCount; } else { $intersectCount += 2; } } } $p1 = $p2;//next ray left point } if ($intersectCount % 2 == 0) {//偶数在多边形外 return false; } else { //奇数在多边形内 return true; } } }