Commit a6a8f36f authored by Tong Li's avatar Tong Li

Merge remote-tracking branch 'origin/tl'

parents 8ceb95e8 3c0b67c4
...@@ -27,5 +27,14 @@ public class OpMachine { ...@@ -27,5 +27,14 @@ public class OpMachine {
/** /**
* 单件工时 * 单件工时
*/ */
private double processingTime; // 加工时间 private double processingTime;
/**
* 单件工时
*/
private BigDecimal runtime;//持续时间
/**
* 产出
*/
private BigDecimal singleOut;//产出
} }
...@@ -18,6 +18,7 @@ public class OrderMaterialRequirement { ...@@ -18,6 +18,7 @@ public class OrderMaterialRequirement {
private String orderId; private String orderId;
private int operationId; private int operationId;
private String childOrderId; private String childOrderId;
private Long routingDetailId;
private String materialId; private String materialId;
private String materialCode; private String materialCode;
private String materialName; private String materialName;
......
package com.aps.entity.basic; package com.aps.entity.basic;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -50,4 +51,7 @@ private List<Integer> FinishOrderId ; ...@@ -50,4 +51,7 @@ private List<Integer> FinishOrderId ;
/// </summary> /// </summary>
private List<Integer> TargetFinishedOperationId; private List<Integer> TargetFinishedOperationId;
private double delayHours;//延迟时间 private double delayHours;//延迟时间
//物料需求
private List<OrderMaterialRequirement> materialRequirementList;
} }
\ No newline at end of file
...@@ -74,16 +74,16 @@ public class GeneticAlgorithm { ...@@ -74,16 +74,16 @@ public class GeneticAlgorithm {
throw new RuntimeException("没有待排产工单"); throw new RuntimeException("没有待排产工单");
} }
if(materials!=null&&materials.size()>0) { // if(materials!=null&&materials.size()>0) {
//
materialRequirementService.init(materials, orders, allOperations, _entryRel, machineScheduler, machines,_GlobalParam); // materialRequirementService.init(materials, orders, allOperations, _entryRel, machineScheduler, machines,_GlobalParam);
//
orderMaterials = materialRequirementService.buildMultiLevelRequirementNetwork(param.getBaseTime()); // orderMaterials = materialRequirementService.buildMultiLevelRequirementNetwork(param.getBaseTime());
Set<Long> existIds = new HashSet<>(); // Set<Long> existIds = new HashSet<>();
machines=machines.stream() // machines=machines.stream()
.filter(t->existIds.add(t.getId()))//HashSet.add() 方法:添加成功返回 true,重复返回 false; // .filter(t->existIds.add(t.getId()))//HashSet.add() 方法:添加成功返回 true,重复返回 false;
.collect(Collectors.toList()); // .collect(Collectors.toList());
} // }
LocalDateTime starttime=LocalDateTime.now(); LocalDateTime starttime=LocalDateTime.now();
FileHelper.writeLogFile("排产-----------开始-----------"+allOperations.get(0).getSceneId()); FileHelper.writeLogFile("排产-----------开始-----------"+allOperations.get(0).getSceneId());
......
...@@ -268,6 +268,9 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -268,6 +268,9 @@ if(finishedOrder==null||finishedOrder.size()==0)
opMachine.setSequence(sequence); opMachine.setSequence(sequence);
opMachine.setMachineId(selectedMachine.getMachineId()); opMachine.setMachineId(selectedMachine.getMachineId());
opMachine.setProcessingTime(selectedMachine.getProcessingTime()); opMachine.setProcessingTime(selectedMachine.getProcessingTime());
opMachine.setRuntime(selectedMachine.getRuntime());
opMachine.setSingleOut(selectedMachine.getSingleOut());
opMachineMap.add(opMachine); opMachineMap.add(opMachine);
} }
...@@ -350,7 +353,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -350,7 +353,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
// int changeoverTime =0; //(lastDiscreteParameter.isEmpty() || // int changeoverTime =0; //(lastDiscreteParameter.isEmpty() ||
// lastDiscreteParameter.equals(currentOp.getDiscreteParameter())) ? 0 : 0; // lastDiscreteParameter.equals(currentOp.getDiscreteParameter())) ? 0 : 0;
int actualEndTime = processWithSingleMachine(currentOp, machine, processTime, prevtime, chromosome); int actualEndTime = processWithSingleMachine(currentOp, machine, processTime, prevtime,machineOption, chromosome);
orderProcessCounter.put(groupId, orderProcessCounter.get(groupId) + 1); orderProcessCounter.put(groupId, orderProcessCounter.get(groupId) + 1);
orderLastEndTime.put(groupId, actualEndTime); orderLastEndTime.put(groupId, actualEndTime);
...@@ -365,14 +368,15 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -365,14 +368,15 @@ if(finishedOrder==null||finishedOrder.size()==0)
private int processWithSingleMachine(Entry operation, Machine machine, double processingTime, private int processWithSingleMachine(Entry operation, Machine machine, double processingTime,
int prevOperationEndTime, Chromosome chromosome) { int prevOperationEndTime,OpMachine machineOption, Chromosome chromosome) {
int processingTimeTotal=0; int processingTimeTotal=0;
int earliestStartTime = prevOperationEndTime; int earliestStartTime = prevOperationEndTime;
if(operation.getConstTime()==1)//常数时间 if(operation.getConstTime()==1)//常数时间
{ {
processingTimeTotal=(int)Math.ceil (processingTime); processingTimeTotal=(int)Math.ceil (processingTime);
}else { }else {
processingTimeTotal =(int)Math.ceil (processingTime * operation.getQuantity()); double t= machineOption.getRuntime().doubleValue()/machineOption.getSingleOut().doubleValue()*(operation.getQuantity());
processingTimeTotal =(int)Math.ceil (t);
} }
if(machine==null||operation.getMachineOptions()==null) if(machine==null||operation.getMachineOptions()==null)
...@@ -380,9 +384,9 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -380,9 +384,9 @@ if(finishedOrder==null||finishedOrder.size()==0)
return 0; return 0;
} }
MachineOption machineOption= operation.getMachineOptions().stream() // MachineOption machineOption= operation.getMachineOptions().stream()
.filter(t->t.getMachineId()==machine.getId()) // .filter(t->t.getMachineId()==machine.getId())
.findFirst().orElse(null); // .findFirst().orElse(null);
operation.setSelectMachineID(machine.getId()); operation.setSelectMachineID(machine.getId());
operation.setEquipCode(machine.getCode()); operation.setEquipCode(machine.getCode());
...@@ -443,6 +447,10 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -443,6 +447,10 @@ if(finishedOrder==null||finishedOrder.size()==0)
operation.setChangeLineTime(setupTime); operation.setChangeLineTime(setupTime);
geneDetails=(CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2); geneDetails=(CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2);
} }
}else {
geneDetails = machineCalculator.getNextAvailableTime(machine, earliestStartTime, -1,
processingTimeTotal, machineTasks, operation.IsInterrupt!=1, true,processingTime, operation.getQuantity(), true);
} }
// FileHelper.writeLogFile(" 开始 "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime + // FileHelper.writeLogFile(" 开始 "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime +
......
...@@ -103,6 +103,7 @@ public class MachineCalculator { ...@@ -103,6 +103,7 @@ public class MachineCalculator {
//判断换型开始时间是否在工作时间段内,要占用工作时间,分割工作时间 //判断换型开始时间是否在工作时间段内,要占用工作时间,分割工作时间
if(setupStartTime1.compareTo(shiftStart1)>0) if(setupStartTime1.compareTo(shiftStart1)>0)
{ {
//换型时间不考虑效率系数
ScheduleResultDetail time =new ScheduleResultDetail(); ScheduleResultDetail time =new ScheduleResultDetail();
time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, setupStartTime1)); time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, setupStartTime1));
time.setEndTime((int) ChronoUnit.SECONDS.between(baseTime, shift1.getEnd())); time.setEndTime((int) ChronoUnit.SECONDS.between(baseTime, shift1.getEnd()));
...@@ -213,9 +214,21 @@ public class MachineCalculator { ...@@ -213,9 +214,21 @@ public class MachineCalculator {
? slot.getStart() ? slot.getStart()
: startTime; : startTime;
LocalDateTime endCandidate = startCandidate.plusSeconds(processingTime);
if (endCandidate.isAfter(slot.getEnd())) { // LocalDateTime endCandidate = startCandidate.plusSeconds(processingTime);
long availableSeconds = ChronoUnit.SECONDS.between(startCandidate, slot.getEnd());
//实际可用时间
long availableSeconds_e =Math.round(availableSeconds*slot.getEfficiency()) ;
// if (endCandidate.isAfter(slot.getEnd())) {
if (processingTime>availableSeconds_e) {
CopyOnWriteArrayList<TimeSegment> timeSegments1= timeSegments.stream() CopyOnWriteArrayList<TimeSegment> timeSegments1= timeSegments.stream()
.filter(t->t.getStart().compareTo(startCandidate)>=0) .filter(t->t.getStart().compareTo(startCandidate)>=0)
.collect(Collectors.toCollection(CopyOnWriteArrayList::new)); .collect(Collectors.toCollection(CopyOnWriteArrayList::new));
...@@ -223,6 +236,10 @@ public class MachineCalculator { ...@@ -223,6 +236,10 @@ public class MachineCalculator {
machine, processingTime, startTime, machine, processingTime, startTime,
timeSegments1, oneTime, quantity); timeSegments1, oneTime, quantity);
} else { } else {
double e= (double)processingTime/slot.getEfficiency();
LocalDateTime endCandidate = startCandidate.plusSeconds((int)Math.ceil(e));
ScheduleResultDetail time = new ScheduleResultDetail(); ScheduleResultDetail time = new ScheduleResultDetail();
time.setKey(slot.getKey()); time.setKey(slot.getKey());
time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, startCandidate)); time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, startCandidate));
...@@ -268,15 +285,25 @@ public class MachineCalculator { ...@@ -268,15 +285,25 @@ public class MachineCalculator {
LocalDateTime startCandidate = slot.getStart().isAfter(prevTimeDateTime != null ? prevTimeDateTime : currentTime) LocalDateTime startCandidate = slot.getStart().isAfter(prevTimeDateTime != null ? prevTimeDateTime : currentTime)
? slot.getStart() ? slot.getStart()
: (prevTimeDateTime != null ? prevTimeDateTime : currentTime); : (prevTimeDateTime != null ? prevTimeDateTime : currentTime);
if(slot.getStart().isBefore(startCandidate))
{
int i=0;
}
LocalDateTime endCandidate = startCandidate.plusSeconds(processingTime);
if (endCandidate.isAfter(slot.getEnd())) { // LocalDateTime endCandidate = startCandidate.plusSeconds(processingTime);
long availableSeconds = ChronoUnit.SECONDS.between(startCandidate, slot.getEnd());
//实际可用时间
long availableSeconds_e =Math.round(availableSeconds*slot.getEfficiency()) ;
// if (endCandidate.isAfter(slot.getEnd())) {
if (processingTime>availableSeconds_e) {
return CaldEarliestStart(machine, processingTime, currentTime, prevtime, machineTasks,oneTime,quantity, checkprevtime,islockMachineTime,isInterrupt); return CaldEarliestStart(machine, processingTime, currentTime, prevtime, machineTasks,oneTime,quantity, checkprevtime,islockMachineTime,isInterrupt);
} else { } else {
double e= (double)processingTime/slot.getEfficiency();
LocalDateTime endCandidate = startCandidate.plusSeconds((int)Math.ceil(e));
ScheduleResultDetail time = new ScheduleResultDetail(); ScheduleResultDetail time = new ScheduleResultDetail();
time.setKey(slot.getKey()); time.setKey(slot.getKey());
time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, startCandidate)); time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, startCandidate));
......
...@@ -36,8 +36,14 @@ public interface LanuchService { ...@@ -36,8 +36,14 @@ public interface LanuchService {
List<RoutingDetail> getRoutingDetails(Integer routingHeaderId); List<RoutingDetail> getRoutingDetails(Integer routingHeaderId);
List<RoutingDetail> getRoutingDetails(List<Long> routingHeaderIds);
List<RoutingDetailEquip> getRoutingDetailEquip(Integer routingHeaderId, String routingCode); List<RoutingDetailEquip> getRoutingDetailEquip(Integer routingHeaderId, String routingCode);
List<RoutingDetailEquip> getRoutingDetailEquip(List<Long> routingHeaderId);
ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain, ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain,
RoutingDetail detail, RoutingDetail detail,
String sceneId,List<RoutingDetailEquip> routingDetailEquip); String sceneId,List<RoutingDetailEquip> routingDetailEquip);
......
...@@ -644,6 +644,22 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -644,6 +644,22 @@ public class LanuchServiceImpl implements LanuchService {
return routingDetails; return routingDetails;
} }
public List<RoutingDetail> getRoutingDetails(List<Long> routingHeaderIds) {
LambdaQueryWrapper<RoutingDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.in(RoutingDetail::getRoutingHeaderId, routingHeaderIds)
.eq(RoutingDetail::getIsDeleted, 0) // 添加 is_deleted=0 过滤条件
.orderByAsc(RoutingDetail::getTaskSeq);
List<RoutingDetail> routingDetails = routingDetailMapper.selectList(wrapper);
if (CollectionUtils.isEmpty(routingDetails)) {
log.error("工艺下无工序信息: {}", routingHeaderIds);
throw new RuntimeException("工艺下无工序信息: " + routingHeaderIds);
}
return routingDetails;
}
/** /**
◦ 批量插入工序执行记录 ◦ 批量插入工序执行记录
...@@ -1080,6 +1096,20 @@ if (connection.getDestoperationid() !=null && connection.getSourceoperationid() ...@@ -1080,6 +1096,20 @@ if (connection.getDestoperationid() !=null && connection.getSourceoperationid()
.eq(RoutingDetailEquip::getIsdeleted, 0) .eq(RoutingDetailEquip::getIsdeleted, 0)
.list();// 添加 is_deleted=0 过滤条件 .list();// 添加 is_deleted=0 过滤条件
// if (CollectionUtils.isEmpty(detailEquips)) {
// log.error("工艺下无设备信息: {}", routingHeaderId);
// throw new RuntimeException("工艺下无设备信息: " + routingCode);
// }
return detailEquips;
}
public List<RoutingDetailEquip> getRoutingDetailEquip(List<Long> routingHeaderId) {
List<RoutingDetailEquip> detailEquips = routingDetailEquipService.lambdaQuery()
.in(RoutingDetailEquip::getRoutingHeaderId, routingHeaderId)
.eq(RoutingDetailEquip::getIsdeleted, 0)
.list();// 添加 is_deleted=0 过滤条件
// if (CollectionUtils.isEmpty(detailEquips)) { // if (CollectionUtils.isEmpty(detailEquips)) {
// log.error("工艺下无设备信息: {}", routingHeaderId); // log.error("工艺下无设备信息: {}", routingHeaderId);
// throw new RuntimeException("工艺下无设备信息: " + routingCode); // throw new RuntimeException("工艺下无设备信息: " + routingCode);
......
...@@ -285,16 +285,24 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -285,16 +285,24 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
Map<Long,Double> machineIds=(Map<Long,Double>)list.get(3); Map<Long,Double> machineIds=(Map<Long,Double>)list.get(3);
machines= machines.stream().filter(t->machineIds.containsKey(t.getId())).collect(Collectors.toList()); // List<Long> equipIDs= materialRequirementService.preloadRoutingCache(SceneId,orders,Materials,globalParam.isIsCheckSf());
Set machineIds1=machineIds.keySet();
// if(equipIDs!=null&&equipIDs.size()>0)
// {
// machineIds1.addAll(equipIDs);
// }
machines= machines.stream().filter(t->machineIds1.contains(t.getId())).collect(Collectors.toList());
for (Machine machine : machines){ for (Machine machine : machines){
Long machineId=machine.getId(); Long machineId=machine.getId();
if(machineIds.get(machineId)>3600*24*200) { if(machineIds.get(machineId)!=null&&machineIds.get(machineId)>3600*24*200) {
int day = (int) (machineIds.get(machineId) / 3600 / 24)+100; int day = (int) (machineIds.get(machineId) / 3600 / 24)+100;
List<TimeSegment> segments = machineScheduler.generateTimeSegment(machine, null, day); List<TimeSegment> segments = machineScheduler.generateTimeSegment(machine, null, day);
machineScheduler.addSegmentsWithDeduplication(machine, segments); machineScheduler.addSegmentsWithDeduplication(machine, segments);
} }
} }
...@@ -1300,7 +1308,6 @@ private GlobalParam InitGlobalParam() ...@@ -1300,7 +1308,6 @@ private GlobalParam InitGlobalParam()
} }
} }
GlobalCacheUtil.put("material",materials, 10, TimeUnit.MINUTES);
FileHelper.writeLogFile("初始化物料-----------结束-------"); FileHelper.writeLogFile("初始化物料-----------结束-------");
return materials; return materials;
...@@ -1432,6 +1439,7 @@ private GlobalParam InitGlobalParam() ...@@ -1432,6 +1439,7 @@ private GlobalParam InitGlobalParam()
// }); // });
} }
redisUtils.set("material",materials); redisUtils.set("material",materials);
GlobalCacheUtil.put("material",materials, 10, TimeUnit.MINUTES);
return materials; return materials;
} }
...@@ -1443,6 +1451,13 @@ private GlobalParam InitGlobalParam() ...@@ -1443,6 +1451,13 @@ private GlobalParam InitGlobalParam()
return entrys; return entrys;
} }
private void InitRouting(String SceneId,List<Order> ProdLaunchOrders)
{
FileHelper.writeLogFile("初始化工艺-----------开始-------");
FileHelper.writeLogFile("初始化工艺-----------结束-------");
}
public GenVO convertGeneToGenVO(Gene gene, LocalDateTime baseTime) { public GenVO convertGeneToGenVO(Gene gene, LocalDateTime baseTime) {
......
...@@ -37,16 +37,16 @@ public class PlanResultServiceTest { ...@@ -37,16 +37,16 @@ public class PlanResultServiceTest {
// NSGAIIUtils nsgaiiUtils=new NSGAIIUtils(); // NSGAIIUtils nsgaiiUtils=new NSGAIIUtils();
// nsgaiiUtils.Test(); // nsgaiiUtils.Test();
// planResultService.execute2("FFAC5AA2E0B943D292933B28BDAB9068"); planResultService.execute2("FCB16D2535F24078BAD79729894C38D1");
// planResultService.execute2("726D4C1A712B4B1393175BD44B775B66"); // planResultService.execute2("726D4C1A712B4B1393175BD44B775B66");
// planResultService.execute2("265F24B6DF3C40E4B17D193B0CC8AAF2"); // planResultService.execute2("265F24B6DF3C40E4B17D193B0CC8AAF2");
// LocalDateTime t= LocalDateTime.of(2026, 02, 14, 1, 25, 52); // LocalDateTime t= LocalDateTime.of(2026, 02, 14, 1, 25, 52);
List<Integer> opids=new ArrayList<>();//BCA6FA43FFA444D3952CF8F6E1EA291B // List<Integer> opids=new ArrayList<>();//BCA6FA43FFA444D3952CF8F6E1EA291B
opids.add(7); // opids.add(7);
// planResultService.Move("27065EA0ECD14A81B7FAAFEF52273F93",opids,t,1265l,0); // planResultService.Move("27065EA0ECD14A81B7FAAFEF52273F93",opids,t,1265l,0);
// planResultService.Redecode("27065EA0ECD14A81B7FAAFEF52273F93"); // planResultService.Redecode("27065EA0ECD14A81B7FAAFEF52273F93");
// planResultService.Redecode("CA71321FE55B4437A3900315692F9220"); // planResultService.Redecode("CA71321FE55B4437A3900315692F9220");
planResultService.Drag("27065EA0ECD14A81B7FAAFEF52273F93",opids,6,false,0l); // planResultService.Drag("27065EA0ECD14A81B7FAAFEF52273F93",opids,6,false,0l);
// MaintenanceWindow maintenanceWindow=new MaintenanceWindow(); // MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
// maintenanceWindow.setStartTime(LocalDateTime.of(2025, 10, 21, 0, 0, 0)); // maintenanceWindow.setStartTime(LocalDateTime.of(2025, 10, 21, 0, 0, 0));
// maintenanceWindow.setEndTime(LocalDateTime.of(2025, 10, 31, 0, 0, 0)); // maintenanceWindow.setEndTime(LocalDateTime.of(2025, 10, 31, 0, 0, 0));
......
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