ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -54,7 +54,16 @@ public R<String> updateChargingGunById(TChargingGun chargingGun) { return R.fail("编辑充电枪失败:" + throwable.getMessage()); } @Override public R<List<TChargingGun>> getChargingGunByChargingPileId(Integer chargingPileId) { return R.fail("根据充电桩id获取枪失败:" + throwable.getMessage()); } @Override public R pushChargingGunStatus(Integer id, Integer status) { return R.fail("接口状态变化后推送给第三方失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -8,10 +8,9 @@ import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author zhibing.pu @@ -58,5 +57,23 @@ */ @PostMapping("/t-charging-gun/updateChargingGunById") R<String> updateChargingGunById(@RequestBody TChargingGun chargingGun); /** * 根据充电桩id获取枪 * @param chargingPileId * @return */ @PostMapping("/t-charging-gun/getChargingGunByChargingPileId") R<List<TChargingGun>> getChargingGunByChargingPileId(@RequestParam("chargingPileId") Integer chargingPileId); /** * 接口状态变化后推送给第三方 * @param id * @param status * @return */ @PostMapping("/t-charging-gun/pushChargingGunStatus") R pushChargingGunStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -7,6 +7,7 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -40,4 +41,14 @@ R<List<GetSiteListDTO>> getSiteListByUserId(@RequestParam("userId") Long userId); @GetMapping("/partner/getPartnerR/{id}") R<Partner> getPartnerR(@PathVariable("id") Integer id); /** * 分页查询站电数据 * @param PageNo * @param PageSize * @return */ @PostMapping("/site/getSiteListPaging") PageInfo<Site> getSiteListPaging(@RequestParam("PageNo") Integer PageNo, @RequestParam("PageSize") Integer PageSize); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -611,4 +611,18 @@ List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0)); return R.ok(list); } /** * 分页查询站电数据 * @param PageNo * @param PageSize * @return */ @PostMapping("/getSiteListPaging") public PageInfo<Site> getSiteListPaging(@RequestParam("PageNo") Integer PageNo, @RequestParam("PageSize") Integer PageSize){ PageInfo<Site> pageInfo = new PageInfo<>(PageNo, PageSize); PageInfo<Site> page = siteService.lambdaQuery().page(pageInfo); return page; } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -294,5 +294,18 @@ chargingGunService.updateById(chargingGun); return R.ok(); } /** * 根据充电桩id获取枪 * @param chargingPileId * @return */ @PostMapping("/getChargingGunByChargingPileId") public R<List<TChargingGun>> getChargingGunByChargingPileId(@RequestParam("chargingPileId") Integer chargingPileId){ List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPileId).eq(TChargingGun::getDelFlag, 0)); return R.ok(list); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/TCECController.java
New file @@ -0,0 +1,259 @@ package com.ruoyi.integration.controller; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.integration.drainage.TCECUtil; import com.ruoyi.integration.drainage.model.*; import com.ruoyi.integration.drainage.model.enu.*; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author zhibing.pu * @Date 2025/1/21 17:52 */ @RestController @RequestMapping("") public class TCECController { @Resource private SiteClient siteClient; @Resource private ChargingPileClient chargingPileClient; @Resource private ChargingGunClient chargingGunClient; /** * 查询充电站信息 * @param query * @return */ @PostMapping("/query_stations_info") public QueryStationsInfoResult queryStationsInfo(@RequestBody QueryStationsInfo query){ Integer pageNo = query.getPageNo(); Integer pageSize = query.getPageSize(); if(null == pageNo){ pageNo = 1; } if(null == pageSize){ pageSize = 10; } PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize); QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult(); queryStationsInfoResult.setPageNo(pageNo); queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue()); queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue()); List<StationInfo> StationInfos = new ArrayList<>(); for (Site datum : siteListPaging.getRecords()) { StationInfo stationInfo = new StationInfo(); stationInfo.setStationID(datum.getId().toString()); stationInfo.setOperatorID(); stationInfo.setEquipmentOwnerID(); stationInfo.setStationName(datum.getName()); stationInfo.setCountryCode(datum.getCountryCode()); stationInfo.setAreaCode(datum.getDistrictsCode()); stationInfo.setAddress(datum.getAddress()); stationInfo.setStationTel(datum.getPhone()); stationInfo.setServiceTel(datum.getServicePhone()); switch (datum.getSiteType()){ case 0: stationInfo.setStationType(StationTypeEnum.OTHER.getType()); break; case 1: stationInfo.setStationType(StationTypeEnum.PUBLIC.getType()); break; case 2: stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType()); break; case 3: stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType()); break; case 4: stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType()); break; case 5: stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType()); break; case 6: stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType()); break; } if(datum.getStatus() == 1){ stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus()); } if(datum.getStatus() == 2){ stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus()); } if(datum.getStatus() == 3){ stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus()); } stationInfo.setParkNums(datum.getParkingSpace()); stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN)); stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN)); stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite()); stationInfo.setPictures(Arrays.asList(datum.getImgUrl().split(","))); stationInfo.setSiteGuide(datum.getGuide()); stationInfo.setMatchCars(datum.getVehicleDescription()); stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime()); stationInfo.setElectricityFee(datum.getRateDescription()); //构建充电设备信息数据 List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteId(datum.getId()).getData(); stationInfo.setEquipmentInfos(buildEquipmentInfo(tChargingPiles)); StationInfos.add(stationInfo); } queryStationsInfoResult.setStationInfos(StationInfos); return queryStationsInfoResult; } /** * 构建桩数据 * @param tChargingPiles * @return */ public List<EquipmentInfo> buildEquipmentInfo(List<TChargingPile> tChargingPiles){ List<EquipmentInfo> equipmentInfos = new ArrayList<>(); for (TChargingPile tChargingPile : tChargingPiles) { EquipmentInfo equipmentInfo = new EquipmentInfo(); equipmentInfo.setEquipmentID(tChargingPile.getId().toString()); equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode()); equipmentInfo.setManufacturerName(tChargingPile.getManufacturer()); equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType()); if(null != tChargingPile.getProductionDate()){ equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } switch (tChargingPile.getType()){ case 0: equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType()); break; case 1: equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType()); break; case 2: equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType()); break; case 3: equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType()); break; case 4: equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType()); break; } //构建设备接口信息 List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileId(tChargingPile.getId()).getData(); equipmentInfo.setConnectorInfos(buildConnectorInfos(chargingGunList)); equipmentInfos.add(equipmentInfo); } return equipmentInfos; } /** * 构建接口数据 * @param chargingGunList * @return */ public List<ConnectorInfo> buildConnectorInfos(List<TChargingGun> chargingGunList){ List<ConnectorInfo> connectorInfos = new ArrayList<>(); for (TChargingGun chargingGun : chargingGunList) { ConnectorInfo connectorInfo = new ConnectorInfo(); connectorInfo.setConnectorID(chargingGun.getId().toString()); connectorInfo.setConnectorName(chargingGun.getName()); switch (chargingGun.getType()){ case 0: connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType()); break; case 1: connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType()); break; case 2: connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType()); break; case 3: connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType()); break; case 4: connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType()); break; case 5: connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType()); break; } connectorInfo.setVoltageUpperLimits(chargingGun.getUpperRatedVoltage().intValue()); connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage().intValue()); connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue()); connectorInfo.setPower(chargingGun.getRatedPower()); connectorInfo.setParkNo(chargingGun.getParkingNumber()); connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard())); connectorInfos.add(connectorInfo); } return connectorInfos; } /** * 接口状态变化后推送给第三方 * @return */ @PostMapping("/pushChargingGunStatus") public R pushChargingGunStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status){ ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo(); connectorStatusInfo.setConnectorID(id.toString()); switch (status){ case 1: connectorStatusInfo.setStatus(0); break; case 2: connectorStatusInfo.setStatus(1); break; case 3: connectorStatusInfo.setStatus(2); break; case 4: connectorStatusInfo.setStatus(3); break; case 5: connectorStatusInfo.setStatus(3); break; case 6: connectorStatusInfo.setStatus(4); break; case 7: connectorStatusInfo.setStatus(255); break; } NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo); return R.ok(); } /** * 设备接口状态查询 * @param query * @return */ @PostMapping("/query_station_status") public QueryStationStatusResult queryStationStatus(@RequestBody QueryStationStatus query){ } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java
New file @@ -0,0 +1,82 @@ package com.ruoyi.integration.drainage; import cn.hutool.http.*; import com.alibaba.fastjson.JSON; import com.ruoyi.integration.drainage.model.*; import lombok.extern.slf4j.Slf4j; /** * 中电联TCEC标准 * @author zhibing.pu * @Date 2025/1/21 11:48 */ @Slf4j public class TCECUtil { /** * 设备状态变化推送 * @param info */ public static NotificationStationStatusResult notificationStationStatus(ConnectorStatusInfo info) { HttpRequest post = HttpUtil.createPost(""); post.contentType(ContentType.JSON.toString()); post.body(JSON.toJSONString(info)); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ log.error("设备状态变化推送失败:" + execute.body()); return null; } return JSON.parseObject(execute.body(), NotificationStationStatusResult.class); } /** * 查询统计信息 * @param query * @return */ public QueryStationStatsResult queryStationStats(QueryStationStats query){ } /** * 查询业务策略信息 * @param query * @return */ public BaseResult<QueryEquipBusinessPolicyResult> queryEquipBusinessPolicy(QueryEquipBusinessPolicy query){ } /** * 查询充电状态 * @param query * @return */ public BaseResult<QueryEquipChargeStatusResult> queryEquipChargeStatus(QueryEquipChargeStatus query){ } /** * 推动充电状态 * @param info * @return */ public BaseResult<NotificationEquipChargeStatusResult> notificationEquipChargeStatus(QueryEquipChargeStatusResult info){ } /** * 推送充电订单信息 * @param indo * @return */ public BaseResult<NotificationChargeOrderInfoResult> notificationChargeOrderInfo(NotificationChargeOrderInfo indo){ } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java
New file @@ -0,0 +1,41 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 公共请求 * @author zhibing.pu * @Date 2025/1/21 17:08 */ @Data public class BaseRequest<T> { /** * 运营商标识 */ @NotNull private String OperatorID; /** * 参数内容 */ @NotNull private T Data; /** * 时间戳 * yyyyMMddHHmmss */ @NotNull private Long TimeStamp; /** * 自增序列 * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001 */ @NotNull private String Seq; /** * 数字签名 */ @NotNull private String Sig; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java
New file @@ -0,0 +1,41 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 公共返回结果 * @author zhibing.pu * @Date 2025/1/21 15:54 */ @Data public class BaseResult<T> { /** * 参数编码 * -1:系统繁忙,此时请求方稍后重试 * 0:请求成功 * 4001:签名错误 * 4002:Token错误 * 4003:POST参数不合法,缺少必需的 * 4004:请求的业务参数不合法 * 500:系统错误 */ @NotNull private Integer Ret; /** * 错误信息描述 */ @NotNull private String Msg; /** * 参数实体 */ @NotNull private T Data; /** * 签名 */ @NotNull private String Sig; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ChargeDetail.java
New file @@ -0,0 +1,53 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; /** * 充电明细信息 * @author zhibing.pu * @Date 2025/1/21 16:40 */ @Data public class ChargeDetail { /** * 开始时间 * yyyy-MM-dd HH:mm:ss */ @NotNull private String DetailStartTime; /** * 结束时间 * yyyy-MM-dd HH:mm:ss */ @NotNull private String DetailEndTime; /** * 时段电价 */ @Null private BigDecimal ElecPrice; /** * 时段服务费价格 */ @Null private BigDecimal SevicePrice; /** * 时段充电量 */ @Null private BigDecimal DetailPower; /** * 时段电费 */ @Null private BigDecimal DetailElecMoney; /** * 时段服务费 */ @Null private BigDecimal DetailSeviceMoney; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java
New file @@ -0,0 +1,63 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; /** * 充电设备接口 * @author zhibing.pu * @Date 2025/1/21 14:03 */ @Data public class ConnectorInfo { /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 充电设备接口名称 */ @Null private String ConnectorName; /** * 充电设备接口类型 */ @NotNull private Integer ConnectorType; /** * 额定电压上限 */ @NotNull private Integer VoltageUpperLimits; /** * 额定电压下限 */ @NotNull private Integer VoltageLowerLimits; /** * 额定电流 */ @NotNull private Integer Current; /** * 额定功率 */ @NotNull private BigDecimal Power; /** * 车位号 */ @Null private String ParkNo; /** * 国家标准 * 1:2011 * 2:2015 */ @NotNull private Integer NationalStandard; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * 充电设备接口统计信息 * @author zhibing.pu * @Date 2025/1/21 15:24 */ @Data public class ConnectorStatsInfo { /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 充电设备接口累计电量 */ @NotNull private BigDecimal ConnectorElectricity; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; /** * 充电设备接口状态 * @author zhibing.pu * @Date 2025/1/21 14:53 */ @Data public class ConnectorStatusInfo { /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 充电设备接口状态 * 0:离网 * 1:空闲 * 2:占用(未充电) * 3:占用(充电中) * 4:占用(预约锁定) * 255:故障 */ @NotNull private Integer Status; /** * 车位状态 * 0:未知 * 10:空闲 * 50:占用 */ @Null private Integer ParkStatus; /** * 地锁状态 * 0:未知 * 10:已解锁 * 50:已上锁 */ @Null private Integer LookStatus; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentInfo.java
New file @@ -0,0 +1,73 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; import java.util.List; /** * 充电设备信息 * @author zhibing.pu * @Date 2025/1/21 13:51 */ @Data public class EquipmentInfo { /** * 设备编号 */ @NotNull private String EquipmentID; /** * 设备生产商组织机构代码 */ @Null private String ManufacturerID; /** * 设备生产商名称 */ @Null private String ManufacturerName; /** * 设备型号 */ @Null private String EquipmentModel; /** * 设备生产日期 * YYYY-MM-DD */ @Null private String ProductionDate; /** * 设备类型 */ @NotNull private Integer EquipmentType; /** * 充电设备接口信息列表 */ @NotNull private List<ConnectorInfo> ConnectorInfos; /** * 充电设备经度 */ @Null private BigDecimal EquipmentLng; /** * 充电设备纬度 */ @Null private BigDecimal EquipmentLat; /** * 充电设备总功率 */ @NotNull private BigDecimal Power; /** * 充电设备名称 */ @Null private String EquipmentName; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.List; /** * 充电设备统计信息 * @author zhibing.pu * @Date 2025/1/21 15:22 */ @Data public class EquipmentStatsInfo { /** * 设备编码 */ @NotNull private String EquipmentID; /** * 充电设备接口累计电量 */ @NotNull private BigDecimal EquipmentElectricity; /** * 充电设备接口统计信息列表 */ @NotNull private List<ConnectorStatsInfo> ConnectorStatsInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationChargeOrderInfo.java
New file @@ -0,0 +1,82 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; import java.util.List; /** * 推送充电订单信息 * @author zhibing.pu * @Date 2025/1/21 15:39 */ @Data public class NotificationChargeOrderInfo { /** * 充电订单号 */ @NotNull private String StartChargeSeq; /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 开始充电时间 * yyyy-MM-dd HH:mm:ss */ @NotNull private String StartTime; /** * 结束充电时间 * yyyy-MM-dd HH:mm:ss */ @NotNull private String EndTime; /** * 累计充电量 */ @NotNull private BigDecimal TotalPower; /** * 总电费 */ @NotNull private BigDecimal TotalElecMoney; /** * 总服务费 */ @NotNull private BigDecimal TotalSeviceMoney; /** * 累计总金额 */ @NotNull private BigDecimal TotalMoney; /** * 充电结束原因 * 0:用户手动停止充电 * 1:客户归属地运营商平台停止充电 * 2:BMS停止充电 * 3:充电机设备故障 * 4:连接器断开 * 5·99:自定义 */ @NotNull private Integer StopReason; /** * 时段数 N * 0·32 */ @Null private Integer SumPeriod; /** * 充电明细信息 */ @Null private List<ChargeDetail> ChargeDetails; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationChargeOrderInfoResult.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 推送充电订单信息返回记过 * @author zhibing.pu * @Date 2025/1/21 15:49 */ @Data public class NotificationChargeOrderInfoResult { /** * 充电订单号 */ @NotNull private String StartChargeSeq; /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 确认结果 * 0;成功 * 1:争议交易 * 2·99:自定义 */ private Integer ConfirmResult; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationEquipChargeStatusResult.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 推送充电状态结果 * @author zhibing.pu * @Date 2025/1/21 16:48 */ @Data public class NotificationEquipChargeStatusResult { /** * 充电订单号 */ @NotNull private String StartChargeSeq; /** * 操作结果 * 0:成功 * 1:失败 */ @NotNull private Integer SuccStat; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStationStatusResult.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 设备状态变化推动返回结果 * @author zhibing.pu * @Date 2025/1/21 14:58 */ @Data public class NotificationStationStatusResult { /** * 状态 * 0:接收 * 1:丢弃/忽略,不需要重试 */ @NotNull private Integer Status; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/OperatorInfo.java
New file @@ -0,0 +1,45 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; /** * 基础设施运营商信息 * @author zhibing.pu * @Date 2025/1/21 11:49 */ @Data public class OperatorInfo { /** * 运营商ID */ @NotNull private String OperatorID; /** * 运营商名称 */ @NotNull private String OperatorName; /** * 运营商电话1 */ @NotNull private String OperatorTel1; /** * 运营商电话2 */ @Null private String OperatorTel2; /** * 运营商注册地址 */ @Null private String OperatorRegAddress; /** * 备注 */ @Null private String OperatorNote; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/PolicyInfo.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * 计费信息 * @author zhibing.pu * @Date 2025/1/21 16:10 */ @Data public class PolicyInfo { /** * 时段起始时间点 * HHmmss */ @NotNull private String StartTime; /** * 时段电费 */ @NotNull private BigDecimal ElecPrice; /** * 时段服务费 */ @NotNull private BigDecimal SevicePrice; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipBusinessPolicy.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 查询业务策略信息 * @author zhibing.pu * @Date 2025/1/21 16:03 */ @Data public class QueryEquipBusinessPolicy { /** * 业务策略查询流水号 * 格式”运营商ID+唯一编号“。27字符 */ @NotNull private String EquipBizSeq; /** * 充电设备接口编码 */ @NotNull private String ConnectorID; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipBusinessPolicyResult.java
New file @@ -0,0 +1,51 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; /** * 查询业务策略信息结果 * @author zhibing.pu * @Date 2025/1/21 16:05 */ @Data public class QueryEquipBusinessPolicyResult { /** * 业务策略查询流水号 */ @NotNull private String EquipBizSeq; /** * 充电设备接口编码 */ @NotNull private String ConnectorID; /** * 操作结果 * 0:成功 * 1:失败 */ @NotNull private Integer SuccStat; /** * 失败原因 * 0:无 * 1:此充电桩业务策略不存在 */ @NotNull private Integer FailReason; /** * 时段数N * 0`32 */ @NotNull private Integer SumPeriod; /** * 计策信息 */ @NotNull private List<PolicyInfo> PolicyInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipChargeStatus.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 查询充电状态 * @author zhibing.pu * @Date 2025/1/21 16:17 */ @Data public class QueryEquipChargeStatus { /** * 充电订单号 */ @NotNull private String StartChargeSeq; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipChargeStatusResult.java
New file @@ -0,0 +1,124 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; import java.util.List; /** * 查询充电状态结果 * @author zhibing.pu * @Date 2025/1/21 15:58 */ @Data public class QueryEquipChargeStatusResult { /** * 充电订单号 */ @NotNull private String StartChargeSeq; /** * 充电订单状态 * 1:启动中 * 2:充电中 * 3:停止中 * 4:已结束 * 5:未知 */ @NotNull private Integer StartChargeSeqStat; /** * 充电设备接口编号 */ @NotNull private String ConnectorID; /** * 充电设备接口状态 * 1:空闲 * 2:占用(未充电) * 3:占用(充电中) * 4:占用(预约锁定) * 255:故障 */ @NotNull private Integer ConnectorStatus; /** * A相电流 */ @NotNull private BigDecimal CurrentA; /** * B相电流 */ @Null private BigDecimal CurrentB; /** * C相电流 */ @Null private BigDecimal CurrentC; /** * A相电压 */ @NotNull private BigDecimal VoltageA; /** * B相电压 */ @Null private BigDecimal VoltageB; /** * C相电压 */ @Null private BigDecimal VoltageC; /** * 电池剩余电量 */ @NotNull private BigDecimal Soc; /** * 开始充电时间 */ @NotNull private String StartTime; /** * 本次采样时间 */ @NotNull private String EndTime; /** * 累计充电量 */ @NotNull private BigDecimal TotalPower; /** * 累计电费 */ @Null private BigDecimal ElecMoney; /** * 累计服务费 */ @Null private BigDecimal SeviceMoney; /** * 累计总金额 */ @Null private BigDecimal TotalMoney; /** * 时段数N * 0`32 */ @Null private Integer SumPeriod; /** * 充电明细信息 */ @Null private List<ChargeDetail> ChargeDetails; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 查询统计信息 * @author zhibing.pu * @Date 2025/1/21 15:11 */ @Data public class QueryStationStats { /** * 充电站ID */ @NotNull private String StationID; /** * 统计开始时间 * yyyy-MM-dd */ @NotNull private String StartTime; /** * 统计结束时间 * yyyy-MM-dd */ @NotNull private String EndTime; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatsResult.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; /** * 查询统计信息结果 * @author zhibing.pu * @Date 2025/1/21 15:16 */ @Data public class QueryStationStatsResult { /** * 充电站统计信息 */ @NotNull private StationStatsInfo StationStats; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; /** * 设备接口状态查询 * @author zhibing.pu * @Date 2025/1/21 15:01 */ @Data public class QueryStationStatus { /** * 充电站ID列表 * 数组长度不超过50 */ @NotNull private List<String> StationIDs; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatusResult.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import java.util.List; /** * 设备接口状态查询返回结果 * @author zhibing.pu * @Date 2025/1/21 15:04 */ @Data public class QueryStationStatusResult { /** * 结果总数 */ private Integer Total; /** * 设备接口状态列表 */ private List<StationStatusInfo> StationStatusInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationsInfo.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.Null; /** * @author zhibing.pu * @Date 2025/1/21 14:41 */ @Data public class QueryStationsInfo { /** * 上次查询时间 * yyyy-MM-dd HH:mm:ss */ @Null private String LastQueryTime; /** * 查询页码 * 默认1 */ @Null private Integer PageNo; /** * 每页数量 * 默认10 */ @Null private Integer PageSize; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationsInfoResult.java
New file @@ -0,0 +1,30 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import java.util.List; /** * 公共返回结果 * @author zhibing.pu * @Date 2025/1/21 14:44 */ @Data public class QueryStationsInfoResult { /** * 当前页数 */ private Integer PageNo; /** * 页码总数 */ private Integer PageCount; /** * 总记录条数 */ private Integer ItemSize; /** * 充电站信息列表 */ private List<StationInfo> StationInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java
New file @@ -0,0 +1,154 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import java.math.BigDecimal; import java.util.List; /** * 充电站信息 * @author zhibing.pu * @Date 2025/1/21 11:54 */ @Data public class StationInfo { /** * 充电站ID */ @NotNull private String StationID; /** * 运营商ID */ @NotNull private String OperatorID; /** * 设备所属方ID * 设备所属运营平台组织机构代码 */ @NotNull private String EquipmentOwnerID; /** * 充电站名称 */ @NotNull private String StationName; /** * 充电站国家代码 */ @NotNull private String CountryCode; /** * 充电站省市辖区编码 */ @NotNull private String AreaCode; /** * 详细地址 */ @NotNull private String Address; /** * 站点电话 */ @Null private String StationTel; /** * 站点电话 */ @NotNull private String ServiceTel; /** * 站点类型 */ @NotNull private Integer StationType; /** * 站点状态 */ @NotNull private Integer StationStatus; /** * 车位数量,0:未知 */ @NotNull private Integer ParkNums; /** * 经度(保留6位小数) */ @NotNull private BigDecimal StationLng; /** * 纬度(保留6位小数) */ @NotNull private BigDecimal StationLat; /** * 站点引导 */ @Null private String SiteGuide; /** * 建设场所 */ @NotNull private Integer Construction; /** * 站点照片 * 字符串数组 */ @Null private List<String> Pictures; /** * 使用车型描述 */ @Null private String MatchCars; /** * 车位楼层及数量描述 */ @Null private String ParkInfo; /** * 营业时间 */ @Null private String BusineHours; /** * 充电电费率描述 */ @Null private String ElectricityFee; /** * 服务费率描述 */ @Null private String ServiceFee; /** * 停车费率描述 */ @Null private String ParkFee; /** * 支付方式:刷卡、线上、现金 */ @Null private String Payment; /** * 是否支持预约 */ @Null private Integer SupportOrder; /** * 备注 */ @Null private String Remark; /** * 充电设备信息列表 */ @NotNull private List<EquipmentInfo> EquipmentInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.List; /** * 充电站统计信息 * @author zhibing.pu * @Date 2025/1/21 15:17 */ @Data public class StationStatsInfo { /** * 充电站ID */ @NotNull private String StationID; /** * 统计的开始时间 * yyyy-MM-dd */ @NotNull private String StartTime; /** * 统计的结束时间 * yyyy-MM-dd */ @NotNull private String EndTime; /** * 充电站累计电量 kw/h */ @NotNull private BigDecimal StationElectricity; /** * 充电设备统计信息列表 */ @NotNull private List<EquipmentStatsInfo> EquipmentStatsInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.integration.drainage.model; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; /** * 充电站状态信息 * @author zhibing.pu * @Date 2025/1/21 15:07 */ @Data public class StationStatusInfo { /** * 充电站ID */ @NotNull private String StationID; /** * 充电设备接口状态列表 */ private List<ConnectorStatusInfo> ConnectorStatusInfos; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/ConnectorTypeEnum.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.integration.drainage.model.enu; /** * 充电设备接口类型 * @author zhibing.pu * @Date 2025/1/21 14:14 */ public enum ConnectorTypeEnum { HOUSEHOLD_SOCKET(1, "家用插座"), AC_SOCKET(2, "交流接口插座"), AC_INTERFACE_PLUG(3, "交流接口插头"), DC_INTERFACE_GUN_HEAD(4, "直流接口枪头"), WIRELESS_CHARGING_STAND(5, "无线充电座"), OTHER(6, "其他") ; private Integer type; private String note; ConnectorTypeEnum(Integer type, String note) { this.type = type; this.note = note; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/ConstructionEnum.java
New file @@ -0,0 +1,45 @@ package com.ruoyi.integration.drainage.model.enu; /** * 建设场所 * @author zhibing.pu * @Date 2025/1/21 13:25 */ public enum ConstructionEnum { RESIDENTIAL_AREA(1, "居民区"), PUBLIC_INSTITUTION(2, "公共机构"), ENTERPRISE(3, "企事业单位"), OFFICE_BUILDING(4, "写字楼"), INDUSTRIAL_PARK(5, "工业园区"), TRANSPORTATION_JUNCTION(6, "交通枢纽"), CULTURE_AND_SPORTS(7, "大型文体设施"), URBAN_GREEN_SPACE(8, "城市绿地"), ANCILLARY_PARKING_LOT(9, "大型建筑配建停车场"), OFF_STREET_PARKING_SPACE(10, "路边停车位"), HIGH_SPEED_SERVICE_AREA(11, "城际高速服务区"), OTHER(255, "其他"); private Integer type; private String note; ConstructionEnum(Integer type, String note) { this.type = type; this.note = note; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/EquipmentTypeEnum.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.integration.drainage.model.enu; /** * 设备类型 * @author zhibing.pu * @Date 2025/1/21 13:59 */ public enum EquipmentTypeEnum { DIRECT_CURRENT(1, "直流设备"), ALTERNATING_CURRENT(2, "交流设备"), ALTERNATING_DIRECT(3, "交直流一体设备"), WIRELESS_DEVICE(4, "无线设备"), OTHER(5, "其他") ; private Integer type; private String note; EquipmentTypeEnum(Integer type, String note) { this.type = type; this.note = note; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.integration.drainage.model.enu; /** * 接口地址枚举 * @author zhibing.pu * @Date 2025/1/21 14:38 */ public enum InterfaceUrlEnum { QUERY_STATIONS_INFO("query_stations_info", "查询充电站信息"), NOTIFICATION_STATION_STATUS("notification_stationStatus", "设备状态变化推送"), QUERY_STATION_STATUS("query_station_status", "设备接口状态查询"), ; private String url; private String note; InterfaceUrlEnum(String url, String note) { this.url = url; this.note = note; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/StationStatusEnum.java
New file @@ -0,0 +1,38 @@ package com.ruoyi.integration.drainage.model.enu; /** * 站点状态 * @author zhibing.pu * @Date 2025/1/21 12:10 */ public enum StationStatusEnum { UNKNOWN(0, "未知"), UNDER_CONSTRUCTION(1, "建设中"), OFF_LINE(5, "关闭下线"), MAINTAIN(6, "维护中"), NORMAL_USE(50, "正常使用") ; private Integer status; private String note; StationStatusEnum(Integer status, String note) { this.status = status; this.note = note; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/StationTypeEnum.java
New file @@ -0,0 +1,41 @@ package com.ruoyi.integration.drainage.model.enu; /** * 站点类型 * @author zhibing.pu * @Date 2025/1/21 12:00 */ public enum StationTypeEnum { PUBLIC(1, "公共"), PERSONAGE(50, "个人"), BUS_SPECIFIC(100, "公交(专用)"), SANITATION_SPECIFIC(101, "环卫(专用)"), LOGISTICS_SPECIFIC(102, "物流(专用)"), TEXT_SPECIFIC(103, "出租车(专用)"), OTHER(255, "其他") ; private Integer type; private String note; StationTypeEnum(Integer type, String note) { this.type = type; this.note = note; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }