mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-07-05 22:47:59 +08:00
update 0xA1双枪并充逻辑
This commit is contained in:
@@ -1,14 +1,17 @@
|
|||||||
package com.jsowell.netty.handler.yunkuaichong;
|
package com.jsowell.netty.handler.yunkuaichong;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.google.common.primitives.Bytes;
|
import com.google.common.primitives.Bytes;
|
||||||
import com.jsowell.common.constant.Constants;
|
import com.jsowell.common.constant.Constants;
|
||||||
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
|
import com.jsowell.common.core.domain.ykc.YKCDataProtocol;
|
||||||
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
|
import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode;
|
||||||
import com.jsowell.common.util.BytesUtil;
|
import com.jsowell.common.util.BytesUtil;
|
||||||
|
import com.jsowell.common.util.StringUtils;
|
||||||
import com.jsowell.common.util.YKCUtils;
|
import com.jsowell.common.util.YKCUtils;
|
||||||
import com.jsowell.netty.factory.YKCOperateFactory;
|
import com.jsowell.netty.factory.YKCOperateFactory;
|
||||||
import com.jsowell.pile.dto.VerifyMergeChargeOrderDTO;
|
import com.jsowell.pile.dto.VerifyMergeChargeOrderDTO;
|
||||||
import com.jsowell.pile.service.OrderBasicInfoService;
|
import com.jsowell.pile.service.OrderBasicInfoService;
|
||||||
|
import com.jsowell.pile.service.PileMsgRecordService;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -31,6 +34,8 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrderBasicInfoService orderBasicInfoService;
|
private OrderBasicInfoService orderBasicInfoService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PileMsgRecordService pileMsgRecordService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
@@ -38,7 +43,7 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, ChannelHandlerContext channel) {
|
public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, ChannelHandlerContext channel){
|
||||||
|
|
||||||
// 获取消息体
|
// 获取消息体
|
||||||
byte[] msgBody = ykcDataProtocol.getMsgBody();
|
byte[] msgBody = ykcDataProtocol.getMsgBody();
|
||||||
@@ -118,34 +123,47 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{
|
|||||||
.mergeChargeNumber(mergeChargeNumber)
|
.mergeChargeNumber(mergeChargeNumber)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Map<String, Object> map = new LinkedHashMap<>();
|
Map<String, String> map = new LinkedHashMap<>();
|
||||||
|
|
||||||
String transactionCode = Constants.ILLEGAL_TRANSACTION_CODE;
|
|
||||||
byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识
|
byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识
|
||||||
byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额
|
byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额
|
||||||
|
byte[] defeatReasonByteArr = Constants.zeroByteArray;
|
||||||
try {
|
try {
|
||||||
map = orderBasicInfoService.verifyMergeChargeOrder(dto);
|
map = orderBasicInfoService.verifyMergeChargeOrder(dto);
|
||||||
log.info("桩号:{}, 并充订单鉴权成功, 结果map:{}", pileSn, map);
|
log.info("桩号:{}, 并充订单鉴权成功, 结果map:{}", pileSn, map);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("桩号:{}, 并充订单鉴权失败, ", pileSn, e);
|
log.error("桩号:{}, 并充订单鉴权失败, ", pileSn, e);
|
||||||
}
|
}
|
||||||
if (map != null) {
|
String transactionCode = map.get("transactionCode");
|
||||||
transactionCode = (String) map.get("transactionCode");
|
// 如果交易流水号不等于Constants.ILLEGAL_TRANSACTION_CODE, 表示鉴权通过
|
||||||
accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(map.get("accountBalance")), 2);
|
if (!StringUtils.equals(transactionCode, Constants.ILLEGAL_TRANSACTION_CODE)) {
|
||||||
authenticationFlagByteArr = Constants.oneByteArray;
|
authenticationFlagByteArr = Constants.oneByteArray;
|
||||||
|
} else {
|
||||||
|
// 鉴权失败
|
||||||
|
authenticationFlagByteArr = Constants.zeroByteArray;
|
||||||
}
|
}
|
||||||
|
accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(map.get("accountBalance")), 2);
|
||||||
|
|
||||||
|
|
||||||
// 应答
|
// 应答
|
||||||
// 交易流水号
|
// 交易流水号
|
||||||
|
byte[] serialNumByteArr = BytesUtil.str2Bcd(transactionCode);
|
||||||
// 桩编号
|
// 桩编号
|
||||||
// 枪号
|
// 枪号
|
||||||
// 逻辑卡号
|
// 逻辑卡号
|
||||||
// 账户余额
|
// 账户余额
|
||||||
// 鉴权成功标志
|
// 鉴权成功标志
|
||||||
// 失败原因
|
// 失败原因
|
||||||
|
if (map.get("defeatReasonCode") != null) {
|
||||||
|
defeatReasonByteArr = BytesUtil.str2Bcd(map.get("defeatReasonCode"));
|
||||||
|
}
|
||||||
// 并充序号
|
// 并充序号
|
||||||
byte[] defeatReasonByteArr = Constants.zeroByteArray; // 失败原因
|
// 保存报文
|
||||||
byte[] msgBodyByteArr = Bytes.concat(BytesUtil.str2Bcd(transactionCode), pileSnByteArr, connectorNumByteArr, cardNumByteArr,
|
String jsonMsg = JSON.toJSONString(dto);
|
||||||
|
pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString());
|
||||||
|
|
||||||
|
|
||||||
|
byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr,
|
||||||
accountBalanceByteArr, authenticationFlagByteArr, defeatReasonByteArr, mergeChargeNumberByteArr);
|
accountBalanceByteArr, authenticationFlagByteArr, defeatReasonByteArr, mergeChargeNumberByteArr);
|
||||||
|
|
||||||
return getResult(ykcDataProtocol, msgBodyByteArr);
|
return getResult(ykcDataProtocol, msgBodyByteArr);
|
||||||
|
|||||||
@@ -576,7 +576,7 @@ public interface OrderBasicInfoService{
|
|||||||
* @param dto
|
* @param dto
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Map<String, Object> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception;
|
Map<String, String> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception;
|
||||||
|
|
||||||
List<OrderBasicInfo> getOrderBasicInfoByTimeInterval(List<String> stationIds, String startTime, String endTime);
|
List<OrderBasicInfo> getOrderBasicInfoByTimeInterval(List<String> stationIds, String startTime, String endTime);
|
||||||
|
|
||||||
|
|||||||
@@ -53,9 +53,7 @@ import com.jsowell.pile.transaction.service.TransactionService;
|
|||||||
import com.jsowell.pile.util.UserUtils;
|
import com.jsowell.pile.util.UserUtils;
|
||||||
import com.jsowell.pile.vo.OrderInfoDetailVO;
|
import com.jsowell.pile.vo.OrderInfoDetailVO;
|
||||||
import com.jsowell.pile.vo.SupStationStatsVO;
|
import com.jsowell.pile.vo.SupStationStatsVO;
|
||||||
import com.jsowell.pile.vo.base.MerchantOrderInfoVO;
|
import com.jsowell.pile.vo.base.*;
|
||||||
import com.jsowell.pile.vo.base.OrderAmountDetailVO;
|
|
||||||
import com.jsowell.pile.vo.base.OrderPeriodAmountVO;
|
|
||||||
import com.jsowell.pile.vo.base.PileInfoVO;
|
import com.jsowell.pile.vo.base.PileInfoVO;
|
||||||
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
|
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
|
||||||
import com.jsowell.pile.vo.nanrui.JiangSuOrderInfoVO;
|
import com.jsowell.pile.vo.nanrui.JiangSuOrderInfoVO;
|
||||||
@@ -5360,12 +5358,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception {
|
public Map<String, String> verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception {
|
||||||
Map<String, Object> map = new LinkedHashMap<>();
|
String pileSn = dto.getPileSn();
|
||||||
|
String connectorCode = dto.getConnectorCode();
|
||||||
|
Map<String, String> map = new LinkedHashMap<>();
|
||||||
|
|
||||||
GenerateOrderDTO generateOrderDTO = new GenerateOrderDTO();
|
GenerateOrderDTO generateOrderDTO = new GenerateOrderDTO();
|
||||||
generateOrderDTO.setPileSn(dto.getPileSn());
|
|
||||||
generateOrderDTO.setConnectorCode(dto.getConnectorCode());
|
|
||||||
generateOrderDTO.setMergeChargeNumber(dto.getMergeChargeNumber());
|
generateOrderDTO.setMergeChargeNumber(dto.getMergeChargeNumber());
|
||||||
|
|
||||||
// 判断是否为主枪
|
// 判断是否为主枪
|
||||||
@@ -5373,35 +5371,91 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
// 主枪
|
// 主枪
|
||||||
generateOrderDTO.setMainConnectorCode(dto.getPileConnectorCode());
|
generateOrderDTO.setMainConnectorCode(dto.getPileConnectorCode());
|
||||||
}
|
}
|
||||||
|
// 查询充电桩信息
|
||||||
|
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn);
|
||||||
|
|
||||||
|
// 查询是否有权限
|
||||||
|
ConfirmStartChargingMemberVO memberWalletVO = null;
|
||||||
|
|
||||||
// 区分是卡还是vin充电
|
// 区分是卡还是vin充电
|
||||||
String startMode = dto.getStartMode();
|
String startMode = dto.getStartMode();
|
||||||
if (StringUtils.equals(Constants.ZERO_ONE, startMode)) {
|
if (StringUtils.equals(Constants.ZERO_ONE, startMode)) {
|
||||||
// 刷卡鉴权
|
// 刷卡鉴权
|
||||||
// 根据卡号查询用户信息
|
// 根据卡号查询用户信息
|
||||||
String physicsCard = dto.getPhysicsCard();
|
String physicsCard = dto.getPhysicsCard();
|
||||||
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectCardInfoByLogicCard(physicsCard);
|
memberWalletVO = memberBasicInfoService.queryMemberInfoByCardCode(physicsCard, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + "");
|
||||||
if (pileAuthCardInfo == null) {
|
logger.info("并充生成订单----根据卡号:{},查询会员信息:{}", physicsCard, JSON.toJSONString(memberWalletVO));
|
||||||
// 未查到此卡信息
|
|
||||||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
|
|
||||||
}
|
|
||||||
generateOrderDTO.setPileAuthCardInfo(pileAuthCardInfo);
|
|
||||||
generateOrderDTO.setStartMode(StartModeEnum.AUTH_CARD.getValue());
|
|
||||||
generateOrderDTO.setMemberId(pileAuthCardInfo.getMemberId());
|
|
||||||
}else if (StringUtils.equals(Constants.ZERO_THREE, startMode)) {
|
}else if (StringUtils.equals(Constants.ZERO_THREE, startMode)) {
|
||||||
// vin鉴权
|
// vin鉴权
|
||||||
// 根据vin查询绑定用户信息
|
// 根据vin查询绑定用户信息
|
||||||
String vinCode = dto.getVinCode();
|
String vinCode = dto.getVinCode();
|
||||||
MemberPlateNumberRelation memberInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode);
|
memberWalletVO = memberBasicInfoService.queryByVinCode(vinCode, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + "");
|
||||||
if (memberInfo == null) {
|
logger.info("并充生成订单----根据vin码:{},查询会员信息:{}", vinCode, JSON.toJSONString(memberWalletVO));
|
||||||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_INFO_IS_NULL);
|
|
||||||
}
|
|
||||||
generateOrderDTO.setMemberPlateNumberRelation(memberInfo);
|
|
||||||
generateOrderDTO.setStartMode(StartModeEnum.VIN_CODE.getValue());
|
|
||||||
generateOrderDTO.setMemberId(memberInfo.getMemberId());
|
|
||||||
}
|
}
|
||||||
// 鉴权通过,生成订单启动充电
|
String accountBalance = Constants.ZERO;
|
||||||
map = generateOrderByCard(generateOrderDTO);
|
|
||||||
|
|
||||||
|
// 如果查询后memberWalletVO为null, 则标示无权限
|
||||||
|
if (memberWalletVO == null) {
|
||||||
|
map.put("transactionCode", Constants.ILLEGAL_TRANSACTION_CODE);
|
||||||
|
map.put("accountBalance", accountBalance);
|
||||||
|
map.put("defeatReasonCode", "01");
|
||||||
|
logger.info("并充生成订单----无此会员权限");
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果总余额小于0, 则标示余额不足
|
||||||
|
if (memberWalletVO.getTotalBalance().compareTo(BigDecimal.ZERO) < 0) {
|
||||||
|
map.put("transactionCode", Constants.ILLEGAL_TRANSACTION_CODE);
|
||||||
|
map.put("accountBalance", accountBalance);
|
||||||
|
map.put("defeatReasonCode", "03");
|
||||||
|
logger.info("并充生成订单----余额不足");
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
鉴权通过, 生成订单并支付
|
||||||
|
*/
|
||||||
|
String payMode;
|
||||||
|
if (StringUtils.equals(Constants.ONE, memberWalletVO.getPlatformTesterFlag())
|
||||||
|
|| StringUtils.equals(Constants.ONE, memberWalletVO.getStationWhiteListFlag())) {
|
||||||
|
// 如果是平台测试员或者是站点白名单
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
// 生成交易流水号, 传递给订单使用
|
||||||
|
String transactionCode = IdUtils.generateTransactionCode(pileSn, connectorCode);
|
||||||
|
map.put("transactionCode", transactionCode);
|
||||||
|
map.put("accountBalance", accountBalance);
|
||||||
|
|
||||||
|
// 异步创建订单
|
||||||
|
// GenerateOrderDTO dto = new GenerateOrderDTO();
|
||||||
|
generateOrderDTO.setPileSn(pileSn);
|
||||||
|
if (StringUtils.isNotBlank(memberWalletVO.getPlateNumber())) {
|
||||||
|
generateOrderDTO.setPlateNumber(memberWalletVO.getPlateNumber());
|
||||||
|
}
|
||||||
|
generateOrderDTO.setOrderType(OrderTypeEnum.MERGE_CHARGE_ORDER.getValue()); // 并充订单标识
|
||||||
|
generateOrderDTO.setConnectorCode(connectorCode);
|
||||||
|
generateOrderDTO.setTransactionCode(transactionCode);
|
||||||
|
generateOrderDTO.setChargeAmount(new BigDecimal(accountBalance));
|
||||||
|
generateOrderDTO.setPayMode(payMode);
|
||||||
|
generateOrderDTO.setStartMode(StringUtils.equals("01", startMode) ? "2" : "5");
|
||||||
|
generateOrderDTO.setMemberId(memberWalletVO.getMemberId());
|
||||||
|
generateOrderDTO.setMerchantId(pileBasicInfo.getMerchantId() + "");
|
||||||
|
|
||||||
|
CompletableFuture.runAsync(() -> {
|
||||||
|
try {
|
||||||
|
Map<String, Object> resultMap = generateOrderByCardV2(generateOrderDTO);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}, executor);
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user