滚动修改

parent 2efd4663
...@@ -71,7 +71,7 @@ public class LockedOrderProcessorService { ...@@ -71,7 +71,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("锁定期范围: {} 到 {} (冻结期: {}秒)", config.lockStartTime, config.lockEndTime, config.freezeSeconds); log.debug("锁定期范围: {} 到 {} (冻结期: {}秒)", config.lockStartTime, config.lockEndTime, config.freezeSeconds);
// 2. 从已下发场景获取锁定期工单 // 2. 从已下发场景获取锁定期工单
LockedOrdersData lockedData = loadLockedOrdersFromScenes(config, chromosome.getBaseTime(), chromosome.getScenarioID()); LockedOrdersData lockedData = loadLockedOrdersFromScenes(config, chromosome.getBaseTime(), chromosome.getScenarioID());
...@@ -103,7 +103,7 @@ public class LockedOrderProcessorService { ...@@ -103,7 +103,7 @@ public class LockedOrderProcessorService {
long freezeSeconds = timeConfig.getFreezeDate() != null ? timeConfig.getFreezeDate().longValue() : 0; long freezeSeconds = timeConfig.getFreezeDate() != null ? timeConfig.getFreezeDate().longValue() : 0;
if (freezeSeconds <= 0) { if (freezeSeconds <= 0) {
log.info("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds); log.debug("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds);
return null; return null;
} }
...@@ -125,11 +125,11 @@ public class LockedOrderProcessorService { ...@@ -125,11 +125,11 @@ public class LockedOrderProcessorService {
// 查询锁定期内的Dispatch记录 // 查询锁定期内的Dispatch记录
List<Dispatch> frozenDispatches = queryFrozenDispatches(config); List<Dispatch> frozenDispatches = queryFrozenDispatches(config);
if (frozenDispatches.isEmpty()) { if (frozenDispatches.isEmpty()) {
log.info("冻结期内没有工单需要添加"); log.debug("冻结期内没有工单需要添加");
return data; return data;
} }
log.info("查询到冻结期内的工序数: {}", frozenDispatches.size()); log.debug("查询到冻结期内的工序数: {}", frozenDispatches.size());
// 获取所有不同的sceneId // 获取所有不同的sceneId
Set<String> dispatchSceneIds = frozenDispatches.stream() Set<String> dispatchSceneIds = frozenDispatches.stream()
...@@ -142,14 +142,14 @@ public class LockedOrderProcessorService { ...@@ -142,14 +142,14 @@ public class LockedOrderProcessorService {
return data; return data;
} }
log.info("锁定期工单来自 {} 个已下发场景: {}", dispatchSceneIds.size(), dispatchSceneIds); log.debug("锁定期工单来自 {} 个已下发场景: {}", dispatchSceneIds.size(), dispatchSceneIds);
// 遍历每个场景,加载锁定期工单 // 遍历每个场景,加载锁定期工单
for (String sceneId : dispatchSceneIds) { for (String sceneId : dispatchSceneIds) {
processSceneForLockedOrders(sceneId, frozenDispatches, config, newBaseTime, data, newSceneId); processSceneForLockedOrders(sceneId, frozenDispatches, config, newBaseTime, data, newSceneId);
} }
log.info("从 {} 个已下发场景排产结果中获取到 {} 个锁定期工单", dispatchSceneIds.size(), data.results.size()); log.debug("从 {} 个已下发场景排产结果中获取到 {} 个锁定期工单", dispatchSceneIds.size(), data.results.size());
} catch (Exception ex) { } catch (Exception ex) {
log.error("从已下发场景排产结果获取锁定期工单失败: {}", ex.getMessage(), ex); log.error("从已下发场景排产结果获取锁定期工单失败: {}", ex.getMessage(), ex);
...@@ -165,7 +165,7 @@ public class LockedOrderProcessorService { ...@@ -165,7 +165,7 @@ public class LockedOrderProcessorService {
LockPeriodConfig config, LocalDateTime newBaseTime, LockPeriodConfig config, LocalDateTime newBaseTime,
LockedOrdersData data, String newSceneId) { LockedOrdersData data, String newSceneId) {
try { try {
log.info("处理场景: {}", sceneId); log.debug("处理场景: {}", sceneId);
// 加载场景的排产结果 // 加载场景的排产结果
Chromosome dispatchChromosome = loadSceneChromosome(sceneId); Chromosome dispatchChromosome = loadSceneChromosome(sceneId);
...@@ -179,7 +179,7 @@ public class LockedOrderProcessorService { ...@@ -179,7 +179,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("场景 {} - 已下发场景baseTime: {}, 新场景baseTime: {}", sceneId, dispatchBaseTime, newBaseTime); log.debug("场景 {} - 已下发场景baseTime: {}, 新场景baseTime: {}", sceneId, dispatchBaseTime, newBaseTime);
// 筛选属于当前场景的Dispatch记录 // 筛选属于当前场景的Dispatch记录
List<Dispatch> currentSceneDispatches = allDispatches.stream() List<Dispatch> currentSceneDispatches = allDispatches.stream()
...@@ -190,7 +190,7 @@ public class LockedOrderProcessorService { ...@@ -190,7 +190,7 @@ public class LockedOrderProcessorService {
Set<String> lockedOrderIds = findLockedOrderIds(dispatchChromosome, currentSceneDispatches, Set<String> lockedOrderIds = findLockedOrderIds(dispatchChromosome, currentSceneDispatches,
config, dispatchBaseTime, sceneId); config, dispatchBaseTime, sceneId);
log.info("场景 {} 中发现 {} 个订单在锁定期内有工序: {}", sceneId, lockedOrderIds.size(), lockedOrderIds); log.debug("场景 {} 中发现 {} 个订单在锁定期内有工序: {}", sceneId, lockedOrderIds.size(), lockedOrderIds);
// 复制锁定期订单的所有工序 // 复制锁定期订单的所有工序
copyLockedOrders(dispatchChromosome, currentSceneDispatches, lockedOrderIds, copyLockedOrders(dispatchChromosome, currentSceneDispatches, lockedOrderIds,
...@@ -212,7 +212,7 @@ public class LockedOrderProcessorService { ...@@ -212,7 +212,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息", log.debug("场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息",
oldSceneId, dispatchChromosome.getAllOperations().size()); oldSceneId, dispatchChromosome.getAllOperations().size());
for (GAScheduleResult result : data.results) { for (GAScheduleResult result : data.results) {
...@@ -226,14 +226,14 @@ public class LockedOrderProcessorService { ...@@ -226,14 +226,14 @@ public class LockedOrderProcessorService {
if (entry != null) { if (entry != null) {
// 检查原始Entry的machineOptions // 检查原始Entry的machineOptions
log.info("原始Entry {} 的machineOptions数量: {}", log.debug("原始Entry {} 的machineOptions数量: {}",
entry.getExecId(), entry.getExecId(),
entry.getMachineOptions() != null ? entry.getMachineOptions().size() : "null"); entry.getMachineOptions() != null ? entry.getMachineOptions().size() : "null");
if (entry.getMachineOptions() != null && !entry.getMachineOptions().isEmpty()) { if (entry.getMachineOptions() != null && !entry.getMachineOptions().isEmpty()) {
for (int i = 0; i < entry.getMachineOptions().size(); i++) { for (int i = 0; i < entry.getMachineOptions().size(); i++) {
MachineOption option = entry.getMachineOptions().get(i); MachineOption option = entry.getMachineOptions().get(i);
log.info(" machineOption[{}]: machineId={}, equipCode={}, equipName={}", log.debug(" machineOption[{}]: machineId={}, equipCode={}, equipName={}",
i, option.getMachineId(), option.getEquipCode(), option.getEquipName()); i, option.getMachineId(), option.getEquipCode(), option.getEquipName());
} }
} }
...@@ -242,7 +242,7 @@ public class LockedOrderProcessorService { ...@@ -242,7 +242,7 @@ public class LockedOrderProcessorService {
Entry lockedEntry; Entry lockedEntry;
try { try {
lockedEntry = ProductionDeepCopyUtil.deepCopy(entry); lockedEntry = ProductionDeepCopyUtil.deepCopy(entry);
log.info("深拷贝后Entry {} 的machineOptions数量: {}, equipCode={}, equipName={}", log.debug("深拷贝后Entry {} 的machineOptions数量: {}, equipCode={}, equipName={}",
lockedEntry.getExecId(), lockedEntry.getExecId(),
lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null", lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null",
lockedEntry.getEquipCode(), lockedEntry.getEquipName()); lockedEntry.getEquipCode(), lockedEntry.getEquipName());
...@@ -258,7 +258,7 @@ public class LockedOrderProcessorService { ...@@ -258,7 +258,7 @@ public class LockedOrderProcessorService {
// 原因:过滤machineOptions会导致在修改订单数量时,重新解码时无法正确处理 // 原因:过滤machineOptions会导致在修改订单数量时,重新解码时无法正确处理
// 解码器会根据所有可用的machineOptions进行调度,而不是被限制在单一设备 // 解码器会根据所有可用的machineOptions进行调度,而不是被限制在单一设备
// 这样可以避免因数量改变导致的时间冲突问题 // 这样可以避免因数量改变导致的时间冲突问题
log.info("锁定期Entry {} 保留所有machineOptions: 数量={}, equipCode={}, equipName={}", log.debug("锁定期Entry {} 保留所有machineOptions: 数量={}, equipCode={}, equipName={}",
lockedEntry.getExecId(), lockedEntry.getExecId(),
lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null", lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null",
lockedEntry.getEquipCode(), lockedEntry.getEquipName()); lockedEntry.getEquipCode(), lockedEntry.getEquipName());
...@@ -267,11 +267,11 @@ public class LockedOrderProcessorService { ...@@ -267,11 +267,11 @@ public class LockedOrderProcessorService {
if (newSceneId != null) { if (newSceneId != null) {
String originalSceneId = lockedEntry.getSceneId(); String originalSceneId = lockedEntry.getSceneId();
lockedEntry.setSceneId(newSceneId); lockedEntry.setSceneId(newSceneId);
log.info("更新锁定期Entry的sceneId: {} -> {}", originalSceneId, newSceneId); log.debug("更新锁定期Entry的sceneId: {} -> {}", originalSceneId, newSceneId);
} }
data.entries.put(result.getExecId(), lockedEntry); data.entries.put(result.getExecId(), lockedEntry);
log.info("从场景 {} 匹配到锁定期Entry: ExecId={}, 设备ID={}, equipCode={}, equipName={}, machineOptions数量={}", log.debug("从场景 {} 匹配到锁定期Entry: ExecId={}, 设备ID={}, equipCode={}, equipName={}, machineOptions数量={}",
oldSceneId, result.getExecId(), result.getMachineId(), oldSceneId, result.getExecId(), result.getMachineId(),
lockedEntry.getEquipCode(), lockedEntry.getEquipName(), lockedEntry.getEquipCode(), lockedEntry.getEquipName(),
lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null"); lockedEntry.getMachineOptions() != null ? lockedEntry.getMachineOptions().size() : "null");
...@@ -280,7 +280,7 @@ public class LockedOrderProcessorService { ...@@ -280,7 +280,7 @@ public class LockedOrderProcessorService {
} }
} }
log.info("场景 {} 成功匹配 {} 个Entry信息", oldSceneId, data.entries.size()); log.debug("场景 {} 成功匹配 {} 个Entry信息", oldSceneId, data.entries.size());
} }
/** /**
...@@ -290,7 +290,7 @@ public class LockedOrderProcessorService { ...@@ -290,7 +290,7 @@ public class LockedOrderProcessorService {
LockPeriodConfig config, LocalDateTime baseTime, String sceneId) { LockPeriodConfig config, LocalDateTime baseTime, String sceneId) {
Set<String> lockedOrderIds = new HashSet<>(); Set<String> lockedOrderIds = new HashSet<>();
log.info("场景 {} 开始分析工序时间,锁定期范围: {} 到 {}", sceneId, config.lockStartTime, config.lockEndTime); log.debug("场景 {} 开始分析工序时间,锁定期范围: {} 到 {}", sceneId, config.lockStartTime, config.lockEndTime);
for (GAScheduleResult result : chromosome.getResult()) { for (GAScheduleResult result : chromosome.getResult()) {
LocalDateTime startTime = baseTime.plusSeconds(result.getStartTime()); LocalDateTime startTime = baseTime.plusSeconds(result.getStartTime());
...@@ -300,7 +300,7 @@ public class LockedOrderProcessorService { ...@@ -300,7 +300,7 @@ public class LockedOrderProcessorService {
// 检查工序是否在锁定期内 // 检查工序是否在锁定期内
if (!startTime.isBefore(config.lockStartTime) && !startTime.isAfter(config.lockEndTime)) { if (!startTime.isBefore(config.lockStartTime) && !startTime.isAfter(config.lockEndTime)) {
log.info("工序在锁定期内: ExecId={}, OrderId={}, 开始时间={}", log.debug("工序在锁定期内: ExecId={}, OrderId={}, 开始时间={}",
result.getExecId(), result.getOrderId(), startTime); result.getExecId(), result.getOrderId(), startTime);
// 通过订单号匹配Dispatch记录 // 通过订单号匹配Dispatch记录
...@@ -313,7 +313,7 @@ public class LockedOrderProcessorService { ...@@ -313,7 +313,7 @@ public class LockedOrderProcessorService {
if (hasValidDispatch && result.getOrderId() != null) { if (hasValidDispatch && result.getOrderId() != null) {
lockedOrderIds.add(result.getOrderId()); lockedOrderIds.add(result.getOrderId());
log.info("订单 {} 被标记为锁定期订单(通过订单号匹配)", result.getOrderId()); log.debug("订单 {} 被标记为锁定期订单(通过订单号匹配)", result.getOrderId());
} else { } else {
log.warn("工序 {} 在锁定期内但没有有效的Dispatch记录(订单号: {})", log.warn("工序 {} 在锁定期内但没有有效的Dispatch记录(订单号: {})",
result.getExecId(), result.getOrderId()); result.getExecId(), result.getOrderId());
...@@ -362,7 +362,7 @@ public class LockedOrderProcessorService { ...@@ -362,7 +362,7 @@ public class LockedOrderProcessorService {
boolean isInLockPeriod = !prevStartTime.isBefore(config.lockStartTime) && boolean isInLockPeriod = !prevStartTime.isBefore(config.lockStartTime) &&
!prevStartTime.isAfter(config.lockEndTime); !prevStartTime.isAfter(config.lockEndTime);
log.info("从场景 {} 获取订单 {} 的工序: ExecId={}, OrderCode={}, MachineId={}, 原始时间=[{} 到 {}], 新相对时间=[{} 到 {}]秒, 是否在锁定期内={}", log.debug("从场景 {} 获取订单 {} 的工序: ExecId={}, OrderCode={}, MachineId={}, 原始时间=[{} 到 {}], 新相对时间=[{} 到 {}]秒, 是否在锁定期内={}",
sceneId, result.getOrderId(), lockedResult.getExecId(), lockedResult.getOrderCode(), sceneId, result.getOrderId(), lockedResult.getExecId(), lockedResult.getOrderCode(),
lockedResult.getMachineId(), prevStartTime, prevEndTime, newStartTime, newEndTime, isInLockPeriod); lockedResult.getMachineId(), prevStartTime, prevEndTime, newStartTime, newEndTime, isInLockPeriod);
} }
...@@ -375,7 +375,7 @@ public class LockedOrderProcessorService { ...@@ -375,7 +375,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息", log.debug("场景 {} 中有 {} 个Entry,开始匹配锁定期工单的Entry信息",
sceneId, chromosome.getAllOperations().size()); sceneId, chromosome.getAllOperations().size());
for (GAScheduleResult result : data.results) { for (GAScheduleResult result : data.results) {
...@@ -398,7 +398,7 @@ public class LockedOrderProcessorService { ...@@ -398,7 +398,7 @@ public class LockedOrderProcessorService {
if (entry != null) { if (entry != null) {
result.setOperationId(entry.getId()); result.setOperationId(entry.getId());
log.info("通过ExecId匹配到Entry并修正OperationId: ExecId={}, EntryId={}", log.debug("通过ExecId匹配到Entry并修正OperationId: ExecId={}, EntryId={}",
result.getExecId(), entry.getId()); result.getExecId(), entry.getId());
} }
} }
...@@ -410,7 +410,7 @@ public class LockedOrderProcessorService { ...@@ -410,7 +410,7 @@ public class LockedOrderProcessorService {
} }
} }
log.info("场景 {} 成功匹配 {} 个Entry信息", sceneId, data.entries.size()); log.debug("场景 {} 成功匹配 {} 个Entry信息", sceneId, data.entries.size());
} }
/** /**
...@@ -419,15 +419,15 @@ public class LockedOrderProcessorService { ...@@ -419,15 +419,15 @@ public class LockedOrderProcessorService {
private LockedOrdersData createLockedOrdersFromDispatch(LockPeriodConfig config, LocalDateTime baseTime) { private LockedOrdersData createLockedOrdersFromDispatch(LockPeriodConfig config, LocalDateTime baseTime) {
LockedOrdersData data = new LockedOrdersData(); LockedOrdersData data = new LockedOrdersData();
log.info("从Dispatch表查询锁定期工单"); log.debug("从Dispatch表查询锁定期工单");
List<Dispatch> frozenDispatches = queryFrozenDispatches(config); List<Dispatch> frozenDispatches = queryFrozenDispatches(config);
if (frozenDispatches.isEmpty()) { if (frozenDispatches.isEmpty()) {
log.info("冻结期内没有工单需要添加"); log.debug("冻结期内没有工单需要添加");
return data; return data;
} }
log.info("查询到冻结期内的工序数: {}", frozenDispatches.size()); log.debug("查询到冻结期内的工序数: {}", frozenDispatches.size());
for (Dispatch dispatch : frozenDispatches) { for (Dispatch dispatch : frozenDispatches) {
GAScheduleResult result = createResultFromDispatch(dispatch, baseTime); GAScheduleResult result = createResultFromDispatch(dispatch, baseTime);
...@@ -443,7 +443,7 @@ public class LockedOrderProcessorService { ...@@ -443,7 +443,7 @@ public class LockedOrderProcessorService {
private GAScheduleResult createResultFromDispatch(Dispatch dispatch, LocalDateTime baseTime) { private GAScheduleResult createResultFromDispatch(Dispatch dispatch, LocalDateTime baseTime) {
GAScheduleResult result = new GAScheduleResult(); GAScheduleResult result = new GAScheduleResult();
log.info("处理Dispatch记录: id={}, executeId={}, mesCode={}, equipId={}, beginTime={}, endTime={}", log.debug("处理Dispatch记录: id={}, executeId={}, mesCode={}, equipId={}, beginTime={}, endTime={}",
dispatch.getId(), dispatch.getExecuteId(), dispatch.getMesCode(), dispatch.getId(), dispatch.getExecuteId(), dispatch.getMesCode(),
dispatch.getEquipId(), dispatch.getBeginTime(), dispatch.getEndTime()); dispatch.getEquipId(), dispatch.getBeginTime(), dispatch.getEndTime());
...@@ -458,7 +458,7 @@ public class LockedOrderProcessorService { ...@@ -458,7 +458,7 @@ public class LockedOrderProcessorService {
result.setProductName(""); result.setProductName("");
result.setProductCode(""); result.setProductCode("");
log.info("从Dispatch创建锁定期工单: executeId={}, OperationId={}, mesCode={}", log.debug("从Dispatch创建锁定期工单: executeId={}, OperationId={}, mesCode={}",
dispatch.getExecuteId(), result.getOperationId(), dispatch.getMesCode()); dispatch.getExecuteId(), result.getOperationId(), dispatch.getMesCode());
// 计算相对时间 // 计算相对时间
...@@ -466,7 +466,7 @@ public class LockedOrderProcessorService { ...@@ -466,7 +466,7 @@ public class LockedOrderProcessorService {
int startTime = (int) java.time.temporal.ChronoUnit.SECONDS.between(baseTime, dispatch.getBeginTime()); int startTime = (int) java.time.temporal.ChronoUnit.SECONDS.between(baseTime, dispatch.getBeginTime());
int endTime = (int) java.time.temporal.ChronoUnit.SECONDS.between(baseTime, dispatch.getEndTime()); int endTime = (int) java.time.temporal.ChronoUnit.SECONDS.between(baseTime, dispatch.getEndTime());
log.info("锁定期工单时间计算: ExecId={}, Dispatch时间=[{} 到 {}], baseTime={}, 相对时间=[{} 到 {}]秒", log.debug("锁定期工单时间计算: ExecId={}, Dispatch时间=[{} 到 {}], baseTime={}, 相对时间=[{} 到 {}]秒",
dispatch.getExecuteId(), dispatch.getBeginTime(), dispatch.getEndTime(), dispatch.getExecuteId(), dispatch.getBeginTime(), dispatch.getEndTime(),
baseTime, startTime, endTime); baseTime, startTime, endTime);
...@@ -510,7 +510,7 @@ public class LockedOrderProcessorService { ...@@ -510,7 +510,7 @@ public class LockedOrderProcessorService {
int beforeSize = chromosome.getResult().size(); int beforeSize = chromosome.getResult().size();
chromosome.getResult().addAll(data.results); chromosome.getResult().addAll(data.results);
log.info("成功添加 {} 个锁定期工单到调度结果中,result大小从{}变为{}", log.debug("成功添加 {} 个锁定期工单到调度结果中,result大小从{}变为{}",
data.results.size(), beforeSize, chromosome.getResult().size()); data.results.size(), beforeSize, chromosome.getResult().size());
// 1.5. 关键修复:将锁定期工单添加到ResultOld中,确保重新解码时能获取正确的设备ID // 1.5. 关键修复:将锁定期工单添加到ResultOld中,确保重新解码时能获取正确的设备ID
...@@ -523,14 +523,14 @@ public class LockedOrderProcessorService { ...@@ -523,14 +523,14 @@ public class LockedOrderProcessorService {
try { try {
GAScheduleResult resultCopy = ProductionDeepCopyUtil.deepCopy(result); GAScheduleResult resultCopy = ProductionDeepCopyUtil.deepCopy(result);
chromosome.getResultOld().add(resultCopy); chromosome.getResultOld().add(resultCopy);
log.info("添加锁定期工单到ResultOld: OperationId={}, MachineId={}, IsLocked={}", log.debug("添加锁定期工单到ResultOld: OperationId={}, MachineId={}, IsLocked={}",
resultCopy.getOperationId(), resultCopy.getMachineId(), resultCopy.isIsLocked()); resultCopy.getOperationId(), resultCopy.getMachineId(), resultCopy.isIsLocked());
} catch (Exception e) { } catch (Exception e) {
log.error("深拷贝GAScheduleResult失败: {}", e.getMessage(), e); log.error("深拷贝GAScheduleResult失败: {}", e.getMessage(), e);
chromosome.getResultOld().add(result); // 失败时使用原始对象 chromosome.getResultOld().add(result); // 失败时使用原始对象
} }
} }
log.info("成功添加 {} 个锁定期工单到ResultOld中", data.results.size()); log.debug("成功添加 {} 个锁定期工单到ResultOld中", data.results.size());
// 2. 复制锁定期订单的Order对象 // 2. 复制锁定期订单的Order对象
copyLockedOrderObjects(chromosome, data, config); copyLockedOrderObjects(chromosome, data, config);
...@@ -566,19 +566,19 @@ public class LockedOrderProcessorService { ...@@ -566,19 +566,19 @@ public class LockedOrderProcessorService {
.filter(result -> result.getOperationId() == oldId) .filter(result -> result.getOperationId() == oldId)
.forEach(result -> { .forEach(result -> {
result.setOperationId(finalNextAvailableId); result.setOperationId(finalNextAvailableId);
log.info("更新ResultOld中的operationId: {} -> {}, ExecId={}", log.debug("更新ResultOld中的operationId: {} -> {}, ExecId={}",
oldId, finalNextAvailableId, result.getExecId()); oldId, finalNextAvailableId, result.getExecId());
}); });
} }
log.info("锁定期Entry ID重新分配: {} -> {}, ExecId={}", log.debug("锁定期Entry ID重新分配: {} -> {}, ExecId={}",
oldId, nextAvailableId, lockedEntry.getExecId()); oldId, nextAvailableId, lockedEntry.getExecId());
nextAvailableId++; nextAvailableId++;
} }
chromosome.getAllOperations().addAll(data.entries.values()); chromosome.getAllOperations().addAll(data.entries.values());
log.info("成功添加 {} 个锁定期Entry到allOperations中,大小从{}变为{},ID范围: {}-{}", log.debug("成功添加 {} 个锁定期Entry到allOperations中,大小从{}变为{},ID范围: {}-{}",
data.entries.size(), beforeEntrySize, chromosome.getAllOperations().size(), data.entries.size(), beforeEntrySize, chromosome.getAllOperations().size(),
maxExistingId + 1, nextAvailableId - 1); maxExistingId + 1, nextAvailableId - 1);
} }
...@@ -606,13 +606,13 @@ public class LockedOrderProcessorService { ...@@ -606,13 +606,13 @@ public class LockedOrderProcessorService {
// 将每个工序的groupId添加到operationSequencing // 将每个工序的groupId添加到operationSequencing
for (Entry entry : orderEntries) { for (Entry entry : orderEntries) {
currentSequencing.add(entry.getGroupId()); currentSequencing.add(entry.getGroupId());
log.info("添加锁定期工序到排产序列: OrderId={}, GroupId={}, Sequence={}", log.debug("添加锁定期工序到排产序列: OrderId={}, GroupId={}, Sequence={}",
orderId, entry.getGroupId(), entry.getSequence()); orderId, entry.getGroupId(), entry.getSequence());
} }
} }
chromosome.setOperationSequencing(currentSequencing); chromosome.setOperationSequencing(currentSequencing);
log.info("更新operationSequencing,从{}个工序增加到{}个工序", log.debug("更新operationSequencing,从{}个工序增加到{}个工序",
chromosome.getOperationSequencing().size() - (currentSequencing.size() - chromosome.getOperationSequencing().size()), chromosome.getOperationSequencing().size() - (currentSequencing.size() - chromosome.getOperationSequencing().size()),
currentSequencing.size()); currentSequencing.size());
} }
...@@ -642,14 +642,14 @@ public class LockedOrderProcessorService { ...@@ -642,14 +642,14 @@ public class LockedOrderProcessorService {
chromosome.getGlobalOpList().add(info); chromosome.getGlobalOpList().add(info);
log.info("添加锁定期Entry到globalOpList: GlobalOpId={}, EntryId={}, OrderCode={}, GroupId={}, Sequence={}, EquipCode={}", log.debug("添加锁定期Entry到globalOpList: GlobalOpId={}, EntryId={}, OrderCode={}, GroupId={}, Sequence={}, EquipCode={}",
nextGlobalOpId, lockedEntry.getId(), lockedEntry.getOrderCode(), nextGlobalOpId, lockedEntry.getId(), lockedEntry.getOrderCode(),
lockedEntry.getGroupId(), lockedEntry.getSequence(), lockedEntry.getEquipCode()); lockedEntry.getGroupId(), lockedEntry.getSequence(), lockedEntry.getEquipCode());
nextGlobalOpId++; nextGlobalOpId++;
} }
log.info("成功添加 {} 个锁定期Entry到globalOpList中,globalOpList大小变为{}", log.debug("成功添加 {} 个锁定期Entry到globalOpList中,globalOpList大小变为{}",
sortedEntries.size(), chromosome.getGlobalOpList().size()); sortedEntries.size(), chromosome.getGlobalOpList().size());
} }
...@@ -669,11 +669,11 @@ public class LockedOrderProcessorService { ...@@ -669,11 +669,11 @@ public class LockedOrderProcessorService {
// 锁定期工序的机器已经确定,machineSelection设为1(索引从1开始) // 锁定期工序的机器已经确定,machineSelection设为1(索引从1开始)
machineSelection.add(1); machineSelection.add(1);
log.info("添加锁定期Entry的机器选择: EntryId={}, OrderCode={}, EquipCode={}, MachineSelectionIndex=1", log.debug("添加锁定期Entry的机器选择: EntryId={}, OrderCode={}, EquipCode={}, MachineSelectionIndex=1",
lockedEntry.getId(), lockedEntry.getOrderCode(), lockedEntry.getEquipCode()); lockedEntry.getId(), lockedEntry.getOrderCode(), lockedEntry.getEquipCode());
} }
log.info("成功添加 {} 个锁定期Entry的机器选择到machineSelection中,machineSelection大小变为{}", log.debug("成功添加 {} 个锁定期Entry的机器选择到machineSelection中,machineSelection大小变为{}",
sortedEntries.size(), machineSelection.size()); sortedEntries.size(), machineSelection.size());
// 验证:确保machineSelection长度与globalOpList长度一致 // 验证:确保machineSelection长度与globalOpList长度一致
...@@ -681,7 +681,7 @@ public class LockedOrderProcessorService { ...@@ -681,7 +681,7 @@ public class LockedOrderProcessorService {
log.error("警告:machineSelection长度({})与globalOpList长度({})不一致!", log.error("警告:machineSelection长度({})与globalOpList长度({})不一致!",
machineSelection.size(), chromosome.getGlobalOpList().size()); machineSelection.size(), chromosome.getGlobalOpList().size());
} else { } else {
log.info("验证通过:machineSelection长度({})与globalOpList长度({})一致", log.debug("验证通过:machineSelection长度({})与globalOpList长度({})一致",
machineSelection.size(), chromosome.getGlobalOpList().size()); machineSelection.size(), chromosome.getGlobalOpList().size());
} }
} }
...@@ -707,7 +707,7 @@ public class LockedOrderProcessorService { ...@@ -707,7 +707,7 @@ public class LockedOrderProcessorService {
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
log.info("需要复制的锁定期订单ID: {}", lockedOrderIds); log.debug("需要复制的锁定期订单ID: {}", lockedOrderIds);
// 用于存储OrderId到新Order.id的映射 // 用于存储OrderId到新Order.id的映射
Map<String, Integer> orderIdToNewGroupId = new HashMap<>(); Map<String, Integer> orderIdToNewGroupId = new HashMap<>();
...@@ -715,14 +715,14 @@ public class LockedOrderProcessorService { ...@@ -715,14 +715,14 @@ public class LockedOrderProcessorService {
try { try {
// 查询锁定期Dispatch记录 // 查询锁定期Dispatch记录
List<Dispatch> frozenDispatches = queryFrozenDispatches(config); List<Dispatch> frozenDispatches = queryFrozenDispatches(config);
log.info("查询到 {} 个锁定期Dispatch记录", frozenDispatches.size()); log.debug("查询到 {} 个锁定期Dispatch记录", frozenDispatches.size());
Set<String> dispatchSceneIds = frozenDispatches.stream() Set<String> dispatchSceneIds = frozenDispatches.stream()
.map(Dispatch::getSceneId) .map(Dispatch::getSceneId)
.filter(id -> id != null && !id.isEmpty()) .filter(id -> id != null && !id.isEmpty())
.collect(Collectors.toSet()); .collect(Collectors.toSet());
log.info("锁定期Dispatch记录来自 {} 个场景: {}", dispatchSceneIds.size(), dispatchSceneIds); log.debug("锁定期Dispatch记录来自 {} 个场景: {}", dispatchSceneIds.size(), dispatchSceneIds);
// 从每个场景复制订单,并收集Order ID映射 // 从每个场景复制订单,并收集Order ID映射
for (String sceneId : dispatchSceneIds) { for (String sceneId : dispatchSceneIds) {
...@@ -730,7 +730,7 @@ public class LockedOrderProcessorService { ...@@ -730,7 +730,7 @@ public class LockedOrderProcessorService {
orderIdToNewGroupId.putAll(sceneMapping); orderIdToNewGroupId.putAll(sceneMapping);
} }
log.info("Order ID映射: {}", orderIdToNewGroupId); log.debug("Order ID映射: {}", orderIdToNewGroupId);
// 更新Entry的groupId // 更新Entry的groupId
updateEntryGroupIds(data, orderIdToNewGroupId); updateEntryGroupIds(data, orderIdToNewGroupId);
...@@ -742,7 +742,7 @@ public class LockedOrderProcessorService { ...@@ -742,7 +742,7 @@ public class LockedOrderProcessorService {
log.error("复制锁定期订单失败: {}", e.getMessage(), e); log.error("复制锁定期订单失败: {}", e.getMessage(), e);
} }
log.info("成功复制锁定期订单到Orders列表,大小从{}变为{}", beforeOrderSize, chromosome.getOrders().size()); log.debug("成功复制锁定期订单到Orders列表,大小从{}变为{}", beforeOrderSize, chromosome.getOrders().size());
} }
/** /**
* 从场景复制订单,并返回OrderId到新Order.id的映射 * 从场景复制订单,并返回OrderId到新Order.id的映射
...@@ -752,7 +752,7 @@ public class LockedOrderProcessorService { ...@@ -752,7 +752,7 @@ public class LockedOrderProcessorService {
Map<String, Integer> orderIdToNewGroupId = new HashMap<>(); Map<String, Integer> orderIdToNewGroupId = new HashMap<>();
try { try {
log.info("开始从场景 {} 加载Chromosome", sceneId); log.debug("开始从场景 {} 加载Chromosome", sceneId);
Chromosome dispatchChromosome = sceneService.loadChromosomeFromFile(sceneId); Chromosome dispatchChromosome = sceneService.loadChromosomeFromFile(sceneId);
if (dispatchChromosome == null) { if (dispatchChromosome == null) {
...@@ -760,7 +760,7 @@ public class LockedOrderProcessorService { ...@@ -760,7 +760,7 @@ public class LockedOrderProcessorService {
return orderIdToNewGroupId; return orderIdToNewGroupId;
} }
log.info("场景 {} 加载成功,Orders数量: {}", sceneId, log.debug("场景 {} 加载成功,Orders数量: {}", sceneId,
dispatchChromosome.getOrders() != null ? dispatchChromosome.getOrders().size() : 0); dispatchChromosome.getOrders() != null ? dispatchChromosome.getOrders().size() : 0);
if (dispatchChromosome.getOrders() == null) { if (dispatchChromosome.getOrders() == null) {
...@@ -773,7 +773,7 @@ public class LockedOrderProcessorService { ...@@ -773,7 +773,7 @@ public class LockedOrderProcessorService {
.filter(order -> lockedOrderIds.contains(order.getOrderId())) .filter(order -> lockedOrderIds.contains(order.getOrderId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
log.info("场景 {} 中找到 {} 个匹配的锁定期订单", sceneId, lockedOrders.size()); log.debug("场景 {} 中找到 {} 个匹配的锁定期订单", sceneId, lockedOrders.size());
// 获取当前最大的Order ID // 获取当前最大的Order ID
int maxOrderId = chromosome.getOrders().stream() int maxOrderId = chromosome.getOrders().stream()
...@@ -781,7 +781,7 @@ public class LockedOrderProcessorService { ...@@ -781,7 +781,7 @@ public class LockedOrderProcessorService {
.max() .max()
.orElse(0); .orElse(0);
log.info("当前最大Order ID: {}", maxOrderId); log.debug("当前最大Order ID: {}", maxOrderId);
// 复制订单(避免重复) // 复制订单(避免重复)
for (Order lockedOrder : lockedOrders) { for (Order lockedOrder : lockedOrders) {
...@@ -797,7 +797,7 @@ public class LockedOrderProcessorService { ...@@ -797,7 +797,7 @@ public class LockedOrderProcessorService {
// 记录映射关系 // 记录映射关系
orderIdToNewGroupId.put(lockedOrder.getOrderId(), newOrderId); orderIdToNewGroupId.put(lockedOrder.getOrderId(), newOrderId);
log.info("从场景 {} 复制锁定期订单: OrderId={}, OrderCode={}, 旧Order.id={}, 新Order.id={}", log.debug("从场景 {} 复制锁定期订单: OrderId={}, OrderCode={}, 旧Order.id={}, 新Order.id={}",
sceneId, lockedOrder.getOrderId(), lockedOrder.getOrderCode(), oldOrderId, newOrderId); sceneId, lockedOrder.getOrderId(), lockedOrder.getOrderCode(), oldOrderId, newOrderId);
chromosome.getOrders().add(lockedOrder); chromosome.getOrders().add(lockedOrder);
...@@ -820,7 +820,7 @@ public class LockedOrderProcessorService { ...@@ -820,7 +820,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("开始更新Entry的groupId,映射数量: {}", orderIdToNewGroupId.size()); log.debug("开始更新Entry的groupId,映射数量: {}", orderIdToNewGroupId.size());
for (Entry entry : data.entries.values()) { for (Entry entry : data.entries.values()) {
String orderId = entry.getOrderId(); String orderId = entry.getOrderId();
...@@ -828,12 +828,12 @@ public class LockedOrderProcessorService { ...@@ -828,12 +828,12 @@ public class LockedOrderProcessorService {
int oldGroupId = entry.getGroupId(); int oldGroupId = entry.getGroupId();
int newGroupId = orderIdToNewGroupId.get(orderId); int newGroupId = orderIdToNewGroupId.get(orderId);
entry.setGroupId(newGroupId); entry.setGroupId(newGroupId);
log.info("更新Entry的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}", log.debug("更新Entry的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}",
entry.getExecId(), orderId, oldGroupId, newGroupId); entry.getExecId(), orderId, oldGroupId, newGroupId);
} }
} }
log.info("Entry的groupId更新完成"); log.debug("Entry的groupId更新完成");
} }
/** /**
...@@ -844,7 +844,7 @@ public class LockedOrderProcessorService { ...@@ -844,7 +844,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("开始更新GAScheduleResult的groupId,映射数量: {}", orderIdToNewGroupId.size()); log.debug("开始更新GAScheduleResult的groupId,映射数量: {}", orderIdToNewGroupId.size());
for (GAScheduleResult result : data.results) { for (GAScheduleResult result : data.results) {
String orderId = result.getOrderId(); String orderId = result.getOrderId();
...@@ -852,12 +852,12 @@ public class LockedOrderProcessorService { ...@@ -852,12 +852,12 @@ public class LockedOrderProcessorService {
int oldGroupId = result.getGroupId(); int oldGroupId = result.getGroupId();
int newGroupId = orderIdToNewGroupId.get(orderId); int newGroupId = orderIdToNewGroupId.get(orderId);
result.setGroupId(newGroupId); result.setGroupId(newGroupId);
log.info("更新GAScheduleResult的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}", log.debug("更新GAScheduleResult的groupId: ExecId={}, OrderId={}, 旧groupId={}, 新groupId={}",
result.getExecId(), orderId, oldGroupId, newGroupId); result.getExecId(), orderId, oldGroupId, newGroupId);
} }
} }
log.info("GAScheduleResult的groupId更新完成"); log.debug("GAScheduleResult的groupId更新完成");
} }
/** /**
...@@ -880,7 +880,7 @@ public class LockedOrderProcessorService { ...@@ -880,7 +880,7 @@ public class LockedOrderProcessorService {
return; return;
} }
log.info("锁定期工单使用的设备不在本次排产中,需要从已下发场景获取设备信息: {}", missingMachineIds); log.debug("锁定期工单使用的设备不在本次排产中,需要从已下发场景获取设备信息: {}", missingMachineIds);
try { try {
List<Dispatch> frozenDispatches = queryFrozenDispatches(config); List<Dispatch> frozenDispatches = queryFrozenDispatches(config);
...@@ -912,7 +912,7 @@ public class LockedOrderProcessorService { ...@@ -912,7 +912,7 @@ public class LockedOrderProcessorService {
*/ */
private void loadMachinesFromScene(Chromosome chromosome, String sceneId, Set<Long> missingMachineIds) { private void loadMachinesFromScene(Chromosome chromosome, String sceneId, Set<Long> missingMachineIds) {
try { try {
log.info("从场景 {} 获取设备信息", sceneId); log.debug("从场景 {} 获取设备信息", sceneId);
Chromosome dispatchChromosome = loadSceneChromosome(sceneId); Chromosome dispatchChromosome = loadSceneChromosome(sceneId);
if (dispatchChromosome == null || dispatchChromosome.getInitMachines() == null) { if (dispatchChromosome == null || dispatchChromosome.getInitMachines() == null) {
...@@ -924,7 +924,7 @@ public class LockedOrderProcessorService { ...@@ -924,7 +924,7 @@ public class LockedOrderProcessorService {
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!foundMachines.isEmpty()) { if (!foundMachines.isEmpty()) {
log.info("从场景 {} 的排产结果中找到 {} 个锁定期设备", sceneId, foundMachines.size()); log.debug("从场景 {} 的排产结果中找到 {} 个锁定期设备", sceneId, foundMachines.size());
chromosome.getInitMachines().addAll(foundMachines); chromosome.getInitMachines().addAll(foundMachines);
Set<Long> foundIds = foundMachines.stream() Set<Long> foundIds = foundMachines.stream()
...@@ -1014,14 +1014,14 @@ public class LockedOrderProcessorService { ...@@ -1014,14 +1014,14 @@ public class LockedOrderProcessorService {
machine.setName(planResource.getTitle()); machine.setName(planResource.getTitle());
machine.setDepartment(planResource.getDepartTitle()); machine.setDepartment(planResource.getDepartTitle());
log.info("为设备 {} 查询班次信息,workSchedId: {}", machineId, planResource.getWorkSchedId()); log.debug("为设备 {} 查询班次信息,workSchedId: {}", machineId, planResource.getWorkSchedId());
// 查询设备的真实班次信息 // 查询设备的真实班次信息
List<MesShiftWorkSched> shiftWorkScheds = allShiftWorkScheds.stream() List<MesShiftWorkSched> shiftWorkScheds = allShiftWorkScheds.stream()
.filter(t -> (long) t.getWeekWorkSchedId() == planResource.getWorkSchedId()) .filter(t -> (long) t.getWeekWorkSchedId() == planResource.getWorkSchedId())
.collect(Collectors.toList()); .collect(Collectors.toList());
log.info("设备 {} 找到 {} 个班次记录", machineId, shiftWorkScheds.size()); log.debug("设备 {} 找到 {} 个班次记录", machineId, shiftWorkScheds.size());
if (!shiftWorkScheds.isEmpty()) { if (!shiftWorkScheds.isEmpty()) {
// 使用真实的班次信息 // 使用真实的班次信息
...@@ -1033,7 +1033,7 @@ public class LockedOrderProcessorService { ...@@ -1033,7 +1033,7 @@ public class LockedOrderProcessorService {
shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0)); shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
} }
machine.setShifts(shifts); machine.setShifts(shifts);
log.info("为设备 {} 设置真实班次信息,共 {} 个班次", machineId, shifts.size()); log.debug("为设备 {} 设置真实班次信息,共 {} 个班次", machineId, shifts.size());
} else { } else {
// 如果没有找到班次信息,使用默认24小时班次 // 如果没有找到班次信息,使用默认24小时班次
machine.setShifts(createDefault24HourShift(machineId)); machine.setShifts(createDefault24HourShift(machineId));
...@@ -1050,7 +1050,7 @@ public class LockedOrderProcessorService { ...@@ -1050,7 +1050,7 @@ public class LockedOrderProcessorService {
chromosome.getInitMachines().add(machine); chromosome.getInitMachines().add(machine);
} }
log.info("成功创建 {} 个默认锁定期设备", machineIds.size()); log.debug("成功创建 {} 个默认锁定期设备", machineIds.size());
} catch (Exception e) { } catch (Exception e) {
log.error("创建默认设备信息失败: {}", e.getMessage(), e); log.error("创建默认设备信息失败: {}", e.getMessage(), e);
} }
...@@ -1193,6 +1193,7 @@ public class LockedOrderProcessorService { ...@@ -1193,6 +1193,7 @@ public class LockedOrderProcessorService {
/** /**
* 在排产前标记锁定期工单占用的设备时间段 * 在排产前标记锁定期工单占用的设备时间段
* 将锁定期工单占用的设备时间段标记为不可用,避免新工单与锁定期工单冲突 * 将锁定期工单占用的设备时间段标记为不可用,避免新工单与锁定期工单冲突
* 核心逻辑:拆分设备的可用时间段,将锁定期工单占用的部分标记为isUsed=true
* *
* @param machines 设备列表 * @param machines 设备列表
* @param baseTime 基准时间 * @param baseTime 基准时间
...@@ -1202,11 +1203,11 @@ public class LockedOrderProcessorService { ...@@ -1202,11 +1203,11 @@ public class LockedOrderProcessorService {
// 1. 获取时间配置 // 1. 获取时间配置
LockPeriodConfig config = getLockPeriodConfig(); LockPeriodConfig config = getLockPeriodConfig();
if (config == null) { if (config == null) {
log.warn("未找到锁定期配置,跳过标记锁定期设备占用"); log.debug("未找到锁定期配置,跳过标记锁定期设备占用");
return; return;
} }
log.info("开始标记锁定期设备占用时间段,锁定期范围: {} 到 {}", config.lockStartTime, config.lockEndTime); log.debug("开始标记锁定期设备占用时间段,锁定期范围: {} 到 {}", config.lockStartTime, config.lockEndTime);
// 2. 从Dispatch表查询锁定期内的工单 // 2. 从Dispatch表查询锁定期内的工单
List<Dispatch> frozenDispatches = dispatchService.lambdaQuery() List<Dispatch> frozenDispatches = dispatchService.lambdaQuery()
...@@ -1219,11 +1220,11 @@ public class LockedOrderProcessorService { ...@@ -1219,11 +1220,11 @@ public class LockedOrderProcessorService {
.list(); .list();
if (frozenDispatches.isEmpty()) { if (frozenDispatches.isEmpty()) {
log.info("没有锁定期工单需要标记设备占用"); log.debug("没有锁定期工单需要标记设备占用");
return; return;
} }
log.info("查询到 {} 个锁定期工单,开始标记设备占用", frozenDispatches.size()); log.debug("查询到 {} 个锁定期工单,开始标记设备占用", frozenDispatches.size());
// 3. 按设备分组 // 3. 按设备分组
Map<Long, List<Dispatch>> dispatchByMachine = frozenDispatches.stream() Map<Long, List<Dispatch>> dispatchByMachine = frozenDispatches.stream()
...@@ -1257,20 +1258,17 @@ public class LockedOrderProcessorService { ...@@ -1257,20 +1258,17 @@ public class LockedOrderProcessorService {
LocalDateTime occupyStart = dispatchStart.isBefore(baseTime) ? baseTime : dispatchStart; LocalDateTime occupyStart = dispatchStart.isBefore(baseTime) ? baseTime : dispatchStart;
LocalDateTime occupyEnd = dispatchEnd; LocalDateTime occupyEnd = dispatchEnd;
// 创建一个不可用的时间段 // 初始化设备的可用时间段列表
TimeSegment occupiedSegment = new TimeSegment();
occupiedSegment.setStart(occupyStart);
occupiedSegment.setEnd(occupyEnd);
occupiedSegment.setType(SegmentType.MAINTENANCE); // 标记为不可用
occupiedSegment.setUsed(true); // 标记为已占用
occupiedSegment.setHoliday(false);
occupiedSegment.setEfficiency(1.0);
// 添加到设备的可用时间段列表中
if (machine.getAvailability() == null) { if (machine.getAvailability() == null) {
machine.setAvailability(new CopyOnWriteArrayList<>()); machine.setAvailability(new CopyOnWriteArrayList<>());
} }
machine.getAvailability().add(occupiedSegment);
// 关键逻辑:拆分设备的可用时间段
// 将与锁定期工单重叠的时间段拆分成三部分:
// 1. 锁定期之前的部分(isUsed=false)
// 2. 锁定期占用的部分(isUsed=true)
// 3. 锁定期之后的部分(isUsed=false)
splitAndMarkAvailabilitySegments(machine, occupyStart, occupyEnd);
markedCount++; markedCount++;
log.debug("标记设备 {} 的锁定期占用时间段: {} 到 {}, 订单: {}", log.debug("标记设备 {} 的锁定期占用时间段: {} 到 {}, 订单: {}",
...@@ -1279,13 +1277,106 @@ public class LockedOrderProcessorService { ...@@ -1279,13 +1277,106 @@ public class LockedOrderProcessorService {
} }
} }
log.info("成功标记 {} 个锁定期工单的设备占用时间段", markedCount); log.debug("成功标记 {} 个锁定期工单的设备占用时间段", markedCount);
// 5. 打印设备的可用时间段信息用于调试
for (Machine machine : machines) {
if (machine.getAvailability() != null && !machine.getAvailability().isEmpty()) {
log.debug("设备 {} 的availability中有 {} 个时间段,前3个:", machine.getId(), machine.getAvailability().size());
for (int i = 0; i < Math.min(3, machine.getAvailability().size()); i++) {
TimeSegment seg = machine.getAvailability().get(i);
log.debug(" [{}] 类型={}, 开始={}, 结束={}, isUsed={}",
i, seg.getType(), seg.getStart(), seg.getEnd(), seg.isUsed());
}
}
}
} catch (Exception e) { } catch (Exception e) {
log.error("标记锁定期设备占用时间段失败: {}", e.getMessage(), e); log.error("标记锁定期设备占用时间段失败: {}", e.getMessage(), e);
} }
} }
/**
* 拆分并标记设备的可用时间段
* 将与锁定期工单重叠的时间段拆分,并标记占用部分为isUsed=true
*
* @param machine 设备对象
* @param occupyStart 锁定期工单开始时间
* @param occupyEnd 锁定期工单结束时间
*/
private void splitAndMarkAvailabilitySegments(Machine machine, LocalDateTime occupyStart, LocalDateTime occupyEnd) {
if (machine.getAvailability() == null || machine.getAvailability().isEmpty()) {
// 如果没有可用时间段,直接添加占用段
TimeSegment occupiedSegment = new TimeSegment();
occupiedSegment.setStart(occupyStart);
occupiedSegment.setEnd(occupyEnd);
occupiedSegment.setType(SegmentType.MAINTENANCE);
occupiedSegment.setUsed(true);
occupiedSegment.setHoliday(false);
occupiedSegment.setEfficiency(1.0);
machine.getAvailability().add(occupiedSegment);
return;
}
// 处理现有的可用时间段
List<TimeSegment> segmentsToProcess = new ArrayList<>(machine.getAvailability());
machine.getAvailability().clear();
for (TimeSegment segment : segmentsToProcess) {
// 检查时间段与锁定期工单是否有重叠
if (segment.getStart().isBefore(occupyEnd) && segment.getEnd().isAfter(occupyStart)) {
// 有重叠,需要拆分
// 1. 前半部分(锁定期之前)
if (segment.getStart().isBefore(occupyStart)) {
TimeSegment beforeSegment = new TimeSegment();
beforeSegment.setStart(segment.getStart());
beforeSegment.setEnd(occupyStart);
beforeSegment.setType(segment.getType());
beforeSegment.setUsed(false); // 未被占用
beforeSegment.setHoliday(segment.isHoliday());
beforeSegment.setEfficiency(segment.getEfficiency());
beforeSegment.setKey(segment.getKey());
machine.getAvailability().add(beforeSegment);
log.debug("添加前半部分时间段: {} 到 {}, isUsed=false", beforeSegment.getStart(), beforeSegment.getEnd());
}
// 2. 中间部分(锁定期占用)
TimeSegment occupiedSegment = new TimeSegment();
occupiedSegment.setStart(occupyStart);
occupiedSegment.setEnd(occupyEnd);
occupiedSegment.setType(SegmentType.MAINTENANCE);
occupiedSegment.setUsed(true); // 被占用
occupiedSegment.setHoliday(false);
occupiedSegment.setEfficiency(segment.getEfficiency());
machine.getAvailability().add(occupiedSegment);
log.debug("添加占用部分时间段: {} 到 {}, isUsed=true", occupiedSegment.getStart(), occupiedSegment.getEnd());
// 3. 后半部分(锁定期之后)
if (segment.getEnd().isAfter(occupyEnd)) {
TimeSegment afterSegment = new TimeSegment();
afterSegment.setStart(occupyEnd);
afterSegment.setEnd(segment.getEnd());
afterSegment.setType(segment.getType());
afterSegment.setUsed(false); // 未被占用
afterSegment.setHoliday(segment.isHoliday());
afterSegment.setEfficiency(segment.getEfficiency());
afterSegment.setKey(segment.getKey());
machine.getAvailability().add(afterSegment);
log.debug("添加后半部分时间段: {} 到 {}, isUsed=false", afterSegment.getStart(), afterSegment.getEnd());
}
} else {
// 没有重叠,保持原样
segment.setUsed(false); // 确保未被占用的段标记为false
machine.getAvailability().add(segment);
log.debug("保持原有时间段: {} 到 {}, isUsed=false", segment.getStart(), segment.getEnd());
}
}
// 按开始时间排序
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
}
/** /**
* 锁定期配置类 * 锁定期配置类
*/ */
......
...@@ -266,7 +266,7 @@ public class PlanResultService { ...@@ -266,7 +266,7 @@ public class PlanResultService {
// //
// // 如果freezeSeconds为0,则不添加锁定期工单 // // 如果freezeSeconds为0,则不添加锁定期工单
// if (freezeSeconds <= 0) { // if (freezeSeconds <= 0) {
// log.info("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds); // log.debug("冻结期秒数为{},跳过添加锁定期工单", freezeSeconds);
// return; // return;
// } // }
// //
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment