Commit ae460151 authored by Tong Li's avatar Tong Li

Merge remote-tracking branch 'origin/tl'

parents c5c9a28b 5767b7da
......@@ -408,37 +408,21 @@ if(isJit)
if (targetFinishedOpIds == null || targetFinishedOpIds.isEmpty()) {
return 0;
}
// 找关联的成品订单
int finishedOrderId = -1;
Entry targetFinishedOp = null;
for (Integer targetOpId : targetFinishedOpIds) {
Entry op = entryIndexById.get(targetOpId);
if (op != null) {
targetFinishedOp = op;
finishedOrderId = op.getGroupId();
break;
int start=Integer.MAX_VALUE;
for (Integer targetFinishedOpId :targetFinishedOpIds) {
Entry finishedFirstOp = entryIndexById.get(targetFinishedOpId);
int finishedOrderId = finishedFirstOp.getGroupId();
GAScheduleResult finishedFirstResult = scheduleIndexById.get(finishedFirstOp.getId());
if (finishedFirstResult == null) {
// 成品还没排(不应该发生在JIT模式),降级为原有逻辑
return computeSemiFinishedAnchor(decoder, semiOrderId, entrysBygroupId,
opMachineKeyMap, chromosome, scheduleIndexById, machineTasksCache,
machineIdMap, entryIndexById);
}
}
if (finishedOrderId <= 0) return 0;
List<Entry> finishedOps = entrysBygroupId.get(finishedOrderId).stream()
.sorted(Comparator.comparing(Entry::getSequence))
.collect(Collectors.toList());
if (finishedOps.isEmpty()) return 0;
// JIT倒排模式成品已排完,直接从scheduleIndexById取成品第一道工序的开始时间
Entry finishedFirstOp = finishedOps.get(0);
GAScheduleResult finishedFirstResult = scheduleIndexById.get(finishedFirstOp.getId());
if (finishedFirstResult == null) {
// 成品还没排(不应该发生在JIT模式),降级为原有逻辑
return computeSemiFinishedAnchor(decoder, semiOrderId, entrysBygroupId,
opMachineKeyMap, chromosome, scheduleIndexById, machineTasksCache,
machineIdMap, entryIndexById);
}
String schedulingMode = finishedFirstOp.getSchedulingMode();
if (Entry.SchedulingMode.BACKWARD.name().equals(schedulingMode)) {
// 成品倒排成功 → 半成品倒排:锚点 = 成品开始时间 - 缓冲
int semiLatestEndTime = finishedFirstResult.getStartTime();
......@@ -446,35 +430,31 @@ if(isJit)
for (Entry op : sfOps) {
String key = semiOrderId + "_" + op.getSequence();
OpMachine opt = opMachineKeyMap.get(key);
if (opt != null) semiTotalTime += calculateOperationProcessingTime(op, opt,_globalParam);
if (opt != null) semiTotalTime += calculateOperationProcessingTime(op, opt, _globalParam);
}
Material material= chromosome.getMaterials().get(order.getMaterialId());
Material material = chromosome.getMaterials().get(order.getMaterialId());
int ckeckLeadTime=0;
if(material.getCkeckLeadTime()!=null)
{
ckeckLeadTime=(material.getCkeckLeadTime().intValue()*24*60*60);
int ckeckLeadTime = 0;
if (material.getCkeckLeadTime() != null) {
ckeckLeadTime = (material.getCkeckLeadTime().intValue() * 24 * 60 * 60);
}
semiTotalTime+=ckeckLeadTime;
semiTotalTime += ckeckLeadTime;
if (semiLatestEndTime - semiTotalTime < 0) {
FileHelper.writeLogFile("[HybridSemi] 半成品" + semiOrderId +
" 倒排开工<0,正排+成品" + finishedOrderId + "重排");
reForwardFinishedOrderIds.add(finishedOrderId);
return -1;
start= Math.min(start, -1);
}else {
FileHelper.writeLogFile("[HybridSemi] 半成品" + semiOrderId +
" 锚点=" + semiLatestEndTime + " (成品" + finishedOrderId +
"开始=" + finishedFirstResult.getStartTime() + ")");
start = Math.min(start, semiLatestEndTime - ckeckLeadTime);
}
FileHelper.writeLogFile("[HybridSemi] 半成品" + semiOrderId +
" 锚点=" + semiLatestEndTime + " (成品" + finishedOrderId +
"开始=" + finishedFirstResult.getStartTime() + ")");
return semiLatestEndTime-ckeckLeadTime;
} else {
// 成品正排了 → 半成品也正排
FileHelper.writeLogFile("[HybridSemi] 成品" + finishedOrderId +
"已正排,半成品" + semiOrderId + "也正排");
reForwardFinishedOrderIds.add(finishedOrderId);
return -1;
}
return start;
}
private int calculateOperationProcessingTime(Entry op, OpMachine machineOption,GlobalParam _globalParam) {
int total = 0;
......
......@@ -506,7 +506,10 @@ public class MachineCalculator {
}
TimeSegment slot = GetCurrentOrNextShift(machine, currentTime, prevtime, checkprevtime,isJit);
if (slot == null) return times;
if (slot == null)
{
return times;
}
LocalDateTime startCandidate=null;
LocalDateTime endCandidate1= null;
LocalDateTime prevTimeDateTime = StringUtils.isEmpty(prevtime) ? null : LocalDateTime.parse(prevtime);
......@@ -1993,7 +1996,7 @@ public class MachineCalculator {
usedSegments.add(usedSegment);
TimeSegment usedSegment2=new TimeSegment();
usedSegment2.setStart(geneStartTime);
usedSegment2.setStart(geneStartTime.plusSeconds(1));
usedSegment2.setEnd(geneEndTime);
usedSegment2.setHoliday(false);
usedSegment2.setKey(UUID.randomUUID().toString());
......@@ -2026,7 +2029,7 @@ public class MachineCalculator {
}
usedSegments.add(usedSegment);
geneDetails.setKey(usedSegment.getKey());
targetSegment.setStart(geneEndTime);
targetSegment.setStart(geneEndTime.plusSeconds(1));
}else if (targetSegment.getStart().isBefore(geneStartTime)) {
//换型时可能需要把前面的时间分割处理
TimeSegment usedSegment=new TimeSegment();
......@@ -2039,7 +2042,7 @@ public class MachineCalculator {
usedSegment.setKey(UUID.randomUUID().toString());
usedSegments.add(usedSegment);
geneDetails.setKey(targetSegment.getKey());
targetSegment.setStart(geneStartTime);
targetSegment.setStart(geneStartTime.plusSeconds(1));
if(islockMachineTime)
{
targetSegment.setUsed(true);
......
......@@ -188,7 +188,7 @@ public class PlanResultService {
try {
ScheduleParams param = InitScheduleParams();
// param.setBaseTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0));
// param.setBaseTime(LocalDateTime.of(2026, 5, 20, 0, 0, 0));
this.baseTime=param.getBaseTime();
// 策略读取入口:优先使用前端传入的 userId;没传时用 sceneId 查场景创建人。
Long effectiveUserId = scheduleStrategyService.resolveScheduleUserId(SceneId, userId);
......
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