优化启动流程

parent 8c0d97a7
package com.aps.controller;
import com.aps.common.util.R;
import com.aps.service.LanuchService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/lanuch")
@Tag(name = "启动工单", description = "启动工单接口")
public class LanuchController {
@Autowired
private LanuchService lanuchService;
/**
* 启动工单
*
* @param sceneName 场景名称
* @param username 用户名
* @return 处理结果
*/
@PostMapping("/execute")
public R<String> lanuch(
@RequestParam String sceneName,
@RequestHeader(required = false) String username) {
if (username == null || username.isEmpty()) {
username = "system";
}
return lanuchService.lanuch(sceneName, username);
}
}
\ No newline at end of file
...@@ -23,7 +23,7 @@ public class ProdLaunchOrder { ...@@ -23,7 +23,7 @@ public class ProdLaunchOrder {
private LocalDateTime startDate; private LocalDateTime startDate;
private LocalDateTime endDate; private LocalDateTime endDate;
private String orderDesc; private String orderDesc;
private String orderPriority; private Integer orderPriority;
private String groupCode; private String groupCode;
private String colorCode; private String colorCode;
private BigDecimal quantity; private BigDecimal quantity;
......
...@@ -6,7 +6,7 @@ import lombok.Data; ...@@ -6,7 +6,7 @@ import lombok.Data;
public class ProdOrderProcess { public class ProdOrderProcess {
private String sceneId; private String sceneId;
private String orderId; private String orderId;
private String processNo; private String taskSeq;
private String targetOrderId; private String targetOrderId;
private String targetProcessNo; private String targetTaskSeq;
} }
\ No newline at end of file
...@@ -10,10 +10,10 @@ public class ProdProcessExec { ...@@ -10,10 +10,10 @@ public class ProdProcessExec {
private String execId; private String execId;
private String sceneId; private String sceneId;
private String orderId; private String orderId;
private String processId; private String routingDetailId;
private String processNo; private String taskSeq;
private String processName; private String routingDetailName;
private String machineId; private Long machineId;
private String resourceGroup; private String resourceGroup;
private BigDecimal planQty; private BigDecimal planQty;
private BigDecimal actualQty; private BigDecimal actualQty;
...@@ -29,4 +29,42 @@ private Long changeDuration; ...@@ -29,4 +29,42 @@ private Long changeDuration;
private Short logicalOrder; private Short logicalOrder;
private LocalDateTime targetStartDate; private LocalDateTime targetStartDate;
private LocalDateTime targetEndDate; private LocalDateTime targetEndDate;
/**
* 工序准备工时(小时)
* 注释: 工序准备工时
*/
private BigDecimal setupTime;
/**
* 换线时间(小时)
* 注释: 换线时间
*/
private BigDecimal changeLineTime;
/**
* 常数时间
* 注释: 常数时间
*/
private BigDecimal constTime;
/**
* 前处理时间(秒)
* 注释: 前处理时间(秒)
*/
private Long preprocessingTime;
/**
* 后处理时间(秒)
* 注释: 后处理时间(秒)
*/
private Long postprocessingTime;
//速度
private BigDecimal speed;
} }
\ No newline at end of file
package com.aps.entity; package com.aps.entity;
import lombok.Data; import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDateTime;
@Data @Data
public class RoutingDetail { public class RoutingDetail {
private Integer id; private Integer id;
private LocalDate creationTime; private LocalDateTime creationTime;
private Long creatorUserId; private BigDecimal creatorUserId;
private LocalDate lastModificationTime; private LocalDateTime lastModificationTime;
private Long lastModifierUserId; private BigDecimal lastModifierUserId;
private Boolean isDeleted; private Short isDeleted;
private Long deleterUserId; private BigDecimal deleterUserId;
private LocalDate deletionTime; private LocalDateTime deletionTime;
private Integer classId; private Long classId;
private Integer routingHeaderId; private Long routingHeaderId;
private String name; private String name;
private BigDecimal taskSeq; private Short taskSeq;
private String description; private String description;
private String taskContent; private String taskContent;
private Integer resourceId; private Long resourceId;
private Short resourceType; private Short resourceType;
private BigDecimal runtime; private BigDecimal runtime;
private BigDecimal setupTime; private BigDecimal setupTime;
private BigDecimal transportTime; private BigDecimal transportTime;
private BigDecimal checkTime; private Short checkTime;
private Short checkFlag; private Short checkFlag;
private BigDecimal efficiencyValue; private Short efficiencyValue;
private BigDecimal singleOut; private BigDecimal singleOut;
private Short isOutside; private Short isOutside;
private Integer departmentId; private Long departmentId;
private Short isImportant; private Short isImportant;
private Integer milestoneId; private Long milestoneId;
private Integer phaseId; private Long phaseId;
private Short status; private Short status;
private String remark; private String remark;
private String extend; private String extend;
private BigDecimal outsideTime; private Short outsideTime;
private BigDecimal performanceHours; private Short performanceHours;
private String resourceCode; private String resourceCode;
private Integer isImportantResources; private Short isImportantResources;
private BigDecimal schedulingWorkingHours; private Short schedulingWorkingHours;
private BigDecimal realWorkingHours; private Short realWorkingHours;
private BigDecimal realRuntime; private Short realRuntime;
private BigDecimal performanceWorkingHours; private Short performanceWorkingHours;
private Integer isParticipateIntime; private Short isParticipateIntime;
private String equipType; private String equipType;
private Integer equipTypeId; private Long equipTypeId;
private String note; private String note;
private String fileId; private String fileId;
private Integer measureUnit; private Long measureUnit;
private String measureUnitName; private String measureUnitName;
private BigDecimal afterProcessTime; private Short afterProcessTime;
private Integer isGeneral; private Long isGeneral;
private Integer canInterrupt; private Long canInterrupt;
private Integer canStartEarly; private Long canStartEarly;
private BigDecimal previousStartTimeBegin; private Short previousStartTimeBegin;
private String code; private String code;
private String tool; private String tool;
private BigDecimal changeLineTime; private BigDecimal changeLineTime;
private Integer preDetailId; private Long preDetailId;
private Integer connectType; private Long connectType;
private Integer connectProperty; private Long connectProperty;
private String connectTypeName; private String connectTypeName;
private String connectPropertyName; private String connectPropertyName;
private String strSetupTime; private String strSetupTime;
...@@ -74,4 +72,13 @@ private Long isync; ...@@ -74,4 +72,13 @@ private Long isync;
private BigDecimal constTime; private BigDecimal constTime;
private String usable; private String usable;
private BigDecimal leadTime; private BigDecimal leadTime;
} private BigDecimal batchQty;
private BigDecimal minProductionQty;
private BigDecimal maxProductionQty;
private BigDecimal productionTakt;
private Long preprocessingTime;
private Long postprocessingTime;
private BigDecimal splitMinQty;
private BigDecimal splitMaxQty;
private Short equipmentConnectivity;
}
\ No newline at end of file
...@@ -15,5 +15,5 @@ public interface LanuchService { ...@@ -15,5 +15,5 @@ public interface LanuchService {
* @author: jdt * @author: jdt
* @return 结果 * @return 结果
*/ */
R<String> lanuch(List<String> prodOrderMainIds, String sceneId, String username); R<String> lanuch( String sceneId, String username);
} }
\ No newline at end of file
...@@ -14,11 +14,13 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -14,11 +14,13 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -57,23 +59,21 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -57,23 +59,21 @@ public class LanuchServiceImpl implements LanuchService {
/** /**
* 生成场景数据 * 生成场景数据
* *
* @param prodOrderMainIds 工单ID列表 *
* @param sceneName 场景名称 * @param sceneName 场景名称
* @param username 操作用户 * @param username 操作用户
* @return 处理结果 * @return 处理结果
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public R<String> lanuch(List<String> prodOrderMainIds, String sceneName, String username) { public R<String> lanuch( String sceneName, String username) {
try { try {
// 参数校验 // 参数校验
if (sceneName == null || sceneName.trim().isEmpty()) { if (sceneName == null || sceneName.trim().isEmpty()) {
return R.failed("场景名称不能为空"); return R.failed("场景名称不能为空");
} }
if (CollectionUtils.isEmpty(prodOrderMainIds)) {
return R.failed("工单ID列表不能为空");
}
// 1. 创建场景 // 1. 创建场景
String sceneId = createScene(sceneName); String sceneId = createScene(sceneName);
...@@ -82,8 +82,14 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -82,8 +82,14 @@ public class LanuchServiceImpl implements LanuchService {
} }
prodEquipSpecialCalService.copyFromEquipCapacityDef(sceneId); prodEquipSpecialCalService.copyFromEquipCapacityDef(sceneId);
List<ApsOrder> apsOrders = apsOrderService.list();
List<ApsOrder> apsOrders = apsOrderService.lambdaQuery()
.eq(ApsOrder::getIsdeleted, 0)
.like(ApsOrder::getCode, "佟礼测试数据")
.list();
if (CollectionUtils.isEmpty(apsOrders)) {
return R.failed("工单列表不能为空");
}
// 4. 处理订单数据转换 // 4. 处理订单数据转换
List<ProdLaunchOrder> prodLaunchOrders = processOrderData(sceneId, apsOrders); List<ProdLaunchOrder> prodLaunchOrders = processOrderData(sceneId, apsOrders);
...@@ -120,10 +126,19 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -120,10 +126,19 @@ public class LanuchServiceImpl implements LanuchService {
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
// 批量保存 // 在您的 LanuchServiceImpl 中修改这一行:
if (!CollectionUtils.isEmpty(launchOrderList)) { // 原来的问题代码:
prodLaunchOrderService.saveBatch(launchOrderList); // prodLaunchOrderService.saveBatch(launchOrders);
log.info("批量插入{}条ProdLaunchOrder记录", launchOrderList.size());
// 修改为:
if (!launchOrderList .isEmpty()) {
for (ProdLaunchOrder order : launchOrderList ) {
try {
prodLaunchOrderService.save(order); // 单条插入
} catch (Exception e) {
log.error("保存订单失败: {}", order.getOrderId(), e);
}
}
} }
...@@ -142,26 +157,33 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -142,26 +157,33 @@ public class LanuchServiceImpl implements LanuchService {
private ProdLaunchOrder convertToLaunchOrder(ApsOrder order, String sceneId) { private ProdLaunchOrder convertToLaunchOrder(ApsOrder order, String sceneId) {
try { try {
ProdLaunchOrder launchOrder = new ProdLaunchOrder(); ProdLaunchOrder launchOrder = new ProdLaunchOrder();
launchOrder.setOrderId(order.getId());
launchOrder.setSceneId(sceneId);
launchOrder.setSerie(order.getSeries());
launchOrder.setCreateUser(String.valueOf(order.getCreatoruserid()));
launchOrder.setMaterialCode(order.getMmcode());
// launchOrder.setStartDate(order.get);
launchOrder.setEndDate(order.getDeliverytime());
// launchOrder.setOrderPriority(order.getPrioritry());
launchOrder.setOrderPriority(1);
launchOrder.setQuantity(order.getQuantity());
launchOrder.setMaterialId(order.getMmid());
String mmid = order.getMmid(); String mmid = order.getMmid();
// 通过mmid查找对应的工艺 // 通过mmid查找对应的工艺
if (mmid != null && !mmid.isEmpty()) { if (mmid != null && !mmid.isEmpty()) {
LambdaQueryWrapper<RoutingHeader> routingWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RoutingHeader> routingWrapper = new LambdaQueryWrapper<>();
routingWrapper.eq(RoutingHeader::getMaterialId, mmid); routingWrapper.eq(RoutingHeader::getMaterialId, mmid);
RoutingHeader routingHeader = routingHeaderService.getOne(routingWrapper); routingWrapper.eq(RoutingHeader::getIsDeleted, 0); // 添加判断 is_deleted=0
List<RoutingHeader> routingHeaders = routingHeaderService.list(routingWrapper);
RoutingHeader routingHeader = null;
if (!CollectionUtils.isEmpty(routingHeaders)) {
routingHeader = routingHeaders.get(0);
}
if (routingHeader != null) { if (routingHeader != null) {
launchOrder.setRoutingId(routingHeader.getId().toString()); launchOrder.setRoutingId(routingHeader.getId().toString());
launchOrder.setRoutingCode(defaultIfBlank(routingHeader.getCode(), "")); launchOrder.setRoutingCode(defaultIfBlank(routingHeader.getCode(), ""));
launchOrder.setOrderId(order.getId());
launchOrder.setSceneId(sceneId);
launchOrder.setSerie(order.getSeries());
launchOrder.setCreateUser(String.valueOf(order.getCreatoruserid()));
launchOrder.setMaterialCode(order.getMmcode());
// launchOrder.setStartDate(order.get);
launchOrder.setEndDate(order.getDeliverytime());
launchOrder.setOrderPriority(order.getPrioritry());
launchOrder.setQuantity(order.getQuantity());
launchOrder.setMaterialId(order.getMmid());
} }
} }
...@@ -356,6 +378,7 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -356,6 +378,7 @@ public class LanuchServiceImpl implements LanuchService {
RoutingHeader routingHeader = getRoutingHeader(prodOrderMain.getRoutingId()); RoutingHeader routingHeader = getRoutingHeader(prodOrderMain.getRoutingId());
// 查询该工艺下的所有工序 // 查询该工艺下的所有工序
List<RoutingDetail> routingDetails = getRoutingDetails(routingHeader.getId()); List<RoutingDetail> routingDetails = getRoutingDetails(routingHeader.getId());
...@@ -375,7 +398,8 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -375,7 +398,8 @@ public class LanuchServiceImpl implements LanuchService {
*/ */
private RoutingHeader getRoutingHeader(String routingId) { private RoutingHeader getRoutingHeader(String routingId) {
LambdaQueryWrapper<RoutingHeader> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RoutingHeader> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(RoutingHeader::getId, routingId); wrapper.eq(RoutingHeader::getId, routingId)
.eq(RoutingHeader::getIsDeleted, 0); // 添加 is_deleted=0 过滤条件
RoutingHeader routingHeader = routingHeaderMapper.selectOne(wrapper); RoutingHeader routingHeader = routingHeaderMapper.selectOne(wrapper);
if (routingHeader == null) { if (routingHeader == null) {
...@@ -395,6 +419,7 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -395,6 +419,7 @@ public class LanuchServiceImpl implements LanuchService {
private List<RoutingDetail> getRoutingDetails(Integer routingHeaderId) { private List<RoutingDetail> getRoutingDetails(Integer routingHeaderId) {
LambdaQueryWrapper<RoutingDetail> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RoutingDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(RoutingDetail::getRoutingHeaderId, routingHeaderId) wrapper.eq(RoutingDetail::getRoutingHeaderId, routingHeaderId)
.eq(RoutingDetail::getIsDeleted, 0) // 添加 is_deleted=0 过滤条件
.orderByAsc(RoutingDetail::getTaskSeq); .orderByAsc(RoutingDetail::getTaskSeq);
List<RoutingDetail> routingDetails = routingDetailMapper.selectList(wrapper); List<RoutingDetail> routingDetails = routingDetailMapper.selectList(wrapper);
...@@ -442,16 +467,30 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -442,16 +467,30 @@ public class LanuchServiceImpl implements LanuchService {
ProdProcessExec prodProcessExec = new ProdProcessExec(); ProdProcessExec prodProcessExec = new ProdProcessExec();
prodProcessExec.setExecId(UUID.randomUUID().toString().replace("-", "")); prodProcessExec.setExecId(UUID.randomUUID().toString().replace("-", ""));
prodProcessExec.setOrderId(prodOrderMain.getOrderId()); prodProcessExec.setOrderId(prodOrderMain.getOrderId());
prodProcessExec.setProcessId(String.valueOf(detail.getId())); prodProcessExec.setRoutingDetailId(String.valueOf(detail.getId()));
prodProcessExec.setProcessNo(String.valueOf(detail.getTaskSeq())); prodProcessExec.setTaskSeq(String.valueOf(detail.getTaskSeq()));
prodProcessExec.setProcessName(detail.getName()); prodProcessExec.setRoutingDetailName(detail.getName());
prodProcessExec.setMachineId(detail.getResourceCode()); prodProcessExec.setMachineId(detail.getEquipTypeId());
prodProcessExec.setResourceGroup(String.valueOf(detail.getResourceId())); // prodProcessExec.setResourceGroup(String.valueOf(detail.getResourceId()));
prodProcessExec.setPlanQty(prodOrderMain.getQuantity()); prodProcessExec.setPlanQty(prodOrderMain.getQuantity());
prodProcessExec.setTargetStartDate(prodOrderMain.getStartDate()); prodProcessExec.setTargetStartDate(prodOrderMain.getStartDate());
prodProcessExec.setTargetEndDate(prodOrderMain.getEndDate()); prodProcessExec.setTargetEndDate(prodOrderMain.getEndDate());
prodProcessExec.setSceneId(sceneId); prodProcessExec.setSceneId(sceneId);
prodProcessExec.setSetupTime(detail.getSetupTime());
prodProcessExec.setChangeLineTime(detail.getChangeLineTime());
prodProcessExec.setConstTime(detail.getConstTime());
prodProcessExec.setPreprocessingTime(detail.getPreprocessingTime());
prodProcessExec.setPostprocessingTime(detail.getPostprocessingTime());
prodProcessExec.setSpeed(
Optional.ofNullable(detail.getSingleOut())
.filter(out -> detail.getRuntime() != null)
.filter(out -> detail.getRuntime().compareTo(BigDecimal.ZERO) != 0)
.map(out -> out.divide(detail.getRuntime(), 4, RoundingMode.HALF_UP))
.orElse(BigDecimal.ZERO)
);
System.out.println(prodProcessExec.getSpeed());
return prodProcessExec; return prodProcessExec;
} }
...@@ -512,7 +551,8 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -512,7 +551,8 @@ public class LanuchServiceImpl implements LanuchService {
*/ */
private List<ProdOrderProcess> createProcessRelations(ProdLaunchOrder prodOrderMain, String sceneId) { private List<ProdOrderProcess> createProcessRelations(ProdLaunchOrder prodOrderMain, String sceneId) {
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 过滤条件
List<RoutingDetailConnect> connections = routingDetailConnectService.list(wrapper); List<RoutingDetailConnect> connections = routingDetailConnectService.list(wrapper);
...@@ -535,9 +575,9 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -535,9 +575,9 @@ public class LanuchServiceImpl implements LanuchService {
ProdOrderProcess prodOrderProcess = new ProdOrderProcess(); ProdOrderProcess prodOrderProcess = new ProdOrderProcess();
prodOrderProcess.setSceneId(sceneId); prodOrderProcess.setSceneId(sceneId);
prodOrderProcess.setOrderId(prodOrderMain.getOrderId()); prodOrderProcess.setOrderId(prodOrderMain.getOrderId());
prodOrderProcess.setProcessNo(connection.getSourceoperation()); prodOrderProcess.setTaskSeq(connection.getSourceoperation());
prodOrderProcess.setTargetOrderId(prodOrderMain.getOrderId()); prodOrderProcess.setTargetOrderId(prodOrderMain.getOrderId());
prodOrderProcess.setTargetProcessNo(connection.getDestoperation()); prodOrderProcess.setTargetTaskSeq(connection.getDestoperation());
return prodOrderProcess; return prodOrderProcess;
} }
......
...@@ -38,7 +38,7 @@ public class ProdEquipSpecialCalServiceImpl extends ServiceImpl<ProdEquipSpecial ...@@ -38,7 +38,7 @@ public class ProdEquipSpecialCalServiceImpl extends ServiceImpl<ProdEquipSpecial
// 过滤出is_deleted为0的记录 // 过滤出is_deleted为0的记录
List<EquipCapacityDef> activeCapacityDefs = capacityDefs.stream() List<EquipCapacityDef> activeCapacityDefs = capacityDefs.stream()
.filter(e -> e.getIsDeleted() != null && e.getIsDeleted() == 0) .filter(e -> e.getIsDeleted() != null && e.getIsDeleted() == 0 && e.getReferenceId() != null)
.collect(Collectors.toList()); .collect(Collectors.toList());
// 转换对象并设置必要字段 // 转换对象并设置必要字段
......
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