Browse Source

feat(charging): 新增充电控制相关接口与数据模型

- 新增启动充电请求DTO与响应VO
- 新增充电状态查询响应VO
- 新增停止充电操作响应VO
- 修改充电业务控制器,新增启动、查询、停止充电接口
- 更新设备接口状态查询接口为POST方式
- 移除控制器中不必要的异常声明
- 简化VO包导入方式
- 实现启动充电、查询充电状态、停止充电业务逻辑
- 新增充电控制相关Swagger文档注释
SheepHy 3 weeks ago
parent
commit
3b10468ec9

+ 41 - 11
src/main/java/com/zsElectric/boot/charging/controller/ChargingBusinessController.java

@@ -1,20 +1,16 @@
 package com.zsElectric.boot.charging.controller;
 
+import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
+import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
 import com.zsElectric.boot.charging.service.ChargingBusinessService;
-import com.zsElectric.boot.charging.vo.ChargingPricePolicyVO;
-import com.zsElectric.boot.charging.vo.EquipmentAuthResponseVO;
-import com.zsElectric.boot.charging.vo.QueryStationStatusVO;
-import com.zsElectric.boot.charging.vo.QueryStationsInfoVO;
+import com.zsElectric.boot.charging.vo.*;
 import com.zsElectric.boot.core.web.Result;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 @Slf4j
@@ -51,7 +47,7 @@ public class ChargingBusinessController {
      */
     @Operation(summary = "查询业务策略信息")
     @GetMapping("/queryEquipAuth")
-    public Result<EquipmentAuthResponseVO> queryEquipAuth(String EquipAuthSeq, String ConnectorID) throws Exception {
+    public Result<EquipmentAuthResponseVO> queryEquipAuth(String EquipAuthSeq, String ConnectorID){
         return Result.success(chargingBusinessService.queryEquipAuth(EquipAuthSeq, ConnectorID));
     }
 
@@ -80,8 +76,42 @@ public class ChargingBusinessController {
      *
      */
     @Operation(summary = "设备接口状态查询")
-    @GetMapping("/queryStationStatus")
-     public Result<QueryStationStatusVO> queryStationStatus(List<String> stationIDs) throws Exception {
+    @PostMapping("/queryStationStatus")
+     public Result<QueryStationStatusVO> queryStationStatus(@RequestBody List<String> stationIDs){
         return Result.success(chargingBusinessService.queryStationStatus(stationIDs));
      }
+
+
+    /**
+     * <p>请求启动充电</p>
+     * @author SheepHy
+     * @param requestDTO,参数为类则包含{@link StartChargingRequestDTO}
+     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link StartChargingResponseVO}
+     */
+    @Operation(summary = "请求启动充电")
+    @PostMapping("/startCharging")
+    public Result<StartChargingResponseVO> startCharging(@RequestBody StartChargingRequestDTO requestDTO){
+        return Result.success(chargingBusinessService.startCharging(requestDTO));
+    }
+
+    /**
+     * <p>查询充电状态</p>
+     * @author SheepHy
+     */
+    @Operation(summary = "查询充电状态")
+    @PostMapping("/queryChargingStatus")
+    public Result<ChargingStatusQueryResponseVO> queryChargingStatus(@RequestParam("StartChargeSeq") @Schema(description = "充电订单号(格式:运营商ID+唯一编号)") String StartChargeSeq){
+        return Result.success(chargingBusinessService.queryChargingStatus(StartChargeSeq));
+    }
+
+    /**
+     * <p>请求停止充电</p>
+     * @author SheepHy
+     */
+    @Operation(summary = "请求停止充电")
+    @GetMapping("/stopCharging")
+    public Result<StopChargingOperationResponseVO> stopCharging(@RequestParam("StartChargeSeq") @Schema(description = "充电订单号(格式:运营商ID+唯一编号)") String StartChargeSeq,
+                                                                @RequestParam("ConnectorID") @Schema(description = "充电设备接口编码") String ConnectorID){
+        return Result.success(chargingBusinessService.stopCharging(StartChargeSeq, ConnectorID));
+    }
 }

+ 43 - 0
src/main/java/com/zsElectric/boot/charging/dto/StartChargingRequestDTO.java

@@ -0,0 +1,43 @@
+package com.zsElectric.boot.charging.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@Accessors(chain = true)
+@Schema(description = "请求启动充电DTO")
+public class StartChargingRequestDTO {
+
+    @NotBlank(message = "充电订单号不能为空")
+    @Pattern(regexp = "^\\d{27}$", message = "充电订单号必须为27位数字")
+    @Schema(description = "充电订单号(格式:运营商ID+唯一编号,27位)",
+            example = "123456789201805071630123456",
+            required = true)
+    private String StartChargeSeq;
+
+    @NotBlank(message = "充电设备接口编码不能为空")
+    @Schema(description = "充电设备接口编码(见中电联协议 102.2-2016)",
+            example = "3702120244102_1",
+            required = true)
+    private String ConnectorID;
+
+    @Schema(description = "手机号(平台扩展字段)",
+            example = "13800138000")
+    private String PhoneNum;
+
+    @Schema(description = "车牌号(平台扩展字段)",
+            example = "京A12345")
+    private String PlateNum;
+
+    @Schema(description = "预付金额(单位元)(平台扩展字段)",
+            example = "50.00")
+    private String ChargingAmt;
+
+    @Schema(description = "二维码其他信息(二维码中含有自定义部分的,需要将二维码自定义部分的原文传输)",
+            example = "custom_qr_info_123456")
+    private String QRCode;
+}

+ 22 - 11
src/main/java/com/zsElectric/boot/charging/service/ChargingBusinessService.java

@@ -1,5 +1,7 @@
 package com.zsElectric.boot.charging.service;
 
+import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
+import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
 import com.zsElectric.boot.charging.vo.*;
 
 import java.util.List;
@@ -24,7 +26,7 @@ public interface ChargingBusinessService {
      * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link EquipmentAuthResponseVO}
      *
      */
-    EquipmentAuthResponseVO queryEquipAuth(String EquipAuthSeq, String ConnectorID) throws Exception;
+    EquipmentAuthResponseVO queryEquipAuth(String EquipAuthSeq, String ConnectorID);
 
     /**
      * <p>查询充电站信息</p>
@@ -35,7 +37,7 @@ public interface ChargingBusinessService {
      * @return 充电站信息列表
      *
      */
-    QueryStationsInfoVO queryStationsInfo(String LastQueryTime, Integer PageNo, Integer PageSize) throws Exception;
+    QueryStationsInfoVO queryStationsInfo(String LastQueryTime, Integer PageNo, Integer PageSize);
 
     /**
      * <p>设备接口状态查询</p>
@@ -44,16 +46,25 @@ public interface ChargingBusinessService {
      * @return 充电站状态列表
      *
      */
-    QueryStationStatusVO queryStationStatus(List<String> stationIDs) throws Exception;
-
-//    /**
-//     * <p>请求启动充电</p>
-//     * @author SheepHy
-//     * @param requestDTO,参数为类则包含{@link StartChargingRequestDTO}
-//     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link StartChargingResponseVO}
-//     */
-//    StartChargingResponseVO startCharging(StartChargingRequestDTO requestDTO) throws Exception;
+    QueryStationStatusVO queryStationStatus(List<String> stationIDs);
 
+    /**
+     * <p>请求启动充电</p>
+     * @author SheepHy
+     * @param requestDTO,参数为类则包含{@link StartChargingRequestDTO}
+     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link StartChargingResponseVO}
+     */
+    StartChargingResponseVO startCharging(StartChargingRequestDTO requestDTO);
 
+    /**
+     * <p>查询充电状态</p>
+     * @author SheepHy
+     */
+    ChargingStatusQueryResponseVO queryChargingStatus(String StartChargeSeq);
 
+    /**
+     * <p>请求停止充电</p>
+     * @author SheepHy
+     */
+    StopChargingOperationResponseVO stopCharging(String StartChargeSeq, String ConnectorID);
 }

+ 39 - 4
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingBusinessServiceImpl.java

@@ -3,11 +3,10 @@ package com.zsElectric.boot.charging.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
+import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
+import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
 import com.zsElectric.boot.charging.service.ChargingBusinessService;
-import com.zsElectric.boot.charging.vo.ChargingPricePolicyVO;
-import com.zsElectric.boot.charging.vo.EquipmentAuthResponseVO;
-import com.zsElectric.boot.charging.vo.QueryStationStatusVO;
-import com.zsElectric.boot.charging.vo.QueryStationsInfoVO;
+import com.zsElectric.boot.charging.vo.*;
 import com.zsElectric.boot.common.constant.ConnectivityConstants;
 import com.zsElectric.boot.common.util.electric.ChargingUtil;
 import lombok.RequiredArgsConstructor;
@@ -77,4 +76,40 @@ public class ChargingBusinessServiceImpl implements ChargingBusinessService {
         log.info("设备接口状态查询返回结果解密后:{}", responseDecode);
         return new Gson().fromJson(responseDecode, QueryStationStatusVO.class);
     }
+
+    @Override
+    public StartChargingResponseVO startCharging(StartChargingRequestDTO requestDTO){
+        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(requestDTO);
+        log.info("设备接口状态查询请求参数:{}", stringObjectMap);
+        JsonObject jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_START_CHARGE, stringObjectMap, true);
+        log.info("设备接口状态查询返回结果:{}", jsonObject);
+        JsonObject responseDecode = chargingUtil.responseDecode(jsonObject);
+        log.info("设备接口状态查询返回结果解密后:{}", responseDecode);
+        return new Gson().fromJson(responseDecode, StartChargingResponseVO.class);
+    }
+
+    @Override
+    public ChargingStatusQueryResponseVO queryChargingStatus(String StartChargeSeq) {
+        Map<String, Object> queryParms = new HashMap<>();
+        queryParms.put("StartChargeSeq", StartChargeSeq);
+        log.info("查询充电订单状态请求参数:{}", queryParms);
+        JsonObject jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_EQUIP_CHARGE_STATUS, queryParms, true);
+        log.info("查询充电订单状态返回结果:{}", jsonObject);
+        JsonObject responseDecode = chargingUtil.responseDecode(jsonObject);
+        log.info("查询充电订单状态返回结果解密后:{}", responseDecode);
+        return new Gson().fromJson(responseDecode, ChargingStatusQueryResponseVO.class);
+    }
+
+    @Override
+    public StopChargingOperationResponseVO stopCharging(String StartChargeSeq, String ConnectorID) {
+        Map<String, Object> queryTokenParms = new HashMap<>();
+        queryTokenParms.put("StartChargeSeq", StartChargeSeq);
+        queryTokenParms.put("ConnectorID", ConnectorID);
+        log.info("停止充电请求参数:{}", queryTokenParms);
+        JsonObject jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_STOP_CHARGE, queryTokenParms, true);
+        log.info("停止充电返回结果:{}", jsonObject);
+        JsonObject responseDecode = chargingUtil.responseDecode(jsonObject);
+        log.info("停止充电返回结果解密后:{}", responseDecode);
+        return new Gson().fromJson(responseDecode, StopChargingOperationResponseVO.class);
+    }
 }

+ 97 - 0
src/main/java/com/zsElectric/boot/charging/vo/ChargingStatusQueryResponseVO.java

@@ -0,0 +1,97 @@
+package com.zsElectric.boot.charging.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@Schema(description = "充电状态查询响应VO")
+public class ChargingStatusQueryResponseVO {
+
+    @Schema(description = "订单状态(1-启动中,2-启动成功,3-启动失败,4-结束)",
+            example = "2",
+            allowableValues = {"1", "2", "3", "4"},
+            required = true)
+    private Integer StartChargeSeqStat;
+
+    @Schema(description = "充电订单号(格式:运营商ID+唯一编号)",
+            example = "123456789201805071630123456",
+            required = true)
+    private String StartChargeSeq;
+
+    @Schema(description = "充电设备接口编码",
+            example = "3702120244102_1",
+            required = true)
+    private String ConnectorID;
+
+    @Schema(description = "设备接口状态(0-离网,1-空闲,2-占用(未充电),3-占用(充电中),4-占用(预约锁定),255-故障)",
+            example = "3",
+            allowableValues = {"0", "1", "2", "3", "4", "255"},
+            required = true)
+    private Integer ConnectorStatus;
+
+    @Schema(description = "累计充电电量,单位:kWh",
+            example = "25.68",
+            required = true)
+    private BigDecimal TotalPower;
+
+    @Schema(description = "电费,单位:元",
+            example = "15.80",
+            required = true)
+    private BigDecimal ElecMoney;
+
+    @Schema(description = "服务费,单位:元",
+            example = "3.20",
+            required = true)
+    private BigDecimal SeviceMoney;
+
+    @Schema(description = "总金额,单位:元",
+            example = "19.00",
+            required = true)
+    private BigDecimal TotalMoney;
+
+    @Schema(description = "充电明细信息体列表",
+            required = true)
+    private List<ChargeDetail> ChargeDetails;
+
+    @Data
+    @Accessors(chain = true)
+    @Schema(description = "充电明细信息体")
+    public static class ChargeDetail {
+
+        @Schema(description = "开始时间,格式\"yyyy-MM-dd HH:mm:ss\"",
+                example = "2024-01-15 10:30:00",
+                required = true)
+        private String DetailStartTime;
+
+        @Schema(description = "结束时间,格式\"yyyy-MM-dd HH:mm:ss\"",
+                example = "2024-01-15 11:30:00",
+                required = true)
+        private String DetailEndTime;
+
+        @Schema(description = "时段电价,小数点后2位",
+                example = "0.65")
+        private BigDecimal ElecPrice;
+
+        @Schema(description = "时段服务费价格,小数点后2位",
+                example = "0.15")
+        private BigDecimal SevicePrice;
+
+        @Schema(description = "时段充电量,单位:度,小数点后2位",
+                example = "12.34",
+                required = true)
+        private BigDecimal DetailPower;
+
+        @Schema(description = "时段电费,小数点后2位",
+                example = "8.02")
+        private BigDecimal DetailElecMoney;
+
+        @Schema(description = "时段服务费,小数点后2位",
+                example = "1.85")
+        private BigDecimal DetailSeviceMoney;
+    }
+}

+ 44 - 0
src/main/java/com/zsElectric/boot/charging/vo/StartChargingResponseVO.java

@@ -0,0 +1,44 @@
+package com.zsElectric.boot.charging.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+@Schema(description = "启动充电返回DTO")
+public class StartChargingResponseVO {
+
+    @Schema(description = "充电订单号(格式:运营商ID+唯一编号)",
+            example = "123456789201805071630123456",
+            required = true)
+    private String StartChargeSeq;
+
+    @Schema(description = "充电订单状态(1-启动中,2-充电中,3-停止中,4-已结束,5-未知)",
+            example = "1",
+            allowableValues = {"1", "2", "3", "4", "5"},
+            required = true)
+    private Integer StartChargeSeqStat;
+
+    @Schema(description = "充电设备接口编码(参见《电动汽车充换电服务信息交换 第2部分:公共信息交换规范》)",
+            example = "3702120244102_1",
+            required = true)
+    private String ConnectorID;
+
+    @Schema(description = "操作结果(0-成功,1-失败)",
+            example = "0",
+            allowableValues = {"0", "1"},
+            required = true)
+    private Integer SuccStat;
+
+    @Schema(description = "失败原因(0-无,1-此设备不存在,2-此设备离线,其它-自定义)",
+            example = "0",
+            allowableValues = {"0", "1", "2"},
+            required = true)
+    private Integer FailReason;
+
+    @Schema(description = "失败原因描述",
+            example = "无错误",
+            required = true)
+    private String FailReasonMsg;
+}

+ 39 - 0
src/main/java/com/zsElectric/boot/charging/vo/StopChargingOperationResponseVO.java

@@ -0,0 +1,39 @@
+package com.zsElectric.boot.charging.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+@Schema(description = "停止充电操作响应VO")
+public class StopChargingOperationResponseVO {
+
+    @Schema(description = "充电订单号(格式:运营商ID+唯一编号)",
+            example = "123456789201805071630123456",
+            required = true)
+    private String StartChargeSeq;
+
+    @Schema(description = "充电订单状态(1:启动中;2:充电中;3:停止中;4:已结束;5:未知)",
+            example = "4",
+            allowableValues = {"1", "2", "3", "4", "5"},
+            required = true)
+    private Integer StartChargeSeqStat;
+
+    @Schema(description = "操作结果(0:成功;1:失败)",
+            example = "0",
+            allowableValues = {"0", "1"},
+            required = true)
+    private Integer SuccStat;
+
+    @Schema(description = "失败原因(0:无;1:此设备不存在;2:此设备离线;3:设备已停止充电;其它:自定义)",
+            example = "0",
+            allowableValues = {"0", "1", "2", "3"},
+            required = true)
+    private Integer FailReason;
+
+    @Schema(description = "失败原因描述",
+            example = "停止成功",
+            required = true)
+    private String FailReasonMsg;
+}