Explorar o código

feat(charging): 新增充电订单结算及账户余额扣减功能

- 在 AppChargeVO 中新增 chargeOrderId 字段用于标识充电订单 ID
- 在 ChargeOrderInfoService 中新增 orderSettlement 方法处理订单结算后的账户扣款逻辑
- 实现 ChargeOrderInfoServiceImpl 中的 orderSettlement 方法,调用 UserAccountService 更新账户余额并记录日志
- 修改 ChargingReceptionServiceImpl 中对 ChargeOrderInfo 的操作方式,从直接使用 Mapper 改为通过 Service 层操作以支持事务管理
- 注释掉暂未启用的结算回调逻辑
- 更新 UserAccountLog 实体类中的 accountType 描述信息,将“集团账户”更正为“企业”
wzq hai 2 días
pai
achega
bcdcd8f874

+ 1 - 1
src/main/java/com/zsElectric/boot/business/model/entity/UserAccountLog.java

@@ -37,7 +37,7 @@ public class UserAccountLog extends BaseEntity {
      */
     private Long changeId;
     /**
-     * 账户类型(1个人账户,2集团账户
+     * 账户类型(1个人账户,2企业
      */
     private Integer accountType;
     /**

+ 3 - 0
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppChargeVO.java

@@ -15,6 +15,9 @@ public class AppChargeVO implements Serializable {
     @Serial
     private static final long serialVersionUID = 1L;
 
+    @Schema(description = "订单号")
+    private Long chargeOrderId;
+
     @Schema(description = "订单号")
     private String chargeOrderNo;
 }

+ 7 - 0
src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java

@@ -64,4 +64,11 @@ public interface ChargeOrderInfoService extends IService<ChargeOrderInfo> {
     AppChargeVO invokeCharge(AppInvokeChargeForm formData);
 
     AppChargeVO stopCharge(AppStopChargeForm formData);
+
+    /**
+     * 订单结算后的账户余额扣减
+     *
+     * @param chargeOrderId 充电订单ID
+     */
+    void orderSettlement(Long chargeOrderId);
 }

+ 24 - 0
src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java

@@ -9,6 +9,7 @@ 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.applet.AppChargeVO;
 import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
+import com.zsElectric.boot.business.service.UserAccountService;
 import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
 import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
 import com.zsElectric.boot.charging.service.ChargingBusinessService;
@@ -30,6 +31,7 @@ import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
 import com.zsElectric.boot.business.converter.ChargeOrderInfoConverter;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
@@ -62,6 +64,8 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
 
     private final CouponTemplateMapper couponTemplateMapper;
 
+    private final UserAccountService userAccountService;
+
     //充电订单号前缀
     private final String ORDER_NO_PREFIX = "CD";
     //设备流水号前缀
@@ -230,6 +234,7 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
             this.save(chargeOrderInfo);
 
             appInvokeChargeVO.setChargeOrderNo(chargeOrderNo);
+            appInvokeChargeVO.setChargeOrderId(chargeOrderInfo.getId());
             return appInvokeChargeVO;
         } catch (Exception e) {
             throw new BusinessException("启动充电失败,系统错误,请联系客服处理!");
@@ -255,6 +260,7 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
             //保存订单
             this.save(chargeOrderInfo);
 
+            appInvokeChargeVO.setChargeOrderId(chargeOrderInfo.getId());
             appInvokeChargeVO.setChargeOrderNo(chargeOrderInfo.getChargeOrderNo());
             return appInvokeChargeVO;
         } catch (Exception e) {
@@ -262,6 +268,24 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
         }
     }
 
+    @Override
+    public void orderSettlement(Long chargeOrderId) {
+        Long userId = SecurityUtils.getUserId();
+        ChargeOrderInfo chargeOrderInfo = this.getById(chargeOrderId);
+
+        //平台收费总金额
+        BigDecimal totalCharge = chargeOrderInfo.getRealCost();
+
+        //账户变动及日志记录
+        userAccountService.updateAccountBalanceAndLog(
+                userId,
+                totalCharge,
+                SystemConstants.CHANGE_TYPE_REDUCE,
+                "充电扣款",
+                chargeOrderInfo.getId()
+        );
+    }
+
     /**
      * 创建商户订单号
      * 要求 32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一

+ 13 - 9
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java

@@ -10,6 +10,7 @@ import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
 import com.zsElectric.boot.business.model.entity.PolicyFee;
 import com.zsElectric.boot.business.model.entity.UserAccount;
 import com.zsElectric.boot.business.model.entity.UserFirm;
+import com.zsElectric.boot.business.service.ChargeOrderInfoService;
 import com.zsElectric.boot.charging.entity.*;
 import com.zsElectric.boot.charging.mapper.ThirdPartyChargeStatusMapper;
 import com.zsElectric.boot.charging.mapper.ThirdPartyConnectorInfoMapper;
@@ -61,7 +62,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private final ThirdPartyConnectorInfoMapper connectorInfoMapper;
     private final ThirdPartyChargeStatusMapper chargeStatusMapper;
     private final ObjectMapper objectMapper;
-    private final ChargeOrderInfoMapper chargeOrderInfoMapper;
+    private final ChargeOrderInfoService chargeOrderInfoService;
     private final RedissonClient redissonClient;
     private final UserAccountMapper userAccountMapper;
     private final UserFirmMapper userFirmMapper;
@@ -69,6 +70,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private final DictItemMapper dictItemMapper;
     private final ThirdPartyEquipmentInfoMapper thirdPartyEquipmentInfoMapper;
 
+
     /**
      * 熔断检查锁前缀
      */
@@ -93,7 +95,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
             // 启动充电结果业务处理
             String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
             int startChargeSeqStat = jsonNode.get("StartChargeSeqStat").asInt();
-            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoService.getOne(new LambdaQueryWrapper<ChargeOrderInfo>()
                     .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("LIMIT 1"));
             if (startChargeSeqStat == 1) {
                 // 启动中
@@ -103,7 +105,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                 // 充电中
                 log.info("充电中 - StartChargeSeq: {}", startChargeSeq);
                 chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
-                chargeOrderInfoMapper.updateById(chargeOrderInfo);
+                chargeOrderInfoService.updateById(chargeOrderInfo);
             }
             if (startChargeSeqStat == 3) {
                 // 停止中
@@ -135,7 +137,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
             // 停止充电结果业务处理
             String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
             int startChargeSeqStat = jsonNode.get("StartChargeSeqStat").asInt();
-            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoService.getOne(new LambdaQueryWrapper<ChargeOrderInfo>()
                     .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("LIMIT 1"));
 
             if (startChargeSeqStat == 1) {
@@ -155,7 +157,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                 log.info("已结束 - StartChargeSeq: {}", startChargeSeq);
                 //修改订单状态结算中
                 chargeOrderInfo.setStatus(SystemConstants.STATUS_TWO);
-                chargeOrderInfoMapper.updateById(chargeOrderInfo);
+                chargeOrderInfoService.updateById(chargeOrderInfo);
             }
             if (startChargeSeqStat == 5) {
                 // 未知
@@ -172,6 +174,8 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
         return processChargeRequest(requestDTO, jsonNode -> {
             // 充电订单信息业务处理
 
+            //账户余额扣减
+            //chargeOrderInfoService.orderSettlement();
             log.debug("充电订单信息 - StartChargeSeq: {}", getTextValue(jsonNode, "StartChargeSeq"));
         });
     }
@@ -321,7 +325,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
         try {
             String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
             //修改订单状态
-            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoService.getOne(new LambdaQueryWrapper<ChargeOrderInfo>()
                     .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("limit 1"));
             if(ObjUtil.isNotEmpty(chargeOrderInfo)){
                 Integer connectorStatus = getIntValue(jsonNode, "ConnectorStatus");
@@ -329,14 +333,14 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                     // 充电中
                     log.info("充电中 - StartChargeSeq: {}", startChargeSeq);
                     chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
-                    chargeOrderInfoMapper.updateById(chargeOrderInfo);
+                    chargeOrderInfoService.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);
+                    chargeOrderInfoService.updateById(chargeOrderInfo);
                 }
             }
 
@@ -428,7 +432,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
             // 尝试获取锁,最多等待3秒,持有锁最多10秒
             if (lock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.SECONDS)) {
                 try {
-                    ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(
+                    ChargeOrderInfo chargeOrderInfo = chargeOrderInfoService.getOne(
                             Wrappers.<ChargeOrderInfo>lambdaQuery()
                                     .eq(ChargeOrderInfo::getChargeOrderNo, chargeStatus.getStartChargeSeq())
                                     .eq(ChargeOrderInfo::getStatus, 1)