插单

parent 31b15e01
......@@ -961,7 +961,7 @@ if(targetOp.getSequence()>1) {
newOrder.setRoutingId(newLaunchOrder.getRoutingId());
newOrder.setRoutingCode(newLaunchOrder.getRoutingCode());
newOrder.setSerie(newLaunchOrder.getSerie());
newOrder.setNewCreate(true);
// 获取当前最大的Order ID
int maxOrderId = orders.stream()
......@@ -989,11 +989,32 @@ if(targetOp.getSequence()>1) {
newEntry.setGroupId(newGroupId);
newEntry.setQuantity(newLaunchOrder.getQuantity());
newEntry.setSequence(processExec.getTaskSeq() != null ? processExec.getTaskSeq().intValue() : 1);
newEntry.setNewCreate(true);
newEntry.setTaskSeq(processExec.getTaskSeq()); // 设置taskSeq字段
newEntry.setState(2);
// 设置工序相关信息
newEntry.setRoutingDetailId(processExec.getRoutingDetailId());
newEntry.setRoutingId(processExec.getRoutingId());
newEntry.setRoutingCode(processExec.getRoutingCode());
newEntry.setRoutingName(processExec.getRoutingName());
newEntry.setRoutingDetailName(processExec.getRoutingDetailName());
// 设置产品相关信息
newEntry.setProductId(newLaunchOrder.getMaterialId());
newEntry.setProductCode(newLaunchOrder.getMaterialCode());
newEntry.setProductName(newLaunchOrder.getMaterialName());
// 设置部门信息
if (processExec.getDepartmentId() != null) {
newEntry.setDepartmentId(processExec.getDepartmentId());
}
// 设置中断属性
newEntry.setIsInterrupt(processExec.getCanInterrupt());
// 设置设备类型信息
newEntry.setEquipTypeID(processExec.getMachineId());
// 使用runtime字段
if (processExec.getRuntime() != null) {
newEntry.setRuntime(processExec.getRuntime());
......@@ -1013,11 +1034,12 @@ if(targetOp.getSequence()>1) {
newEntry.setEquipTypeName(processExec.getEquipTypeName());
newEntry.setEquipTypeCode(processExec.getEquipTypeCode());
// 设置设备选项(从数据库加载或使用默认值)
// 这里需要根据实际情况设置MachineOptions
// 暂时使用空列表,后续在redecode时会重新计算
// 设备配置将在后面从插入位置的订单复制,这里先设置为空列表
newEntry.setMachineOptions(new ArrayList<>());
// 设置默认选中的设备ID(将在后面从插入位置订单复制)
newEntry.setSelectMachineID(null);
newEntrys.add(newEntry);
}
......@@ -1102,7 +1124,7 @@ if(targetOp.getSequence()>1) {
}
}
// 6. 将新订单插入到指定订单后面的位置
// 6. 将新订单插入到指定订单后面的位置,并使用相同的设备配置
List<Entry> afterOrderOps = allOperations.stream()
.filter(o -> o.getOrderId().equals(afterOrderId))
.sorted(Comparator.comparing(Entry::getSequence))
......@@ -1130,6 +1152,21 @@ if(targetOp.getSequence()>1) {
chromosome.getOperationSequencing().add(newGroupId);
}
}
// 使用插入位置订单的设备配置来更新新订单的工序
// 这样可以确保新订单使用相同的生产线和设备
for (int i = 0; i < newEntrys.size() && i < afterOrderOps.size(); i++) {
Entry newEntry = newEntrys.get(i);
Entry referenceEntry = afterOrderOps.get(i);
// 复制设备配置
if (referenceEntry.getMachineOptions() != null && !referenceEntry.getMachineOptions().isEmpty()) {
newEntry.setMachineOptions(new ArrayList<>(referenceEntry.getMachineOptions()));
newEntry.setSelectMachineID(referenceEntry.getSelectMachineID());
newEntry.setEquipCode(referenceEntry.getEquipCode());
newEntry.setEquipName(referenceEntry.getEquipName());
}
}
} else {
// 如果找不到afterOrder,就添加到末尾
for (int i = 0; i < newEntrys.size(); i++) {
......@@ -1137,8 +1174,16 @@ if(targetOp.getSequence()>1) {
}
}
// 临时设置isCheckSf为false,避免CreateNewOpSequence重新生成operationSequencing
boolean originalIsCheckSf = globalParam.isIsCheckSf();
globalParam.setIsCheckSf(false);
// 7. 重新解码,重新计算排产结果
redecode(chromosome, chromosome.getBaseTime(), globalParam);
// 恢复isCheckSf的原始值
globalParam.setIsCheckSf(originalIsCheckSf);
}
public void MergeOrder(Chromosome chromosome, String sourceorderId,String targetorderId, GlobalParam globalParam) {
......
......@@ -219,7 +219,7 @@ public class PlanResultService {
.collect(Collectors.toList());
ApsTimeConfig timeConfig = apsTimeConfigService.getOne(new LambdaQueryWrapper<>());
// 4.5 在排产前标记锁定期工单占用的设备时间段
// lockedOrderProcessorService.markLockedOrdersOccupiedTime(machines, timeConfig.getBaseTime());
lockedOrderProcessorService.markLockedOrdersOccupiedTime(machines, timeConfig.getBaseTime());
// 5. 执行调度算法
GeneticAlgorithm scheduler =new GeneticAlgorithm(globalParam,machines,orders,Materials1,materialIds,machineScheduler,entryRel,materialRequirementService,_sceneService,SceneId); //new GeneticAlgorithm(products, machines, orders, machineScheduler);
......@@ -234,7 +234,7 @@ public class PlanResultService {
// 添加锁定期工单到调度结果中
// 这里会从 Dispatch 表加载锁定期工单,并添加到 chromosome.result 中
// lockedOrderProcessorService.addLockedOrdersToResult(chromosome);
lockedOrderProcessorService.addLockedOrdersToResult(chromosome);
_sceneService.saveChromosomeToFile(chromosome, SceneId);
......@@ -1515,6 +1515,7 @@ public class PlanResultService {
newOrderId, newLaunchOrder.getOrderCode(), newProcessExecs.size());
// 调用ScheduleOperationService的方法将新订单加入排产
// 设备配置将从插入位置的订单复制,不需要单独加载
ScheduleOperationService scheduleOperation = new ScheduleOperationService(materialRequirementService, this);
scheduleOperation.InsertOrder(chromosome, afterOrderId, newOrderId, newLaunchOrder, newProcessExecs, globalParam);
......
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