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 @@
-
- 新增
-
+
+
+
+
+
+
+
+
+
+
删除
-
- 导出
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+