场景接口返回统一修改

parent 2c8b8b29
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -17,14 +17,14 @@ import java.time.LocalDateTime; ...@@ -17,14 +17,14 @@ import java.time.LocalDateTime;
public class R<T> implements Serializable { public class R<T> implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Schema(description = "code码,通常为0为正常,500为异常,其它code码见异常对照表,为规范code码报错异常操作。所有异常报错码以数据表映射相关") @Schema(description = "code码,通常为200为正常,500为异常,其它code码见异常对照表,为规范code码报错异常操作。所有异常报错码以数据表映射相关")
@Getter @Getter
@Setter @Setter
private int code = 0; private int code = 200;
@Getter @Getter
@Setter @Setter
@Schema(description = "返回code码为0 时, 默认为success,其它的情况为具体的消息") @Schema(description = "返回code码为200 时, 默认为success,其它的情况为具体的消息")
private String msg = "success"; private String msg = "success";
@Getter @Getter
...@@ -39,31 +39,31 @@ public class R<T> implements Serializable { ...@@ -39,31 +39,31 @@ public class R<T> implements Serializable {
private LocalDateTime timestamp = LocalDateTime.now(); private LocalDateTime timestamp = LocalDateTime.now();
public static <T> R<T> ok() { public static <T> R<T> ok() {
return restResult(null, 0, "success"); return restResult(null, 200, "success");
} }
public static <T> R<T> ok(T data) { public static <T> R<T> ok(T data) {
return restResult(data, 0, "success"); return restResult(data, 200, "success");
} }
public static <T> R<T> ok(T data, String msg) { public static <T> R<T> ok(T data, String msg) {
return restResult(data, 0, msg); return restResult(data, 200, msg);
} }
public static <T> R<T> failed() { public static <T> R<T> failed() {
return restResult(null, 1, "error"); return restResult(null, 500, "error");
} }
public static <T> R<T> failed(String msg) { public static <T> R<T> failed(String msg) {
return restResult(null, 1, msg); return restResult(null, 500, msg);
} }
public static <T> R<T> failed(T data) { public static <T> R<T> failed(T data) {
return restResult(data, 1, "error"); return restResult(data, 500, "error");
} }
public static <T> R<T> failed(T data, String msg) { public static <T> R<T> failed(T data, String msg) {
return restResult(data, 1, msg); return restResult(data, 500, msg);
} }
public static <T> R<T> failed(int code, String msg) { public static <T> R<T> failed(int code, String msg) {
...@@ -96,7 +96,7 @@ public class R<T> implements Serializable { ...@@ -96,7 +96,7 @@ public class R<T> implements Serializable {
public R(Throwable e) { public R(Throwable e) {
super(); super();
this.msg = e.getMessage(); this.msg = e.getMessage();
this.code = 1; this.code = 500;
} }
private static <T> R<T> restResult(T data, int code, String msg) { private static <T> R<T> restResult(T data, int code, String msg) {
...@@ -113,6 +113,6 @@ public class R<T> implements Serializable { ...@@ -113,6 +113,6 @@ public class R<T> implements Serializable {
* @return * @return
*/ */
public boolean is() { public boolean is() {
return this.code == 0; return this.code ==200;
} }
} }
\ No newline at end of file
package com.aps.config;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.examples.Example; // 添加这个导入
import org.springdoc.core.customizers.OperationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.HandlerMethod;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class SwaggerMapParamConfig {
@Bean
public OperationCustomizer customizeOperation() {
return (operation, handlerMethod) -> {
if (operation.getRequestBody() != null &&
operation.getRequestBody().getContent() != null &&
operation.getRequestBody().getContent().get("application/json") != null) {
Schema<?> schema = operation.getRequestBody().getContent().get("application/json").getSchema();
if (schema instanceof MapSchema) {
addParamExamples(operation, handlerMethod);
}
}
return operation;
};
}
private void addParamExamples(io.swagger.v3.oas.models.Operation operation, HandlerMethod handlerMethod) {
String methodName = handlerMethod.getMethod().getName();
Map<String, Schema> properties = new HashMap<>();
Map<String, Example> examples = new HashMap<>(); // 修改这里:Object -> Example
switch (methodName) {
case "lanuch":
properties.put("sceneName", new StringSchema().description("场景名称").example("scene_001"));
properties.put("userId", new StringSchema().description("用户ID").example("111"));
examples.put("启动工单示例", createExample(
"启动指定场景的工单处理",
"{\n" +
" \"sceneName\": \"scene_001\",\n" +
" \"userId\": \"111\"\n" +
"}"
));
break;
case "schedule":
properties.put("sceneId", new StringSchema().description("场景ID").example("487282ECAF57435F9373BAAAFBE90616"));
examples.put("排程计算示例", createExample(
"执行场景的排程算法计算",
"{\n" +
" \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\"\n" +
"}"
));
break;
case "copyScene":
properties.put("oldSceneId", new StringSchema().description("原场景ID").example("B571EF6682DB463AB2977B1055A74112"));
properties.put("newSceneId", new StringSchema().description("新场景名称").example("scene_002"));
properties.put("userId", new StringSchema().description("用户ID").example("111"));
examples.put("完整复制示例", createExample(
"复制场景包含所有数据和配置",
"{\n" +
" \"oldSceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n" +
" \"newSceneName\": \"scene_002\",\n" +
" \"userId\": \"111\"\n" +
"}"
));
examples.put("最小复制示例", createExample(
"仅提供必需参数的场景复制",
"{\n" +
" \"oldSceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n" +
" \"newSceneName\": \"scene_002\",\n" +
" \"userId\": \"111\"\n" +
"}"
));
break;
case "exportPlan":
properties.put("sceneId", new StringSchema().description("场景ID").example("487282ECAF57435F9373BAAAFBE90616"));
examples.put("导出计划示例", createExample(
"导出指定场景的排程结果为生产计划",
"{\n" +
" \"sceneId\": \"487282ECAF57435F9373BAAAFBE90616\"\n" +
"}"
));
break;
case "deleteScene":
properties.put("sceneId", new StringSchema().description("场景ID").example("487282ECAF57435F9373BAAAFBE90616"));
examples.put("删除场景示例", createExample(
"删除指定的场景",
"{\n" +
" \"sceneId\": \"487282ECAF57435F9373BAAAFBE90616\"\n" +
"}"
));
examples.put("批量删除示例", createExample(
"删除多个场景(如果支持批量删除)",
"{\n" +
" \"sceneId\": \"487282ECAF57435F9373BAAAFBE90616\"\n" +
"}"
));
break;
case "getAllScene":
properties.put("userId", new StringSchema().description("用户ID").example("111"));
examples.put("获取场景示例", createExample(
"获取指定用户的所有场景",
"{\n" +
" \"userId\": \"111\"\n" +
"}"
));
examples.put("管理员查询示例", createExample(
"管理员查询系统所有场景(如果支持)",
"{\n" +
" \"userId\": \"111\"\n" +
"}"
));
break;
}
if (!properties.isEmpty()) {
MapSchema mapSchema = new MapSchema();
mapSchema.setProperties(properties);
mapSchema.setDescription(getMethodDescription(methodName));
if (!examples.isEmpty()) {
mapSchema.setExample(examples.values().iterator().next());
operation.getRequestBody().getContent().get("application/json").setExamples(examples); // 这行现在类型匹配了
}
operation.getRequestBody().getContent().get("application/json").setSchema(mapSchema);
}
}
// 修改这里:返回类型从 Map<String, Object> 改为 Example
private Example createExample(String summary, String value) {
Example example = new Example();
example.setSummary(summary);
example.setValue(value);
return example;
}
private String getMethodDescription(String methodName) {
switch (methodName) {
case "lanuch":
return "启动工单请求参数";
case "schedule":
return "排程计算请求参数";
case "copyScene":
return "复制场景请求参数";
case "exportPlan":
return "导出计划请求参数";
case "deleteScene":
return "删除场景请求参数";
case "getAllScene":
return "获取场景列表请求参数";
default:
return "请求参数";
}
}
}
...@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/lanuch") @RequestMapping("/lanuch")
...@@ -26,64 +27,112 @@ public class LanuchController { ...@@ -26,64 +27,112 @@ public class LanuchController {
@Autowired @Autowired
private ProdSceneConfigService prodSceneConfigService; private ProdSceneConfigService prodSceneConfigService;
/** /**
* 启动工单 * 启动工单
*
* @param sceneId 场景名称
* @param userId 用户名
* @return 处理结果
*/ */
@PostMapping("/execute") @PostMapping("/execute")
public R<String> lanuch( @Operation(summary = "启动工单")
@RequestParam String sceneId, public R<String> lanuch(@RequestBody Map<String, String> params) {
@RequestHeader(required = false) String userId) { String sceneName = params.get("sceneName");
String userId = params.get("userId");
if (sceneName == null || sceneName.trim().isEmpty()) {
return R.failed("场景名称不能为空");
}
return lanuchService.lanuch(sceneId, userId); return lanuchService.lanuch(sceneName, userId);
} }
@GetMapping("/schedule") /**
public Chromosome schedule(@RequestParam String sceneId) { * 执行排程
// 调用 PlanResultService 获取 ScheduleChromosome 列表 */
Chromosome scheduleChromosomes = planResultService.schedule(sceneId); @PostMapping("/schedule")
@Operation(summary = "运算")
public R<Chromosome> schedule(@RequestBody Map<String, String> params) {
String sceneId = params.get("sceneId");
// 提取所有场景ID if (sceneId == null || sceneId.trim().isEmpty()) {
return scheduleChromosomes; return R.failed("场景ID不能为空");
} }
try {
Chromosome scheduleChromosomes = planResultService.schedule(sceneId);
return R.ok(scheduleChromosomes);
} catch (Exception e) {
return R.failed("排程执行失败: " + e.getMessage());
}
}
/**
* 复制场景
*/
@PostMapping("/copyScene") @PostMapping("/copyScene")
public R<String> copyScene( @Operation(summary = "复制场景")
@RequestParam String newSceneId,@RequestParam String oldSceneId, public R<String> copyScene(@RequestBody Map<String, String> params) {
@RequestHeader(required = false) String userId) { String oldSceneId = params.get("oldSceneId");
String newSceneName = params.get("newSceneName");
String userId = params.get("userId");
if (oldSceneId == null || oldSceneId.trim().isEmpty()) {
return R.failed("原场景ID不能为空");
}
if (newSceneName == null || newSceneName.trim().isEmpty()) {
return R.failed("新场景名称不能为空");
}
if (userId == null || userId.trim().isEmpty()) {
return R.failed("用户名不能为空");
}
return lanuchService.copyScene(oldSceneId, userId, newSceneName);
}
/**
* 导出计划
*/
@PostMapping("/exportPlan")
@Operation(summary = "导出计划")
public R<String> exportPlan(@RequestBody Map<String, String> params) {
String sceneId = params.get("sceneId");
return lanuchService.copyScene(oldSceneId,userId,newSceneId); if (sceneId == null || sceneId.trim().isEmpty()) {
return R.failed("场景ID不能为空");
} }
@GetMapping("/exportPlan")
public R<String> exportPlan(@RequestParam String sceneId) {
// 调用 PlanResultService 获取 ScheduleChromosome 列表
return lanuchService.exportPlan(sceneId); return lanuchService.exportPlan(sceneId);
} }
/**
* 删除场景
*/
@PostMapping("/deleteScene")
@Operation(summary = "删除场景")
public R<Boolean> deleteScene(@RequestBody Map<String, String> params) {
String sceneId = params.get("sceneId");
@GetMapping("/deleteScene") if (sceneId == null || sceneId.trim().isEmpty()) {
public R<Boolean> deleteScene(@RequestParam String sceneId) { return R.failed("场景ID不能为空");
// 调用 PlanResultService 获取 ScheduleChromosome 列表 }
return R.ok(prodSceneConfigService.deleteSceneById(sceneId));
boolean result = prodSceneConfigService.deleteSceneById(sceneId);
return result ? R.ok(true) : R.failed("删除场景失败");
} }
@GetMapping("/getAllScene") /**
public R<List<ProdSceneConfig>> getAllScene(@RequestParam String userId) { * 获取用户所有场景
// 调用 PlanResultService 获取 ScheduleChromosome 列表 */
return R.ok(prodSceneConfigService.lambdaQuery() @PostMapping("/getAllScene")
.eq(ProdSceneConfig::getCreateUser,userId) @Operation(summary = "获取用户场景")
.list()); public R<List<ProdSceneConfig>> getAllScene(@RequestBody Map<String, String> params) {
String userId = params.get("userId");
if (userId == null || userId.trim().isEmpty()) {
return R.failed("用户ID不能为空");
} }
List<ProdSceneConfig> scenes = prodSceneConfigService.lambdaQuery()
.eq(ProdSceneConfig::getCreateUser, userId)
.list();
return R.ok(scenes);
}
} }
\ No newline at end of file
...@@ -488,7 +488,7 @@ public class ResourceGanttController { ...@@ -488,7 +488,7 @@ public class ResourceGanttController {
// 转换为 ResourceGanttVO 格式 // 转换为 ResourceGanttVO 格式
List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>(); List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>();
List<ResourceGanttVO> resourceGanttVOs = convertToResourceGanttVO1(schedule,sceneId); List<ResourceGanttVO> resourceGanttVOs = convertToResourceGanttVO1(schedule);
resourceGanttVOList.addAll(resourceGanttVOs); resourceGanttVOList.addAll(resourceGanttVOs);
return resourceGanttVOList; return resourceGanttVOList;
...@@ -497,13 +497,10 @@ public class ResourceGanttController { ...@@ -497,13 +497,10 @@ public class ResourceGanttController {
private List<ResourceGanttVO> convertToResourceGanttVO1(Chromosome scheduleChromosome,String sceneId) { private List<ResourceGanttVO> convertToResourceGanttVO1(Chromosome scheduleChromosome) {
List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>(); List<ResourceGanttVO> resourceGanttVOList = new ArrayList<>();
List<Machine> machineList = planResultService.InitCalendarToAllMachines1(sceneId); List<Machine> machineList = planResultService.InitCalendarToAllMachines1(scheduleChromosome.getScenarioID());
// 遍历所有机器资源 // 遍历所有机器资源
if (machineList != null) { if (machineList != null) {
for (int i = 0; i < machineList.size(); i++) { for (int i = 0; i < machineList.size(); i++) {
...@@ -511,16 +508,14 @@ public class ResourceGanttController { ...@@ -511,16 +508,14 @@ public class ResourceGanttController {
ResourceGanttVO resourceGanttVO = new ResourceGanttVO(); ResourceGanttVO resourceGanttVO = new ResourceGanttVO();
resourceGanttVO.setId(machine.getId()); resourceGanttVO.setId(machine.getId());
resourceGanttVO.setName(machine.getId() + "号设备"); resourceGanttVO.setName(machine.getId()+"号设备");
resourceGanttVO.setShift(convertToVO(machine)); resourceGanttVO.setShift(convertToVO(machine));
// 转换任务列表 // 转换任务列表
List<TaskVO> taskVOList = new ArrayList<>(); List<TaskVO> taskVOList = new ArrayList<>();
if (scheduleChromosome.getResult() != null) {
if (scheduleChromosome != null){
if (scheduleChromosome.getResult() != null ) {
// 筛选出属于当前设备的任务 // 筛选出属于当前设备的任务
List<GAScheduleResult> machineGenes = scheduleChromosome.getResult().stream() List<GAScheduleResult> machineGenes = scheduleChromosome.getResult().stream()
.filter(gene -> gene.getMachineId() == (machine.getId())) .filter(gene -> gene.getMachineId()==(machine.getId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
// 按开始时间排序 // 按开始时间排序
...@@ -572,9 +567,10 @@ public class ResourceGanttController { ...@@ -572,9 +567,10 @@ public class ResourceGanttController {
taskVO.setAbsolutePreparationTime(gene.getTeardownTime()); taskVO.setAbsolutePreparationTime(gene.getTeardownTime());
} }
} }
}
resourceGanttVO.setList(taskVOList); resourceGanttVO.setList(taskVOList);
resourceGanttVOList.add(resourceGanttVO); resourceGanttVOList.add(resourceGanttVO);
} }
...@@ -596,9 +592,6 @@ public class ResourceGanttController { ...@@ -596,9 +592,6 @@ public class ResourceGanttController {
List<ProductGanttVO> productGanttVOList = new ArrayList<>(); List<ProductGanttVO> productGanttVOList = new ArrayList<>();
// 按产品ID和工单ID分组基因 // 按产品ID和工单ID分组基因
if (scheduleChromosome!= null) {
if (scheduleChromosome.getResult() != null) { if (scheduleChromosome.getResult() != null) {
// 按工单ID分组 // 按工单ID分组
scheduleChromosome.getResult().stream() scheduleChromosome.getResult().stream()
...@@ -608,17 +601,17 @@ public class ResourceGanttController { ...@@ -608,17 +601,17 @@ public class ResourceGanttController {
ProductGanttVO productGanttVO = new ProductGanttVO(); ProductGanttVO productGanttVO = new ProductGanttVO();
GAScheduleResult firstGene = genes.get(0); GAScheduleResult firstGene = genes.get(0);
productGanttVO.setId(firstGene.getOrderId()); productGanttVO.setId(firstGene.getOrderId());
productGanttVO.setProductName("产品" + firstGene.getProductId()); // 默认值,实际应从订单数据获取 productGanttVO.setProductName("产品"+firstGene.getProductId()); // 默认值,实际应从订单数据获取
productGanttVO.setProductType(0); productGanttVO.setProductType(0);
productGanttVO.setProductId(firstGene.getProductId()); productGanttVO.setProductId(firstGene.getProductId());
// 计算总数量(假设同一批次) // 计算总数量(假设同一批次)
productGanttVO.setQuantity(firstGene.getQuantity()); productGanttVO.setQuantity(firstGene.getQuantity());
productGanttVO.setCode("编号" + firstGene.getProductId()); // 默认值 productGanttVO.setCode("编号"+firstGene.getProductId()); // 默认值
productGanttVO.setShopId(firstGene.getMachineId()); // 默认值 productGanttVO.setShopId(firstGene.getMachineId()); // 默认值
productGanttVO.setShopName(firstGene.getMachineId() + "号线"); // 默认值 productGanttVO.setShopName(firstGene.getMachineId()+"号线"); // 默认值
productGanttVO.setStatus("已发布"); productGanttVO.setStatus("已发布");
// productGanttVO.setHeaderId(firstGene.getProductId()); // productGanttVO.setHeaderId(firstGene.getProductId());
productGanttVO.setHeaderName("工艺" + firstGene.getProductId()); // 默认值 productGanttVO.setHeaderName("工艺"+firstGene.getProductId()); // 默认值
// 计算开始和结束时间 // 计算开始和结束时间
int minStartTime = genes.stream() int minStartTime = genes.stream()
...@@ -644,7 +637,7 @@ public class ResourceGanttController { ...@@ -644,7 +637,7 @@ public class ResourceGanttController {
taskVO.setId(gene.getOrderId()); // 生成唯一ID taskVO.setId(gene.getOrderId()); // 生成唯一ID
taskVO.setPlanId(String.valueOf(orderId)); taskVO.setPlanId(String.valueOf(orderId));
taskVO.setProductType(0); taskVO.setProductType(0);
taskVO.setProductName("产品" + gene.getProductId()); taskVO.setProductName("产品"+gene.getProductId());
taskVO.setProductId(String.valueOf(gene.getProductId())); taskVO.setProductId(String.valueOf(gene.getProductId()));
taskVO.setQuantity(gene.getQuantity()); taskVO.setQuantity(gene.getQuantity());
taskVO.setStart(scheduleChromosome.getBaseTime().plusSeconds(gene.getStartTime())); taskVO.setStart(scheduleChromosome.getBaseTime().plusSeconds(gene.getStartTime()));
...@@ -660,11 +653,11 @@ public class ResourceGanttController { ...@@ -660,11 +653,11 @@ public class ResourceGanttController {
scheduleChromosome.getBaseTime().plusMinutes(gene.getEndTime()))); scheduleChromosome.getBaseTime().plusMinutes(gene.getEndTime())));
taskVO.setEquipId(gene.getMachineId()); // 生成设备ID taskVO.setEquipId(gene.getMachineId()); // 生成设备ID
taskVO.setShopId(gene.getMachineId()); taskVO.setShopId(gene.getMachineId());
taskVO.setShopName(gene.getMachineId() + "车间"); taskVO.setShopName(gene.getMachineId()+"车间");
taskVO.setStatus(0); taskVO.setStatus(0);
// taskVO.setDetailId((long) gene.getProductId() * 1000 + gene.getOperationId()); // taskVO.setDetailId((long) gene.getProductId() * 1000 + gene.getOperationId());
// taskVO.setHeaderId(gene.getProductId()); // taskVO.setHeaderId(gene.getProductId());
taskVO.setHeaderName("工艺" + gene.getProductId()); taskVO.setHeaderName("工艺"+gene.getProductId());
// taskVO.setSeq(gene.getSequenceId()); // taskVO.setSeq(gene.getSequenceId());
// taskVO.setSeqName("工序名称"+gene.getSequenceId()); // taskVO.setSeqName("工序名称"+gene.getSequenceId());
// taskVO.setAbsoluteStart(scheduleChromosome.getBaseTime().plusMinutes(gene.getStartTime())); // taskVO.setAbsoluteStart(scheduleChromosome.getBaseTime().plusMinutes(gene.getStartTime()));
...@@ -678,7 +671,7 @@ public class ResourceGanttController { ...@@ -678,7 +671,7 @@ public class ResourceGanttController {
} }
}); });
} }
}
return productGanttVOList; return productGanttVOList;
} }
......
...@@ -7,6 +7,8 @@ import java.time.LocalDateTime; ...@@ -7,6 +7,8 @@ import java.time.LocalDateTime;
@Data @Data
public class ProdSceneConfig { public class ProdSceneConfig {
private String sceneId; private String sceneId;
private String sceneName; private String sceneName;
private String sceneDesc; private String sceneDesc;
......
...@@ -254,8 +254,7 @@ public class GeneticDecoder { ...@@ -254,8 +254,7 @@ public class GeneticDecoder {
int preTime = machineOption.getPreTime(); int preTime = machineOption.getPreTime();
int setupTime = calculateSetupTime(chromosome.getResult(), operation, machine, machineOption); int setupTime = calculateSetupTime(chromosome.getResult(), operation, machine, machineOption);
System.out.println(" 处理时间: " + processingTime + ", 后处理: " + teardownTime +
", 前处理: " + preTime + ", 换型: " + setupTime);
// 确定任务的最早开始时间(基于前一道工序的完整结束时间,包含后处理) // 确定任务的最早开始时间(基于前一道工序的完整结束时间,包含后处理)
...@@ -284,32 +283,25 @@ public class GeneticDecoder { ...@@ -284,32 +283,25 @@ public class GeneticDecoder {
machineAvailableTime += setupTime; machineAvailableTime += setupTime;
// 平滑模式:换型在非工作时间进行,不额外占用设备时间 // 平滑模式:换型在非工作时间进行,不额外占用设备时间
System.out.println(" 平滑模式换型:在非工作时间进行,设备可用时间不变");
} else { } else {
// 标准模式:换型需要额外占用设备时间 // 标准模式:换型需要额外占用设备时间
machineAvailableTime += setupTime; machineAvailableTime += setupTime;
System.out.println(" 标准模式换型:需要额外占用设备 " + setupTime + " 分钟");
} }
} }
earliestStartTime = Math.max(earliestStartTime, machineAvailableTime); earliestStartTime = Math.max(earliestStartTime, machineAvailableTime);
} }
System.out.println(" 最终最早开始时间: " + earliestStartTime +
" (前序工序结束含后处理: " + prevOperationEndTime + ", 设备可用: " +
(lastGeneOnMachine != null ? lastGeneOnMachine.getEndTime() : 0) +
", 换型: " + setupTime + ")");
// 根据换型模式调整处理时间 // 根据换型模式调整处理时间
// int processingTimeForScheduling; // int processingTimeForScheduling;
if (_globalParam.is_smoothSetup()) { if (_globalParam.is_smoothSetup()) {
// 平滑模式:只需要安排主处理时间 // 平滑模式:只需要安排主处理时间
// processingTimeForScheduling = processingTimeTotal; // processingTimeForScheduling = processingTimeTotal;
System.out.println(" 平滑模式:安排主处理时间 " + processingTime + " 分钟");
} else { } else {
// 标准模式:需要安排主处理时间+换型时间 // 标准模式:需要安排主处理时间+换型时间
processingTimeTotal = processingTimeTotal + setupTime; processingTimeTotal = processingTimeTotal + setupTime;
System.out.println(" 标准模式:安排主处理+" + setupTime + "分钟换型=" + processingTimeTotal + "分钟");
} }
GAScheduleResult existingResult = chromosome.getResultOld().stream().filter(r-> r.getOperationId() == operation.Id).findFirst().orElse(null); GAScheduleResult existingResult = chromosome.getResultOld().stream().filter(r-> r.getOperationId() == operation.Id).findFirst().orElse(null);
...@@ -346,7 +338,6 @@ public class GeneticDecoder { ...@@ -346,7 +338,6 @@ public class GeneticDecoder {
.orElse(null); .orElse(null);
if (conflictingGene != null) { if (conflictingGene != null) {
System.out.println(" ⚠️ 检测到时间冲突,重新调度");
int conflictSetupStartTime = conflictingGene.getEndTime(); int conflictSetupStartTime = conflictingGene.getEndTime();
int conflictSetupTime = calculateSetupTimeForConflict(chromosome.getResult(),operation , machine, machineOption, conflictingGene); int conflictSetupTime = calculateSetupTimeForConflict(chromosome.getResult(),operation , machine, machineOption, conflictingGene);
int conflictEarliestStartTime = conflictSetupStartTime + conflictSetupTime; int conflictEarliestStartTime = conflictSetupStartTime + conflictSetupTime;
...@@ -365,7 +356,6 @@ public class GeneticDecoder { ...@@ -365,7 +356,6 @@ public class GeneticDecoder {
.mapToInt(ScheduleResultDetail::getEndTime) .mapToInt(ScheduleResultDetail::getEndTime)
.max() .max()
.orElse(0); .orElse(0);
System.out.println(" 重新安排时间: " + ConvertTime(startTime) + " - " + ConvertTime(endTime));
} }
} }
...@@ -655,7 +645,6 @@ public class GeneticDecoder { ...@@ -655,7 +645,6 @@ public class GeneticDecoder {
.orElse(null); .orElse(null);
if (lastGeneOnMachine == null) { if (lastGeneOnMachine == null) {
System.out.println("设备 " + machine.getId() + " 上无历史任务,换型时间为0");
return 0; return 0;
} }
Entry prev= _allOperations.stream(). Entry prev= _allOperations.stream().
...@@ -673,7 +662,6 @@ public class GeneticDecoder { ...@@ -673,7 +662,6 @@ public class GeneticDecoder {
if (setupTime > 0) { if (setupTime > 0) {
System.out.println("设备 " + machine.getId() + " 需要换型,因为产品从 " + prev.getProductId() + " 变更为 " + operation.getProductId());
} }
} }
...@@ -694,9 +682,7 @@ public class GeneticDecoder { ...@@ -694,9 +682,7 @@ public class GeneticDecoder {
setupTime = 0; setupTime = 0;
} }
if (setupTime > 0) {
System.out.println("设备 " + machine.getId() + " 需要换型,因为产品从 " + conflictingGene.getProductId() + " 变更为 " + operation.getProductId());
}
return setupTime; return setupTime;
} }
......
...@@ -44,36 +44,32 @@ public class Initialization { ...@@ -44,36 +44,32 @@ public class Initialization {
* 生成初始种群 * 生成初始种群
*/ */
public List<Chromosome> generateInitialPopulation(ScheduleParams param, List<GlobalOperationInfo> globalOpList) { public List<Chromosome> generateInitialPopulation(ScheduleParams param, List<GlobalOperationInfo> globalOpList) {
List<Chromosome> population = new ArrayList<>();
// 按比例生成不同类型个体(GS:40%, LS:40%, RS:20%) // 按比例生成不同类型个体(GS:40%, LS:40%, RS:20%)
int gsCount = (int) (param.getPopulationSize() * param.getGsRatio()); int gsCount = (int) (param.getPopulationSize() * param.getGsRatio());
int lsCount =gsCount+ (int) (param.getPopulationSize() * param.getLsRatio()); int lsCount = gsCount + (int) (param.getPopulationSize() * param.getLsRatio());
int rsCount = param.getPopulationSize() - gsCount - lsCount; int rsCount = param.getPopulationSize() - gsCount - lsCount;
int populationSize=param.getPopulationSize(); int populationSize = param.getPopulationSize();
// 并行循环:对应 Parallel.For(0, PopulationSize, i => { ... })
IntStream.range(0, populationSize)
.parallel() // 开启并行
.forEach(i -> {
Chromosome chromo = new Chromosome(); // 初始化染色体
// 使用并行流生成所有染色体,然后收集到列表中,避免并发修改ArrayList的问题
List<Chromosome> population = IntStream.range(0, populationSize)
.parallel()
.mapToObj(i -> {
Chromosome chromo = new Chromosome();
// 全局选择(GS):按GlobalOpId顺序生成MachineSelection // 全局选择(GS):按GlobalOpId顺序生成MachineSelection
if (i < gsCount) { if (i < gsCount) {
generateGSChromosome(chromo,globalOpList); // 对应 C# GenerateGSChromosome generateGSChromosome(chromo, globalOpList);
} else if (i < lsCount) { } else if (i < lsCount) {
// 局部选择(LS):按GlobalOpId顺序生成MachineSelection(仅负载计算范围不同) // 局部选择(LS):按GlobalOpId顺序生成MachineSelection(仅负载计算范围不同)
generateLSChromosome(chromo,globalOpList); generateLSChromosome(chromo, globalOpList);
} else { } else {
// 随机选择(RS):按GlobalOpId顺序生成MachineSelection(仅机器选择随机) // 随机选择(RS):按GlobalOpId顺序生成MachineSelection(仅机器选择随机)
generateRSChromosome(chromo,globalOpList); generateRSChromosome(chromo, globalOpList);
} }
population.add(chromo); // 赋值到数组,线程安全(数组索引唯一) return chromo;
}); })
.collect(Collectors.toList());
return population; return population;
} }
...@@ -113,7 +109,6 @@ int populationSize=param.getPopulationSize(); ...@@ -113,7 +109,6 @@ int populationSize=param.getPopulationSize();
.min(Comparator.comparingDouble(m ->machineLoad.getOrDefault(m.getMachineId(), (double)0) + m.getProcessingTime())) .min(Comparator.comparingDouble(m ->machineLoad.getOrDefault(m.getMachineId(), (double)0) + m.getProcessingTime()))
.orElseThrow(() -> new NoSuchElementException("MachineOption not found for machine: " )); .orElseThrow(() -> new NoSuchElementException("MachineOption not found for machine: " ));
OptionalInt index = IntStream.range(0, optionalMachines.size()) OptionalInt index = IntStream.range(0, optionalMachines.size())
.filter(i -> minLoadMachine.getMachineId()==optionalMachines.get(i).getMachineId()) .filter(i -> minLoadMachine.getMachineId()==optionalMachines.get(i).getMachineId())
.findFirst(); .findFirst();
...@@ -177,6 +172,10 @@ int populationSize=param.getPopulationSize(); ...@@ -177,6 +172,10 @@ int populationSize=param.getPopulationSize();
// 选择“当前订单内设备负载+加工时间”最小的机器 // 选择“当前订单内设备负载+加工时间”最小的机器
List<MachineOption> optionalMachines = op.getMachineOptions(); List<MachineOption> optionalMachines = op.getMachineOptions();
if (optionalMachines == null || optionalMachines.isEmpty()) {
throw new IllegalStateException("工序 " + op.getId() + " 没有可用的机器选项");
}
MachineOption minLoadMachine = optionalMachines.stream() MachineOption minLoadMachine = optionalMachines.stream()
......
...@@ -142,16 +142,16 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -142,16 +142,16 @@ public class LanuchServiceImpl implements LanuchService {
/** /**
*复制数据 *复制数据
* @param oldSceneName * @param oldSceneId
* @param newSceneName * @param newSceneName
* @return R<String> Result * @return R<String> Result
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public R<String> copyScene(String oldSceneName,String username, String newSceneName) { public R<String> copyScene(String oldSceneId,String username, String newSceneName) {
try { try {
// Validate input parameters // Validate input parameters
if (oldSceneName == null || oldSceneName.trim().isEmpty()) { if (oldSceneId == null || oldSceneId.trim().isEmpty()) {
return R.failed("场景ID不能为空"); return R.failed("场景ID不能为空");
} }
...@@ -163,7 +163,7 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -163,7 +163,7 @@ public class LanuchServiceImpl implements LanuchService {
// 检查场景是否存在 // 检查场景是否存在
ProdSceneConfig oldScene = prodSceneConfigService.lambdaQuery() ProdSceneConfig oldScene = prodSceneConfigService.lambdaQuery()
.eq(ProdSceneConfig::getSceneName, oldSceneName) .eq(ProdSceneConfig::getSceneId, oldSceneId)
.one(); .one();
if (oldScene == null) { if (oldScene == null) {
...@@ -185,7 +185,6 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -185,7 +185,6 @@ public class LanuchServiceImpl implements LanuchService {
// 复制染色体文件(排产结果) // 复制染色体文件(排产结果)
copyChromosomeFile(oldScene.getSceneId(), newSceneId); copyChromosomeFile(oldScene.getSceneId(), newSceneId);
log.info("场景数据复制完成,从 {} 到 {}", oldSceneName, newSceneName);
return R.ok("场景数据复制成功"); return R.ok("场景数据复制成功");
} catch (Exception e) { } catch (Exception e) {
...@@ -864,8 +863,9 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -864,8 +863,9 @@ public class LanuchServiceImpl implements LanuchService {
private List<ProdOrderProcess> createProcessRelations(ProdLaunchOrder prodOrderMain, String sceneId, Map<Long, String> routingDetailIdToExecIdMap) { private List<ProdOrderProcess> createProcessRelations(ProdLaunchOrder prodOrderMain, String sceneId, Map<Long, String> routingDetailIdToExecIdMap) {
LambdaQueryWrapper<RoutingDetailConnect> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RoutingDetailConnect> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(RoutingDetailConnect::getRoutingHeaderId, prodOrderMain.getRoutingId()) wrapper.eq(RoutingDetailConnect::getRoutingHeaderId, prodOrderMain.getRoutingId())
.eq(RoutingDetailConnect::getIsdeleted, 0); // 添加 isdeleted=0 过滤条件 .eq(RoutingDetailConnect::getIsdeleted, 0)
.isNotNull(RoutingDetailConnect::getSourceoperationid) // 添加 sourceoperationid 不为 null 的过滤条件
.isNotNull(RoutingDetailConnect::getSourceoperation);
List<RoutingDetailConnect> connections = routingDetailConnectService.list(wrapper); List<RoutingDetailConnect> connections = routingDetailConnectService.list(wrapper);
return connections.stream() return connections.stream()
......
...@@ -553,7 +553,6 @@ public class AlgorithmScheduler8 { ...@@ -553,7 +553,6 @@ public class AlgorithmScheduler8 {
.orElse(null); .orElse(null);
if (lastGeneOnMachine == null) { if (lastGeneOnMachine == null) {
System.out.println("设备 " + machine.getId() + " 上无历史任务,换型时间为0");
return 0; return 0;
} }
...@@ -562,7 +561,6 @@ public class AlgorithmScheduler8 { ...@@ -562,7 +561,6 @@ public class AlgorithmScheduler8 {
: 0; : 0;
if (setupTime > 0) { if (setupTime > 0) {
System.out.println("设备 " + machine.getId() + " 需要换型,因为产品从 " + lastGeneOnMachine.getProductId() + " 变更为 " + currentOrder.getProductId());
} }
return setupTime; return setupTime;
......
...@@ -552,6 +552,8 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -552,6 +552,8 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
return chromosomes; return chromosomes;
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("调度执行失败", e); throw new RuntimeException("调度执行失败", e);
} }
} }
......
...@@ -9,11 +9,16 @@ ...@@ -9,11 +9,16 @@
<id column="RESOURCE_ID" property="resourceId" /> <id column="RESOURCE_ID" property="resourceId" />
<result column="EQUIP_CODE" property="equipCode" /> <result column="EQUIP_CODE" property="equipCode" />
<result column="EQUIP_NAME" property="equipName" /> <result column="EQUIP_NAME" property="equipName" />
<result column="EXEC_ID" property="execId" />
<result column="SPEED" property="speed" />
<result column="ID" property="id" />
<result column="EFFICIENCY_VALUE" property="efficiencyValue" />
<result column="SETUP_TIME" property="setupTime" />
</resultMap> </resultMap>
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
SCENE_ID, EQUIP_ID, EQUIP_CODE, EQUIP_NAME, RESOURCE_ID SCENE_ID, EQUIP_ID, EQUIP_CODE, EQUIP_NAME, RESOURCE_ID, EXEC_ID, SPEED, ID, EFFICIENCY_VALUE, SETUP_TIME
</sql> </sql>
</mapper> </mapper>
\ No newline at end of file
...@@ -24,4 +24,9 @@ ...@@ -24,4 +24,9 @@
SCENE_ID, SCENE_NAME, SCENE_DESC, CREATE_TIME, SCENE_OWNER, SCENE_STATUS, RELATE_PLAN_ID, CREATE_USER, UPDATE_TIME, UPDATE_USER, EXTEND1, EXTEND2, EXTEND3 SCENE_ID, SCENE_NAME, SCENE_DESC, CREATE_TIME, SCENE_OWNER, SCENE_STATUS, RELATE_PLAN_ID, CREATE_USER, UPDATE_TIME, UPDATE_USER, EXTEND1, EXTEND2, EXTEND3
</sql> </sql>
<!-- 根据ID删除场景配置 -->
<delete id="deleteById" parameterType="string">
DELETE FROM prod_scene_config WHERE SCENE_ID = #{sceneId}
</delete>
</mapper> </mapper>
\ No newline at end of file
package com.aps.demo;
import com.aps.ApsApplication;
import com.aps.entity.Algorithm.Chromosome;
import com.aps.service.plan.PlanResultService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = ApsApplication.class)
public class PlanResultServiceTest {
@Autowired
private PlanResultService planResultService;
@Test
public void testExecute2() {
// 这里需要一个有效的SceneId来测试
// 在实际测试中,您需要提供一个数据库中存在的SceneId
String sceneId = "7E99857F64A44780AF06C326CAEE9682";
try {
Chromosome result = planResultService.execute2(sceneId);
System.out.println("执行成功,结果:" + (result != null ? "获得染色体对象" : "空结果"));
if (result != null) {
System.out.println("适应度: " + result.getFitness());
System.out.println("工序字符串: " + result.getOperationStr());
}
} catch (Exception e) {
System.err.println("执行过程中发生异常: " + e.getMessage());
e.printStackTrace();
}
}
}
\ 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