互联互通和云快充小程序多商户thinkphpworkerman

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()
    {
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
快充 1.5 是一个使用 C 语言编写的快速充电算法。该算法利用计算技术,在充电站与电动汽车之间建立实时通信,以最大化电动汽车的充电速度。 首先,在充电站与电动汽车之间建立通信连接,确保双方之间的数据传输和消息交互的准确性和实时性。同时,通过端的数据库存储和处理大量的充电数据,进行计算和分析。 其次,该算法通过实时监测电动汽车的电池状态和充电需求,结合充电站的电力供应情况,实现智能调度充电功率。根据电动汽车的剩余电量、已充电时间、电池类型和电池特性等信息,以及充电站的电力供应能力和排队情况,合理分配充电功率,提高充电效率。 另外,快充 1.5 还充分考虑了电动汽车的用户需求和优化策略。通过用户注册、预约充电和优先级设置等方式,为用户提供个性化的充电服务。在高峰期采取优先级调度策略,优先满足急需充电的用户,确保充电服务的公平性和高效性。 最后,快充 1.5 除了提高充电速度,还考虑了充电设备的安全性和稳定性。通过对充电设备和电动汽车之间的数据进行校验、防护和备份,确保数据的安全传输。同时,对充电设备进行实时监测和故障预警,提前发现和解决问题,保障用户的充电安全。 总之,快充 1.5 利用 C 语言编写的快速充电算法,通过计算平台实现实时通信和数据处理,智能调度充电功率,提高充电效率和安全性,为用户提供个性化的充电服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉阳软件yuyangdev_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值