diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/MemberController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/MemberController.java index faa07173b..a846ce203 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/MemberController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/MemberController.java @@ -299,4 +299,31 @@ public class MemberController extends BaseController { logger.info("用户解绑车牌号 result:{}", response); return response; } + + + /** + * 用户绑定鉴权卡接口 + * http://localhost:8080/uniapp/member/memberBindingCard + * @param dto + * @return + */ + @PostMapping("/memberBindingCard") + public RestApiResponse memberBindingCard(HttpServletRequest request, @RequestBody BindingCardDTO dto){ + logger.info("用户绑定鉴权卡 param:{}", JSONObject.toJSONString(dto)); + RestApiResponse response = null; + try { + String memberId = getMemberIdByAuthorization(request); + dto.setMemberId(memberId); + int i = memberService.memberBindCard(dto); + response = new RestApiResponse<>(i); + } catch (BusinessException e){ + logger.error("用户绑定鉴权卡 error", e); + response = new RestApiResponse<>(e.getCode(), e.getMessage()); + } catch (Exception e) { + logger.error("用户绑定鉴权卡 error", e); + response = new RestApiResponse<>(e); + } + logger.info("用户绑定鉴权卡 result:{}", response); + return response; + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index dcbeab866..74ee89ef1 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -15,9 +15,11 @@ 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.PileAuthCard; import com.jsowell.pile.dto.*; import com.jsowell.pile.service.IMemberBasicInfoService; import com.jsowell.pile.service.IMemberPlateNumberRelationService; +import com.jsowell.pile.service.IPileAuthCardService; import com.jsowell.pile.service.IPileMerchantInfoService; import com.jsowell.pile.transaction.dto.MemberTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; @@ -55,6 +57,9 @@ public class MemberService { @Autowired private IMemberPlateNumberRelationService memberPlateNumberRelationService; + @Autowired + private IPileAuthCardService pileAuthCardService; + /** * 校验短信验证码 * @param dto @@ -259,4 +264,35 @@ public class MemberService { relation.setPhoneNumber(dto.getPhoneNumber()); memberPlateNumberRelationService.insertMemberPlateNumberRelation(relation); } + + /** + * 用户绑定鉴权卡 + * @param dto + */ + public int memberBindCard(BindingCardDTO dto){ + // 校验短信验证码 + MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder() + .mobileNumber(dto.getPhoneNumber()) + .verificationCode(dto.getVerificationCode()) + .build(); + // checkVerificationCode(registerAndLoginDTO); + // 判断当前鉴权卡是否被绑定过 + PileAuthCard authCard = PileAuthCard.builder() + .physicsCard(dto.getPhysicsCard()) + .build(); + PileAuthCard pileAuthCardInfo = pileAuthCardService.selectPileAuthCardInfo(authCard); + if (pileAuthCardInfo == null){ + // 为空说明没查到此卡信息 + throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO); + } + if (StringUtils.isNotBlank(pileAuthCardInfo.getMemberId())) { + // memberId 不为空,说明此卡已被绑定 + throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_BEEN_BINDING); + } + authCard.setMemberId(dto.getMemberId()); + authCard.setStatus("1"); // 1-正常使用 + authCard.setCreateBy(dto.getMemberId()); + authCard.setId(pileAuthCardInfo.getId()); + return pileAuthCardService.updatePileAuthCard(authCard); + } } diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java index 5401d694d..47ae14515 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java @@ -123,6 +123,12 @@ public enum ReturnCodeEnum { CODE_SECRET_KEY_ERROR("00400013", "填写的桩密钥有误,请检查!"), CODE_THIS_PILE_NOT_PERSONAL_PILE("00400014", "此桩不是个人桩!"), + + CODE_THIS_CARD_HAS_NO_INFO("00600001", "未查到此卡信息!"), + + CODE_THIS_CARD_NOT_BIND_USER("00600002", "此卡未绑定用户!"), + + CODE_THIS_CARD_HAS_BEEN_BINDING("00600003", "此卡已被绑定!"), ; private String value; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/ConfirmStartChargingRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/ConfirmStartChargingRequestHandler.java index c10fa0e0d..194734d14 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/ConfirmStartChargingRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/ConfirmStartChargingRequestHandler.java @@ -5,11 +5,19 @@ 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.enums.ykc.ReturnCodeEnum; +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.PileAuthCard; +import com.jsowell.pile.service.IMemberBasicInfoService; +import com.jsowell.pile.service.IMemberWalletInfoService; +import com.jsowell.pile.service.IPileAuthCardService; import com.jsowell.pile.service.impl.MemberBasicInfoServiceImpl; +import com.jsowell.pile.service.impl.PileAuthCardServiceImpl; import com.jsowell.pile.vo.uniapp.MemberVO; import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; @@ -33,6 +41,9 @@ public class ConfirmStartChargingRequestHandler extends AbstractHandler{ @Autowired private MemberBasicInfoServiceImpl memberBasicInfoService; + @Autowired + private IPileAuthCardService pileAuthCardService; + @Override public void afterPropertiesSet() throws Exception { YKCOperateFactory.register(type, this); @@ -45,13 +56,11 @@ public class ConfirmStartChargingRequestHandler extends AbstractHandler{ byte[] msgBody = ykcDataProtocol.getMsgBody(); int startIndex = 0; - int length = 16; + int length = 7; // 桩编码 - startIndex += length; - length = 7; byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); - String pileSn = BytesUtil.bcd2Str(pileSnByteArr); + String pileSn = BytesUtil.binary(pileSnByteArr, 16); // 保存时间 saveLastTime(pileSn); @@ -59,26 +68,28 @@ public class ConfirmStartChargingRequestHandler extends AbstractHandler{ // 枪号 startIndex += length; length = 1; - byte[] pileConnectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); - String connectorCode = BytesUtil.bcd2Str(pileConnectorNumByteArr); + byte[] connectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String connectorCode = BytesUtil.bcd2Str(connectorNumByteArr); // 启动方式 // 0x01 表示通过刷卡启动充电 // 0x02 表求通过帐号启动充电 (暂不支持) // 0x03 表示vin码启动充电 startIndex += length; - length = 1; byte[] startModeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String startMode = BytesUtil.bcd2Str(startModeByteArr); // 是否需要密码 0x00 不需要 0x01 需要 startIndex += length; byte[] needPasswordFlagByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String needPasswordFlag = BytesUtil.bcd2Str(needPasswordFlagByteArr); // 物理卡号 不足 8 位补 0 startIndex += length; length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); - String physicsCardNum = BytesUtil.bcd2Str(cardNumByteArr); + String physicsCard = BytesUtil.binary(cardNumByteArr, 16); + log.info("物理卡号:{}", physicsCard); // 输入密码 对用户输入的密码进行16 位MD5 加密,采用小写上传 startIndex += length; @@ -90,24 +101,59 @@ public class ConfirmStartChargingRequestHandler extends AbstractHandler{ length = 17; byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String logicCard = ""; + byte[] authenticationFlagByteArr = Constants.zeroByteArray; + byte[] accountBalanceByteArr = Constants.zeroByteArray; + try { + if (StringUtils.equals("01", startMode)) { + // 刷卡启动充电 + // 根据传过来的物理卡号查询数据库中此卡信息 + PileAuthCard pileAuthCard = PileAuthCard.builder() + .logicCard(physicsCard) + .build(); + PileAuthCard pileAuthCardInfo = pileAuthCardService.selectPileAuthCardInfo(pileAuthCard); + 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); + } + // 卡状态 + String cardStatus = pileAuthCardInfo.getStatus(); + // 逻辑卡号 + logicCard = pileAuthCardInfo.getLogicCard(); + // 通过memberId获取账户余额 + MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(pileAuthCardInfo.getMemberId()); + BigDecimal principalBalance = memberVO.getPrincipalBalance(); // 本金金额 + double accountBalance = principalBalance.add(memberVO.getGiftBalance()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(accountBalance), 2); + // 鉴权成功标识 0x00 失败 0x01 成功 + authenticationFlagByteArr = Constants.oneByteArray; + } + } catch (BusinessException e){ + log.error("刷卡启动充电鉴权 error:{}, {}", e.getCode(), e.getMessage()); + }catch (Exception e){ + log.error("刷卡启动充电鉴权 error", e); + } // 应答 // 交易流水号 - String serialNum = IdUtils.generateTransactionCode(pileSn, connectorCode); - byte[] serialNumByteArr = BytesUtil.str2Bcd(serialNum); + String transactionCode = IdUtils.generateTransactionCode(pileSn, connectorCode); + byte[] serialNumByteArr = BytesUtil.str2Bcd(transactionCode); // 逻辑卡号 - String logicCardNum = "00000000"; - byte[] logicCardNumByteArr = BytesUtil.str2Bcd(logicCardNum); // [0, 0, 0, 0] + // String logicCardNum = "00000000"; // 账户余额 保留两位小数 - MemberVO memberVO = memberBasicInfoService.selectInfoByPhysicsCard(physicsCardNum); - BigDecimal principalBalance = memberVO.getPrincipalBalance(); // 本金金额 - double accountBalance = principalBalance.add(memberVO.getGiftBalance()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - byte[] accountBalanceByteArr = BytesUtil.str2Bcd(String.valueOf(accountBalance)); + // MemberVO memberVO = memberBasicInfoService.selectInfoByPhysicsCard(physicsCard); + // BigDecimal principalBalance = memberVO.getPrincipalBalance(); // 本金金额 + // double accountBalance = principalBalance.add(memberVO.getGiftBalance()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + // byte[] accountBalanceByteArr = BytesUtil.str2Bcd(String.valueOf(accountBalance)); // 鉴权成功标识 0x00 失败 0x01 成功 - byte[] authenticationFlagByteArr= Constants.oneByteArray; + // byte[] authenticationFlagByteArr = Constants.oneByteArray; /** * 失败原因 @@ -126,7 +172,7 @@ public class ConfirmStartChargingRequestHandler extends AbstractHandler{ byte[] defeatReasonByteArr = Constants.zeroByteArray; // 拼装消息体 - byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, logicCardNumByteArr, accountBalanceByteArr, + byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr, accountBalanceByteArr, authenticationFlagByteArr, defeatReasonByteArr); return getResult(ykcDataProtocol, msgBodyByteArr); diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/TransactionRecordsRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/TransactionRecordsRequestHandler.java index 9b1688907..baff20e3c 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/TransactionRecordsRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/TransactionRecordsRequestHandler.java @@ -436,7 +436,7 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); byte[] logicCardNum = BytesUtil.checkLengthAndBehindAppendZero(cardNumByteArr, 16); - String logicCard = BytesUtil.binary(logicCardNum, 10); + String logicCard = BytesUtil.binary(logicCardNum, 16); log.info("[===交易记录===]交易流水号:{}, 桩编号:{}, 枪号:{}, 开始时间:{}, 结束时间:{}, 尖单价:{}, 尖电量:{}, 计损尖电量:{}, 尖金额:{}, " + "峰单价:{}, 峰电量:{}, 计损峰电量:{}, 峰金额:{}, 平单价:{}, 平电量:{}, 计损平电量:{}, 平金额:{}, " + diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileAuthCard.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileAuthCard.java index 80d708be4..46caea7c5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileAuthCard.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileAuthCard.java @@ -38,6 +38,12 @@ public class PileAuthCard { @Excel(name = "物理卡号") private String physicsCard; + /** + * 卡状态 + */ + @Excel(name = "卡状态") + private String status; + /** * 所属用户的会员id */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCardDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCardDTO.java new file mode 100644 index 000000000..572fe0944 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCardDTO.java @@ -0,0 +1,34 @@ +package com.jsowell.pile.dto; + +import lombok.Data; + +/** + * 用户绑定卡DTO + * + * @author JS-ZZA + * @date 2023/3/17 15:16 + */ +@Data +public class BindingCardDTO { + private String memberId; + + /** + * 逻辑卡号 + */ + private String logicCard; + + /** + * 物理卡号 + */ + private String physicsCard; + + /** + * 电话号码 + */ + private String phoneNumber; + + /** + * 验证码 + */ + private String verificationCode; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileAuthCardMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileAuthCardMapper.java index 5c0ca9c22..7a276d102 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileAuthCardMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileAuthCardMapper.java @@ -21,6 +21,13 @@ public interface PileAuthCardMapper { */ public PileAuthCard selectPileAuthCardById(Long id); + /** + * 查询充电站鉴权卡信息 + * @param pileAuthCard + * @return + */ + PileAuthCard selectPileAuthCardInfo (PileAuthCard pileAuthCard); + /** * 查询充电站鉴权卡列表 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileAuthCardService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileAuthCardService.java index 61542a040..badce923b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileAuthCardService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileAuthCardService.java @@ -19,6 +19,13 @@ public interface IPileAuthCardService { */ public PileAuthCard selectPileAuthCardById(Long id); + /** + * 查询充电站鉴权卡信息 + * @param pileAuthCard + * @return + */ + PileAuthCard selectPileAuthCardInfo(PileAuthCard pileAuthCard); + /** * 查询充电站鉴权卡列表 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileAuthCardServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileAuthCardServiceImpl.java index 7c8ecbe79..4dd845ce9 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileAuthCardServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileAuthCardServiceImpl.java @@ -31,6 +31,16 @@ public class PileAuthCardServiceImpl implements IPileAuthCardService { return pileAuthCardMapper.selectPileAuthCardById(id); } + /** + * 查询充电站鉴权卡信息 + * @param pileAuthCard + * @return + */ + @Override + public PileAuthCard selectPileAuthCardInfo(PileAuthCard pileAuthCard) { + return pileAuthCardMapper.selectPileAuthCardInfo(pileAuthCard); + } + /** * 查询充电站鉴权卡列表 * diff --git a/jsowell-pile/src/main/resources/mapper/pile/PileAuthCardMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/PileAuthCardMapper.xml index df50717c0..9b21b95a8 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/PileAuthCardMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/PileAuthCardMapper.xml @@ -8,6 +8,7 @@ + @@ -17,7 +18,11 @@ - select id, logic_card, physics_card, member_id, create_time, create_by, update_time, update_by, del_flag from pile_auth_card + select id, logic_card, physics_card, status, member_id, create_time, create_by, update_time, update_by, del_flag from pile_auth_card + + + + id, logic_card, physics_card, status, member_id, create_time, create_by, update_time, update_by, del_flag @@ -39,6 +45,7 @@ logic_card, physics_card, + status, member_id, create_time, create_by, @@ -49,6 +56,7 @@ #{logicCard}, #{physicsCard}, + #{status}, #{memberId}, #{createTime}, #{createBy}, @@ -63,6 +71,7 @@ logic_card = #{logicCard}, physics_card = #{physicsCard}, + status = #{status}, member_id = #{memberId}, create_time = #{createTime}, create_by = #{createBy}, @@ -83,4 +92,21 @@ #{id} + + \ No newline at end of file diff --git a/jsowell-ui/src/views/pile/card/index.vue b/jsowell-ui/src/views/pile/card/index.vue index c5f779f6a..932296b8b 100644 --- a/jsowell-ui/src/views/pile/card/index.vue +++ b/jsowell-ui/src/views/pile/card/index.vue @@ -32,16 +32,16 @@ - - 新增 - + + + + + + + + + + 删除 - - 导出 - + + + + + + + + + + - + - +