diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/PileApplyMergeChargeHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/PileApplyMergeChargeHandler.java index fd1e56d9c..5fea30281 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/PileApplyMergeChargeHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/PileApplyMergeChargeHandler.java @@ -1,14 +1,17 @@ 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.common.core.domain.ykc.YKCDataProtocol; import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; import com.jsowell.common.util.BytesUtil; +import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.YKCUtils; import com.jsowell.netty.factory.YKCOperateFactory; import com.jsowell.pile.dto.VerifyMergeChargeOrderDTO; import com.jsowell.pile.service.OrderBasicInfoService; +import com.jsowell.pile.service.PileMsgRecordService; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +34,8 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{ @Autowired private OrderBasicInfoService orderBasicInfoService; + @Autowired + private PileMsgRecordService pileMsgRecordService; @Override public void afterPropertiesSet() throws Exception { @@ -38,7 +43,7 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{ } @Override - public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, ChannelHandlerContext channel) { + public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, ChannelHandlerContext channel){ // 获取消息体 byte[] msgBody = ykcDataProtocol.getMsgBody(); @@ -118,34 +123,47 @@ public class PileApplyMergeChargeHandler extends AbstractYkcHandler{ .mergeChargeNumber(mergeChargeNumber) .build(); - Map map = new LinkedHashMap<>(); + Map map = new LinkedHashMap<>(); - String transactionCode = Constants.ILLEGAL_TRANSACTION_CODE; byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识 byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额 + byte[] defeatReasonByteArr = Constants.zeroByteArray; try { map = orderBasicInfoService.verifyMergeChargeOrder(dto); log.info("桩号:{}, 并充订单鉴权成功, 结果map:{}", pileSn, map); } catch (Exception e) { log.error("桩号:{}, 并充订单鉴权失败, ", pileSn, e); } - if (map != null) { - transactionCode = (String) map.get("transactionCode"); - accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(map.get("accountBalance")), 2); + String transactionCode = map.get("transactionCode"); + // 如果交易流水号不等于Constants.ILLEGAL_TRANSACTION_CODE, 表示鉴权通过 + if (!StringUtils.equals(transactionCode, Constants.ILLEGAL_TRANSACTION_CODE)) { 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); return getResult(ykcDataProtocol, msgBodyByteArr); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index 4e90954f3..57005d1bb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -576,7 +576,7 @@ public interface OrderBasicInfoService{ * @param dto * @return */ - Map verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception; + Map verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception; List getOrderBasicInfoByTimeInterval(List stationIds, String startTime, String endTime); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 84c7623b5..762192526 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -53,9 +53,7 @@ import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.util.UserUtils; import com.jsowell.pile.vo.OrderInfoDetailVO; import com.jsowell.pile.vo.SupStationStatsVO; -import com.jsowell.pile.vo.base.MerchantOrderInfoVO; -import com.jsowell.pile.vo.base.OrderAmountDetailVO; -import com.jsowell.pile.vo.base.OrderPeriodAmountVO; +import com.jsowell.pile.vo.base.*; import com.jsowell.pile.vo.base.PileInfoVO; import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO; import com.jsowell.pile.vo.nanrui.JiangSuOrderInfoVO; @@ -5360,12 +5358,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { * @return */ @Override - public Map verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception { - Map map = new LinkedHashMap<>(); + public Map verifyMergeChargeOrder(VerifyMergeChargeOrderDTO dto) throws Exception { + String pileSn = dto.getPileSn(); + String connectorCode = dto.getConnectorCode(); + Map map = new LinkedHashMap<>(); GenerateOrderDTO generateOrderDTO = new GenerateOrderDTO(); - generateOrderDTO.setPileSn(dto.getPileSn()); - generateOrderDTO.setConnectorCode(dto.getConnectorCode()); generateOrderDTO.setMergeChargeNumber(dto.getMergeChargeNumber()); // 判断是否为主枪 @@ -5373,35 +5371,91 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { // 主枪 generateOrderDTO.setMainConnectorCode(dto.getPileConnectorCode()); } + // 查询充电桩信息 + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); + + // 查询是否有权限 + ConfirmStartChargingMemberVO memberWalletVO = null; + // 区分是卡还是vin充电 String startMode = dto.getStartMode(); if (StringUtils.equals(Constants.ZERO_ONE, startMode)) { // 刷卡鉴权 // 根据卡号查询用户信息 String physicsCard = dto.getPhysicsCard(); - PileAuthCard pileAuthCardInfo = pileAuthCardService.selectCardInfoByLogicCard(physicsCard); - if (pileAuthCardInfo == null) { - // 未查到此卡信息 - throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO); - } - generateOrderDTO.setPileAuthCardInfo(pileAuthCardInfo); - generateOrderDTO.setStartMode(StartModeEnum.AUTH_CARD.getValue()); - generateOrderDTO.setMemberId(pileAuthCardInfo.getMemberId()); + memberWalletVO = memberBasicInfoService.queryMemberInfoByCardCode(physicsCard, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + ""); + logger.info("并充生成订单----根据卡号:{},查询会员信息:{}", physicsCard, JSON.toJSONString(memberWalletVO)); }else if (StringUtils.equals(Constants.ZERO_THREE, startMode)) { // vin鉴权 // 根据vin查询绑定用户信息 String vinCode = dto.getVinCode(); - MemberPlateNumberRelation memberInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode); - if (memberInfo == null) { - throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_INFO_IS_NULL); - } - generateOrderDTO.setMemberPlateNumberRelation(memberInfo); - generateOrderDTO.setStartMode(StartModeEnum.VIN_CODE.getValue()); - generateOrderDTO.setMemberId(memberInfo.getMemberId()); + memberWalletVO = memberBasicInfoService.queryByVinCode(vinCode, pileBasicInfo.getMerchantId() + "", pileBasicInfo.getStationId() + ""); + logger.info("并充生成订单----根据vin码:{},查询会员信息:{}", vinCode, JSON.toJSONString(memberWalletVO)); } - // 鉴权通过,生成订单启动充电 - map = generateOrderByCard(generateOrderDTO); + String accountBalance = Constants.ZERO; + // 如果查询后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 resultMap = generateOrderByCardV2(generateOrderDTO); + } catch (Exception e) { + throw new RuntimeException(e); + } + }, executor); return map; }