Commit a448dbf7 authored by Tong Li's avatar Tong Li

遗传算法-设备日历缓存

parent 2ac79222
...@@ -100,6 +100,12 @@ ...@@ -100,6 +100,12 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.15.2</version> <!-- 建议与jackson-databind版本一致 -->
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.aps.common.util;
import com.aps.entity.Algorithm.DateRange;
import java.util.ArrayList;
import java.util.List;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
public class RangeSubtractUtil {
// 主方法:返回数组1与数组2无交集的区间列表
public static List<DateRange> getNonOverlappingRanges(List<DateRange> list1, List<DateRange> list2) {
List<DateRange> result = new ArrayList<>(list1); // 先复制数组1的所有区间
// 遍历数组2的每个区间,依次切割结果中的区间
for (DateRange target : list2) {
List<DateRange> temp = new ArrayList<>();
for (DateRange current : result) {
// 切割当前区间,排除与target重叠的部分
temp.addAll(current.subtract(target));
}
result = temp; // 更新结果为切割后的区间
}
// 过滤无效区间(start > end的情况)
result.removeIf(range -> !range.isValid());
return result;
}
// 测试示例
public static void test() {
// 构造数组1
List<DateRange> list1 = new ArrayList<>();
list1.add(new DateRange("2025/10/01 00:00:00", "2025/10/08 23:59:59"));
list1.add(new DateRange("2025/11/01 00:00:00", "2025/11/03 23:59:59"));
// 构造数组2
List<DateRange> list2 = new ArrayList<>();
list2.add(new DateRange("2025/10/03 00:00:00", "2025/10/03 23:59:59"));
list2.add(new DateRange("2025/10/06 00:00:00", "2025/10/07 23:59:59"));
// 计算无交集区间
List<DateRange> nonOverlapping = getNonOverlappingRanges(list1, list2);
// 输出结果(与题目示例一致)
System.out.println("无交集区间:");
nonOverlapping.forEach(range ->
System.out.println(DateTimeUtil.format(range.getStartDate(),"yyyy/MM/dd")
+ " ~ " + DateTimeUtil.format(range.getEndDate(),"yyyy/MM/dd"))
);
}
}
...@@ -146,6 +146,16 @@ public class ResourceGanttController { ...@@ -146,6 +146,16 @@ public class ResourceGanttController {
} }
@GetMapping("/SyncMachines")
@Operation(summary = "更新设备信息缓存", description = "更新设备信息缓存")
public void SyncMachines() {
// 调用 PlanResultService 获取 ScheduleChromosome 列表
planResultService.InitCalendarToAllMachines();
}
@PostMapping("/operationMove") @PostMapping("/operationMove")
......
package com.aps.entity.Algorithm;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
// 时间区间实体类
public class DateRange {
private LocalDateTime startDate;
private LocalDateTime endDate;
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// 构造方法(支持字符串日期)
public DateRange(String start, String end) {
this.startDate = LocalDateTime.parse(start, FORMATTER);
this.endDate = LocalDateTime.parse(end, FORMATTER);
}
// 构造方法(支持LocalDate)
public DateRange(LocalDateTime start, LocalDateTime end) {
this.startDate = start;
this.endDate = end;
}
// 判断当前区间是否有效(start <= end)
public boolean isValid() {
return !startDate.isAfter(endDate);
}
// 切割当前区间,排除与targetRange重叠的部分,返回无交集的子区间列表
public List<DateRange> subtract(DateRange targetRange) {
List<DateRange> result = new ArrayList<>();
// 1. 当前区间在targetRange之前:无交集,直接保留当前区间
if (this.endDate.isBefore(targetRange.startDate)) {
result.add(this);
return result;
}
// 2. 当前区间在targetRange之后:无交集,直接保留当前区间
if (this.startDate.isAfter(targetRange.endDate)) {
result.add(this);
return result;
}
// 3. 部分重叠:切割出无交集的子区间
// 左半部分(当前start ~ target的start前一天)
if (this.startDate.isBefore(targetRange.startDate)) {
result.add(new DateRange(this.startDate, targetRange.startDate.minusSeconds(1)));
}
// 右半部分(target的end后一天 ~ 当前end)
if (this.endDate.isAfter(targetRange.endDate)) {
result.add(new DateRange(targetRange.endDate.plusSeconds(1), this.endDate));
}
return result;
}
// 转换为字符串格式(方便输出)
@Override
public String toString() {
return startDate.format(FORMATTER) + " ~ " + endDate.format(FORMATTER);
}
// getter
public LocalDateTime getStartDate() {
return startDate;
}
public LocalDateTime getEndDate() {
return endDate;
}
}
// 核心方法实现
...@@ -15,7 +15,7 @@ public class Shift { ...@@ -15,7 +15,7 @@ public class Shift {
private LocalDateTime shiftDate; private LocalDateTime shiftDate;
private LocalDateTime startDate; private LocalDateTime startDate;
private LocalDateTime endDate; private LocalDateTime endDate;
private boolean isTemporaryShift; private boolean isTemporaryShift=false;
private int priority; private int priority;
private boolean isSpecial; private boolean isSpecial;
private Integer status;//0:正常班次 1:临时班次 2:维修 private Integer status;//0:正常班次 1:临时班次 2:维修
......
...@@ -153,7 +153,7 @@ if(routingIds.size()==0) ...@@ -153,7 +153,7 @@ if(routingIds.size()==0)
allRequirements.addAll(result.getMaterialRequirements()); allRequirements.addAll(result.getMaterialRequirements());
childorders.addAll(result.getChildOrders()); childorders.addAll(result.getChildOrders());
_newEntrys.addAll(result.getNewEntrys()); _newEntrys.addAll(result.getNewEntrys());
_newMachines.addAll(result.getNewMachines()); // _newMachines.addAll(result.getNewMachines());
} }
...@@ -163,9 +163,9 @@ if(routingIds.size()==0) ...@@ -163,9 +163,9 @@ if(routingIds.size()==0)
orders.addAll(childorders); orders.addAll(childorders);
// _allOperations.addAll(_newEntrys); // _allOperations.addAll(_newEntrys);
Set<Long> existIds = new HashSet<>(); Set<Long> existIds = new HashSet<>();
_Machines.addAll(_newMachines.stream() // _Machines.addAll(_newMachines.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()));
} }
...@@ -219,7 +219,7 @@ if(routingIds.size()==0) ...@@ -219,7 +219,7 @@ if(routingIds.size()==0)
materialRequirements.addAll(operationResult.getMaterialRequirements()); materialRequirements.addAll(operationResult.getMaterialRequirements());
childorders2.addAll(operationResult.getChildOrders()); childorders2.addAll(operationResult.getChildOrders());
_newEntrys.addAll(operationResult.getNewEntrys()); _newEntrys.addAll(operationResult.getNewEntrys());
_newMachines.addAll(operationResult.getNewMachines()); // _newMachines.addAll(operationResult.getNewMachines());
} }
} }
} }
...@@ -361,7 +361,7 @@ if(routingIds.size()==0) ...@@ -361,7 +361,7 @@ if(routingIds.size()==0)
Map<Integer, Object> list=_routingDataService.CreateEntry( sceneId, ProdEquipmentList, ProdLaunchOrders, routingDiscreteParams, ProdOrderProcesslist, processExecList,_entryRel ); Map<Integer, Object> list=_routingDataService.CreateEntry( sceneId, ProdEquipmentList, ProdLaunchOrders, routingDiscreteParams, ProdOrderProcesslist, processExecList,_entryRel );
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(sceneId,ProdEquipmentList,machineScheduler, globalParam.isIsUseCalendar()); // List<Machine> machines= _routingDataService.InitCalendarToAllMachines(sceneId,ProdEquipmentList,machineScheduler, globalParam.isIsUseCalendar());
if(list.get(1)!=null) if(list.get(1)!=null)
...@@ -371,7 +371,7 @@ if(routingIds.size()==0) ...@@ -371,7 +371,7 @@ if(routingIds.size()==0)
} }
Map<Integer, Object> rest=new HashMap<>(); Map<Integer, Object> rest=new HashMap<>();
rest.put(1,list.get(1)); rest.put(1,list.get(1));
rest.put(2,machines); // rest.put(2,machines);
return rest; return rest;
} }
...@@ -590,7 +590,7 @@ if(routingIds.size()==0) ...@@ -590,7 +590,7 @@ if(routingIds.size()==0)
_childorders.add(childorder); _childorders.add(childorder);
List<Entry> newentrys=(List<Entry>)list.get(1); List<Entry> newentrys=(List<Entry>)list.get(1);
_newEntrys.addAll(newentrys); _newEntrys.addAll(newentrys);
_newMachines.addAll((List<Machine>)list.get(2)); // _newMachines.addAll((List<Machine>)list.get(2));
orderMaterial.getProductOrderID().add(childorder.getId()); orderMaterial.getProductOrderID().add(childorder.getId());
operation.getDependentOnOrderIds().add(childorder.getId()); operation.getDependentOnOrderIds().add(childorder.getId());
// 递归构建BOM // 递归构建BOM
...@@ -601,7 +601,7 @@ if(routingIds.size()==0) ...@@ -601,7 +601,7 @@ if(routingIds.size()==0)
materialRequirements.addAll(childResult.getMaterialRequirements()); materialRequirements.addAll(childResult.getMaterialRequirements());
_childorders.addAll(childResult.getChildOrders()); _childorders.addAll(childResult.getChildOrders());
_newEntrys.addAll(childResult.getNewEntrys()); _newEntrys.addAll(childResult.getNewEntrys());
_newMachines.addAll(childResult.getNewMachines()); // _newMachines.addAll(childResult.getNewMachines());
} }
} }
} }
......
package com.aps.service.Algorithm; package com.aps.service.Algorithm;
import com.aps.common.util.RangeSubtractUtil;
import com.aps.entity.*; import com.aps.entity.*;
import com.aps.entity.Algorithm.DateRange;
import com.aps.entity.Algorithm.DependencyType; import com.aps.entity.Algorithm.DependencyType;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult; import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo; import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
...@@ -57,6 +59,12 @@ public class RoutingDataService { ...@@ -57,6 +59,12 @@ public class RoutingDataService {
@Autowired @Autowired
private EquipMaintainTaskService _equipMaintainTaskService; private EquipMaintainTaskService _equipMaintainTaskService;
@Autowired
private SpecialCalendarService _specialCalendarService;
@Autowired
private SpecialCalendarDetailService _specialCalendarDetailService;
@Autowired @Autowired
private MesShiftWorkSchedService _MesShiftWorkSchedService; private MesShiftWorkSchedService _MesShiftWorkSchedService;
...@@ -379,7 +387,7 @@ public class RoutingDataService { ...@@ -379,7 +387,7 @@ public class RoutingDataService {
} }
public List<Machine> InitCalendarToAllMachines(MachineSchedulerService machineScheduler,boolean IsUseCalendar) { public List<Machine> InitCalendarToAllMachines(MachineSchedulerService machineScheduler,boolean IsUseCalendar,LocalDateTime baseTime) {
// 按设备分组 // 按设备分组
...@@ -391,7 +399,7 @@ public class RoutingDataService { ...@@ -391,7 +399,7 @@ public class RoutingDataService {
List<MesShiftWorkSched> MesShiftWorkScheds = _MesShiftWorkSchedService.lambdaQuery() List<MesShiftWorkSched> MesShiftWorkScheds = _MesShiftWorkSchedService.lambdaQuery()
.eq(MesShiftWorkSched::getIsdeleted, 0).list(); .eq(MesShiftWorkSched::getIsdeleted, 0).list();
//特殊日历 //设备能力
LambdaQueryWrapper<EquipCapacityDef> EquipSpecialCalWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EquipCapacityDef> EquipSpecialCalWrapper = new LambdaQueryWrapper<>();
EquipSpecialCalWrapper.eq(EquipCapacityDef::getIsDeleted, 0); EquipSpecialCalWrapper.eq(EquipCapacityDef::getIsDeleted, 0);
...@@ -402,9 +410,21 @@ public class RoutingDataService { ...@@ -402,9 +410,21 @@ public class RoutingDataService {
LambdaQueryWrapper<EquipMaintainTask> EquipMaintainTaskWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EquipMaintainTask> EquipMaintainTaskWrapper = new LambdaQueryWrapper<>();
EquipMaintainTaskWrapper.eq(EquipMaintainTask::getIsdeleted, 0); EquipMaintainTaskWrapper.eq(EquipMaintainTask::getIsdeleted, 0);
EquipMaintainTaskWrapper.eq(EquipMaintainTask::getStatus, 0); EquipMaintainTaskWrapper.eq(EquipMaintainTask::getStatus, 0);
EquipMaintainTaskWrapper.ge(EquipMaintainTask::getPlanFinishTime, baseTime);
List<EquipMaintainTask> EquipMaintainTasks = _equipMaintainTaskService.list(EquipMaintainTaskWrapper); List<EquipMaintainTask> EquipMaintainTasks = _equipMaintainTaskService.list(EquipMaintainTaskWrapper);
//特殊日历
LambdaQueryWrapper<SpecialCalendar> SpecialCalendarWrapper = new LambdaQueryWrapper<>();
SpecialCalendarWrapper.eq(SpecialCalendar::getIsDeleted, 0);
List<SpecialCalendar> SpecialCalendars = _specialCalendarService.list(SpecialCalendarWrapper);
//特殊日历
LambdaQueryWrapper<SpecialCalendarDetail> SpecialCalendarDetailWrapper = new LambdaQueryWrapper<>();
SpecialCalendarDetailWrapper.eq(SpecialCalendarDetail::getIsDeleted, 0);
// SpecialCalendarDetailWrapper.ge(SpecialCalendarDetail::getEndTime, baseTime);
List<SpecialCalendarDetail> SpecialCalendarDetails = _specialCalendarDetailService.list(SpecialCalendarDetailWrapper);
for (PlanResource resource : PlanResources) { for (PlanResource resource : PlanResources) {
...@@ -415,7 +435,7 @@ public class RoutingDataService { ...@@ -415,7 +435,7 @@ public class RoutingDataService {
if(!IsUseCalendar) if(!IsUseCalendar)
{ {
List<EquipCapacityDef> machineProdEquipSpecialCals = ProdEquipSpecialCals.stream() List<EquipCapacityDef> machineProdEquipSpecialCals = ProdEquipSpecialCals.stream()
.filter(t -> t.getPlanResourceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 1) .filter(t -> t.getPlanResourceId() != null &&t.getReferenceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 1)
.collect(Collectors.toList()); .collect(Collectors.toList());
List<Shift> shifts1 = new ArrayList<>(); List<Shift> shifts1 = new ArrayList<>();
for (EquipCapacityDef machineProdEquipSpecialCal : machineProdEquipSpecialCals) { for (EquipCapacityDef machineProdEquipSpecialCal : machineProdEquipSpecialCals) {
...@@ -434,6 +454,8 @@ public class RoutingDataService { ...@@ -434,6 +454,8 @@ public class RoutingDataService {
} }
if(resource.getWorkSchedId()!=null) {
List<MesShiftWorkSched> ShiftWorkScheds = MesShiftWorkScheds.stream() List<MesShiftWorkSched> ShiftWorkScheds = MesShiftWorkScheds.stream()
.filter(t -> (long) t.getWeekWorkSchedId() == resource.getWorkSchedId()) .filter(t -> (long) t.getWeekWorkSchedId() == resource.getWorkSchedId())
.collect(Collectors.toList()); .collect(Collectors.toList());
...@@ -446,17 +468,61 @@ public class RoutingDataService { ...@@ -446,17 +468,61 @@ public class RoutingDataService {
shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0)); shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
shifts1.add(shift); shifts1.add(shift);
} }
}else {
Shift shift=new Shift();
shift.setMachineId(machine.getId());
shift.setStartTime(LocalTime.of(0,0,0));
shift.setEndTime(LocalTime.of(23,59,59));
HashSet days= new HashSet<>();
days.add(1);
days.add(2);
days.add(3);
days.add(4);
days.add(5);
days.add(6);
days.add(0);
shift.setDays(days);
shift.setStartDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
shifts1.add(shift);
}
machine.setShifts(shifts1); machine.setShifts(shifts1);
//加班
List<EquipCapacityDef> machineProdEquipSpecialCals2 = ProdEquipSpecialCals.stream()
.filter(t -> t.getPlanResourceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 3)
.collect(Collectors.toList());
List<DateRange> shifts2 = new ArrayList<>();
for (EquipCapacityDef machineProdEquipSpecialCal : machineProdEquipSpecialCals2) {
List<SpecialCalendarDetail> SpecialCalendarDetails1 = SpecialCalendarDetails.stream()
.filter(t -> (long) t.getSpecialCalendarId() == machineProdEquipSpecialCal.getReferenceId())
.collect(Collectors.toList());
for (SpecialCalendarDetail cald : SpecialCalendarDetails1) {
DateRange shift = new DateRange(cald.getStartTime(),cald.getEndTime());
shifts2.add(shift);
}
}
List<EquipCapacityDef> Holidays = ProdEquipSpecialCals.stream() List<EquipCapacityDef> Holidays = ProdEquipSpecialCals.stream()
.filter(t -> t.getPlanResourceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 2) .filter(t -> t.getPlanResourceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 2)
.collect(Collectors.toList()); .collect(Collectors.toList());
List<Holiday> Holidays1 = new ArrayList<>(); List<DateRange> shifts3 = new ArrayList<>();
for (EquipCapacityDef machineProdEquipSpecialCal : Holidays) { for (EquipCapacityDef machineProdEquipSpecialCal : Holidays) {
DateRange shift = new DateRange(machineProdEquipSpecialCal.getEffectiveStartTime(),machineProdEquipSpecialCal.getEffectiveEndTime());
shifts3.add(shift);
}
List<DateRange> Holidaysn= RangeSubtractUtil.getNonOverlappingRanges(shifts3,shifts2);
List<Holiday> Holidays1 = new ArrayList<>();
for (DateRange cal : Holidaysn) {
Holiday holiday = new Holiday(); Holiday holiday = new Holiday();
holiday.setStart(machineProdEquipSpecialCal.getEffectiveStartTime()); holiday.setStart(cal.getStartDate());
holiday.setEnd(machineProdEquipSpecialCal.getEffectiveEndTime()); holiday.setEnd(cal.getEndDate());
Holidays1.add(holiday); Holidays1.add(holiday);
} }
machine.setHolidays(Holidays1); machine.setHolidays(Holidays1);
...@@ -499,31 +565,9 @@ public class RoutingDataService { ...@@ -499,31 +565,9 @@ public class RoutingDataService {
} }
machines.add(machine); machines.add(machine);
} }
//节假日
// List<MesHoliday> holidays= _MesHolidayService.list();
if (IsUseCalendar) {
if (machines == null) {
return null;
}
for (Machine machine : machines) {
// 确保维护窗口列表不为null
if (machine.getMaintenanceWindows() == null) {
machine.setMaintenanceWindows(new ArrayList<>());
}
}
}
// 4. 初始化机器时间线 // 4. 初始化机器时间线
for (Machine machine : machines) { for (Machine machine : machines) {
MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine); MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine);
...@@ -534,6 +578,7 @@ public class RoutingDataService { ...@@ -534,6 +578,7 @@ public class RoutingDataService {
} }
/** /**
* 合并重复的ShiftData,将serialNumber收集为列表 * 合并重复的ShiftData,将serialNumber收集为列表
* @param originalList 原始数据列表 * @param originalList 原始数据列表
......
...@@ -4,10 +4,7 @@ import com.aps.common.util.ProductionDeepCopyUtil; ...@@ -4,10 +4,7 @@ import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.entity.Algorithm.*; import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult; import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo; import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.basic.Entry; import com.aps.entity.basic.*;
import com.aps.entity.basic.GlobalParam;
import com.aps.entity.basic.MachineOption;
import com.aps.entity.basic.Order;
import com.aps.service.plan.MachineSchedulerService; import com.aps.service.plan.MachineSchedulerService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.ScopeMetadata; import org.springframework.context.annotation.ScopeMetadata;
...@@ -145,6 +142,80 @@ Integer newMachineId1=newMachineId.intValue(); ...@@ -145,6 +142,80 @@ Integer newMachineId1=newMachineId.intValue();
} }
/**
* 增加设备维修保养
* @param chromosome 染色体对象
*/
public void AddMaintenanceWindow(Chromosome chromosome,Long machineId, MaintenanceWindow maintenanceWindow,
GlobalParam globalParam) {
Machine machine= chromosome.getMachines().stream().filter(t->t.getId()==machineId)
.findFirst().orElse(null);
if(machine!=null)
{
maintenanceWindow.setId(UUID.randomUUID().toString());
machine.getMaintenanceWindows().add(maintenanceWindow);
}else {
throw new RuntimeException("未找到设备");
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
}
public List<MaintenanceWindow> GetMaintenanceWindow(Chromosome chromosome,Long machineId) {
if(machineId==0)
{
return chromosome.getMachines().stream()
// 过滤掉null的机器对象
.filter(machine -> machine != null)
// 过滤掉维护窗口为null的机器(避免后续空指针)
.filter(machine -> machine.getMaintenanceWindows() != null)
// 提取维护窗口列表(此时流是 Stream<List<MaintenanceWindow>>)
.map(Machine::getMaintenanceWindows)
// 扁平化为 Stream<MaintenanceWindow>(核心:将嵌套列表“拍平”)
.flatMap(List::stream)
// 收集为最终的List结果
.collect(Collectors.toList());
}
Machine machine= chromosome.getMachines().stream().filter(t->t.getId()==machineId)
.findFirst().orElse(null);
if(machine!=null)
{
return machine.getMaintenanceWindows();
}else {
throw new RuntimeException("未找到设备");
}
}
public void DelMaintenanceWindow(Chromosome chromosome,Long machineId,String maintenanceId,GlobalParam globalParam) {
Machine machine= chromosome.getMachines().stream().filter(t->t.getId()==machineId)
.findFirst().orElse(null);
if(machine!=null)
{
List<MaintenanceWindow> maintenanceWindows= machine.getMaintenanceWindows();
OptionalInt index = IntStream.range(0, maintenanceWindows.size())
.filter(i -> maintenanceId.equals(maintenanceWindows.get(i).getId()))
.findFirst();
machine.getMaintenanceWindows().remove(index);
}else {
throw new RuntimeException("未找到设备");
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
}
public void SpiltOperation(Chromosome chromosome, int opId,Double[] splitCounts, GlobalParam globalParam) public void SpiltOperation(Chromosome chromosome, int opId,Double[] splitCounts, GlobalParam globalParam)
{ {
List<Entry> allOperations = chromosome.getAllOperations(); List<Entry> allOperations = chromosome.getAllOperations();
......
...@@ -320,6 +320,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -320,6 +320,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
.eq(ProdLaunchOrder::getSceneId,SceneId) .eq(ProdLaunchOrder::getSceneId,SceneId)
.list(); .list();
GlobalParam globalParam=InitGlobalParam(); GlobalParam globalParam=InitGlobalParam();
// 3. 创建调度服务 // 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService( MachineSchedulerService machineScheduler = new MachineSchedulerService(
param.getBaseTime()); param.getBaseTime());
...@@ -521,8 +522,56 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -521,8 +522,56 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
return chromosome; return chromosome;
} }
public Chromosome AddMaintenanceWindow(String SceneId, Long machineId, MaintenanceWindow maintenanceWindow) {
GlobalParam globalParam=new GlobalParam();
Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId);
ScheduleOperationService ScheduleOperation=new ScheduleOperationService();
ScheduleOperation.AddMaintenanceWindow(chromosome,machineId,maintenanceWindow, globalParam);
// WriteScheduleSummary(chromosome);
_sceneService.saveChromosomeToFile(chromosome, SceneId);
return chromosome;
}
public Chromosome DelMaintenanceWindow(String SceneId, Long machineId,String maintenanceId) {
GlobalParam globalParam=new GlobalParam();
Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId);
ScheduleOperationService ScheduleOperation=new ScheduleOperationService();
ScheduleOperation.DelMaintenanceWindow(chromosome,machineId,maintenanceId, globalParam);
// WriteScheduleSummary(chromosome);
_sceneService.saveChromosomeToFile(chromosome, SceneId);
return chromosome;
}
public List<MaintenanceWindow> GetMaintenanceWindow(String SceneId, Long machineId, MaintenanceWindow maintenanceWindow) {
GlobalParam globalParam=new GlobalParam();
Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId);
ScheduleOperationService ScheduleOperation=new ScheduleOperationService();
List<MaintenanceWindow> maintenanceWindowList= ScheduleOperation.GetMaintenanceWindow(chromosome,machineId);
// WriteScheduleSummary(chromosome);
return maintenanceWindowList;
}
...@@ -699,12 +748,43 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -699,12 +748,43 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// 按设备分组 // 按设备分组
FileHelper.writeLogFile("初始化设备日历-----------开始-------"); FileHelper.writeLogFile("初始化设备日历-----------开始-------");
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(SceneId,ProdEquipments,machineScheduler,IsUseCalendar); // List<Machine> machines = _routingDataService.InitCalendarToAllMachines(SceneId, ProdEquipments, machineScheduler, IsUseCalendar);
List<Machine> machines= (List<Machine>)GlobalCacheUtil.get("machines");
if(machines!=null)
{
return machines;
}
machines= (List<Machine>)redisUtils.get("machines");
if(machines!=null)
{
return machines;
}
machines=InitCalendarToAllMachines();
FileHelper.writeLogFile("初始化设备日历-----------结束-------"); FileHelper.writeLogFile("初始化设备日历-----------结束-------");
GlobalCacheUtil.put("machines",machines, 10, TimeUnit.MINUTES);
return machines;
}
return machines; public List<Machine> InitCalendarToAllMachines ()
{
FileHelper.writeLogFile("初始化Redis设备日历-----------开始-------");
GlobalParam globalParam=InitGlobalParam();
ScheduleParams param = InitScheduleParams();
MachineSchedulerService machineScheduler = new MachineSchedulerService(
param.getBaseTime());
List<Machine> machines = _routingDataService.InitCalendarToAllMachines( machineScheduler, globalParam.isIsUseCalendar(),param.getBaseTime());
redisUtils.set("machines",machines);
FileHelper.writeLogFile("初始化Redis设备日历-----------结束-------");
return machines;
} }
private ScheduleParams InitScheduleParams() private ScheduleParams InitScheduleParams()
......
...@@ -37,7 +37,7 @@ spring: ...@@ -37,7 +37,7 @@ spring:
# Oracle数据源 # Oracle数据源
oracle: oracle:
driver-class-name: oracle.jdbc.OracleDriver driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//192.168.0.181:1522/ORCLPDB1 # ORCL为你的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:
......
package com.aps.demo; package com.aps.demo;
import com.aps.ApsApplication; import com.aps.ApsApplication;
import com.aps.common.util.RangeSubtractUtil;
import com.aps.entity.Algorithm.Chromosome; import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Gantt.ProductGanttVO; import com.aps.entity.Gantt.ProductGanttVO;
import com.aps.entity.basic.Machine; import com.aps.entity.basic.Machine;
...@@ -26,6 +27,8 @@ public class PlanResultServiceTest { ...@@ -26,6 +27,8 @@ public class PlanResultServiceTest {
@Test @Test
public void testExecute() { public void testExecute() {
// planResultService.getMaterials(); // planResultService.getMaterials();
// RangeSubtractUtil.test();
planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64"); planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64");
// planResultService.execute2("BE037838EF074B07B87D7DE763107398"); // planResultService.execute2("BE037838EF074B07B87D7DE763107398");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11); // LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11);
......
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