diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ConfirmStartChargingRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ConfirmStartChargingRequestHandler.java index 62fdb2862..14db5d1bf 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ConfirmStartChargingRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ConfirmStartChargingRequestHandler.java @@ -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 confirmStartCharging(ConfirmStartChargingData confirmStartChargingData) { + Map 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 map = orderBasicInfoService.generateOrderByCard(dto); - } + Map 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); - } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberBasicInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberBasicInfoMapper.java index ee7437dc7..dd934da28 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberBasicInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberBasicInfoMapper.java @@ -2,6 +2,7 @@ package com.jsowell.pile.mapper; import com.jsowell.pile.domain.MemberBasicInfo; import com.jsowell.pile.dto.QueryMemberInfoDTO; +import com.jsowell.pile.vo.base.ConfirmStartChargingMemberVO; import com.jsowell.pile.vo.base.MerchantInfoVO; import com.jsowell.pile.vo.uniapp.customer.MemberVO; import com.jsowell.pile.vo.uniapp.customer.MerchantVipVO; @@ -127,4 +128,8 @@ public interface MemberBasicInfoMapper { * @return */ List getMemberInfoByPlateNumber(@Param("plateNumber") String plateNumber); + + ConfirmStartChargingMemberVO queryMemberInfoByCardCode(@Param("cardCode") String cardCode, @Param("merchantId") String merchantId); + + ConfirmStartChargingMemberVO queryMemberInfoByVinCode(@Param("vinCode") String vinCode, @Param("cardCode") String merchantId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java index 222ca2f43..386af72e1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberBasicInfoService.java @@ -5,6 +5,7 @@ import com.jsowell.pile.dto.CreateMerchantVipDTO; import com.jsowell.pile.dto.PlatformTesterDTO; import com.jsowell.pile.dto.QueryMemberInfoDTO; import com.jsowell.pile.dto.UniAppQueryMemberBalanceDTO; +import com.jsowell.pile.vo.base.ConfirmStartChargingMemberVO; import com.jsowell.pile.vo.uniapp.customer.*; import com.jsowell.pile.vo.web.MemberDetailsVO; import com.jsowell.pile.vo.web.PlatformTesterVO; @@ -169,4 +170,8 @@ public interface MemberBasicInfoService { * @return */ MemberDetailsVO queryMemberDetails(UniAppQueryMemberBalanceDTO dto); + + ConfirmStartChargingMemberVO queryMemberInfoByCardCode(String physicsCard, String merchantId, String stationId); + + ConfirmStartChargingMemberVO queryByVinCode(String vinCode, String merchantId, String stationId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java index c83b474d8..768cd5ba5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberBasicInfoServiceImpl.java @@ -15,21 +15,16 @@ import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.SecurityUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; -import com.jsowell.pile.domain.MemberBasicInfo; -import com.jsowell.pile.domain.MemberPlateNumberRelation; -import com.jsowell.pile.domain.MemberWalletInfo; -import com.jsowell.pile.domain.MemberWalletLog; +import com.jsowell.pile.domain.*; import com.jsowell.pile.dto.CreateMerchantVipDTO; import com.jsowell.pile.dto.PlatformTesterDTO; import com.jsowell.pile.dto.QueryMemberInfoDTO; import com.jsowell.pile.dto.UniAppQueryMemberBalanceDTO; -import com.jsowell.pile.mapper.MemberBasicInfoMapper; -import com.jsowell.pile.mapper.MemberPlateNumberRelationMapper; -import com.jsowell.pile.mapper.MemberWalletInfoMapper; -import com.jsowell.pile.mapper.MemberWalletLogMapper; +import com.jsowell.pile.mapper.*; import com.jsowell.pile.service.*; import com.jsowell.pile.util.MerchantUtils; import com.jsowell.pile.util.UserUtils; +import com.jsowell.pile.vo.base.ConfirmStartChargingMemberVO; import com.jsowell.pile.vo.base.MerchantInfoVO; import com.jsowell.pile.vo.uniapp.customer.*; import com.jsowell.pile.vo.web.MemberDetailsVO; @@ -59,8 +54,8 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService { @Autowired private MemberBasicInfoMapper memberBasicInfoMapper; - // @Autowired - // private MemberWalletInfoMapper memberWalletInfoMapper; + @Autowired + private PileStationWhitelistMapper pileStationWhitelistMapper; @Autowired private MemberWalletInfoService memberWalletInfoService; @@ -773,4 +768,44 @@ public class MemberBasicInfoServiceImpl implements MemberBasicInfoService { .build(); } + /** + * 根据卡号查询会员信息 + * @param cardCode + * @param merchantId + * @return + */ + @Override + public ConfirmStartChargingMemberVO queryMemberInfoByCardCode(String cardCode, String merchantId, String stationId) { + ConfirmStartChargingMemberVO memberVO = memberBasicInfoMapper.queryMemberInfoByCardCode(cardCode, merchantId); + if (memberVO == null) { + return null; + } + BigDecimal principalBalance = memberVO.getPrincipalBalance() != null ? memberVO.getPrincipalBalance() : BigDecimal.ZERO; + BigDecimal giftBalance = memberVO.getGiftBalance() != null ? memberVO.getGiftBalance() : BigDecimal.ZERO; + memberVO.setTotalBalance(principalBalance.add(giftBalance)); + // 是否为平台测试员 + memberVO.setPlatformTesterFlag(selectPlatformTesterStatus(memberVO.getMemberId()).getStatus()); + // 查询会员在站点是否是白名单用户 + PileStationWhitelist whitelist = pileStationWhitelistMapper.queryWhitelistByMemberId(stationId, memberVO.getMemberId()); + memberVO.setStationWhiteListFlag(whitelist != null ? Constants.ONE : Constants.ZERO); + return memberVO; + } + + @Override + public ConfirmStartChargingMemberVO queryByVinCode(String vinCode, String merchantId, String stationId) { + ConfirmStartChargingMemberVO memberVO = memberBasicInfoMapper.queryMemberInfoByVinCode(vinCode, merchantId); + if (memberVO == null) { + return null; + } + BigDecimal principalBalance = memberVO.getPrincipalBalance() != null ? memberVO.getPrincipalBalance() : BigDecimal.ZERO; + BigDecimal giftBalance = memberVO.getGiftBalance() != null ? memberVO.getGiftBalance() : BigDecimal.ZERO; + memberVO.setTotalBalance(principalBalance.add(giftBalance)); + // 是否为平台测试员 + memberVO.setPlatformTesterFlag(selectPlatformTesterStatus(memberVO.getMemberId()).getStatus()); + // 查询会员在站点是否是白名单用户 + PileStationWhitelist whitelist = pileStationWhitelistMapper.queryWhitelistByMemberId(stationId, memberVO.getMemberId()); + memberVO.setStationWhiteListFlag(whitelist != null ? Constants.ONE : Constants.ZERO); + return null; + } + } diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberBasicInfoMapper.xml index b7025ae99..8025ec615 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberBasicInfoMapper.xml @@ -302,4 +302,28 @@ AND t1.del_flag = '0' AND t2.STATUS = '1' - \ No newline at end of file + + + + +