publicfunctionquery_token(){//131-0389-5694$params=$this->getRequestData();$OperatorID=$params['Data']['OperatorID'];$OperatorSecret=$params['Data']['OperatorSecret'];if(empty($OperatorID)){$this->error('无此对接平台',['OperatorID'=>$OperatorID,'SuccStat'=>1,'FailReason'=>1]);}if($OperatorID!=$this->config['lian_operator_id']||$OperatorSecret!=$this->config['operator_secret']){$this->error('无此对接平台',['OperatorID'=>$OperatorID,'SuccStat'=>1,'FailReason'=>2]);}$token=Random::uuid();Token::set($token,'lian:'.$this->config['lian_operator_id'],7200);$this->success('ok',['OperatorID'=>$OperatorID,'SuccStat'=>0,'AccessToken'=>$token,'TokenAvailableTime'=>7200,'FailReason'=>0]);}/**
* 6.3.1
* 此接口用于查询运营商的充电站的信息。
* 接口名称:query_stations_info
* 接口使用方法:由充电运营商方实现此接口,市级平台调用。
* 查询时需要比对电站、充电设备、充电接口的基本信息的最后修改时间,三者只要有一处修改,就认为是最新修改时间,然后与输入参数lastQueryTime进行对比。
*/publicfunctionquery_stations_info(){$params=$this->getRequestData();$LastQueryTime=$params['Data']['LastQueryTime']??'';$PageNo=$params['Data']['PageNo']??'1';$PageSize=$params['Data']['PageSize']??'10';$ItemSize=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('station')->alias('s')->join('wxapp wxapp','s.app_id=wxapp.app_id')->where('s.delete_time',0)->when(!empty($LastQueryTime),function($query)use($LastQueryTime){$query->where('s.create_time','<',$LastQueryTime);})->count();$PageCount=ceil($ItemSize/$PageSize);$PageNo=$PageNo>$PageCount?$PageCount:$PageNo;$StationInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('station')->alias('s')->join('wxapp wxapp','s.app_id=wxapp.app_id')->where('s.delete_time',0)->when(!empty($LastQueryTime),function($query)use($LastQueryTime){$query->where('s.create_time','<',$LastQueryTime);})->field('s.station_id as StationID,s.equipment_owner_id as EquipmentOwnerID,s.station_name as StationName,s.is_alone_apply as IsAloneApply,s.account_number as AccountNumber,s.capacity as Capacity,
s.is_public_parking_lot as IsPublicParkingLot,s.parking_lot_number as ParkingLotNumber,s.country_code as CountryCode,
s.area_code as AreaCode,s.station_address as Address,s.respon_phone as StationTel,wxapp.site_kefu as ServiceTel,s.station_type as StationType,s.park_nums as ParkNums,s.longitude as StationLng,s.latitude as StationLat,
s.construction as Construction,s.open_all_day as OpenAllDay,s.min_electricity_price as MinElectricityPrice,s.electricity_fee as ElectricityFee,s.service_fee as ServiceFee,
s.park_free as ParkFree,s.post_status,s.park_fee_type as ParkFeeType,s.toilet_flag as ToiletFlag,s.store_flag as StoreFlag,s.restaurant_flag as RestaurantFlag,s.lounge_flag as LoungeFlag,
s.canopy_flag as CanopyFlag,s.printer_flag as PrinterFlag,s.barrier_flag as BarrierFlag,
s.parking_lock_flag as ParkingLockFlag')->page($PageNo,$PageSize)->select()->toArray();$StationInfos=$StationInfos?:[];foreach($StationInfosas&$StationInfo){$StationInfo['OperatorID']=$this->config['operator_id'];if(mb_strlen($StationInfo['EquipmentOwnerID'])==18){$StationInfo['EquipmentOwnerID']=substr($StationInfo['EquipmentOwnerID'],8,9);}$StationInfo['StationName']=mb_substr($StationInfo['StationName'],0,50);if($StationInfo['IsAloneApply']==0){unset($StationInfo['AccountNumber']);unset($StationInfo['Capacity']);}if($StationInfo['IsPublicParkingLot']==0){unset($StationInfo['ParkingLotNumber']);}$StationInfo['Payment']='线上';$StationInfo['SupportOrder']=0;$StationInfo['StationStatus']=$StationInfo['post_status']==1?50:5;unset($StationInfo['post_status']);$EquipmentInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('device')->field('device_no as EquipmentID,manufacturer_id as ManufacturerID,construction_time as ConstructionTime,device_type as EquipmentType,device_state as EquipmentStatus,device_power as EquipmentPower,new_national_standard as NewNationalStandard')->where('station_id',$StationInfo['StationID'])->select()->toArray();$EquipmentInfos=$EquipmentInfos?:[];foreach($EquipmentInfosas&$equipmentInfo){$equipmentInfo['EquipmentType']=$equipmentInfo['EquipmentType']==1?1:2;if(mb_strlen($equipmentInfo['ManufacturerID'])==18){$equipmentInfo['ManufacturerID']=substr($equipmentInfo['ManufacturerID'],8,9);}$equipmentInfo['EquipmentStatus']=$equipmentInfo['EquipmentStatus']==DeviceStateEnum::$device_online?50:($equipmentInfo['EquipmentStatus']==DeviceStateEnum::$device_offline?5:6);$equipmentInfo['EquipmentPower']=sprintf('%.1f',$equipmentInfo['EquipmentPower']);$equipmentInfo['VinFlag']=0;//是否支持VIN码识别$ConnectorInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('device_loop')->field('`loop` as ConnectorID,voltage_upper_limits as VoltageUpperLimits,voltage_lower_limits as VoltageLowerLimits,current as Current,power as Power')->where('device_no',$equipmentInfo['EquipmentID'])->select()->toArray();$ConnectorInfos=$ConnectorInfos?:[];foreach($ConnectorInfosas&$connectorInfo){$connectorInfo['ConnectorID']=$equipmentInfo['EquipmentID'].str_pad($connectorInfo['ConnectorID'],2,'0',STR_PAD_LEFT);$connectorInfo['ConnectorName']='枪'.$connectorInfo['ConnectorID'];$connectorInfo['ConnectorType']=$equipmentInfo['EquipmentType']==1?4:3;$connectorInfo['VoltageUpperLimits']=intval($connectorInfo['VoltageUpperLimits']);$connectorInfo['VoltageLowerLimits']=intval($connectorInfo['VoltageLowerLimits']);$connectorInfo['Current']=intval($connectorInfo['Current']);$connectorInfo['Power']=round($connectorInfo['Power'],1);}unset($connectorInfo);$equipmentInfo['ConnectorInfos']=$ConnectorInfos;}unset($equipmentInfo);$StationInfo['EquipmentInfos']=$EquipmentInfos;}$this->success('ok',compact('PageNo','PageCount','ItemSize','StationInfos'));}/**
* 设备接口状态查询
* 此接口用于批量查询设备实时状态
* 接口使用方法:由充电运营商方实现此接口,市级平台调用。
* @return void
*/publicfunctionquery_station_status(){$params=$this->getRequestData();$StationIDs=$params['Data']['StationIDs']??[];if(empty($StationIDs))$this->error('参数错误');$StationStatusInfos=[];foreach($StationIDsas$stationID){$ConnectorStatusInfos=[];$device_loops=Db::name('device_loop')->alias('dl')->where('d.station_id',$stationID)->join('device d','dl.device_no=d.device_no')->field('d.device_no,dl.loop,d.device_state,dl.loop_state,dl.loop_instate,dl.loop_backstate,current_a,voltage_a')->select();if(!empty($device_loops)){foreach($device_loopsas$device_loop){if($device_loop['device_state']==DeviceStateEnum::$device_offline){$Status=0;//离网}elseif($device_loop['device_state']==DeviceStateEnum::$device_breakdown){$Status=255;//故障}else{if($device_loop['loop_state']==DeviceStateEnum::$loop_bad){$Status=255;//故障}elseif($device_loop['loop_state']==DeviceStateEnum::$loop_busy){$Status=3;//占用充电中}else{if($device_loop['loop_instate']==1||$device_loop['loop_backstate']==0){$Status=2;//占用未充电}else{$Status=1;//空闲}}}$ConnectorStatusInfos[]=['ConnectorID'=>$device_loop['device_no'].str_pad($device_loop['loop'],2,'0',STR_PAD_LEFT),'Status'=>$Status,];}}$StationStatusInfos[]=['StationID'=>$stationID,'ConnectorStatusInfos'=>$ConnectorStatusInfos];}$this->success('ok',compact('StationStatusInfos'));}/**
* 6.6 查询统计信息
* 此查询用于定期获取每个充电站,在某个周期内的统计信息
* 接口名称: query_station_stats
* 接口使用方法:由充电运营商方实现此接口,市级平台调用。
* @return void
*/publicfunctionquery_station_stats(){$params=$this->getRequestData();$StationID=$params['Data']['StationID'];$StartTime=$params['Data']['StartTime'];$EndTime=$params['Data']['EndTime'];if($StartTime==$EndTime){$EndTime=$EndTime.' 23:59:59';}$StationElectricity=Db::name('vip_charge_log')->where('station_id',$StationID)->where('start_time','>=',strtotime($StartTime))->where('end_time','<',strtotime($EndTime))->where('order_status',VipChargeLogEnum::$order_status_donecharge)->sum('degree');$EquipmentStatsInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('vip_charge_log')->field('device_no as EquipmentID,sum(degree) as EquipmentElectricity')->group('device_no')->where('station_id',$StationID)->where('start_time','>=',strtotime($StartTime))->where('end_time','<',strtotime($EndTime))->where('order_status',VipChargeLogEnum::$order_status_donecharge)->select()->toArray();if(empty($EquipmentStatsInfos)){$EquipmentStatsInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('device')->field('device_no as EquipmentID,0 as EquipmentElectricity')->where('station_id',$StationID)->select()->toArray();}foreach($EquipmentStatsInfosas&$equipmentStatsInfo){$equipmentStatsInfo['EquipmentElectricity']=$equipmentStatsInfo['EquipmentElectricity']?:0;$equipmentStatsInfo['EquipmentElectricity']=sprintf('%.1f',$equipmentStatsInfo['EquipmentElectricity']);$equipmentStatsInfo['EquipmentElectricity']=floatval($equipmentStatsInfo['EquipmentElectricity']);$ConnectorStatsInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('vip_charge_log')->field('`loop` as ConnectorID,sum(degree) as ConnectorElectricity')->group('device_no,`loop`')->where('device_no',$equipmentStatsInfo['EquipmentID'])->where('station_id',$StationID)->where('start_time','>=',strtotime($StartTime))->where('end_time','<',strtotime($EndTime))->where('order_status',VipChargeLogEnum::$order_status_donecharge)->select()->toArray();$ConnectorStatsInfos=$ConnectorStatsInfos?:[];if(empty($ConnectorStatsInfos)){$ConnectorStatsInfos=Db::connect(array_merge(config('database'),['params'=>[\PDO::ATTR_CASE=>\PDO::CASE_NATURAL]]))->name('device_loop')->field('`loop` as ConnectorID,0 as ConnectorElectricity')->where('device_no',$equipmentStatsInfo['EquipmentID'])->select()->toArray();}foreach($ConnectorStatsInfosas&$connectorStatsInfo){$connectorStatsInfo['ConnectorID']=$equipmentStatsInfo['EquipmentID'].str_pad($connectorStatsInfo['ConnectorID'],2,'0',STR_PAD_LEFT);$connectorStatsInfo['ConnectorElectricity']=$connectorStatsInfo['ConnectorElectricity']?:0;$connectorStatsInfo['ConnectorElectricity']=sprintf('%.1f',$connectorStatsInfo['ConnectorElectricity']);$connectorStatsInfo['ConnectorElectricity']=floatval($connectorStatsInfo['ConnectorElectricity']);}unset($connectorStatsInfo);$equipmentStatsInfo['ConnectorStatsInfos']=$ConnectorStatsInfos;}$StationStats=['StationID'=>$StationID,'StartTime'=>$StartTime,'EndTime'=>$EndTime,'StationElectricity'=>$StationElectricity?:0,'EquipmentStatsInfos'=>$EquipmentStatsInfos];$this->success('ok',compact('StationStats'));}/**
* 6.2 请求设备认证
* 此接口用于客户归属运营商请求设备归属运营商设备认证信息。
* 由设备归属运营商平台实现此接口,客户归属运营商平台方调用。
* @return void
*/publicfunctionquery_equip_auth(){