浏览代码

feat(charging): 实现停止充电功能并优化充电状态处理

- 重命名 AppInvokeChargeVO 为 AppChargeVO
- 新增 AppStopChargeForm 表单对象用于停止充电请求
- 在 ChargeOrderInfo 实体中增加 connectorId 字段
- 实现 stopCharge 接口及对应业务逻辑
- 完善充电状态变更处理,支持启动、停止、结算等状态更新
- 增加日志记录与异常处理机制
- 更新相关控制器和服务层方法签名以适配新结构
wzq 2 天之前
父节点
当前提交
11b31f4e8f

+ 7 - 7
src/main/java/com/zsElectric/boot/business/controller/applet/AppletChargeController.java

@@ -1,11 +1,11 @@
 package com.zsElectric.boot.business.controller.applet;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
+import com.zsElectric.boot.business.model.form.applet.AppStopChargeForm;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
-import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargeVO;
 import com.zsElectric.boot.business.service.ChargeOrderInfoService;
 import com.zsElectric.boot.core.web.Result;
 import io.swagger.v3.oas.annotations.Operation;
@@ -49,8 +49,8 @@ public class AppletChargeController {
      */
     @Operation(summary = "启用充电")
     @PostMapping("/invokeCharge")
-    public Result<AppInvokeChargeVO> invokeCharge(@Valid @RequestBody AppInvokeChargeForm formData) {
-        AppInvokeChargeVO appInvokeChargeVO = chargeOrderInfoService.invokeCharge(formData);
+    public Result<AppChargeVO> invokeCharge(@Valid @RequestBody AppInvokeChargeForm formData) {
+        AppChargeVO appInvokeChargeVO = chargeOrderInfoService.invokeCharge(formData);
         return Result.success(appInvokeChargeVO);
     }
 
@@ -62,8 +62,8 @@ public class AppletChargeController {
      */
     @Operation(summary = "结束充电")
     @PostMapping("/stopCharge")
-    public Result<T> stopCharge(@RequestBody AppInvokeChargeForm formData) {
-//        chargeOrderInfoService.invokeCharge(formData);
-        return Result.success();
+    public Result<AppChargeVO> stopCharge(@RequestBody AppStopChargeForm formData) {
+        AppChargeVO appStopChargeVO= chargeOrderInfoService.stopCharge(formData);
+        return Result.success(appStopChargeVO);
     }
 }

+ 4 - 0
src/main/java/com/zsElectric/boot/business/model/entity/ChargeOrderInfo.java

@@ -48,6 +48,10 @@ public class ChargeOrderInfo extends BaseEntity {
      * 第三方充电订单号
      */
     private String startChargeSeq;
+    /**
+     * 充电设备接口编码
+     */
+    private String connectorId;
     /**
      * 充电开始时间
      */

+ 22 - 0
src/main/java/com/zsElectric/boot/business/model/form/applet/AppStopChargeForm.java

@@ -0,0 +1,22 @@
+package com.zsElectric.boot.business.model.form.applet;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Getter
+@Setter
+@Schema(description = "用户启用充电表单对象")
+public class AppStopChargeForm implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "充电订单ID")
+    @NotBlank(message = "充电订单ID不能为空")
+    private String chargeOrderId;
+}

+ 1 - 1
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppInvokeChargeVO.java → src/main/java/com/zsElectric/boot/business/model/vo/applet/AppChargeVO.java

@@ -10,7 +10,7 @@ import java.io.Serializable;
 @Getter
 @Setter
 @Schema(description = "启用充电响应对象")
-public class AppInvokeChargeVO implements Serializable {
+public class AppChargeVO implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 5 - 3
src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java

@@ -1,15 +1,15 @@
 package com.zsElectric.boot.business.service;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
 import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
 import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
+import com.zsElectric.boot.business.model.form.applet.AppStopChargeForm;
 import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargeVO;
 
 /**
  * 充电订单信息服务类
@@ -61,5 +61,7 @@ public interface ChargeOrderInfoService extends IService<ChargeOrderInfo> {
 
     IPage<ChargeOrderInfoVO> getPage(AppChargeOrderInfoQuery queryParams);
 
-    AppInvokeChargeVO invokeCharge(AppInvokeChargeForm formData);
+    AppChargeVO invokeCharge(AppInvokeChargeForm formData);
+
+    AppChargeVO stopCharge(AppStopChargeForm formData);
 }

+ 35 - 9
src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java

@@ -1,27 +1,25 @@
 package com.zsElectric.boot.business.service.impl;
 
-import cn.binarywang.wx.miniapp.bean.shop.WxMaShopCouponInfo;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.zsElectric.boot.business.mapper.*;
 import com.zsElectric.boot.business.model.entity.*;
 import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
-import com.zsElectric.boot.business.model.query.UserOrderInfoQuery;
+import com.zsElectric.boot.business.model.form.applet.AppStopChargeForm;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
-import com.zsElectric.boot.business.model.vo.UserOrderInfoVO;
-import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargeVO;
 import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 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.EquipmentAuthResponseVO;
+import com.zsElectric.boot.charging.vo.StopChargingOperationResponseVO;
 import com.zsElectric.boot.common.constant.ConnectivityConstants;
 import com.zsElectric.boot.common.constant.SystemConstants;
-import com.zsElectric.boot.common.util.electric.ApiToken;
 import com.zsElectric.boot.core.exception.BusinessException;
 import com.zsElectric.boot.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -33,7 +31,6 @@ import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
 import com.zsElectric.boot.business.converter.ChargeOrderInfoConverter;
 
 import java.text.SimpleDateFormat;
-import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
@@ -48,6 +45,7 @@ import cn.hutool.core.util.StrUtil;
  * @author zsElectric
  * @since 2025-12-17 19:13
  */
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMapper, ChargeOrderInfo> implements ChargeOrderInfoService {
@@ -149,10 +147,12 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
     }
 
     @Override
-    public AppInvokeChargeVO invokeCharge(AppInvokeChargeForm formData) {
+    public AppChargeVO invokeCharge(AppInvokeChargeForm formData) {
+
+        log.info("启动充电开始,用户ID:{},设备认证流水号:{},充电桩编号:{}", SecurityUtils.getUserId(), formData.getEquipAuthSeq(), formData.getEquipmentId());
 
         try {
-            AppInvokeChargeVO appInvokeChargeVO = new AppInvokeChargeVO();
+            AppChargeVO appInvokeChargeVO = new AppChargeVO();
 
             //必要校验
             Long userId = SecurityUtils.getUserId();
@@ -236,6 +236,32 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
         }
     }
 
+    @Override
+    public AppChargeVO stopCharge(AppStopChargeForm formData) {
+        try {
+            AppChargeVO appInvokeChargeVO = new AppChargeVO();
+
+            //订单
+            ChargeOrderInfo chargeOrderInfo = this.getById(formData.getChargeOrderId());
+            if(ObjectUtil.isEmpty(chargeOrderInfo)){
+                throw new BusinessException("订单不存在");
+            }
+            StopChargingOperationResponseVO stopChargingOperationResponseVO = chargingBusinessService.stopCharging(chargeOrderInfo.getStartChargeSeq(), chargeOrderInfo.getConnectorId());
+
+            if (!Objects.equals(stopChargingOperationResponseVO.getSuccStat(), SystemConstants.STATUS_ZERO)) {
+                throw new BusinessException("停止充电失败");
+            }
+
+            //保存订单
+            this.save(chargeOrderInfo);
+
+            appInvokeChargeVO.setChargeOrderNo(chargeOrderInfo.getChargeOrderNo());
+            return appInvokeChargeVO;
+        } catch (Exception e) {
+            throw new BusinessException("停止充电失败,系统错误,请联系客服处理!");
+        }
+    }
+
     /**
      * 创建商户订单号
      * 要求 32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一

+ 39 - 2
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java

@@ -132,7 +132,36 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     public ResponseParmsEntity stopChargeResponse(RequestParmsEntity requestDTO) {
         log.info("接收推送停止充电结果请求参数:{}", requestDTO);
         return processChargeRequest(requestDTO, jsonNode -> {
-            // TODO: 停止充电结果业务处理
+            // 停止充电结果业务处理
+            String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
+            int startChargeSeqStat = jsonNode.get("StartChargeSeqStat").asInt();
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+                    .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("LIMIT 1"));
+
+            if (startChargeSeqStat == 1) {
+                // 启动中
+                log.info("启动中 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 2) {
+                // 充电中
+                log.info("充电中 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 3) {
+                // 停止中
+                log.info("停止中 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 4) {
+                // 已结束
+                log.info("已结束 - StartChargeSeq: {}", startChargeSeq);
+                //修改订单状态结算中
+                chargeOrderInfo.setStatus(SystemConstants.STATUS_TWO);
+                chargeOrderInfoMapper.updateById(chargeOrderInfo);
+            }
+            if (startChargeSeqStat == 5) {
+                // 未知
+                log.info("未知 - StartChargeSeq: {}", startChargeSeq);
+            }
+
             log.debug("停止充电结果 - StartChargeSeq: {}", getTextValue(jsonNode, "StartChargeSeq"));
         });
     }
@@ -141,7 +170,8 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     public ResponseParmsEntity chargeOrderResponse(RequestParmsEntity requestDTO) {
         log.info("接收推送充电订单信息请求参数:{}", requestDTO);
         return processChargeRequest(requestDTO, jsonNode -> {
-            // TODO: 充电订单信息业务处理
+            // 充电订单信息业务处理
+
             log.debug("充电订单信息 - StartChargeSeq: {}", getTextValue(jsonNode, "StartChargeSeq"));
         });
     }
@@ -301,6 +331,13 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                     chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
                     chargeOrderInfoMapper.updateById(chargeOrderInfo);
                 }
+                if (Objects.equals(connectorStatus, SystemConstants.STATUS_FOUR) && Objects.equals(chargeOrderInfo.getStatus(),
+                        SystemConstants.STATUS_ONE)) {
+                    // 结算中
+                    log.info("结算中 - StartChargeSeq: {}", startChargeSeq);
+                    chargeOrderInfo.setStatus(SystemConstants.STATUS_TWO);
+                    chargeOrderInfoMapper.updateById(chargeOrderInfo);
+                }
             }
 
             // 查询是否已存在该订单