public function query_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进行对比。
*/
public function query_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 ($StationInfos as &$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 ($EquipmentInfos as &$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 ($ConnectorInfos as &$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
*/
public function query_station_status()
{
$params = $this->getRequestData();
$StationIDs = $params['Data']['StationIDs'] ?? [];
if (empty($StationIDs)) $this->error('参数错误');
$StationStatusInfos = [];
foreach ($StationIDs as $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_loops as $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
*/
public function query_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 ($EquipmentStatsInfos as &$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 ($ConnectorStatsInfos as &$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
*/
public function query_equip_auth()
{
互联互通和云快充小程序多商户thinkphpworkerman
最新推荐文章于 2024-08-09 00:01:23 发布