Files
park/application/api/controller/YqVehicle.php
MeSHard b22d09bd39 init
2025-12-01 11:19:23 +08:00

870 lines
47 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}
}