|
@@ -35,7 +35,7 @@ public class ChargingJob {
|
|
|
private final ThirdPartyConnectorInfoMapper connectorInfoMapper;
|
|
private final ThirdPartyConnectorInfoMapper connectorInfoMapper;
|
|
|
private final ThirdPartyEquipmentPricePolicyMapper pricePolicyMapper;
|
|
private final ThirdPartyEquipmentPricePolicyMapper pricePolicyMapper;
|
|
|
private final ThirdPartyPolicyInfoMapper policyInfoMapper;
|
|
private final ThirdPartyPolicyInfoMapper policyInfoMapper;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 任务执行标记,防止并发执行
|
|
// 任务执行标记,防止并发执行
|
|
|
private volatile boolean isPricePolicySyncRunning = false;
|
|
private volatile boolean isPricePolicySyncRunning = false;
|
|
|
|
|
|
|
@@ -48,32 +48,32 @@ public class ChargingJob {
|
|
|
// @Scheduled(cron = "0 0/15 * * * ?")
|
|
// @Scheduled(cron = "0 0/15 * * * ?")
|
|
|
public void syncStationsInfo() {
|
|
public void syncStationsInfo() {
|
|
|
log.info("开始执行充电站信息同步定时任务");
|
|
log.info("开始执行充电站信息同步定时任务");
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
// 获取当前时间作为查询时间
|
|
// 获取当前时间作为查询时间
|
|
|
String lastQueryTime = LocalDateTime.now().minusMinutes(30).format(FORMATTER);
|
|
String lastQueryTime = LocalDateTime.now().minusMinutes(30).format(FORMATTER);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 分页查询,每次查询100条
|
|
// 分页查询,每次查询100条
|
|
|
Integer pageNo = 1;
|
|
Integer pageNo = 1;
|
|
|
Integer pageSize = 100;
|
|
Integer pageSize = 100;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("查询参数 - LastQueryTime: {}, PageNo: {}, PageSize: {}", lastQueryTime, pageNo, pageSize);
|
|
log.info("查询参数 - LastQueryTime: {}, PageNo: {}, PageSize: {}", lastQueryTime, pageNo, pageSize);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 调用业务服务查询充电站信息(会自动保存到数据库)
|
|
// 调用业务服务查询充电站信息(会自动保存到数据库)
|
|
|
QueryStationsInfoVO result = chargingBusinessService.queryStationsInfo(lastQueryTime, pageNo, pageSize);
|
|
QueryStationsInfoVO result = chargingBusinessService.queryStationsInfo(lastQueryTime, pageNo, pageSize);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (result != null && result.getStationInfos() != null) {
|
|
if (result != null && result.getStationInfos() != null) {
|
|
|
log.info("充电站信息同步完成,共同步 {} 个充电站", result.getStationInfos().size());
|
|
log.info("充电站信息同步完成,共同步 {} 个充电站", result.getStationInfos().size());
|
|
|
} else {
|
|
} else {
|
|
|
log.warn("充电站信息同步结果为空");
|
|
log.warn("充电站信息同步结果为空");
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
} catch (JsonProcessingException e) {
|
|
} catch (JsonProcessingException e) {
|
|
|
log.error("充电站信息同步失败 - JSON处理异常", e);
|
|
log.error("充电站信息同步失败 - JSON处理异常", e);
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("充电站信息同步失败 - 系统异常", e);
|
|
log.error("充电站信息同步失败 - 系统异常", e);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("充电站信息同步定时任务执行结束");
|
|
log.info("充电站信息同步定时任务执行结束");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -89,56 +89,56 @@ public class ChargingJob {
|
|
|
log.warn("价格策略同步任务正在执行中,跳过本次调度");
|
|
log.warn("价格策略同步任务正在执行中,跳过本次调度");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
isPricePolicySyncRunning = true;
|
|
isPricePolicySyncRunning = true;
|
|
|
log.info("开始执行设备价格策略同步定时任务");
|
|
log.info("开始执行设备价格策略同步定时任务");
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
// 查询所有充电桩接口信息
|
|
// 查询所有充电桩接口信息
|
|
|
List<ThirdPartyConnectorInfo> connectorList = connectorInfoMapper.selectList(null);
|
|
List<ThirdPartyConnectorInfo> connectorList = connectorInfoMapper.selectList(null);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (CollectionUtils.isEmpty(connectorList)) {
|
|
if (CollectionUtils.isEmpty(connectorList)) {
|
|
|
log.warn("未查询到充电桩接口信息,跳过价格策略同步");
|
|
log.warn("未查询到充电桩接口信息,跳过价格策略同步");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("开始同步价格策略,总共 {} 个充电桩接口", connectorList.size());
|
|
log.info("开始同步价格策略,总共 {} 个充电桩接口", connectorList.size());
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
int successCount = 0;
|
|
int successCount = 0;
|
|
|
int failCount = 0;
|
|
int failCount = 0;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 遍历每个充电桩接口,查询价格策略
|
|
// 遍历每个充电桩接口,查询价格策略
|
|
|
for (ThirdPartyConnectorInfo connector : connectorList) {
|
|
for (ThirdPartyConnectorInfo connector : connectorList) {
|
|
|
try {
|
|
try {
|
|
|
String connectorId = connector.getConnectorId();
|
|
String connectorId = connector.getConnectorId();
|
|
|
String equipmentId = connector.getEquipmentId();
|
|
String equipmentId = connector.getEquipmentId();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 检查该充电桩的价格策略上次更新时间,如果不足1小时则跳过
|
|
// 检查该充电桩的价格策略上次更新时间,如果不足1小时则跳过
|
|
|
if (shouldSkipUpdate(connectorId)) {
|
|
if (shouldSkipUpdate(connectorId)) {
|
|
|
- log.info("充电桩价格策略上次更新时间不足1小时,跳过本次同步 - connectorId: {}, equipmentId: {}",
|
|
|
|
|
|
|
+ log.info("充电桩价格策略上次更新时间不足1小时,跳过本次同步 - connectorId: {}, equipmentId: {}",
|
|
|
connectorId, equipmentId);
|
|
connectorId, equipmentId);
|
|
|
continue; // 跳过本次充电桩,不调用第三方接口
|
|
continue; // 跳过本次充电桩,不调用第三方接口
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("查询价格策略 - connectorId: {}, equipmentId: {}", connectorId, equipmentId);
|
|
log.info("查询价格策略 - connectorId: {}, equipmentId: {}", connectorId, equipmentId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 调用业务服务查询价格策略(会自动保存到数据库)
|
|
// 调用业务服务查询价格策略(会自动保存到数据库)
|
|
|
ChargingPricePolicyVO result = chargingBusinessService.queryEquipBusinessPolicy(equipmentId, connectorId);
|
|
ChargingPricePolicyVO result = chargingBusinessService.queryEquipBusinessPolicy(equipmentId, connectorId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 立即休眠10秒,避免触发第三方接口保护机制
|
|
// 立即休眠10秒,避免触发第三方接口保护机制
|
|
|
// 第三方接口可能有频率限制,需要足够的间隔时间
|
|
// 第三方接口可能有频率限制,需要足够的间隔时间
|
|
|
// Thread.sleep(18000); // 10秒间隔
|
|
// Thread.sleep(18000); // 10秒间隔
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (result != null && result.getSuccStat() != null && result.getSuccStat() == 0) {
|
|
if (result != null && result.getSuccStat() != null && result.getSuccStat() == 0) {
|
|
|
successCount++;
|
|
successCount++;
|
|
|
log.info("价格策略同步成功 - connectorId: {}, 时段数: {}", connectorId, result.getSumPeriod());
|
|
log.info("价格策略同步成功 - connectorId: {}, 时段数: {}", connectorId, result.getSumPeriod());
|
|
|
} else {
|
|
} else {
|
|
|
failCount++;
|
|
failCount++;
|
|
|
- log.warn("价格策略同步失败 - connectorId: {}, 失败原因: {}, 跳过该接口继续处理下一个", connectorId,
|
|
|
|
|
|
|
+ log.warn("价格策略同步失败 - connectorId: {}, 失败原因: {}, 跳过该接口继续处理下一个", connectorId,
|
|
|
result != null ? result.getFailReason() : "返回结果为空");
|
|
result != null ? result.getFailReason() : "返回结果为空");
|
|
|
continue; // 跳过失败的接口,继续处理下一个
|
|
continue; // 跳过失败的接口,继续处理下一个
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// } catch (InterruptedException e) {
|
|
// } catch (InterruptedException e) {
|
|
|
// Thread.currentThread().interrupt();
|
|
// Thread.currentThread().interrupt();
|
|
|
// log.error("线程休眠被中断 - connectorId: {}", connector.getConnectorId(), e);
|
|
// log.error("线程休眠被中断 - connectorId: {}", connector.getConnectorId(), e);
|
|
@@ -149,9 +149,9 @@ public class ChargingJob {
|
|
|
log.error("同步价格策略失败 - connectorId: {}", connector.getConnectorId(), e);
|
|
log.error("同步价格策略失败 - connectorId: {}", connector.getConnectorId(), e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("设备价格策略同步完成 - 成功: {}, 失败: {}, 总数: {}", successCount, failCount, connectorList.size());
|
|
log.info("设备价格策略同步完成 - 成功: {}, 失败: {}, 总数: {}", successCount, failCount, connectorList.size());
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("设备价格策略同步定时任务执行异常", e);
|
|
log.error("设备价格策略同步定时任务执行异常", e);
|
|
|
} finally {
|
|
} finally {
|
|
@@ -160,11 +160,11 @@ public class ChargingJob {
|
|
|
log.info("设备价格策略同步定时任务执行结束");
|
|
log.info("设备价格策略同步定时任务执行结束");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 检查是否应该跳过更新
|
|
* 检查是否应该跳过更新
|
|
|
* 如果该充电桩的价格策略上次更新时间不足1小时,则跳过
|
|
* 如果该充电桩的价格策略上次更新时间不足1小时,则跳过
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* @param connectorId 充电接口ID
|
|
* @param connectorId 充电接口ID
|
|
|
* @return true-跳过更新, false-需要更新
|
|
* @return true-跳过更新, false-需要更新
|
|
|
*/
|
|
*/
|
|
@@ -177,12 +177,12 @@ public class ChargingJob {
|
|
|
.orderByDesc(ThirdPartyEquipmentPricePolicy::getCreateTime)
|
|
.orderByDesc(ThirdPartyEquipmentPricePolicy::getCreateTime)
|
|
|
.last("LIMIT 1")
|
|
.last("LIMIT 1")
|
|
|
).stream().findFirst().orElse(null);
|
|
).stream().findFirst().orElse(null);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (latestPolicy == null) {
|
|
if (latestPolicy == null) {
|
|
|
// 没有记录,需要更新
|
|
// 没有记录,需要更新
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 2. 查询该价格策略的明细记录,获取最近的更新时间
|
|
// 2. 查询该价格策略的明细记录,获取最近的更新时间
|
|
|
List<ThirdPartyPolicyInfo> policyInfoList = policyInfoMapper.selectList(
|
|
List<ThirdPartyPolicyInfo> policyInfoList = policyInfoMapper.selectList(
|
|
|
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ThirdPartyPolicyInfo>()
|
|
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ThirdPartyPolicyInfo>()
|
|
@@ -190,30 +190,30 @@ public class ChargingJob {
|
|
|
.orderByDesc(ThirdPartyPolicyInfo::getUpdateTime)
|
|
.orderByDesc(ThirdPartyPolicyInfo::getUpdateTime)
|
|
|
.last("LIMIT 1")
|
|
.last("LIMIT 1")
|
|
|
);
|
|
);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (policyInfoList.isEmpty()) {
|
|
if (policyInfoList.isEmpty()) {
|
|
|
// 没有明细记录,需要更新
|
|
// 没有明细记录,需要更新
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
LocalDateTime lastUpdateTime = policyInfoList.get(0).getUpdateTime();
|
|
LocalDateTime lastUpdateTime = policyInfoList.get(0).getUpdateTime();
|
|
|
if (lastUpdateTime == null) {
|
|
if (lastUpdateTime == null) {
|
|
|
// 没有更新时间,需要更新
|
|
// 没有更新时间,需要更新
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 3. 判断是否距离上次更新不足1小时
|
|
// 3. 判断是否距离上次更新不足1小时
|
|
|
LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1);
|
|
LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1);
|
|
|
if (lastUpdateTime.isAfter(oneHourAgo)) {
|
|
if (lastUpdateTime.isAfter(oneHourAgo)) {
|
|
|
// 上次更新时间在1小时内,跳过更新
|
|
// 上次更新时间在1小时内,跳过更新
|
|
|
- log.debug("充电桩价格策略距离上次更新不足1小时 - connectorId: {}, lastUpdateTime: {}",
|
|
|
|
|
|
|
+ log.debug("充电桩价格策略距离上次更新不足1小时 - connectorId: {}, lastUpdateTime: {}",
|
|
|
connectorId, lastUpdateTime);
|
|
connectorId, lastUpdateTime);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 距离上次更新超过1小时,需要更新
|
|
// 距离上次更新超过1小时,需要更新
|
|
|
return false;
|
|
return false;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("检查更新时间失败,默认需要更新 - connectorId: {}", connectorId, e);
|
|
log.error("检查更新时间失败,默认需要更新 - connectorId: {}", connectorId, e);
|
|
|
// 发生异常时,默认需要更新
|
|
// 发生异常时,默认需要更新
|