Commit b1b2a85e authored by Tong Li's avatar Tong Li

Merge remote-tracking branch 'origin/tl'

parents ccc8685f cb1d4c68
...@@ -157,6 +157,7 @@ private Long isInterrupt = 1l; ...@@ -157,6 +157,7 @@ private Long isInterrupt = 1l;
private String equipName;//设备编码 private String equipName;//设备编码
@Schema(description = "指定开始时间") @Schema(description = "指定开始时间")
@JsonInclude(JsonInclude.Include.ALWAYS) @JsonInclude(JsonInclude.Include.ALWAYS)
private LocalDateTime designatedStartTime; private LocalDateTime designatedStartTime;
...@@ -164,4 +165,12 @@ private Long isInterrupt = 1l; ...@@ -164,4 +165,12 @@ private Long isInterrupt = 1l;
private LocalDateTime jitPreferredStartTime; private LocalDateTime jitPreferredStartTime;
private boolean jitTemporary = false; private boolean jitTemporary = false;
private String schedulingMode = SchedulingMode.FORWARD.name();
private int anchorTimeSecond = 0;
public enum SchedulingMode {
FORWARD, BACKWARD
}
} }
...@@ -39,6 +39,11 @@ public class GlobalParam { ...@@ -39,6 +39,11 @@ public class GlobalParam {
/// </summary> /// </summary>
private boolean IsOverlap = false; private boolean IsOverlap = false;
/// <summary>
/// 是否全局倒排
/// </summary>
private boolean isJit = true;
private boolean _smoothSetup = false; // 设置时间平滑 工序的前处理是否提前 private boolean _smoothSetup = false; // 设置时间平滑 工序的前处理是否提前
private boolean _smoothChangeOver = true; // 默认true,设置时间 是否考虑换型时间 private boolean _smoothChangeOver = true; // 默认true,设置时间 是否考虑换型时间
......
...@@ -20,6 +20,7 @@ public class TimeSegment { ...@@ -20,6 +20,7 @@ public class TimeSegment {
private boolean isHoliday; // 是否节假日(true=节假日) private boolean isHoliday; // 是否节假日(true=节假日)
private boolean isUsed; // 是否已被占用(true=已分配任务) private boolean isUsed; // 是否已被占用(true=已分配任务)
private double efficiency=1;//效率 private double efficiency=1;//效率
private int processingTime;
// 无参构造(Lombok默认生成) // 无参构造(Lombok默认生成)
public TimeSegment() {} public TimeSegment() {}
......
package com.aps.service.Algorithm;
import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.OperationDependency;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import com.aps.entity.basic.Entry;
import com.aps.entity.basic.Machine;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 作者:佟礼
* 时间:2026-04-28
*/
public class GeneticDecoderBom {
/**
* 计算成品可用时间(用于半成品排程)
*
* @param semiFinishedOperation 半成品工序
* @param chromosome 染色体
* @param baseTime 基准时间
* @param machineTasksCache 设备任务缓存
* @param entryIndexById 工序索引
* @param scheduleIndexById 排程索引
* @return 成品可用时间(秒)
*/
public int calculateFinishedAvailableTime(Entry semiFinishedOperation, Chromosome chromosome,
LocalDateTime baseTime,
Map<Long, CopyOnWriteArrayList<GAScheduleResult>> machineTasksCache,
Map<Integer, Entry> entryIndexById,
Map<Integer, GAScheduleResult> scheduleIndexById) {
// 如果没有关联的成品工序,返回0
if (semiFinishedOperation.getTargetFinishedOperationId() == null ||
semiFinishedOperation.getTargetFinishedOperationId().isEmpty()) {
return 0;
}
int maxFinishedTime = 0;
// 遍历所有关联的成品工序,计算每个的可用时间,取最大值
for (Integer finishedOperationId : semiFinishedOperation.getTargetFinishedOperationId()) {
Entry finishedOperation = entryIndexById.get(finishedOperationId);
if (finishedOperation == null) {
continue;
}
// 计算该成品工序的可用时间
int finishedAvailableTime = calculateSingleFinishedAvailableTime(
finishedOperation, chromosome, baseTime, machineTasksCache, entryIndexById, scheduleIndexById);
maxFinishedTime = Math.min(maxFinishedTime, finishedAvailableTime);
}
return maxFinishedTime;
}
/**
* 计算单个成品工序的可用时间
*
* @param finishedOperation 成品工序
* @param chromosome 染色体
* @param baseTime 基准时间
* @param machineTasksCache 设备任务缓存
* @param entryIndexById 工序索引
* @param scheduleIndexById 排程索引
* @return 成品工序可用时间(秒)
*/
private int calculateSingleFinishedAvailableTime(Entry finishedOperation, Chromosome chromosome,
LocalDateTime baseTime,
Map<Long, CopyOnWriteArrayList<GAScheduleResult>> machineTasksCache,
Map<Integer, Entry> entryIndexById,
Map<Integer, GAScheduleResult> scheduleIndexById) {
int maxTime = 0;
// 1. 计算成品前一序时间
int prevOperationEndTime = 0;
if (!finishedOperation.getPrevEntryIds().isEmpty()) {
for (OperationDependency prevOp : finishedOperation.getPrevEntryIds()) {
GAScheduleResult prevResult = scheduleIndexById.get(prevOp.getPrevOperationId());
if (prevResult != null) {
prevOperationEndTime = Math.max(prevOperationEndTime, prevResult.getEndTime());
}
}
}
//成品时间一定晚于prevOperationEndTime
//半成品库存只能用
maxTime = Math.max(maxTime, prevOperationEndTime);
// 2. 计算成品当前序所用设备最后一个任务的结束时间
Long machineId = finishedOperation.getSelectMachineID();
if (machineId == null && finishedOperation.getMachineOptions() != null &&
!finishedOperation.getMachineOptions().isEmpty()) {
// 如果设备还未选择,使用第一个可用设备
machineId = finishedOperation.getMachineOptions().get(0).getMachineId();
}
if (machineId != null) {
Long machineId1=machineId;
Machine machine= chromosome.getMachines().stream().filter(t->t.getId()==machineId1).findFirst().orElse(null);
GAScheduleResult machineTask = machine.getLastGene();
if (machineTask != null ) {
int lastEndTime =machineTask.getEndTime();
maxTime = Math.max(maxTime, lastEndTime);
}
}
// 3. 原材料0库存计算齐套最大时间(只计算原材料,不计算半成品)
int rawMaterialBomTime = calculateRawMaterialBomTimeForFinished(finishedOperation, chromosome);
maxTime = Math.max(maxTime, rawMaterialBomTime);
return maxTime;
}
/**
* 计算成品工序的原材料齐套时间(只计算原材料MP,不计算半成品)
*/
private int calculateRawMaterialBomTimeForFinished(Entry finishedOperation, Chromosome chromosome) {
List<OrderMaterialRequirement> materialReqs = finishedOperation.getMaterialRequirements();
if (materialReqs == null) {
return 0;
}
int maxTime = 0;
for (OrderMaterialRequirement req : materialReqs) {
if ("MP".equals(req.getMaterialTypeName())) { // 只计算原材料
// 计算原材料采购提前期
int purchaseTime = req.getPurchaseTime() != null ? req.getPurchaseTime() : 0;
int checkLeadTime = req.getCheckLeadTime() != null ? req.getCheckLeadTime() : 0;
int totalDays = purchaseTime + checkLeadTime;
int totalSeconds = totalDays * 24 * 3600;
maxTime = Math.max(maxTime, totalSeconds);
}
}
return maxTime;
}
}
...@@ -453,7 +453,7 @@ public class HybridAlgorithm { ...@@ -453,7 +453,7 @@ public class HybridAlgorithm {
FileHelper.writeLogFile("解码---------------"+population.size() ); FileHelper.writeLogFile("解码---------------"+population.size() );
// GeneticDecoder decoder = new GeneticDecoder(_GlobalParam, param.getBaseTime(), machines, orders, materials, machineScheduler,materialRequirementService, sceneId); // GeneticDecoder decoder = new GeneticDecoder(_GlobalParam, param.getBaseTime(), machines, orders, materials, machineScheduler,materialRequirementService, sceneId);
boolean ismore=true; boolean ismore=false;
if(ismore) { if(ismore) {
CompletableFuture.allOf(population.stream() CompletableFuture.allOf(population.stream()
.map(chromosome -> CompletableFuture.runAsync(() -> decode(sharedDecoder, chromosome, param, allOperations, globalOpList), decodeExecutor)) .map(chromosome -> CompletableFuture.runAsync(() -> decode(sharedDecoder, chromosome, param, allOperations, globalOpList), decodeExecutor))
......
...@@ -58,6 +58,17 @@ public class MachineSchedulerService { ...@@ -58,6 +58,17 @@ public class MachineSchedulerService {
} }
public MachineTimeline getOrCreateTimeline(Machine machine) { public MachineTimeline getOrCreateTimeline(Machine machine) {
return getOrCreateTimeline(machine,true); return getOrCreateTimeline(machine,true);
}
public LocalDateTime GetEndTime(Long machineId) {
MachineTimeline timeline = timelineCache.get(machineId);
if(timeline!=null)
{
return timeline.getValidTo();
}
return null;
} }
private MachineTimeline generateTimeline(Machine machine) { private MachineTimeline generateTimeline(Machine machine) {
......
...@@ -168,6 +168,7 @@ public class PlanResultService { ...@@ -168,6 +168,7 @@ public class PlanResultService {
ScheduleParams param = InitScheduleParams(); ScheduleParams param = InitScheduleParams();
this.baseTime=param.getBaseTime();
// 1. 读取数据 // 1. 读取数据
// List<Machine> machines = loadData("machines.json", Machine.class); // List<Machine> machines = loadData("machines.json", Machine.class);
...@@ -259,7 +260,7 @@ public class PlanResultService { ...@@ -259,7 +260,7 @@ public class PlanResultService {
_sceneService.saveChromosomeToFile(chromosome, SceneId); _sceneService.saveChromosomeToFile(chromosome, SceneId);
// WriteScheduleSummary(chromosome); WriteScheduleSummary(chromosome);
return chromosome; return chromosome;
...@@ -1928,8 +1929,8 @@ public class PlanResultService { ...@@ -1928,8 +1929,8 @@ public class PlanResultService {
TargetFinishedOperationIds TargetFinishedOperationIds
)); ));
if(job.getGeneDetails()!=null)
// 追加基因详情 {
for (ScheduleResultDetail d : job.getGeneDetails()) { for (ScheduleResultDetail d : job.getGeneDetails()) {
sb.append(String.format( sb.append(String.format(
"\n\t\t\t\t\t\t\t\t\t\t [%d-%d]:[%s-%s] %d", "\n\t\t\t\t\t\t\t\t\t\t [%d-%d]:[%s-%s] %d",
...@@ -1940,6 +1941,9 @@ public class PlanResultService { ...@@ -1940,6 +1941,9 @@ public class PlanResultService {
d.getEndTime() - d.getStartTime() d.getEndTime() - d.getStartTime()
)); ));
} }
}
// 追加基因详情
FileHelper.writeLogFile(sb.toString()); FileHelper.writeLogFile(sb.toString());
......
...@@ -55,7 +55,10 @@ spring: ...@@ -55,7 +55,10 @@ spring:
# Oracle数据源 # Oracle数据源
oracle: oracle:
driver-class-name: oracle.jdbc.OracleDriver driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//39.100.78.207:7002/ORCLPDB1 # ORCL为你的Oracle实例名 url: jdbc:oracle:thin:@//39.100.77.7:1522/ORCLPDB1 # ORCL为你的Oracle实例名
# username: mes # 替换为你的Oracle用户名
# password: root_mes123456 # 替换为你的Oracle密码
# url: jdbc:oracle:thin:@//39.100.78.207:7002/ORCLPDB1 # ORCL为你的Oracle实例名
username: mes # 替换为你的Oracle用户名 username: mes # 替换为你的Oracle用户名
password: root_mes123456 # 替换为你的Oracle密码 password: root_mes123456 # 替换为你的Oracle密码
# sqlserver: # sqlserver:
......
...@@ -40,10 +40,14 @@ public class PlanResultServiceTest { ...@@ -40,10 +40,14 @@ public class PlanResultServiceTest {
// sortService.test1(); // sortService.test1();
// nsgaiiUtils.Test(); // nsgaiiUtils.Test();
// planResultService.execute2("AD62106303684459949A7323D114BF60");//2000
planResultService.execute2("15210B13B88A453F8B84AAC7F16C7541");//2000
// planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000 // planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000
// planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600 // planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600
// planResultService.execute2("EAF3C94B8F3345278F226C94FB0FED86");//bom // planResultService.execute2("EAF3C94B8F3345278F226C94FB0FED86");//bom
planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//2000 // planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//2000
// planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//5000 // planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//5000
// planResultService.execute2("C8B533BD8944405B9A2F8823C575C204");//500 // planResultService.execute2("C8B533BD8944405B9A2F8823C575C204");//500
// planResultService.execute2("EFDD34E4B5BC434BAEAE6A84DFCD4E7B");//20 // planResultService.execute2("EFDD34E4B5BC434BAEAE6A84DFCD4E7B");//20
......
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