修改排产工单为移入排产人

parent 4967ea77
...@@ -13,7 +13,15 @@ public class FileHelper { ...@@ -13,7 +13,15 @@ public class FileHelper {
public static void writeLogFile(String message) { public static void writeLogFile(String message) {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+"-"; String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+"-";
try (PrintWriter writer = new PrintWriter(new FileWriter(LOG_FILE_PATH+date+LOG_FILE, true))) { // 确保目录存在
java.io.File logDir = new java.io.File(LOG_FILE_PATH);
if (!logDir.exists()) {
logDir.mkdirs(); // 创建目录(包括父目录)
}
String filePath = LOG_FILE_PATH + date + LOG_FILE;
try (PrintWriter writer = new PrintWriter(new FileWriter(filePath, true))) {
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
writer.println("[" + timestamp + "] " + message); writer.println("[" + timestamp + "] " + message);
System.out.println("[" + timestamp + "] " + message); System.out.println("[" + timestamp + "] " + message);
......
...@@ -796,7 +796,7 @@ public class ResourceGanttController { ...@@ -796,7 +796,7 @@ public class ResourceGanttController {
return new ArrayList<>(); return new ArrayList<>();
} }
List<Machine> machineList = planResultService.InitCalendarToAllMachines1(sceneId); List<Machine> machineList = planResultService.InitCalendarToAllMachines2(sceneId);
// 转换为 ResourceGanttVO 格式 // 转换为 ResourceGanttVO 格式
List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>(); List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>();
...@@ -825,7 +825,7 @@ public class ResourceGanttController { ...@@ -825,7 +825,7 @@ public class ResourceGanttController {
throw new RuntimeException("未找到对应的场景文件"); throw new RuntimeException("未找到对应的场景文件");
} }
List<Machine> machineList = planResultService.InitCalendarToAllMachines1(sceneId); List<Machine> machineList = planResultService.InitCalendarToAllMachines2(sceneId);
// 转换为 ResourceGanttVO 格式 // 转换为 ResourceGanttVO 格式
List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>(); List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>();
......
...@@ -16,4 +16,5 @@ public class ApsTimeConfig { ...@@ -16,4 +16,5 @@ public class ApsTimeConfig {
private BigDecimal freezeDate; private BigDecimal freezeDate;
private BigDecimal startCount; private BigDecimal startCount;
private BigDecimal endCount; private BigDecimal endCount;
private LocalDateTime deadlineTime;
} }
\ No newline at end of file
...@@ -21,7 +21,7 @@ public class Machine { ...@@ -21,7 +21,7 @@ public class Machine {
private double actualWorkTime; private double actualWorkTime;
private double rate; private double rate;
private String department;
// 事件回调 // 事件回调
private Consumer<Void> shiftsChanged; private Consumer<Void> shiftsChanged;
......
...@@ -2,6 +2,7 @@ package com.aps.service.Algorithm; ...@@ -2,6 +2,7 @@ package com.aps.service.Algorithm;
import com.aps.common.util.FileHelper; import com.aps.common.util.FileHelper;
import com.aps.common.util.ProductionDeepCopyUtil; import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.common.util.SpringContextUtil;
import com.aps.entity.Algorithm.*; import com.aps.entity.Algorithm.*;
import com.aps.entity.DiscreteParameterDuration; import com.aps.entity.DiscreteParameterDuration;
import com.aps.entity.ProdEquipment; import com.aps.entity.ProdEquipment;
...@@ -10,7 +11,9 @@ import com.aps.entity.basic.*; ...@@ -10,7 +11,9 @@ import com.aps.entity.basic.*;
import com.aps.service.DiscreteParameterDurationService; import com.aps.service.DiscreteParameterDurationService;
import com.aps.service.DiscreteParameterMatrixService; import com.aps.service.DiscreteParameterMatrixService;
import com.aps.service.plan.MachineSchedulerService; import com.aps.service.plan.MachineSchedulerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.DelegatingServerHttpResponse; import org.springframework.http.server.DelegatingServerHttpResponse;
import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Duration; import java.time.Duration;
...@@ -24,6 +27,9 @@ import java.util.concurrent.locks.ReentrantLock; ...@@ -24,6 +27,9 @@ import java.util.concurrent.locks.ReentrantLock;
* 作者:佟礼 * 作者:佟礼
* 时间:2025-11-24 * 时间:2025-11-24
*/ */
public class GeneticDecoder { public class GeneticDecoder {
private final Map<String, Chromosome> decodingCache = new HashMap<>(); private final Map<String, Chromosome> decodingCache = new HashMap<>();
// 缓存大小限制 // 缓存大小限制
...@@ -41,9 +47,10 @@ public class GeneticDecoder { ...@@ -41,9 +47,10 @@ public class GeneticDecoder {
private MachineCalculator machineCalculator; private MachineCalculator machineCalculator;
private List<OrderMaterialRequirement> orderMaterials; private List<OrderMaterialRequirement> orderMaterials;
private DiscreteParameterMatrixService discreteParameterMatrixService;
private DiscreteParameterMatrixService discreteParameterMatrixService;
public GeneticDecoder(GlobalParam globalParam,LocalDateTime baseTime, List<Machine> machines, List<Order> orders, public GeneticDecoder(GlobalParam globalParam,LocalDateTime baseTime, List<Machine> machines, List<Order> orders,
List<Material> materials, MachineSchedulerService machineScheduler, List<OrderMaterialRequirement> _orderMaterials) { List<Material> materials, MachineSchedulerService machineScheduler, List<OrderMaterialRequirement> _orderMaterials) {
this.baseTime = baseTime; this.baseTime = baseTime;
...@@ -830,14 +837,17 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -830,14 +837,17 @@ if(finishedOrder==null||finishedOrder.size()==0)
//离散参数 //离散参数
// prev.getDiscreteParameter() // prev.getDiscreteParameter()
setupTime = (prev.getProductId() != operation.getProductId()) // setupTime = (prev.getProductId() != operation.getProductId())
? (int) discreteParameterMatrixService.getDiscreteParameterMatrixValue(prev, operation) // ? (int) discreteParameterMatrixService.getDiscreteParameterMatrixValue(prev, operation)
: 0; // : 0;
DiscreteParameterMatrixService service = SpringContextUtil.getBean(DiscreteParameterMatrixService.class);
if (service != null) {
if (setupTime > 0) { double discreteParameterMatrixValue = service.getDiscreteParameterMatrixValue(prev, operation);
System.out.println("设备 " + machine.getId() + " 需要换型,因为产品从 " + prev.getProductId() + " 变更为 " + operation.getProductId()); setupTime = (int) discreteParameterMatrixValue;
System.out.println(setupTime+"换型时间"+"huanxingshijian ");
} }
} }
......
...@@ -76,6 +76,9 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -76,6 +76,9 @@ public class LanuchServiceImpl implements LanuchService {
DispatchService dispatchService; DispatchService dispatchService;
@Autowired @Autowired
RoutingDiscreteParamService routingDiscreteParamService; RoutingDiscreteParamService routingDiscreteParamService;
@Autowired
MesScheduleService mesScheduleService;
/** /**
* 生成场景数据 * 生成场景数据
* *
...@@ -107,10 +110,25 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -107,10 +110,25 @@ public class LanuchServiceImpl implements LanuchService {
prodEquipSpecialCalService.copyFromEquipCapacityDef(sceneId); prodEquipSpecialCalService.copyFromEquipCapacityDef(sceneId);
List<MesSchedule> mesSchedules = mesScheduleService.lambdaQuery()
.eq(MesSchedule::getIsDeleted, 0)
.eq(MesSchedule::getScheduleUserId, username)
.list();
// 2. 获取工单列表
List<String> apsOrderIds = mesSchedules.stream()
.map(MesSchedule::getApsOrderId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
List<ApsOrder> apsOrders = apsOrderService.lambdaQuery() List<ApsOrder> apsOrders = apsOrderService.lambdaQuery()
.eq(ApsOrder::getIsdeleted, 0) .eq(ApsOrder::getIsdeleted, 0)
.eq(ApsOrder::getSchedulestatus, 1) .eq(ApsOrder::getSchedulestatus, 1)
.eq(ApsOrder::getCreatoruserid, username) // .eq(ApsOrder::getCreatoruserid, username)
.in(ApsOrder::getId, apsOrderIds)
.list(); .list();
if (CollectionUtils.isEmpty(apsOrders)) { if (CollectionUtils.isEmpty(apsOrders)) {
throw new SceneGenerationException("工单列表不能为空"); throw new SceneGenerationException("工单列表不能为空");
......
...@@ -1570,5 +1570,178 @@ private GlobalParam InitGlobalParam() ...@@ -1570,5 +1570,178 @@ private GlobalParam InitGlobalParam()
} }
public List<Machine> InitCalendarToAllMachines2(String SceneId) {
GlobalParam globalParam=InitGlobalParam();
boolean IsUseCalendar = globalParam.isIsUseCalendar();
// 按设备分组
List<ProdEquipment> ProdEquipments= _prodEquipmentService.lambdaQuery()
.eq(ProdEquipment::getSceneId,SceneId)
.list();
List<Long> MachineIds = ProdEquipments.stream()
.map(ProdEquipment::getEquipId)
.distinct()
.sorted()
.collect(Collectors.toList());
List<Machine> machines = new ArrayList<>();
List<PlanResource> PlanResources = _PlanResourceService.lambdaQuery()
.eq(PlanResource::getIsdeleted, 0)
.list();
for (Long id : MachineIds) {
Machine machine = new Machine();
machine.setId(id);
machines.add(machine);
}
//节假日
// List<MesHoliday> holidays= _MesHolidayService.list();
if (IsUseCalendar) {
LambdaQueryWrapper<ProdEquipSpecialCal> ProdEquipSpecialCalWrapper = new LambdaQueryWrapper<>();
ProdEquipSpecialCalWrapper.eq(ProdEquipSpecialCal::getSceneId, SceneId);
List<ProdEquipSpecialCal> ProdEquipSpecialCals = _prodEquipSpecialCalService.list(ProdEquipSpecialCalWrapper);
List<MesShiftWorkSched> MesShiftWorkScheds = _MesShiftWorkSchedService.lambdaQuery()
.eq(MesShiftWorkSched::getIsdeleted, 0).list();
if (machines == null) {
return null;
}
for (Machine machine : machines) {
// 确保维护窗口列表不为null
if (machine.getMaintenanceWindows() == null) {
machine.setMaintenanceWindows(new ArrayList<>());
}
List<ProdEquipSpecialCal> machineProdEquipSpecialCals = ProdEquipSpecialCals.stream()
.filter(t -> t.getPlanResourceId() != null && t.getPlanResourceId() == machine.getId() && t.getReferenceType() == 1)
.collect(Collectors.toList());
List<Shift> shifts1 = new ArrayList<>();
for (ProdEquipSpecialCal machineProdEquipSpecialCal : machineProdEquipSpecialCals) {
List<MesShiftWorkSched> ShiftWorkScheds = MesShiftWorkScheds.stream()
.filter(t -> (long) t.getWeekWorkSchedId() == machineProdEquipSpecialCal.getReferenceId())
.collect(Collectors.toList());
List<Shift> Shifts = mergeShiftData(ShiftWorkScheds);
for (Shift shift : Shifts) {
shift.setMachineId(machine.getId());
shift.setStartDate(machineProdEquipSpecialCal.getStartDate());
shift.setEndDate(machineProdEquipSpecialCal.getEndDate());
shifts1.add(shift);
shift.setSpecial(true);
}
}
PlanResource PlanResource = PlanResources.stream()
.filter(t -> t.getId() == machine.getId())
.findFirst().orElse(null);
if (PlanResource != null) {
machine.setCode(PlanResource.getReferenceCode());
machine.setName(PlanResource.getTitle());
machine.setDepartment(PlanResource.getDepartTitle());
List<MesShiftWorkSched> ShiftWorkScheds = MesShiftWorkScheds.stream()
.filter(t -> (long) t.getWeekWorkSchedId() == PlanResource.getWorkSchedId())
.collect(Collectors.toList());
List<Shift> Shifts = mergeShiftData(ShiftWorkScheds);
for (Shift shift : Shifts) {
shift.setMachineId(machine.getId());
shift.setSpecial(false);
shift.setStartDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
shift.setEndDate(LocalDateTime.of(2000, 1, 1, 0, 0, 0));
shifts1.add(shift);
}
}
if (shifts1 == null || shifts1.size() == 0) {
throw new RuntimeException(String.format("设备%s没有工作日历", machine.getCode().concat("_").concat(machine.getName())));
}
// 转换为列表返回
List<Shift> result = new ArrayList<>();
for (Shift shift : shifts1) {
// 处理跨天班次(开始时间晚于结束时间的情况,如 7:30 到 3:30)
if (shift.getEndTime().isBefore(shift.getStartTime())) {
// 创建第一天的班次 (开始时间到24:00)
Shift firstShift = new Shift();
firstShift.setStartTime(shift.getStartTime());
firstShift.setEndTime(LocalTime.of(23, 59, 59)); // 23:59:59代替24:00
firstShift.setDays(new HashSet<>(shift.getDays()));
firstShift.setStatus(shift.getStatus());
firstShift.setStartDate(shift.getStartDate());
firstShift.setEndDate(shift.getEndDate());
firstShift.setSpecial(shift.isSpecial());
// 创建第二天的班次 (00:00到结束时间)
Shift secondShift = new Shift();
secondShift.setStartTime(LocalTime.MIDNIGHT);
secondShift.setEndTime(shift.getEndTime());
secondShift.setDays(new HashSet<>(shift.getDays()));
secondShift.setStatus(shift.getStatus());
secondShift.setStartDate(shift.getStartDate().plusDays(1));
secondShift.setEndDate(shift.getEndDate().plusDays(1));
secondShift.setSpecial(shift.isSpecial());
result.add(firstShift);
result.add(secondShift);
} else {
// 正常班次直接添加
result.add(shift);
}
}
machine.setShifts(result);
List<ProdEquipSpecialCal> Holidays = ProdEquipSpecialCals.stream()
.filter(t -> t.getEquipId() == machine.getId() && t.getReferenceType() == 2)
.collect(Collectors.toList());
List<Holiday> Holidays1 = new ArrayList<>();
for (ProdEquipSpecialCal machineProdEquipSpecialCal : Holidays) {
Holiday holiday = new Holiday();
holiday.setStart(machineProdEquipSpecialCal.getStartDate());
holiday.setEnd(machineProdEquipSpecialCal.getEndDate());
Holidays1.add(holiday);
}
machine.setHolidays(Holidays1);
}
} else {
for (Machine machine : machines) {
List<Shift> shifts1 = new ArrayList<>();
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.setSpecial(false);
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);
}
}
return machines;
}
} }
\ No newline at end of file
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