From e9024665d730181878c3b94511dc324c0425b237 Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Fri, 12 Jun 2026 10:59:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81yuxin=E4=B8=BB=E6=9D=BF?= =?UTF-8?q?=E9=A2=84=E7=BA=A6=E5=85=85=E7=94=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/ykc/YKCFrameTypeCode.java | 3 ++ .../domain/ykc/device2platform/Data0xB1.java | 11 ++++++++ .../domain/ykc/platform2device/Data0xB2.java | 11 ++++++++ .../ykc/PileMainboardManufacturerEnum.java | 1 + .../ReservationChargingHandler.java | 2 ++ .../ReservationChargingResponseHandler.java | 14 ++++++++-- .../pile/service/PileRemoteService.java | 5 ++-- .../impl/YKCPushCommandServiceImpl.java | 28 +++++++++++++++++-- 8 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/device2platform/Data0xB1.java create mode 100644 jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/platform2device/Data0xB2.java diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java index 9557c05a3..5c9487109 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java @@ -75,6 +75,8 @@ public enum YKCFrameTypeCode { RESERVATION_CHARGING_SETUP_CODE(0x60, "预约充电设置"), RESERVATION_CHARGING_SETUP_ANSWER_CODE(0x59, "预约充电设置响应"), // RESERVATION + YUXIN_RESERVATION_CHARGING_SETUP_CODE(0xB2, "yuxin预约充电设置"), + YUXIN_RESERVATION_CHARGING_SETUP_ANSWER_CODE(0xB1, "yuxin预约充电设置响应"), RESERVATION_CHARGING_STARTUP_RESULT_ANSWER_CODE(0x64, "预约充电启动结果上传响应"), // 平台响应 RESERVATION_CHARGING_STARTUP_RESULT_CODE(0x65, "预约充电启动结果上传"), // 桩 -> 平台 @@ -255,6 +257,7 @@ public enum YKCFrameTypeCode { // 预约充电设置 RESERVATION_CHARGING_SETUP(RESERVATION_CHARGING_SETUP_CODE.getCode(), RESERVATION_CHARGING_SETUP_ANSWER_CODE.getCode()), + YUXIN_RESERVATION_CHARGING_SETUP(YUXIN_RESERVATION_CHARGING_SETUP_CODE.getCode(), YUXIN_RESERVATION_CHARGING_SETUP_ANSWER_CODE.getCode()), // 预约充电启动结果上传 // RESERVATION_CHARGING_STARTUP_RESULT(RESERVATION_CHARGING_STARTUP_RESULT_CODE.getCode(), RESERVATION_CHARGING_STARTUP_RESULT_ANSWER_CODE.getCode()), diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/device2platform/Data0xB1.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/device2platform/Data0xB1.java new file mode 100644 index 000000000..d2e64ebe7 --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/device2platform/Data0xB1.java @@ -0,0 +1,11 @@ +package com.jsowell.common.core.domain.ykc.device2platform; + +import com.jsowell.common.core.domain.ykc.YKCBaseMessage; +import lombok.Data; + +/** + * yuxin预约充电设置响应 + */ +@Data +public class Data0xB1 extends YKCBaseMessage { +} diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/platform2device/Data0xB2.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/platform2device/Data0xB2.java new file mode 100644 index 000000000..8ff226cb6 --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/platform2device/Data0xB2.java @@ -0,0 +1,11 @@ +package com.jsowell.common.core.domain.ykc.platform2device; + +import com.jsowell.common.core.domain.ykc.YKCBaseMessage; +import lombok.Data; + +/** + * yuxin预约充电设置 + */ +@Data +public class Data0xB2 extends YKCBaseMessage { +} diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java index f36651276..7c1e1d784 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java @@ -5,6 +5,7 @@ package com.jsowell.common.enums.ykc; */ public enum PileMainboardManufacturerEnum { UNKNOWN("unknown", "未知厂家"), + YUXIN("yuxin", "yuxin主板"), ; private String value; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java index 00e6ad6e7..bcdcc7255 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java @@ -15,9 +15,11 @@ import org.springframework.stereotype.Component; public class ReservationChargingHandler extends AbstractYkcHandler { private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE.getBytes()); + private final String yuxinType = YKCUtils.frameType2Str(YKCFrameTypeCode.YUXIN_RESERVATION_CHARGING_SETUP_CODE.getBytes()); @Override public void afterPropertiesSet() throws Exception { YKCOperateFactory.register(type, this); + YKCOperateFactory.register(yuxinType, this); } } diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java index b3bad640e..cf468e394 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java @@ -8,6 +8,7 @@ import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.protocol.SyncPromise; import com.jsowell.common.util.BytesUtil; import com.jsowell.common.util.RpcUtil; +import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.YKCUtils; import com.jsowell.netty.factory.YKCOperateFactory; import com.jsowell.pile.domain.PileReservationInfo; @@ -25,6 +26,7 @@ import org.springframework.stereotype.Component; public class ReservationChargingResponseHandler extends AbstractYkcHandler { private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_ANSWER_CODE.getBytes()); + private final String yuxinType = YKCUtils.frameType2Str(YKCFrameTypeCode.YUXIN_RESERVATION_CHARGING_SETUP_ANSWER_CODE.getBytes()); @Autowired private RedisCache redisCache; @@ -35,6 +37,7 @@ public class ReservationChargingResponseHandler extends AbstractYkcHandler { @Override public void afterPropertiesSet() throws Exception { YKCOperateFactory.register(type, this); + YKCOperateFactory.register(yuxinType, this); } @Override @@ -77,11 +80,16 @@ public class ReservationChargingResponseHandler extends AbstractYkcHandler { byte[] failedReasonByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String failedReason = BytesUtil.bcd2Str(failedReasonByteArr); - log.info("0x59预约充电响应, 交易流水号:{}, 桩SN:{}, 枪口号:{}, 结果:{}, 失败原因:{}", - transactionCode, pileSn, connectorCode, resultCode, failedReason); + String responseFrameType = YKCUtils.frameType2Str(ykcDataProtocol.getFrameType()); + log.info("{}预约充电响应, 交易流水号:{}, 桩SN:{}, 枪口号:{}, 结果:{}, 失败原因:{}", + responseFrameType, transactionCode, pileSn, connectorCode, resultCode, failedReason); // 根据请求id,在集合中找到与外部线程通信的SyncPromise对象 - String msgId = ctx.channel().id().toString() + "_" + YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE.getBytes()); + String requestFrameType = YKCFrameTypeCode.PileAnswersRelation.getRequestFrameType(responseFrameType); + if (StringUtils.isBlank(requestFrameType)) { + requestFrameType = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE.getBytes()); + } + String msgId = ctx.channel().id().toString() + "_" + requestFrameType; log.info("同步获取响应数据-收到消息, msgId:{}", msgId); SyncPromise syncPromise = RpcUtil.getSyncPromiseMap().get(msgId); if(syncPromise != null) { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java index 4ab0e588f..0df5d2352 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java @@ -559,8 +559,9 @@ public class PileRemoteService { String failedReason = BytesUtil.bcd2Str(failedReasonByteArr); String failedReasonMsg = ChargingFailedReasonEnum.getMsgByCode(Integer.parseInt(failedReason, 16)); - log.info("0x59预约充电响应sync, 交易流水号:{}, 桩SN:{}, 枪口号:{}, 结果(00-失败; 01成功):{}, 失败原因:{}", - transactionCode, pileSn, connectorCode, resultCode, failedReasonMsg); + String responseFrameType = YKCUtils.frameType2Str(ykcDataProtocol.getFrameType()); + log.info("{}预约充电响应sync, 交易流水号:{}, 桩SN:{}, 枪口号:{}, 结果(00-失败; 01成功):{}, 失败原因:{}", + responseFrameType, transactionCode, pileSn, connectorCode, resultCode, failedReasonMsg); } return result; 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 b98d61374..ff36a177b 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 @@ -5,6 +5,7 @@ import com.google.common.primitives.Bytes; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; import com.jsowell.common.enums.ykc.PileChannelEntity; +import com.jsowell.common.enums.ykc.PileMainboardManufacturerEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.protocol.SyncPromise; @@ -12,8 +13,10 @@ import com.jsowell.common.service.JcppService; import com.jsowell.common.util.*; import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; import com.jsowell.common.util.spring.SpringUtils; +import com.jsowell.pile.domain.PileBasicInfo; import com.jsowell.pile.domain.ykcCommond.*; import com.jsowell.pile.dto.SavePileMsgDTO; +import com.jsowell.pile.mapper.PileBasicInfoMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.vo.web.BillingTemplateVO; import com.jsowell.pile.vo.web.PileModelInfoVO; @@ -58,6 +61,9 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { @Autowired private PileConnectorInfoService pileConnectorInfoService; + @Autowired + private PileBasicInfoMapper pileBasicInfoMapper; + @DubboReference private JcppService jcppService; @@ -70,6 +76,7 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_CONTROL_START_CHARGING_CODE.getBytes()), YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_CONTROL_STOP_CHARGING_CODE.getBytes()), YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE.getBytes()), + YKCUtils.frameType2Str(YKCFrameTypeCode.YUXIN_RESERVATION_CHARGING_SETUP_CODE.getBytes()), YKCUtils.frameType2Str(YKCFrameTypeCode.TIME_CHECK_SETTING_CODE.getBytes()) ); @@ -813,17 +820,32 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { reservationTypeByteArr, verifyIdentityByteArr, vin1ByteArr, vin2ByteArr, vin3ByteArr, reservedStartTimeByteArr, reservedEndTimeByteArr, amountByteArr); + YKCFrameTypeCode frameTypeCode = getReservationChargingFrameType(pileSn); byte[] response; try { - response = this.supplySend(msg, pileSn, YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE); + response = this.supplySend(msg, pileSn, frameTypeCode); } catch (Exception e) { log.error("发送消息异常", e); response = null; } - log.info("【=====平台下发指令=====】: 预约充电指令, 交易流水号:{}, 桩编号:{}, 枪口号:{}, 操作(01-启动; 02-取消; 03-修改):{}, 身份验证:{}, 开始时间:{}, 结束时间:{}, 启动金额:{}", - transactionCode, pileSn, connectorCode, operation, verifyIdentity, DateUtils.formatDateTime(reservedStartTime), DateUtils.formatDateTime(reservedEndTime), amount); + log.info("【=====平台下发指令=====】: 预约充电指令, 帧类型:{}, 交易流水号:{}, 桩编号:{}, 枪口号:{}, 操作(01-启动; 02-取消; 03-修改):{}, 身份验证:{}, 开始时间:{}, 结束时间:{}, 启动金额:{}", + YKCUtils.frameType2Str(frameTypeCode.getBytes()), transactionCode, pileSn, connectorCode, operation, verifyIdentity, DateUtils.formatDateTime(reservedStartTime), DateUtils.formatDateTime(reservedEndTime), amount); return response; } + private YKCFrameTypeCode getReservationChargingFrameType(String pileSn) { + try { + PileBasicInfo pileBasicInfo = pileBasicInfoMapper.selectPileBasicInfoBySn(pileSn); + String programVersion = pileBasicInfo == null ? null : pileBasicInfo.getProgramVersion(); + PileMainboardManufacturerEnum manufacturer = PileProgramVersionUtils.getMainboardManufacturer(programVersion); + if (manufacturer == PileMainboardManufacturerEnum.YUXIN) { + return YKCFrameTypeCode.YUXIN_RESERVATION_CHARGING_SETUP_CODE; + } + } catch (Exception e) { + log.warn("查询主板厂家失败, 使用默认预约充电帧类型, pileSn:{}", pileSn, e); + } + return YKCFrameTypeCode.RESERVATION_CHARGING_SETUP_CODE; + } + }