Commit 1bed79d7 authored by DESKTOP-VKRD9QF\Administration's avatar DESKTOP-VKRD9QF\Administration

Merge branch 'master' of http://39.100.78.207:1213/tongli/hyh.apsj

# Conflicts:
#	src/main/resources/machines.json
parents 2ba6a39a 1c20209d
package com.aps.entity.Algorithm;
/**
* 作者:佟礼
* 时间:2025-12-04
*/
public enum DependencyType {
FinishToStart(0), // 完成-开始(FS):串行 下料→加工→组装
StartToStart(1), // 开始-开始(SS): 加工 A 和加工 B 可同时进行 重叠 重叠生产:涂装开始后 30 分钟,烘烤可开始
FinishToFinish(2), // 完成-完成(FF):前置工序完成后,后继工序才能完成 所有并行加工工序需同时完成
StartToFinish(3); // 开始-完成(SF):前置工序开始后,后继工序才能完成
private final int value;
DependencyType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
package com.aps.entity.Algorithm;
import lombok.Data;
/**
* 作者:佟礼
* 时间:2025-12-04
*/
@Data
public class OperationDependency {
private int Id ;
private int prevOperationId ; // 前置工序ID
private int nextOperationId ; // 后继工序ID
private DependencyType dependencyType=DependencyType.FinishToStart ; // 依赖类型
}
......@@ -9,6 +9,40 @@ import lombok.Data;
@Data
public class ScheduleResultDetail {
private String Key;
private int StartTime; // 相对开始时间(分钟)
private int EndTime; // 相对结束时间(分钟)
private int StartTime; // 相对开始时间(秒)
private int EndTime; // 相对结束时间(秒)
private double OneTime; // 单件工时
private double Quantity; // 时间段
// Key 的 getter/setter
public String getKey() {
return Key;
}
public void setKey(String key) {
this.Key = key;
}
// StartTime 的 getter/setter
public int getStartTime() {
return StartTime;
}
public void setStartTime(int startTime) {
this.StartTime = startTime;
}
// EndTime 的 getter/setter
public int getEndTime() {
return EndTime;
}
public void setEndTime(int endTime) {
this.EndTime = endTime;
}
// 对应C#的计算属性 processingTime(通过方法实现)
public int getProcessingTime() {
return EndTime - StartTime; // 绝对处理时间(分钟)
}
}
package com.aps.entity.basic;
import com.aps.entity.Algorithm.OperationDependency;
import lombok.Data;
import java.util.ArrayList;
......@@ -12,7 +13,7 @@ import java.util.List;
@Data
public class Entry {
public Entry() {
PrevEntryIds=new ArrayList<Integer>();
PrevEntryIds=new ArrayList<OperationDependency>();
}
/**
......@@ -74,12 +75,12 @@ public class Entry {
/**
* 前工单ID
*/
public List<Integer> PrevEntryIds ;//前工序
public List<OperationDependency> PrevEntryIds ;//前工序
/**
* 工单ID
* 工单ID
*/
public List<Integer> NextEntryIds ;//后工序
public List<OperationDependency> NextEntryIds ;//后工序
/**
* 数据状态 1 拆分 2 新建
......
package com.aps.service.Algorithm;
import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.GlobalOperationInfo;
import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Algorithm.ScheduleResultDetail;
import com.aps.entity.basic.Entry;
import com.aps.entity.basic.GlobalParam;
import com.aps.entity.basic.MachineOption;
......@@ -173,9 +170,28 @@ public class ScheduleOperationService {
{
//存在则修改顺和前后序
entry.setSequence(nodeInfo.getGroupSerial());
entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds());
// entry.setPrevEntryIds(nodeInfo.getNewParentIds());
// entry.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
GlobalOperationInfo info= chromosome.getGlobalOpList().stream()
.filter(t->t.getOp().getId()==entry.getId())
.findFirst()
......@@ -196,8 +212,28 @@ public class ScheduleOperationService {
newOp.setId(nodeInfo.getGlobalSerial());
newOp.setSequence(nodeInfo.getGroupSerial());
newOp.setExecId(nodeInfo.getOriginalId());
newOp.setPrevEntryIds(nodeInfo.getNewParentIds());
newOp.setNextEntryIds(nodeInfo.getNewChildIds());
// newOp.setPrevEntryIds(nodeInfo.getNewParentIds());
// newOp.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
newOp.setQuantity(newids.get(nodeInfo.getOriginalId()));
newOp.setMainId(MainId);
newOp.setState(2);
......@@ -281,10 +317,10 @@ public class ScheduleOperationService {
for (Entry entry : newEntrys) {
if(entry.getNextEntryIds().size()>0)
{
for (Integer id : entry.getNextEntryIds()) {
for (OperationDependency od : entry.getNextEntryIds()) {
Entry nextentry= newEntrys.stream()
.filter(t->t.getGroupId()==entry.getGroupId()&&t.getId()==id)
.filter(t->t.getGroupId()==entry.getGroupId()&&t.getId()==od.getNextOperationId())
.findFirst()
.orElse(null);
if(nextentry!=null) {
......@@ -325,8 +361,28 @@ public class ScheduleOperationService {
entry.setGroupId(i+1);
entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId());
entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds());
// entry.setPrevEntryIds(nodeInfo.getNewParentIds());
// entry.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
entry.setMainId("");
entry.setState(2);
//工序基本信息
......@@ -487,8 +543,28 @@ public class ScheduleOperationService {
if(node!=null)
{
entry.setSequence(node.getGroupSerial());
entry.setPrevEntryIds(node.getNewParentIds());
entry.setNextEntryIds(node.getNewChildIds());
// entry.setPrevEntryIds(node.getNewParentIds());
// entry.setNextEntryIds(node.getNewChildIds());
if(node.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : node.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(node.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : node.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
GlobalOperationInfo info= chromosome.getGlobalOpList().stream()
.filter(t->t.getOp().getId()==entry.getId())
.findFirst()
......
......@@ -5,12 +5,9 @@ import com.aps.common.util.JsonFileReader;
import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.controller.gantt.FileUploadController;
import com.aps.entity.*;
import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Algorithm.ScheduleParams;
import com.aps.entity.Algorithm.ScheduleResultDetail;
import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.Schedule.GenVO;
import com.aps.entity.Schedule.MachineVO;
......@@ -140,10 +137,25 @@ public class PlanResultService {
}
}
public Chromosome execute1() {
try {
//List<ScheduleResultDetail> details=new ArrayList<>();
// ScheduleResultDetail detail1=new ScheduleResultDetail();
//
// detail1.setOneTime(100);//单件工时
//
//
// ScheduleResultDetail detail2=new ScheduleResultDetail();
//
// detail2.setOneTime(200);//单件工时
// details.add(detail1);
// details.add(detail2);
// mergeSegmentsWithDifferentOneTime(details, 50);
// 1. 读取数据
List<Machine> machines = loadData("machines.json", Machine.class);
List<Product> products = loadData("products.json", Product.class);
......@@ -171,23 +183,20 @@ public class PlanResultService {
}
ScheduleParams param = new ScheduleParams();
param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0));
param.setPopulationSize(50);
param.setMaxIterations(100);
param.setPopulationSize(1);
param.setMaxIterations(2);
// List<MesHoliday> holidays= _MesHolidayService.list();
// 创建节假日
List<Holiday> holidays = Arrays.asList(
new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
LocalDateTime.of(2025, 10, 7, 23, 59))
);
// 将节假日添加到所有设备中
addHolidaysToAllMachines(machines, holidays);
// addHolidaysToAllMachines(machines);
// 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
holidays, param.getBaseTime());
param.getBaseTime());
// 4. 初始化机器时间线
for (Machine machine : machines) {
......@@ -219,7 +228,10 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// entry.setMaterialRequirements(o.getMaterialRequirements()); // 假设Operation类有获取物料需求的方法
if (sequence != 1) {
entry.getPrevEntryIds().add(id - 1); // 假设Entry类有getPrevEntryIds()返回List<Integer>
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id - 1);
entry.getPrevEntryIds().add(od); // 假设Entry类有getPrevEntryIds()返回List<Integer>
}
allOperations.add(entry);
......@@ -799,8 +811,27 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
entry.setGroupId(i + 1);
entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId());
entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
ProdProcessExec op= ProdProcessExecs.stream()
.filter(t->t.getExecId().equals(entry.getExecId()))
.findFirst().orElse(null);
......
......@@ -5,42 +5,12 @@
"startTime": "08:00:00",
"endTime": "18:00:00",
"days": [1, 2, 3, 4, 5],
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"shiftDate": "0001-01-01T00:00:00",
"temporaryShift": false,
"priority": 0,
"status":0
},{
"startTime": "18:00:00",
"endTime": "20:00:00",
"days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "0001-01-01T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
},{
"startTime": "08:00:00",
"endTime": "18:00:00",
"days": [0],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
},{
"startTime": "08:00:00",
"endTime": "18:00:00",
"days": null,
"shiftDate": "2025-10-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
}],
"maintenanceWindows": [{
"startTime": "2025-10-08T10:00:00",
......@@ -55,8 +25,8 @@
"endTime": "18:00:00",
"days": [1, 2, 3,4,5],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false,
"priority": 0,
"status":0
......@@ -70,8 +40,8 @@
"endTime": "18:00:00",
"days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false,
"priority": 0,
"status":0
......@@ -85,8 +55,8 @@
"endTime": "18:00:00",
"days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false,
"priority": 0,
"status":0
......@@ -100,8 +70,8 @@
"endTime": "18:00:00",
"days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00",
"startDate": "2025-10-10T00:00:00",
"endDate": "2025-11-10T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false,
"priority": 0,
"status":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