From 1b1d5fd81fcf54882a0d63a17044ec38ddbbc78b Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Sat, 21 Mar 2026 10:30:03 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=B7=BB=E5=8A=A0=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E5=AF=B9=E6=97=B6=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/ykc/PileChannelEntity.java | 4 + .../TimeCheckSettingResponseHandler.java | 19 ++++- .../impl/YKCPushCommandServiceImpl.java | 3 +- .../com/jsowell/quartz/task/JsowellTask.java | 80 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileChannelEntity.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileChannelEntity.java index af23df7ed..19e0c193f 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileChannelEntity.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileChannelEntity.java @@ -152,6 +152,10 @@ public class PileChannelEntity { return manager.remove(pileSn, currentCtx); } + public static List getPileSnListSnapshot() { + return new ArrayList<>(manager.keySet()); + } + public static void removeByChannelId(String channelId){ if (StringUtils.isBlank(channelId)) { return; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TimeCheckSettingResponseHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TimeCheckSettingResponseHandler.java index a66599e95..c68cbd81a 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TimeCheckSettingResponseHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TimeCheckSettingResponseHandler.java @@ -7,8 +7,11 @@ import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.YKCUtils; import com.jsowell.netty.factory.YKCOperateFactory; +import com.jsowell.pile.dto.SavePileMsgDTO; +import com.jsowell.pile.service.PileMsgRecordService; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; @@ -24,6 +27,9 @@ import java.util.Date; public class TimeCheckSettingResponseHandler extends AbstractYkcHandler { private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.TIME_CHECK_SETTING_ANSWER_CODE.getBytes()); + @Autowired + private PileMsgRecordService pileMsgRecordService; + @Override public void afterPropertiesSet() throws Exception { YKCOperateFactory.register(type, this); @@ -50,7 +56,18 @@ public class TimeCheckSettingResponseHandler extends AbstractYkcHandler { length = 7; byte[] currentTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); Date date = Cp56Time2aUtil.byte2Hdate(currentTimeByteArr); - log.info("[===对时设置充电桩应答===], pileSn:{}, channelId:{}, 充电桩当前时间:{}", pileSn, channel.channel().id().asShortText(), DateUtils.formatDateTime(date)); + String deviceTime = DateUtils.formatDateTime(date); + String platformTime = DateUtils.getDateTime(); + SavePileMsgDTO dto = SavePileMsgDTO.builder() + .pileSn(pileSn) + .connectorCode("") + .transactionCode("") + .frameType(type) + .jsonMsg("对时设置应答: deviceTime=" + deviceTime + ", platformTime=" + platformTime) + .originalMsg(ykcDataProtocol.getHEXString()) + .build(); + pileMsgRecordService.save(dto); + log.info("[===对时设置充电桩应答===], pileSn:{}, channelId:{}, 充电桩当前时间:{}, 平台当前时间:{}", pileSn, channel.channel().id().asShortText(), deviceTime, platformTime); return null; } } 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 e861418c5..b98d61374 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 @@ -69,7 +69,8 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_RESTART_CODE.getBytes()), 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.RESERVATION_CHARGING_SETUP_CODE.getBytes()), + YKCUtils.frameType2Str(YKCFrameTypeCode.TIME_CHECK_SETTING_CODE.getBytes()) ); /** diff --git a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java index 4e0d7c0c5..e6a0798b5 100644 --- a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java +++ b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java @@ -14,16 +14,20 @@ import com.jsowell.common.YouDianUtils; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.redis.RedisCache; +import com.jsowell.common.enums.SoftwareProtocolEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; +import com.jsowell.common.enums.ykc.PileChannelEntity; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.PageUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.spring.SpringUtils; import com.jsowell.pile.domain.AdapayUnsplitRecord; import com.jsowell.pile.domain.OrderBasicInfo; +import com.jsowell.pile.domain.PileBasicInfo; import com.jsowell.pile.domain.PileMerchantInfo; import com.jsowell.pile.domain.PileStationInfo; import com.jsowell.pile.domain.ykcCommond.PublishPileBillingTemplateCommand; +import com.jsowell.pile.domain.ykcCommond.ProofreadTimeCommand; import com.jsowell.pile.domain.ykcCommond.StartChargingCommand; import com.jsowell.pile.service.*; import com.jsowell.pile.vo.AdapayUnsplitRecordVO; @@ -57,6 +61,9 @@ public class JsowellTask { @Autowired private OrderBasicInfoService orderBasicInfoService; + @Autowired + private PileBasicInfoService pileBasicInfoService; + @Autowired private PileBillingTemplateService pileBillingTemplateService; @@ -93,6 +100,8 @@ public class JsowellTask { @Autowired private AdapayUnsplitRecordService adapayUnsplitRecordService; + private static final long YKC_DAILY_TIMECHECK_INTERVAL_MILLIS = 200L; + /** * 设置挡板, PRE环境不执行 */ @@ -182,6 +191,77 @@ public class JsowellTask { } } + /** + * 云快充1.6每日自动对时 + * jsowellTask.dailyProofreadTimeForYkcV160() + */ + public void dailyProofreadTimeForYkcV160() { + this.dailyProofreadTimeForYkcV160(YKC_DAILY_TIMECHECK_INTERVAL_MILLIS); + } + + /** + * 云快充1.6每日自动对时 + * jsowellTask.dailyProofreadTimeForYkcV160(200) + */ + public void dailyProofreadTimeForYkcV160(Long intervalMillis) { + String env = SpringUtils.getActiveProfile(); + if (StringUtils.equalsIgnoreCase(env, "pre")) { + log.debug("PRE环境不执行"); + return; + } + + long sendIntervalMillis = intervalMillis == null || intervalMillis < 0 ? YKC_DAILY_TIMECHECK_INTERVAL_MILLIS : intervalMillis; + List connectedPileSnList = PileChannelEntity.getPileSnListSnapshot().stream() + .filter(StringUtils::isNotBlank) + .sorted() + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(connectedPileSnList)) { + log.info("云快充1.6每日自动对时跳过: 当前无在线长连接"); + return; + } + + int candidateCount = connectedPileSnList.size(); + int sentCount = 0; + int skippedCount = 0; + int failedCount = 0; + log.info("云快充1.6每日自动对时开始, candidateCount:{}, intervalMillis:{}", candidateCount, sendIntervalMillis); + + for (String pileSn : connectedPileSnList) { + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); + if (pileBasicInfo == null) { + skippedCount++; + log.warn("云快充1.6每日自动对时跳过, pileSn:{}, reason: pile_basic_info_not_found", pileSn); + continue; + } + if (!StringUtils.equals(SoftwareProtocolEnum.YUN_KUAI_CHONGV160.getValue(), pileBasicInfo.getSoftwareProtocol())) { + skippedCount++; + continue; + } + + try { + ProofreadTimeCommand command = ProofreadTimeCommand.builder().pileSn(pileSn).build(); + ykcPushCommandService.pushProofreadTimeCommand(command); + sentCount++; + } catch (Exception e) { + failedCount++; + log.error("云快充1.6每日自动对时失败, pileSn:{}", pileSn, e); + } + + if (sendIntervalMillis > 0) { + try { + Thread.sleep(sendIntervalMillis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("云快充1.6每日自动对时被中断, sentCount:{}, skippedCount:{}, failedCount:{}", sentCount, skippedCount, failedCount); + return; + } + } + } + + log.info("云快充1.6每日自动对时结束, candidateCount:{}, sentCount:{}, skippedCount:{}, failedCount:{}, intervalMillis:{}", + candidateCount, sentCount, skippedCount, failedCount, sendIntervalMillis); + } + /** * 计算站点订单报表 * jsowellTask.calculateTheSiteOrdersReport()