Files
park/application/api/controller/YqVehicle.php

870 lines
47 KiB
PHP
Raw Normal View History

2025-12-01 11:19:23 +08:00
<?php
namespace app\api\controller;
use app\common\controller\Api;
use think\Db;
class YqVehicle extends Api {
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function __construct(){
parent::__construct();
}
//动态添加车辆记录表
public function add_vehicle_table(){
$time = 's_vehicle_'.date('Ymd',strtotime("+1 day"));
Db::query('CREATE TABLE '.$time.' LIKE s_vehicle_table');
$this->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;
}
}
}