Commit 016c5717 authored by DESKTOP-VKRD9QF\Administration's avatar DESKTOP-VKRD9QF\Administration

Merge remote-tracking branch 'origin/jdt'

# Conflicts:
#	src/main/java/com/aps/service/impl/LanuchServiceImpl.java
#	src/main/java/com/aps/service/plan/PlanResultService.java
parents a62f09c8 b11e0318
......@@ -106,6 +106,11 @@
<version>2.15.2</version> <!-- 建议与jackson-databind版本一致 -->
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
</dependencies>
<build>
......
......@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@RestController
@RequestMapping("/lanuch")
......@@ -44,8 +45,8 @@ public class LanuchController {
R<ProdSceneConfig> result = lanuchService.lanuch(sceneName, userId);
// 异步更新物料和设备缓存
updateMaterialAndEquipmentCacheAsync();
// 异步更新物料和设备缓存,不等待完成
CompletableFuture.runAsync(this::updateMaterialAndEquipmentCacheAsync);
return result;
}
......@@ -56,7 +57,6 @@ public class LanuchController {
log.info("开始异步更新物料缓存");
planResultService.getMaterials();
log.info("物料缓存更新完成");
log.info("开始异步更新设备缓存");
planResultService.InitCalendarToAllMachines();
log.info("设备缓存更新完成");
......
package com.aps.controller.gantt;
import cn.hutool.core.bean.BeanUtil;
import com.aps.common.util.ParamValidator;
import com.aps.common.util.R;
import com.aps.entity.Algorithm.Chromosome;
......@@ -27,27 +28,26 @@ public class MaintenanceWindowController {
@PostMapping("/add")
@Operation(summary = "添加维护窗口", description = "为指定机器添加维护窗口",
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "维护窗口参数",
content = @io.swagger.v3.oas.annotations.media.Content(
mediaType = "application/json",
examples = @io.swagger.v3.oas.annotations.media.ExampleObject(
name = "添加维护窗口示例",
value = "{\n \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n \"machineId\": 3402,\n \"maintenanceWindow\": {\n \"id\": \"maintenance-001\",\n \"startTime\": \"2025-11-03T07:36:00.000Z\",\n \"endTime\": \"2025-11-03T09:36:00.000Z\",\n \"reason\": \"定期维护\"\n }\n}"
)
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "维护窗口参数",
content = @io.swagger.v3.oas.annotations.media.Content(
mediaType = "application/json",
examples = @io.swagger.v3.oas.annotations.media.ExampleObject(
name = "添加维护窗口示例",
value = "{\n \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n \"machineId\": 3402,\n \"maintenanceWindow\": {\n \"id\": \"maintenance-001\",\n \"startTime\": \"2025-11-03T07:36:00.000Z\",\n \"endTime\": \"2025-11-03T09:36:00.000Z\",\n \"reason\": \"定期维护\"\n }\n}"
)
)
)
)
)
public R<Chromosome> addMaintenanceWindow(@RequestBody Map<String, Object> params) {
public R<String> addMaintenanceWindow(@RequestBody Map<String, Object> params) {
String sceneId = ParamValidator.getString(params, "sceneId", "场景ID");
Long machineId = ParamValidator.getLong(params, "machineId", "机器ID");
MaintenanceWindow maintenanceWindow = (MaintenanceWindow) params.get("maintenanceWindow");
MaintenanceWindow maintenanceWindow = BeanUtil.toBean(params.get("maintenanceWindow"), MaintenanceWindow.class);
Chromosome result = planResultService.AddMaintenanceWindow(sceneId, machineId, maintenanceWindow);
return R.ok(result);
return R.ok("添加成功");
}
@DeleteMapping("/delete")
@PostMapping("/delete")
@Operation(summary = "删除维护窗口", description = "删除指定机器的维护窗口",
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "删除维护窗口请求参数",
......@@ -60,13 +60,13 @@ public class MaintenanceWindowController {
)
)
)
public R<Chromosome> delMaintenanceWindow(@RequestBody Map<String, Object> params) {
public R<String> delMaintenanceWindow(@RequestBody Map<String, Object> params) {
String sceneId = ParamValidator.getString(params, "sceneId", "场景ID");
Long machineId = ParamValidator.getLong(params, "machineId", "机器ID");
String maintenanceId = ParamValidator.getString(params, "maintenanceId", "维护窗口ID");
Chromosome result = planResultService.DelMaintenanceWindow(sceneId, machineId, maintenanceId);
return R.ok(result);
return R.ok("删除成功");
}
@PostMapping("/get")
......@@ -83,7 +83,7 @@ public class MaintenanceWindowController {
)
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "成功获取维护窗口列表")
@ApiResponse(responseCode = "200", description = "成功获取维护窗口列表")
})
public R<List<MaintenanceWindow>> getMaintenanceWindow(@RequestBody Map<String, Object> params) {
String sceneId = ParamValidator.getString(params, "sceneId", "场景ID");
......
......@@ -22,7 +22,7 @@ public class Entry {
/**
* 基因编号
*/
public int Id ;
public int id ;
/**
* 所属组ID 需要按照前后顺序生产的工单给一组
*/
......
......@@ -11,15 +11,18 @@ public class MaintenanceWindow {
private LocalDateTime endTime;
private String reason;
private String equipCode;
private String equipName;
public MaintenanceWindow() {}
public MaintenanceWindow(LocalDateTime startTime, LocalDateTime endTime, String reason) {
this.startTime = startTime;
this.endTime = endTime;
this.reason = reason;
}
/**
* 从Holiday对象构造MaintenanceWindow
* @param holiday 假期对象
......@@ -27,7 +30,7 @@ public class MaintenanceWindow {
public MaintenanceWindow(Holiday holiday) {
this(holiday.getStart(), holiday.getEnd(), "Holiday Period");
}
/**
* 从Holiday对象构造MaintenanceWindow(可指定原因)
* @param holiday 假期对象
......@@ -36,28 +39,28 @@ public class MaintenanceWindow {
public MaintenanceWindow(Holiday holiday, String reason) {
this(holiday.getStart(), holiday.getEnd(), reason);
}
// Getters and Setters
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
......@@ -69,18 +72,33 @@ public class MaintenanceWindow {
public void setId(String id) {
this.id = id;
}
public String getEquipCode() {
return equipCode;
}
public void setEquipCode(String equipCode) {
this.equipCode = equipCode;
}
public String getEquipName() {
return equipName;
}
public void setEquipName(String equipName) {
this.equipName = equipName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MaintenanceWindow that = (MaintenanceWindow) o;
return Objects.equals(startTime, that.startTime) &&
Objects.equals(endTime, that.endTime);
return Objects.equals(startTime, that.startTime) &&
Objects.equals(endTime, that.endTime);
}
@Override
public int hashCode() {
return Objects.hash(startTime, endTime);
......
// DataSourceType.java
package com.aps.entity.common;
public enum DataSourceType {
FILE("file"), // 文件数据源(现有)
DATABASE("db"); // 数据库数据源(新增)
private String type;
DataSourceType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public static DataSourceType fromString(String type) {
for (DataSourceType dataSource : DataSourceType.values()) {
if (dataSource.getType().equalsIgnoreCase(type)) {
return dataSource;
}
}
return FILE; // 默认返回FILE
}
}
\ No newline at end of file
// EntityConfig.java
package com.aps.entity.common;
public class EntityConfig {
private String entityName;
private DataSourceType dataSource;
private String tableName; // 数据库表名(如果是数据库源)
private String fieldName; // Chromosome字段名(如果是文件源)
private Class<?> entityClass; // 实体类(数据库实体使用)
// 构造方法
public EntityConfig() {}
public EntityConfig(String entityName, DataSourceType dataSource, String fieldName, String tableName, Class<?> entityClass) {
this.entityName = entityName;
this.dataSource = dataSource;
this.fieldName = fieldName;
this.tableName = tableName;
this.entityClass = entityClass;
}
// getter/setter
public String getEntityName() { return entityName; }
public void setEntityName(String entityName) { this.entityName = entityName; }
public DataSourceType getDataSource() { return dataSource; }
public void setDataSource(DataSourceType dataSource) { this.dataSource = dataSource; }
public String getTableName() { return tableName; }
public void setTableName(String tableName) { this.tableName = tableName; }
public String getFieldName() { return fieldName; }
public void setFieldName(String fieldName) { this.fieldName = fieldName; }
public Class<?> getEntityClass() { return entityClass; }
public void setEntityClass(Class<?> entityClass) { this.entityClass = entityClass; }
@Override
public String toString() {
return "EntityConfig{" +
"entityName='" + entityName + '\'' +
", dataSource=" + dataSource +
", tableName='" + tableName + '\'' +
", fieldName='" + fieldName + '\'' +
", entityClass=" + entityClass +
'}';
}
}
\ No newline at end of file
package com.aps.entity.common;
import com.aps.entity.ProdEquipment;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class EntityConfigConfiguration {
@Bean
public Map<String, EntityConfig> entityConfigMap() {
Map<String, EntityConfig> configMap = new HashMap<>();
// ========== 文件实体配置 ==========
addFileEntity(configMap, "order", "orders");
addFileEntity(configMap, "entry", "allOperations");
addFileEntity(configMap, "machine", "InitMachines");
addFileEntity(configMap, "globaloperationinfo", "globalOpList");
addFileEntity(configMap, "groupresult", "OperatRel");
// ========== 数据库实体配置 ==========
// 设备表配置
addDbEntity(configMap, "prod_equipment", "PROD_EQUIPMENT", ProdEquipment.class);
return configMap;
}
/**
* 添加文件实体配置
*/
private void addFileEntity(Map<String, EntityConfig> configMap, String entityName, String fieldName) {
EntityConfig config = new EntityConfig();
config.setEntityName(entityName);
config.setDataSource(DataSourceType.FILE);
config.setFieldName(fieldName);
config.setTableName(null);
config.setEntityClass(null);
configMap.put(entityName.toLowerCase(), config);
}
/**
* 添加数据库实体配置
*/
private void addDbEntity(Map<String, EntityConfig> configMap, String entityName, String tableName, Class<?> entityClass) {
EntityConfig config = new EntityConfig();
config.setEntityName(entityName);
config.setDataSource(DataSourceType.DATABASE);
config.setTableName(tableName);
config.setEntityClass(entityClass);
config.setFieldName(null);
configMap.put(entityName.toLowerCase(), config);
}
}
\ No newline at end of file
......@@ -301,7 +301,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
int opSequence = currentOp.getSequence();
GAScheduleResult existingResult = chromosome.getResultOld().stream()
.filter(r-> r.getOperationId() == currentOp.Id)
.filter(r-> r.getOperationId() == currentOp.getId())
.findFirst().orElse(null);
if(existingResult!=null) {
if(existingResult.isIsLocked())
......@@ -430,7 +430,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
// 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.getId()).findFirst().orElse(null);
if(existingResult!=null)
{
earliestStartTime = Math.max(earliestStartTime,existingResult.getDesignatedStartTime());
......
......@@ -313,8 +313,9 @@ if(routingIds.size()==0)
order.setRoutingId(headers1.getId());
ProdLaunchOrder prodOrderMain= convertToLaunchOrder(order,"");
List<RoutingDetailEquip> finalRoutingDetailEquips = routingDetailEquips;
List<ProdProcessExec> processExecList = RoutingDetails.stream()
.map(detail -> lanuchService.createProcessExec(prodOrderMain, detail, sceneId))
.map(detail -> lanuchService.createProcessExec(prodOrderMain, detail, sceneId, finalRoutingDetailEquips))
.collect(Collectors.toList());
List<ProdEquipment> ProdEquipmentList= lanuchService.batchInsertEquipMent(routingDetailEquips, sceneId,processExecList,false);
......
......@@ -543,6 +543,8 @@ public class RoutingDataService {
maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setEquipCode(equipMaintainTask.getEquipCode());
maintenanceWindow.setEquipName(equipMaintainTask.getEquipName());
maintenanceWindow.setReason("");
maintenanceWindows.add(maintenanceWindow);
}
......@@ -623,6 +625,8 @@ public class RoutingDataService {
maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setEquipCode(equipMaintainTask.getEquipCode());
maintenanceWindow.setEquipName(equipMaintainTask.getEquipName());
maintenanceWindow.setReason("");
maintenanceWindows.add(maintenanceWindow);
}
......
......@@ -155,6 +155,9 @@ Integer newMachineId1=newMachineId.intValue();
.findFirst().orElse(null);
if(machine!=null)
{
maintenanceWindow.setEquipCode(machine.getCode());
maintenanceWindow.setEquipName(machine.getName());
maintenanceWindow.setId(UUID.randomUUID().toString());
machine.getMaintenanceWindows().add(maintenanceWindow);
......
......@@ -40,7 +40,7 @@ public interface LanuchService {
ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain,
RoutingDetail detail,
String sceneId);
String sceneId,List<RoutingDetailEquip> routingDetailEquip);
List<ProdEquipment> batchInsertEquipMent(
List<RoutingDetailEquip> routingDetailEquips,
......
This diff is collapsed.
......@@ -246,8 +246,10 @@ public class LanuchServiceImpl implements LanuchService {
throw new RuntimeException("插入mes_order失败");
}
// List<ProdProcessExec> processExecList = prodProcessExecService.lambdaQuery()
// .eq(ProdProcessExec::getSceneId, sceneId)
// .list();
List<Entry> entrys= chromosome.getAllOperations();
// 遍历GAScheduleResult结果并转换为dispatch
List<Dispatch> dispatches = new ArrayList<>();
for (GAScheduleResult gaResult : chromosome.getResult()) {
......@@ -618,7 +620,7 @@ public class LanuchServiceImpl implements LanuchService {
List<RoutingDetail> routingDetails,
String sceneId, List<RoutingDetailEquip> routingDetailEquip) {
List<ProdProcessExec> processExecList = routingDetails.stream()
.map(detail -> createProcessExec(prodOrderMain, detail, sceneId))
.map(detail -> createProcessExec(prodOrderMain, detail, sceneId,routingDetailEquip))
.collect(Collectors.toList());
batchInsertEquipMent(routingDetailEquip, sceneId,processExecList,true);
......@@ -644,7 +646,7 @@ public class LanuchServiceImpl implements LanuchService {
*/
public ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain,
RoutingDetail detail,
String sceneId) {
String sceneId,List<RoutingDetailEquip> routingDetailEquip) {
ProdProcessExec prodProcessExec = new ProdProcessExec();
prodProcessExec.setExecId(UUID.randomUUID().toString().replace("-", ""));
......@@ -652,7 +654,18 @@ public class LanuchServiceImpl implements LanuchService {
prodProcessExec.setRoutingDetailId(detail.getId());
prodProcessExec.setTaskSeq(detail.getTaskSeq());
prodProcessExec.setRoutingDetailName(detail.getName());
prodProcessExec.setMachineId(detail.getEquipTypeId());
RoutingDetailEquip routingDetailEquip1 = routingDetailEquip.stream().
filter(detailEquip -> detailEquip.getRoutingDetailId().equals(detail.getId()))
.filter(detailEquip -> detailEquip.getType1() != null)
.filter(detailEquip -> detailEquip.getIsdeleted() == 0)
.findFirst()
.orElse(null);
prodProcessExec.setMachineId(routingDetailEquip1.getType1());
prodProcessExec.setRuntime(detail.getRuntime());
prodProcessExec.setSingleOut(detail.getSingleOut());
if (detail.getEquipTypeId() != null)
......
......@@ -1725,6 +1725,8 @@ private GlobalParam InitGlobalParam()
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setReason("");
maintenanceWindow.setEquipCode(equipMaintainTask.getEquipCode());
maintenanceWindow.setEquipName(equipMaintainTask.getEquipName());
maintenanceWindows.add(maintenanceWindow);
}
......@@ -1883,57 +1885,60 @@ private GlobalParam InitGlobalParam()
public List<Machine> InitCalendarToAllMachines3(Chromosome chromosome) {
List<Machine> machines = chromosome.getInitMachines();
Set<Long> machineIds = chromosome.getResult().stream()
.map(GAScheduleResult::getMachineId)
.collect(Collectors.toSet());
.map(GAScheduleResult::getMachineId)
.collect(Collectors.toSet());
machines = machines.stream()
.filter(machine -> machineIds.contains(machine.getId()))
.collect(Collectors.toList());
.filter(machine -> machineIds.contains(machine.getId()))
.collect(Collectors.toList());
for (Machine machine:machines) {
{
List<Shift> result = new ArrayList<>();
List<Shift> shifts = machine.getShifts();
for (Shift shift : shifts) {
// 处理跨天班次(开始时间晚于结束时间的情况,如 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<Shift> result = new ArrayList<>();
List<Shift> shifts = machine.getShifts();
for (Shift shift : shifts) {
// 处理跨天班次(开始时间晚于结束时间的情况,如 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);
}
}
return machines;
}
}
\ No newline at end of file
}
\ 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