update 充电桩主动申请充电逻辑优化

This commit is contained in:
Guoqs
2025-07-05 14:29:59 +08:00
parent b008891f53
commit 6011f27e42
5 changed files with 165 additions and 77 deletions

View File

@@ -3,30 +3,32 @@ package com.jsowell.netty.handler.yunkuaichong;
import com.alibaba.fastjson2.JSON;
import com.google.common.primitives.Bytes;
import com.jsowell.common.constant.Constants;
import com.jsowell.pile.dto.ConfirmStartChargingData;
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
import com.jsowell.common.enums.ykc.CardStatusEnum;
import com.jsowell.common.enums.ykc.OrderPayModeEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.enums.ykc.StartModeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.BytesUtil;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.YKCUtils;
import com.jsowell.common.util.id.IdUtils;
import com.jsowell.netty.factory.YKCOperateFactory;
import com.jsowell.pile.domain.MemberPlateNumberRelation;
import com.jsowell.pile.domain.PileAuthCard;
import com.jsowell.pile.domain.PileBasicInfo;
import com.jsowell.pile.dto.ConfirmStartChargingData;
import com.jsowell.pile.dto.GenerateOrderDTO;
import com.jsowell.pile.service.MemberPlateNumberRelationService;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileAuthCardService;
import com.jsowell.pile.service.PileMsgRecordService;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.base.ConfirmStartChargingMemberVO;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
@@ -53,6 +55,12 @@ public class ConfirmStartChargingRequestHandler extends AbstractYkcHandler {
@Autowired
private PileMsgRecordService pileMsgRecordService;
@Autowired
private PileBasicInfoService pileBasicInfoService;
@Autowired
private MemberBasicInfoService memberBasicInfoService;
@Override
public void afterPropertiesSet() throws Exception {
YKCOperateFactory.register(type, this);
@@ -122,11 +130,13 @@ public class ConfirmStartChargingRequestHandler extends AbstractYkcHandler {
.vinCode(vinCode)
.build();
// 启动充电
this.confirmStartCharging(confirmStartChargingData);
byte[] defeatReasonByteArr = Constants.zeroByteArray;
/**
* 刷卡启动充电
*/
String logicCard = "";
byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识
byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额
String transactionCode = "";
@@ -195,10 +205,6 @@ public class ConfirmStartChargingRequestHandler extends AbstractYkcHandler {
accountBalanceByteArr = BytesUtil.checkLengthAndBehindAppendZero(accountBalanceByteArr, 8);
authenticationFlagByteArr = Constants.zeroByteArray;
}
// if (!StringUtils.equals("1", plateInfo.getVinStatus())) {
// // 1- 正常使用
// throw new BusinessException("", vinCode + "vin状态不正确");
// }
// vin码生成订单 vin启动充电
GenerateOrderDTO dto = new GenerateOrderDTO();
dto.setMemberPlateNumberRelation(plateInfo);
@@ -268,71 +274,84 @@ public class ConfirmStartChargingRequestHandler extends AbstractYkcHandler {
}
/**
* 充电桩主动申请充电 逻辑
* 充电桩主动申请充电逻辑
* @param confirmStartChargingData
* @return
*/
private byte[] confirmStartCharging(ConfirmStartChargingData confirmStartChargingData) {
String startMode = confirmStartChargingData.getStartMode();
private Map<String, String> confirmStartCharging(ConfirmStartChargingData confirmStartChargingData) {
Map<String, String> resultMap = new HashMap<>();
String pileSn = confirmStartChargingData.getPileSn();
String connectorCode = confirmStartChargingData.getConnectorCode();
GenerateOrderDTO dto = null;
// 查询充电桩信息
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn);
// 查询是否有权限
ConfirmStartChargingMemberVO memberWalletVO = null;
String startMode = confirmStartChargingData.getStartMode();
if (StringUtils.equals("01", startMode)) {
String physicsCard = confirmStartChargingData.getPhysicsCard();
memberWalletVO = memberBasicInfoService.queryMemberInfoByCardCode(physicsCard, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + "");
} else if (StringUtils.equals("03", startMode)) {
String vinCode = confirmStartChargingData.getVinCode();
memberWalletVO = memberBasicInfoService.queryByVinCode(vinCode, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + "");
}
String accountBalance = Constants.ZERO;
// 如果查询后memberWalletVO为null, 则标示无权限
if (memberWalletVO == null) {
resultMap.put("transactionCode", Constants.ILLEGAL_TRANSACTION_CODE);
resultMap.put("accountBalance", accountBalance);
resultMap.put("defeatReasonCode", "01");
return resultMap;
}
// 如果总余额小于0, 则标示余额不足
if (memberWalletVO.getTotalBalance().compareTo(BigDecimal.ZERO) < 0) {
resultMap.put("transactionCode", Constants.ILLEGAL_TRANSACTION_CODE);
resultMap.put("accountBalance", accountBalance);
resultMap.put("defeatReasonCode", "03");
return resultMap;
}
// 生成交易流水号, 传递给订单使用
String transactionCode = IdUtils.generateTransactionCode(pileSn, connectorCode);
resultMap.put("transactionCode", transactionCode);
String payMode;
if (StringUtils.equals(Constants.ONE, memberWalletVO.getPlatformTesterFlag())
|| StringUtils.equals(Constants.ONE, memberWalletVO.getStationWhiteListFlag())) {
// 如果是平台测试员或者是站点白名单
resultMap.put("transactionCode", Constants.ILLEGAL_TRANSACTION_CODE);
accountBalance = Constants.WHITELIST_DEFAULT_AMOUNT.toString();
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
} else {
BigDecimal totalBalance = memberWalletVO.getTotalBalance();
accountBalance = totalBalance.toString();
if (totalBalance.compareTo(Constants.BALANCE_PAY_MAX_AMOUNT_NEW) > 0) {
accountBalance = Constants.BALANCE_PAY_MAX_AMOUNT_NEW.toString();
}
payMode = OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue();
}
// 异步创建订单
GenerateOrderDTO dto = new GenerateOrderDTO();
dto.setPileSn(pileSn);
dto.setConnectorCode(connectorCode);
dto.setTransactionCode(transactionCode);
dto.setChargeAmount(new BigDecimal(accountBalance));
dto.setPayMode(payMode);
dto.setStartMode(StringUtils.equals("01", startMode) ? "2" : "5");
dto.setMemberId(memberWalletVO.getMemberId());
try {
if (StringUtils.equals("01", startMode)) {
String physicsCard = confirmStartChargingData.getPhysicsCard();
// 查询卡信息 根据传过来的物理卡号查询数据库中此卡信息
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectCardInfoByLogicCard(physicsCard);
if (pileAuthCardInfo == null) {
// 未查到此卡信息
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
}
if (StringUtils.isBlank(pileAuthCardInfo.getMemberId())) {
// 卡未绑定用户
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_NOT_BIND_USER);
}
// 判断卡状态
if (!StringUtils.equals(CardStatusEnum.NORMAL.getCode(), pileAuthCardInfo.getStatus())) {
log.info("卡号:{}, 状态:{}, 非正常使用状态", physicsCard, CardStatusEnum.getCardStatus(pileAuthCardInfo.getStatus()));
return null;
}
dto = new GenerateOrderDTO();
dto.setPileAuthCardInfo(pileAuthCardInfo);
dto.setPileSn(pileSn);
dto.setConnectorCode(connectorCode);
dto.setStartMode(StartModeEnum.AUTH_CARD.getValue());
dto.setMemberId(pileAuthCardInfo.getMemberId());
} else if (StringUtils.equals("03", startMode)) {
String vinCode = confirmStartChargingData.getVinCode();
// 通过vin码查询数据库绑定用户信息
MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode);
if (plateInfo == null) {
throw new BusinessException("", vinCode + "未查到绑定用户信息");
}
dto = new GenerateOrderDTO();
dto.setMemberPlateNumberRelation(plateInfo);
dto.setPileSn(pileSn);
dto.setConnectorCode(connectorCode);
dto.setStartMode(StartModeEnum.VIN_CODE.getValue());
dto.setMemberId(plateInfo.getMemberId());
}
if (dto != null) {
// Map<String, Object> map = orderBasicInfoService.generateOrderByCard(dto);
}
Map<String, Object> map = orderBasicInfoService.generateOrderByCard(dto);
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
return resultMap;
}
public static void main(String[] args) {
String msg = "01";
System.out.println(StringUtils.length(msg));
byte[] bytes = BytesUtil.str2Bcd(msg);
byte[] a = new byte[]{0x01};
String s = Arrays.toString(bytes);
}
}