From c013f1f90d81db48ac7b944153a5b27bf348fc9f Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Sat, 25 Jul 2026 17:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E5=90=AF=E5=8A=A8=E5=85=85?= =?UTF-8?q?=E7=94=B5=E6=8C=87=E4=BB=A4=E5=A2=9E=E5=8A=A0=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E5=85=85=E7=94=B5=E6=A1=A9=E5=BA=94=E7=AD=94?= =?UTF-8?q?=E5=B9=B6=E6=89=93=E5=8D=B0=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pushStartChargingCommand 发送 0x34 启机指令后,通过 SyncPromise 同步等待 0x33 应答(最多3秒),在同一线程打印启动结果。效果:成功打印成功,失败打印失败(原因),超时打印超时提示。 --- .../RemoteStartChargingRequestHandler.java | 14 ++++++++++ .../impl/YKCPushCommandServiceImpl.java | 26 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java index e2cdd1c57..d982a8866 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/RemoteStartChargingRequestHandler.java @@ -1,5 +1,7 @@ package com.jsowell.netty.handler.yunkuaichong; +import com.jsowell.common.protocol.SyncPromise; +import com.jsowell.common.util.RpcUtil; import com.jsowell.common.constant.Constants; import com.jsowell.common.constant.mq.ThirdPartyRabbitConstants; import com.jsowell.common.core.domain.ykc.YKCDataProtocol; @@ -20,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; +import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletableFuture; /** @@ -101,6 +104,17 @@ public class RemoteStartChargingRequestHandler extends AbstractYkcHandler { String failedReasonMsg = ChargingFailedReasonEnum.getMsgByCode(Integer.parseInt(failedReason, 16)); log.info("远程启动充电命令回复-交易流水号:{}, 桩编码:{}, 枪号:{}, 启动结果(00-失败, 01-成功):{}, 失败原因:{}", transactionCode, pileSn, connectorCode, startResult, failedReasonMsg); + + // 唤醒 pushStartChargingCommand 中等待应答的线程 + String responseKey = transactionCode + "_0x33"; + SyncPromise syncPromise = RpcUtil.getSyncPromiseMap().get(responseKey); + if (syncPromise != null) { + String resultMsg = StringUtils.equals(startResult, Constants.ONE) + ? "成功" + : "失败(" + failedReasonMsg + ")"; + syncPromise.setRpcResult(resultMsg.getBytes(StandardCharsets.UTF_8)); + syncPromise.wake(); + } if (StringUtils.equals(startResult, Constants.DOUBLE_ZERO)) { // 启动失败 2025年4月2日16点39分修改逻辑:启动失败后不退款, 使用支付完成未启动定时任务退款 // orderBasicInfoService.chargingPileFailedToStart(transactionCode, failedReasonMsg); 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 d4f993d75..4e511ab2d 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 @@ -406,14 +406,40 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { byte[] accountBalanceByteArr = YKCUtils.getPriceByte(chargeAmount.toString(), 2); byte[] msgBody = Bytes.concat(orderIdByteArr, pileSnByteArr, connectorCodeByteArr, logicCardNumByteArr, physicsCardNumByteArr, accountBalanceByteArr); + + // 注册同步等待容器,用于接收充电桩 0x33 应答并打印启动结果 + SyncPromise syncPromise = new SyncPromise(); + String responseKey = transactionCode + "_0x33"; + RpcUtil.getSyncPromiseMap().put(responseKey, syncPromise); + try { this.runSend(msgBody, pileSn, YKCFrameTypeCode.REMOTE_CONTROL_START_CHARGING_CODE); } catch (Exception e) { + RpcUtil.getSyncPromiseMap().remove(responseKey); throw new RuntimeException(e); } log.info("【=====平台下发充电指令=====】:订单id:{}, 桩号:{}, 枪口号:{}, 逻辑卡号:{}, 物理卡号:{}, 账户余额:{}", transactionCode, pileSn, BytesUtil.bcd2Str(connectorCodeByteArr), logicCardNum, physicsCardNum, chargeAmount); + + // 等待充电桩应答(最多 3 秒) + byte[] response; + try { + response = syncPromise.get(3, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + response = null; + } finally { + RpcUtil.getSyncPromiseMap().remove(responseKey); + } + + if (response == null) { + log.warn("【启动充电结果】订单号:{}, 桩号:{}, 枪号:{}, 结果:等待充电桩响应超时(3s),桩可能未收到指令或未回复", + transactionCode, pileSn, connectorCode); + } else { + log.info("【启动充电结果】订单号:{}, 桩号:{}, 枪号:{}, 结果:{}", + transactionCode, pileSn, connectorCode, new String(response, java.nio.charset.StandardCharsets.UTF_8)); + } } /**