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 7ef2ea26f..1a432bac3 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -315,7 +315,7 @@ public class MemberService { .requestSource(dto.getRequestSource()) .firstLevelMerchantId(firstLevelMerchantId) .mobileNumber(dto.getMobileNumber()) - .buyerId(dto.getOpenId()) + .buyerId(dto.getUserId()) .build(); return memberRegisterAndLogin(loginDTO); // 支付宝小程序一键登录 } @@ -337,10 +337,9 @@ public class MemberService { throw new BusinessException(ReturnCodeEnum.CODE_ALIPAY_ACCESS_TOKEN_ERROR); } log.info("支付宝getAccessToken:{}", JSON.toJSONString(response)); - String accessToken = response.getAccessToken(); - dto.setAccessToken(accessToken); - String openId = response.getOpenId(); - dto.setOpenId(openId); + dto.setAccessToken(response.getAccessToken()); + dto.setOpenId(response.getOpenId()); + dto.setUserId(response.getUserId()); } /** diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 0a21adb64..0d62d99ad 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -70,6 +70,7 @@ import com.jsowell.pile.util.SnUtils; import com.jsowell.pile.vo.base.MemberWalletVO; import com.jsowell.pile.vo.base.PileInfoVO; import com.jsowell.pile.vo.uniapp.CurrentTimePriceDetails; +import com.jsowell.pile.vo.uniapp.MemberPlateNumberVO; import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO; import com.jsowell.pile.vo.web.*; @@ -265,6 +266,13 @@ public class SpringBootTestController { @Autowired private PileReservationInfoService pileReservationInfoService; + @Test + public void selectMemberPlateNumberRelationTest() { + String memberId = "25950857"; + List plateNumberVOList = memberPlateNumberRelationService.selectMemberPlateNumberRelation(memberId); + System.out.println(JSON.toJSONString(plateNumberVOList)); + } + @Test public void activateReservedTest() { PileReservationDTO dto = new PileReservationDTO(); diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java index 4376e2816..a69fc6aa7 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java @@ -31,10 +31,10 @@ public class TransactionRecordsData { // 枪号 private String connectorCode; - // 开始时间 CP56Time2a 格式 + // 开始时间 yyyy-MM-dd HH:mm:ss private String startTime; - // 结束时间 + // 结束时间 yyyy-MM-dd HH:mm:ss private String endTime; // 尖单价 精确到小数点后五位(尖电费+尖服务费,见费率帧) 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 9ad7192d4..72c8b2676 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 @@ -177,6 +177,8 @@ public enum ReturnCodeEnum { CODE_UPDATE_RESERVED_STATUS_REFUSED("00400016", "时间与现有预订重叠"), + CODE_RESERVATION_ALREADY_EXISTS_ERROR("00400017", "已经存在生效中的预约,请关闭后再试"), + /* 个人桩 end */ CODE_THIS_CARNO_HAS_BEEN_BINDING("00500001", "当前车牌号已经绑定,请检查!"), diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java b/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java index 65a2f56b6..eaeaf2801 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java @@ -2,11 +2,13 @@ package com.jsowell.common.util; import com.google.common.primitives.Bytes; import com.jsowell.common.constant.Constants; +import org.springframework.mail.MailMessage; import javax.xml.bind.DatatypeConverter; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.Date; import java.util.Stack; @@ -402,6 +404,11 @@ public class BytesUtil { return rightPadBytes(target, len, b); } + /** + * ASCII转字符串 小端模式 + * @param ascs + * @return + */ public static String ascii2StrLittle(byte[] ascs) { byte[] data = revert(ascs); String asciiStr = null; @@ -413,6 +420,11 @@ public class BytesUtil { return asciiStr; } + /** + * ASCII转字符串 + * @param ascs + * @return + */ public static String ascii2Str(byte[] ascs) { byte[] data = ascs; String asciiStr = null; @@ -424,10 +436,20 @@ public class BytesUtil { return asciiStr; } + /** + * 字符串转ASCII 小端模式 + * @param str + * @return + */ public static byte[] str2AscLittle(String str) { return revert(str2Asc(str)); } + /** + * 字符串转ASCII + * @param str + * @return + */ public static byte[] str2Asc(String str) { byte[] bytes = null; try { @@ -626,21 +648,6 @@ public class BytesUtil { return bytes; } - public static void main(String[] args) { - byte[] originalBytes = {1, 2, 3}; - int desiredLength = 5; - byte[] result = ensureLengthPrependZero(originalBytes, desiredLength); - - System.out.println("Original array: "); - for (byte b : originalBytes) { - System.out.print(b + " "); - } - System.out.println("\nResulting array with padding at the beginning: "); - for (byte b : result) { - System.out.print(b + " "); - } - } - /** * 确保byte数组长度至少为指定长度,不足则在前面补充0。 * 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 1d5cd5ac6..473a46cf2 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 @@ -17,9 +17,8 @@ import com.jsowell.common.util.YKCUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.netty.factory.YKCOperateFactory; import com.jsowell.pile.domain.OrderBasicInfo; -import com.jsowell.pile.service.OrderBasicInfoService; -import com.jsowell.pile.service.PileMerchantInfoService; -import com.jsowell.pile.service.PileMsgRecordService; +import com.jsowell.pile.domain.PileBasicInfo; +import com.jsowell.pile.service.*; import com.jsowell.pile.service.programlogic.AbstractProgramLogic; import com.jsowell.pile.service.programlogic.ProgramLogicFactory; import com.jsowell.thirdparty.common.CommonService; @@ -68,6 +67,12 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { @Autowired private CommonService commonService; + @Autowired + private PileBasicInfoService pileBasicInfoService; + + @Autowired + private PersonalChargingRecordService personalChargingRecordService; + /*public static void main(String[] args) { BigDecimal totalElectricity = new BigDecimal("23.73"); @@ -588,6 +593,13 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { * @param data */ private void processOrder(TransactionRecordsData data) { + String pileSn = data.getPileSn(); // 充电桩编号 + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); + if (StringUtils.equals(pileBasicInfo.getBusinessType(), Constants.TWO)) { + personalChargingRecordService.processPersonalChargingRecord(data); + return; + } + String transactionCode = data.getTransactionCode(); // 根据交易流水号查询订单信息 OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode); @@ -666,7 +678,6 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { e.printStackTrace(); } }); - } else { // 平台没有查到订单 orderBasicInfoService.saveAbnormalOrder(data); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/AlipayLoginDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/AlipayLoginDTO.java index adc7e433f..20d01a83d 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/AlipayLoginDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/AlipayLoginDTO.java @@ -26,5 +26,7 @@ public class AlipayLoginDTO extends BaseDTO{ private String openId; + private String userId; + private String mobileNumber; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PersonalChargingRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PersonalChargingRecordMapper.java index 576e8ffff..b3ad24b8b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PersonalChargingRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PersonalChargingRecordMapper.java @@ -26,4 +26,6 @@ public interface PersonalChargingRecordMapper { int updateBatchSelective(List list); int batchInsert(@Param("list") List list); + + PersonalChargingRecord selectByTransactionCode(String transactionCode); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java index 36b84886e..4d9653b0c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java @@ -1,6 +1,8 @@ package com.jsowell.pile.service; import java.util.List; + +import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.pile.domain.PersonalChargingRecord; public interface PersonalChargingRecordService{ @@ -27,4 +29,10 @@ public interface PersonalChargingRecordService{ int batchInsert(List list); + /** + * 处理个人桩充电记录 + * + * @param data + */ + void processPersonalChargingRecord(TransactionRecordsData data); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java index abdc49767..757b753b9 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java @@ -1,7 +1,14 @@ package com.jsowell.pile.service.impl; +import com.jsowell.common.core.domain.ykc.TransactionRecordsData; +import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; +import com.jsowell.common.util.DateUtils; +import com.jsowell.pile.domain.PileBasicInfo; +import com.jsowell.pile.service.PileBasicInfoService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.List; import com.jsowell.pile.mapper.PersonalChargingRecordMapper; import com.jsowell.pile.domain.PersonalChargingRecord; @@ -12,6 +19,9 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord @Resource private PersonalChargingRecordMapper personalChargingRecordMapper; + @Autowired + private PileBasicInfoService pileBasicInfoService; + @Override public int deleteByPrimaryKey(Integer id) { return personalChargingRecordMapper.deleteByPrimaryKey(id); @@ -42,6 +52,10 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord return personalChargingRecordMapper.selectByPrimaryKey(id); } + public PersonalChargingRecord selectByTransactionCode(String transactionCode) { + return personalChargingRecordMapper.selectByTransactionCode(transactionCode); + } + @Override public int updateByPrimaryKeySelective(PersonalChargingRecord record) { return personalChargingRecordMapper.updateByPrimaryKeySelective(record); @@ -67,4 +81,56 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord return personalChargingRecordMapper.batchInsert(list); } + /** + * 处理个人桩充电记录 + * + * @param data + */ + @Override + public void processPersonalChargingRecord(TransactionRecordsData data) { + // 根据交易流水号查询,如果数据库没有就入库 + String transactionCode = data.getTransactionCode(); + PersonalChargingRecord chargingRecord = this.selectByTransactionCode(transactionCode); + if (chargingRecord == null) { + // 为空,数据保存到数据库 + chargingRecord = new PersonalChargingRecord(); + } + + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(data.getPileSn()); + + // 处理数据 + chargingRecord.setTransactionCode(transactionCode); + chargingRecord.setStatus("6"); + chargingRecord.setMemberId(""); + chargingRecord.setStationId(pileBasicInfo.getStationId() + ""); + chargingRecord.setMerchantId(pileBasicInfo.getMerchantId() + ""); + chargingRecord.setPileSn(data.getPileSn()); + chargingRecord.setConnectorCode(data.getConnectorCode()); + chargingRecord.setPileConnectorCode(chargingRecord.getPileSn() + chargingRecord.getConnectorCode()); + chargingRecord.setLogicCard(data.getLogicCard()); + chargingRecord.setVinCode(data.getVinCode()); + chargingRecord.setStartMode(""); + chargingRecord.setPlateNumber(""); + chargingRecord.setChargeStartTime(DateUtils.parseDate(data.getStartTime())); + chargingRecord.setChargeEndTime(DateUtils.parseDate(data.getEndTime())); + chargingRecord.setStartType(null); + chargingRecord.setReservationStartTime(null); + chargingRecord.setReservationEndTime(null); + chargingRecord.setStartSoc(null); + chargingRecord.setEndSoc(null); + BigDecimal sharpUsedElectricity = new BigDecimal(data.getSharpUsedElectricity()); + chargingRecord.setSharpUsedElectricity(sharpUsedElectricity); + BigDecimal peakUsedElectricity = new BigDecimal(data.getPeakUsedElectricity()); + chargingRecord.setPeakUsedElectricity(peakUsedElectricity); + BigDecimal flatUsedElectricity = new BigDecimal(data.getFlatUsedElectricity()); + chargingRecord.setFlatUsedElectricity(flatUsedElectricity); + BigDecimal valleyUsedElectricity = new BigDecimal(data.getValleyUsedElectricity()); + chargingRecord.setValleyUsedElectricity(valleyUsedElectricity); + BigDecimal totalUsedElectricity = sharpUsedElectricity.add(peakUsedElectricity).add(flatUsedElectricity).add(valleyUsedElectricity); + chargingRecord.setTotalUsedElectricity(totalUsedElectricity); + chargingRecord.setReason(data.getStopReasonMsg()); + // 创建或更新 + personalChargingRecordMapper.insertOrUpdateSelective(chargingRecord); + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java index 08a804136..ec08ba362 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java @@ -15,6 +15,7 @@ import com.jsowell.pile.service.PileBasicInfoService; import com.jsowell.pile.service.PileRemoteService; import com.jsowell.pile.vo.uniapp.MemberPlateNumberVO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -111,6 +112,12 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic */ @Override public void activateReserved(PileReservationDTO dto) { + // 查询其他生效中的预约 + List infoList = pileReservationInfoMapper.findByMemberIdAndPileSnAndStatus(dto.getMemberId(), dto.getPileSn(), "1"); + if (CollectionUtils.isNotEmpty(infoList)) { + throw new BusinessException(ReturnCodeEnum.CODE_RESERVATION_ALREADY_EXISTS_ERROR); + } + PileReservationInfo pileReservationInfo = pileReservationInfoMapper.selectByPrimaryKey(Integer.parseInt(dto.getReservedId())); if (pileReservationInfo == null) { return; @@ -184,7 +191,7 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic } // 如果 vinCodes 的数量少于 3,用 "0" 补足 while (vinCodes.size() < 3) { - vinCodes.add("0"); + vinCodes.add(""); } String type = StringUtils.equals(pileReservationInfo.getReservationType(), "single") ? "00" : "01"; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java index 31b085ce6..9a26bc84b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java @@ -508,24 +508,15 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { // VIN1 String vin1 = command.getVin1(); - if (StringUtils.isBlank(vin1)) { - vin1 = Constants.ZERO; - } - byte[] vin1ByteArr = BytesUtil.str2Bcd(vin1); + byte[] vin1ByteArr = BytesUtil.str2Asc(vin1); vin1ByteArr = BytesUtil.ensureLength(vin1ByteArr, 17); String vin2 = command.getVin2(); - if (StringUtils.isBlank(vin2)) { - vin2 = Constants.ZERO; - } - byte[] vin2ByteArr = BytesUtil.str2Bcd(vin2); + byte[] vin2ByteArr = BytesUtil.str2Asc(vin2); vin2ByteArr = BytesUtil.ensureLength(vin2ByteArr, 17); String vin3 = command.getVin3(); - if (StringUtils.isBlank(vin3)) { - vin3 = Constants.ZERO; - } - byte[] vin3ByteArr = BytesUtil.str2Bcd(vin3); + byte[] vin3ByteArr = BytesUtil.str2Asc(vin3); vin3ByteArr = BytesUtil.ensureLength(vin3ByteArr, 17); // 开始时间 diff --git a/jsowell-pile/src/main/resources/mapper/pile/PersonalChargingRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/PersonalChargingRecordMapper.xml index 16c615b2a..07d4c4669 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/PersonalChargingRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/PersonalChargingRecordMapper.xml @@ -1212,4 +1212,12 @@ + + \ No newline at end of file