物料需求

parent bf350b40
......@@ -81,7 +81,7 @@ public class LanuchController {
// 在这里可以添加时间格式转换逻辑
// 根据不同格式解析时间字符串
Chromosome scheduleChromosomes = planResultService.schedule(sceneId);
Chromosome scheduleChromosomes = planResultService.execute2(sceneId);
return R.ok("运算完成");
}
......
......@@ -34,7 +34,7 @@ public class MaintenanceWindowController {
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}"
value = "{\n \"sceneId\": \"B571EF6682DB463AB2977B1055A74112\",\n \"machineId\": 3402,\n \"maintenanceWindow\": {\n \"startTime\": \"2025-11-03T07:36:00.000Z\",\n \"endTime\": \"2025-11-03T09:36:00.000Z\",\n \"reason\": \"定期维护\"\n }\n}"
)
)
)
......@@ -69,6 +69,29 @@ public class MaintenanceWindowController {
return R.ok("删除成功");
}
@PostMapping("/batchDelete")
@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\": \"scene001\",\n \"machineId\": 1,\n \"maintenanceIds\": [\"maint001\", \"maint002\", \"maint003\"]\n}"
)
)
)
)
public R<String> delMaintenanceWindowBatch(@RequestBody Map<String, Object> params) {
String sceneId = ParamValidator.getString(params, "sceneId", "场景ID");
Long machineId = ParamValidator.getLong(params, "machineId", "机器ID");
List<String> maintenanceIds = (List<String>) params.get("maintenanceIds");
Chromosome result = planResultService.DelMaintenanceWindowBatch(sceneId, machineId, maintenanceIds);
return R.ok("批量删除成功");
}
@PostMapping("/get")
@Operation(summary = "获取维护窗口", description = "获取指定机器的维护窗口列表",
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
......
......@@ -6,6 +6,8 @@ import com.aps.entity.basic.Machine;
import com.aps.entity.basic.Order;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
......
package com.aps.entity.Algorithm;
import com.aps.entity.basic.MaterialType;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.math.BigDecimal;
......@@ -16,7 +17,7 @@ public class OrderMaterialRequirement {
private String orderId;
private int operationId;
private String childorderId;
private String childOrderId;
private String materialId;
private String materialCode;
private String materialName;
......@@ -55,6 +56,7 @@ public class OrderMaterialRequirement {
/**
* 层级
*/
@TableField(exist = false)
private int level;
/**
......@@ -80,12 +82,13 @@ public class OrderMaterialRequirement {
/**
* 创建或使用的半成品订单ID
*/
@TableField(exist = false)
private List<Integer> productOrderID=new ArrayList<>();
/**
* 检验周期
*/
private Long CkeckLeadTime;
private Long checkLeadTime;
@TableField(exist = false)
private List<OrderMaterialRequirement> replaceMaterial=new ArrayList<>();
}
package com.aps.entity.basic;
import com.aps.entity.Algorithm.OperationDependency;
import com.aps.entity.RoutingDiscreteParam;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;
import java.math.BigDecimal;
......@@ -35,6 +37,8 @@ public class Entry {
*/
public String SceneId ;
private Integer routingId;
private String routingCode;
private String routingName;
private Long routingDetailId;
private Long taskSeq;
private String routingDetailName;
......
package com.aps.mapper;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 订单物料需求表 Mapper 接口
* </p>
*
* @author MyBatis-Plus
* @since 2026-01-05
*/
public interface OrderMaterialRequirementMapper extends BaseMapper<OrderMaterialRequirement> {
}
......@@ -386,17 +386,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
.orElse(null);
if (lastGeneOnMachine != null) {
// 设备上已有任务,当前任务必须在设备可用后开始
// 设备可用时间 = 前一个任务的主处理结束时间(后处理不占用设备)
int machineAvailableTime = lastGeneOnMachine.getEndTime();
if (setupTime > 0) {
if (_globalParam.is_smoothSetup()) {
......@@ -513,6 +503,8 @@ if(finishedOrder==null||finishedOrder.size()==0)
result.setProcessingTime(processingTimeTotal);
result.setGeneDetails(geneDetails);
// System.out.println("huanxingshijian="+result.getChangeOverTime()+"-------------------"+result.getOrderId()+"--------"+result.getExecId()+"---------"+prev.getOrderId()+"--------"+prev.getExecId());
chromosome.getResult().add(result);
return endTime;
}
......@@ -625,9 +617,9 @@ if(finishedOrder==null||finishedOrder.size()==0)
.collect(Collectors.toList());
if (!oe.isEmpty()) {
int CkeckLeadTime=0;
if(sf.getCkeckLeadTime()!=null)
if(sf.getCheckLeadTime()!=null)
{
CkeckLeadTime=(int) (sf.getCkeckLeadTime()*24*60);
CkeckLeadTime=(int) (sf.getCheckLeadTime()*24*60);
}
sfTime1 = oe.stream().mapToInt(GAScheduleResult::getEndTime).max().orElse(0)
+CkeckLeadTime;
......@@ -850,9 +842,9 @@ if(finishedOrder==null||finishedOrder.size()==0)
DiscreteParameterMatrixService service = SpringContextUtil.getBean(DiscreteParameterMatrixService.class);
if (service != null) {
double discreteParameterMatrixValue = service.getDiscreteParameterMatrixValue(prev, operation);
double discreteParameterMatrixValue = service.getDiscreteParameterMatrixValue( operation,prev);
setupTime = (int) discreteParameterMatrixValue;
operation.setChangeLineTime(discreteParameterMatrixValue);
if (operation.getOrderId()=="a0e61488-0647-4f8e-a27c-cfed9cbbba52"){
......@@ -865,7 +857,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
}
operation.setChangeLineTime(setupTime);
System.out.println("换型时间111"+setupTime);
......
......@@ -648,7 +648,7 @@ if(routingIds.size()==0)
OrderMaterialRequirement orderMaterial = new OrderMaterialRequirement();
orderMaterial.setOrderId(orderId);
orderMaterial.setOperationId(operation.getId());
orderMaterial.setChildorderId(StringUtils.isBlank(childorderId) ? orderId : childorderId);
orderMaterial.setChildOrderId(StringUtils.isBlank(childorderId) ? orderId : childorderId);
orderMaterial.setRequiredQuantity(allneeded);
if (material == null) {
material = _materials.stream()
......@@ -665,7 +665,7 @@ if(routingIds.size()==0)
orderMaterial.setMaterialName(material.getName());
orderMaterial.setMaterialTypeName(material.getMaterialTypeName());
orderMaterial.setMaterialId(material.getId());
orderMaterial.setCkeckLeadTime(material.getCkeckLeadTime());
orderMaterial.setCheckLeadTime(material.getCkeckLeadTime());
// 扣减现有库存
......
......@@ -550,7 +550,8 @@ public class RoutingDataService {
.collect(Collectors.toList());
for (EquipMaintainTask equipMaintainTask : EquipMaintainTasks1) {
MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
maintenanceWindow.setId(equipMaintainTask.getId().toString());
// maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setId(UUID.randomUUID().toString());
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setEquipCode(equipMaintainTask.getEquipCode());
......@@ -632,7 +633,10 @@ public class RoutingDataService {
.collect(Collectors.toList());
for (EquipMaintainTask equipMaintainTask : EquipMaintainTasks1) {
MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setId(UUID.randomUUID().toString());
// maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setEquipCode(equipMaintainTask.getEquipCode());
......
......@@ -155,6 +155,11 @@ Integer newMachineId1=newMachineId.intValue();
.findFirst().orElse(null);
if(machine!=null)
{
// 检查时间是否与现有维护窗口重复
if (isTimeOverlap(machine.getMaintenanceWindows(), maintenanceWindow)) {
throw new RuntimeException("维修时间已存在");
}
maintenanceWindow.setEquipCode(machine.getCode());
maintenanceWindow.setEquipName(machine.getName());
......@@ -175,6 +180,27 @@ Integer newMachineId1=newMachineId.intValue();
}
/**
* 检查新维护窗口是否与现有维护窗口时间重叠
* @param existingWindows 现有维护窗口列表
* @param newWindow 新维护窗口
* @return 如果时间重叠返回true,否则返回false
*/
private boolean isTimeOverlap(List<MaintenanceWindow> existingWindows, MaintenanceWindow newWindow) {
if (existingWindows == null || existingWindows.isEmpty()) {
return false;
}
for (MaintenanceWindow existingWindow : existingWindows) {
// 检查时间是否重叠:新窗口开始时间 < 现有窗口结束时间 && 新窗口结束时间 > 现有窗口开始时间
if (newWindow.getStartTime().isEqual(existingWindow.getEndTime()) &&
newWindow.getEndTime().isEqual(existingWindow.getStartTime())) {
return true;
}
}
return false;
}
public List<MaintenanceWindow> GetMaintenanceWindow(Chromosome chromosome,Long machineId) {
if(machineId==0)
......@@ -214,11 +240,15 @@ Integer newMachineId1=newMachineId.intValue();
.filter(i -> maintenanceId.equals(maintenanceWindows.get(i).getId()))
.findFirst();
machine.getMaintenanceWindows().remove(index);
if (index.isPresent()) {
machine.getMaintenanceWindows().remove(index.getAsInt());
MachineSchedulerService machineScheduler = new MachineSchedulerService(
chromosome.getBaseTime());
MachineTimeline machineTimeline = machineScheduler.getOrCreateTimeline(machine);
machine.setAvailability(machineTimeline.getSegments());
} else {
throw new RuntimeException("未找到维护窗口");
}
}else {
......@@ -229,6 +259,43 @@ Integer newMachineId1=newMachineId.intValue();
}
/**
* 批量删除维护窗口
* @param chromosome 染色体对象
* @param machineId 机器ID
* @param maintenanceIds 要删除的维护窗口ID列表
* @param globalParam 全局参数
*/
public void DelMaintenanceWindowBatch(Chromosome chromosome, Long machineId, List<String> maintenanceIds, GlobalParam globalParam) {
Machine machine = chromosome.getInitMachines().stream().filter(t -> t.getId() == machineId)
.findFirst().orElse(null);
if (machine != null) {
List<MaintenanceWindow> maintenanceWindows = machine.getMaintenanceWindows();
if (maintenanceWindows != null && maintenanceIds != null && !maintenanceIds.isEmpty()) {
// 过滤出存在的维护窗口ID
List<String> existingIds = maintenanceIds.stream()
.filter(id -> maintenanceWindows.stream().anyMatch(window -> id.equals(window.getId())))
.collect(Collectors.toList());
if (existingIds.size() != maintenanceIds.size()) {
throw new RuntimeException("部分维护窗口未找到");
}
// 根据ID批量删除维护窗口
maintenanceWindows.removeIf(window -> maintenanceIds.contains(window.getId()));
MachineSchedulerService machineScheduler = new MachineSchedulerService(
chromosome.getBaseTime());
MachineTimeline machineTimeline = machineScheduler.getOrCreateTimeline(machine);
machine.setAvailability(machineTimeline.getSegments());
}
} else {
throw new RuntimeException("未找到设备");
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
}
public void SpiltOperation(Chromosome chromosome, int opId,Double[] splitCounts, GlobalParam globalParam)
{
List<Entry> allOperations = chromosome.getAllOperations();
......
package com.aps.service;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 订单物料需求表 服务类
* </p>
*
* @author MyBatis-Plus
* @since 2026-01-05
*/
public interface OrderMaterialRequirementService extends IService<OrderMaterialRequirement> {
}
......@@ -6,6 +6,7 @@ import com.aps.common.util.SnowFlackIdWorker;
import com.aps.entity.*;
import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import com.aps.entity.basic.Entry;
import com.aps.entity.basic.Order;
import com.aps.mapper.RoutingDetailMapper;
......@@ -85,6 +86,9 @@ public class LanuchServiceImpl implements LanuchService {
Equiptype1Service equiptype1Service;
@Autowired
PlanResourceService planResourceService;
@Autowired
OrderMaterialRequirementService orderMaterialRequirementService;
/**
* 生成场景数据
*
......@@ -246,7 +250,7 @@ public class LanuchServiceImpl implements LanuchService {
mesOrder.setTaskType(prodLaunchOrder.getFinishOrderId() != null ? "半成品" : "成品");
mesOrderList.add(mesOrder);
}
mesOrderService.remove(new LambdaQueryWrapper<>());
boolean saved = mesOrderService.saveBatch(mesOrderList);
if (saved) {
......@@ -288,14 +292,27 @@ public class LanuchServiceImpl implements LanuchService {
dispatches.add(dispatch);
}
dispatchService.remove(new LambdaQueryWrapper<>());
// 批量保存到数据库
boolean savedDispatch = dispatchService.saveOrUpdateBatch(dispatches);
List<OrderMaterialRequirement> orderMaterials = chromosome.getOrderMaterials();
// 先删除表中所有数据
orderMaterialRequirementService.remove(new LambdaQueryWrapper<>());
// 再批量插入新数据
orderMaterialRequirementService.saveBatch(orderMaterials);
if (savedDispatch) {
return R.ok("计划下发成功,共处理 " + dispatches.size() + " 条记录");
} else {
throw new RuntimeException("保存到数据库失败");
}
}
/**
......
package com.aps.service.impl;
import com.aps.entity.Algorithm.OrderMaterialRequirement;
import com.aps.entity.ProdLaunchOrder;
import com.aps.mapper.OrderMaterialRequirementMapper;
import com.aps.mapper.ProdLaunchOrderMapper;
import com.aps.service.OrderMaterialRequirementService;
import com.aps.service.ProdLaunchOrderService;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 订单物料需求表 服务类
* </p>
*
* @author MyBatis-Plus
* @since 2026-01-05
*/
@Service
public class OrderMaterialRequirementServiceImpl extends ServiceImpl<OrderMaterialRequirementMapper, OrderMaterialRequirement> implements OrderMaterialRequirementService {
}
......@@ -558,6 +558,19 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
return chromosome;
}
public Chromosome DelMaintenanceWindowBatch(String SceneId, Long machineId, List<String> maintenanceIds) {
GlobalParam globalParam = new GlobalParam();
Chromosome chromosome = _sceneService.loadChromosomeFromFile(SceneId);
ScheduleOperationService ScheduleOperation = new ScheduleOperationService();
ScheduleOperation.DelMaintenanceWindowBatch(chromosome, machineId, maintenanceIds, globalParam);
// WriteScheduleSummary(chromosome);
_sceneService.saveChromosomeToFile(chromosome, SceneId);
return chromosome;
}
public List<MaintenanceWindow> GetMaintenanceWindow(String SceneId, Long machineId, MaintenanceWindow maintenanceWindow) {
......@@ -1504,7 +1517,7 @@ private GlobalParam InitGlobalParam()
taskVO.setSetup(gene.getPreTime());
taskVO.setTeardown(gene.getTeardownTime()); // 默认值
taskVO.setEquipChange(gene.getChangeOverTime()); // 默认值
taskVO.setEquipCooling(888); // 默认值
taskVO.setEquipCooling(0); // 默认值
taskVO.setEquipType(resourceGanttVO.getType());
taskVO.setEquipName(resourceGanttVO.getName());
taskVO.setLocked(gene.isIsLocked()); // 默认值
......@@ -1517,7 +1530,7 @@ private GlobalParam InitGlobalParam()
// scheduleChromosome.getBaseTime().plusMinutes(gene.getStartTime()),
// scheduleChromosome.getBaseTime().plusMinutes(gene.getEndTime()))); // 计算持续时间
taskVO.setDuration(888); //
taskVO.setDuration(0); //
taskVO.setEquipId(machine.getId());
taskVO.setShopId(machine.getId());
taskVO.setShopName(resourceGanttVO.getShopName());
......@@ -1721,7 +1734,7 @@ private GlobalParam InitGlobalParam()
.collect(Collectors.toList());
for (EquipMaintainTask equipMaintainTask : EquipMaintainTasks1) {
MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
maintenanceWindow.setId(equipMaintainTask.getId().toString());
maintenanceWindow.setId(UUID.randomUUID().toString());
maintenanceWindow.setStartTime(equipMaintainTask.getPlanStartTime());
maintenanceWindow.setEndTime(equipMaintainTask.getPlanFinishTime());
maintenanceWindow.setReason("");
......
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