优化启动流程

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 {
private LocalDateTime startDate;
private LocalDateTime endDate;
private String orderDesc;
private String orderPriority;
private Integer orderPriority;
private String groupCode;
private String colorCode;
private BigDecimal quantity;
......
......@@ -6,7 +6,7 @@ import lombok.Data;
public class ProdOrderProcess {
private String sceneId;
private String orderId;
private String processNo;
private String taskSeq;
private String targetOrderId;
private String targetProcessNo;
private String targetTaskSeq;
}
\ No newline at end of file
......@@ -10,10 +10,10 @@ public class ProdProcessExec {
private String execId;
private String sceneId;
private String orderId;
private String processId;
private String processNo;
private String processName;
private String machineId;
private String routingDetailId;
private String taskSeq;
private String routingDetailName;
private Long machineId;
private String resourceGroup;
private BigDecimal planQty;
private BigDecimal actualQty;
......@@ -29,4 +29,42 @@ private Long changeDuration;
private Short logicalOrder;
private LocalDateTime targetStartDate;
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;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class RoutingDetail {
private Integer id;
private LocalDate creationTime;
private Long creatorUserId;
private LocalDate lastModificationTime;
private Long lastModifierUserId;
private Boolean isDeleted;
private Long deleterUserId;
private LocalDate deletionTime;
private Integer classId;
private Integer routingHeaderId;
private LocalDateTime creationTime;
private BigDecimal creatorUserId;
private LocalDateTime lastModificationTime;
private BigDecimal lastModifierUserId;
private Short isDeleted;
private BigDecimal deleterUserId;
private LocalDateTime deletionTime;
private Long classId;
private Long routingHeaderId;
private String name;
private BigDecimal taskSeq;
private Short taskSeq;
private String description;
private String taskContent;
private Integer resourceId;
private Long resourceId;
private Short resourceType;
private BigDecimal runtime;
private BigDecimal setupTime;
private BigDecimal transportTime;
private BigDecimal checkTime;
private BigDecimal setupTime;
private BigDecimal transportTime;
private Short checkTime;
private Short checkFlag;
private BigDecimal efficiencyValue;
private Short efficiencyValue;
private BigDecimal singleOut;
private Short isOutside;
private Integer departmentId;
private Long departmentId;
private Short isImportant;
private Integer milestoneId;
private Integer phaseId;
private Long milestoneId;
private Long phaseId;
private Short status;
private String remark;
private String extend;
private BigDecimal outsideTime;
private BigDecimal performanceHours;
private Short outsideTime;
private Short performanceHours;
private String resourceCode;
private Integer isImportantResources;
private BigDecimal schedulingWorkingHours;
private BigDecimal realWorkingHours;
private BigDecimal realRuntime;
private BigDecimal performanceWorkingHours;
private Integer isParticipateIntime;
private Short isImportantResources;
private Short schedulingWorkingHours;
private Short realWorkingHours;
private Short realRuntime;
private Short performanceWorkingHours;
private Short isParticipateIntime;
private String equipType;
private Integer equipTypeId;
private Long equipTypeId;
private String note;
private String fileId;
private Integer measureUnit;
private Long measureUnit;
private String measureUnitName;
private BigDecimal afterProcessTime;
private Integer isGeneral;
private Integer canInterrupt;
private Integer canStartEarly;
private BigDecimal previousStartTimeBegin;
private Short afterProcessTime;
private Long isGeneral;
private Long canInterrupt;
private Long canStartEarly;
private Short previousStartTimeBegin;
private String code;
private String tool;
private BigDecimal changeLineTime;
private Integer preDetailId;
private Integer connectType;
private Integer connectProperty;
private BigDecimal changeLineTime;
private Long preDetailId;
private Long connectType;
private Long connectProperty;
private String connectTypeName;
private String connectPropertyName;
private String strSetupTime;
......@@ -74,4 +72,13 @@ private Long isync;
private BigDecimal constTime;
private String usable;
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 {
* @author: jdt
* @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;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
......@@ -57,23 +59,21 @@ public class LanuchServiceImpl implements LanuchService {
/**
* 生成场景数据
*
* @param prodOrderMainIds 工单ID列表
*
* @param sceneName 场景名称
* @param username 操作用户
* @return 处理结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public R<String> lanuch(List<String> prodOrderMainIds, String sceneName, String username) {
public R<String> lanuch( String sceneName, String username) {
try {
// 参数校验
if (sceneName == null || sceneName.trim().isEmpty()) {
return R.failed("场景名称不能为空");
}
if (CollectionUtils.isEmpty(prodOrderMainIds)) {
return R.failed("工单ID列表不能为空");
}
// 1. 创建场景
String sceneId = createScene(sceneName);
......@@ -82,8 +82,14 @@ public class LanuchServiceImpl implements LanuchService {
}
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. 处理订单数据转换
List<ProdLaunchOrder> prodLaunchOrders = processOrderData(sceneId, apsOrders);
......@@ -120,10 +126,19 @@ public class LanuchServiceImpl implements LanuchService {
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 批量保存
if (!CollectionUtils.isEmpty(launchOrderList)) {
prodLaunchOrderService.saveBatch(launchOrderList);
log.info("批量插入{}条ProdLaunchOrder记录", launchOrderList.size());
// 在您的 LanuchServiceImpl 中修改这一行:
// 原来的问题代码:
// prodLaunchOrderService.saveBatch(launchOrders);
// 修改为:
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 {
private ProdLaunchOrder convertToLaunchOrder(ApsOrder order, String sceneId) {
try {
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();
// 通过mmid查找对应的工艺
if (mmid != null && !mmid.isEmpty()) {
LambdaQueryWrapper<RoutingHeader> routingWrapper = new LambdaQueryWrapper<>();
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) {
launchOrder.setRoutingId(routingHeader.getId().toString());
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 {
RoutingHeader routingHeader = getRoutingHeader(prodOrderMain.getRoutingId());
// 查询该工艺下的所有工序
List<RoutingDetail> routingDetails = getRoutingDetails(routingHeader.getId());
......@@ -375,7 +398,8 @@ public class LanuchServiceImpl implements LanuchService {
*/
private RoutingHeader getRoutingHeader(String routingId) {
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);
if (routingHeader == null) {
......@@ -395,6 +419,7 @@ public class LanuchServiceImpl implements LanuchService {
private List<RoutingDetail> getRoutingDetails(Integer routingHeaderId) {
LambdaQueryWrapper<RoutingDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(RoutingDetail::getRoutingHeaderId, routingHeaderId)
.eq(RoutingDetail::getIsDeleted, 0) // 添加 is_deleted=0 过滤条件
.orderByAsc(RoutingDetail::getTaskSeq);
List<RoutingDetail> routingDetails = routingDetailMapper.selectList(wrapper);
......@@ -442,16 +467,30 @@ public class LanuchServiceImpl implements LanuchService {
ProdProcessExec prodProcessExec = new ProdProcessExec();
prodProcessExec.setExecId(UUID.randomUUID().toString().replace("-", ""));
prodProcessExec.setOrderId(prodOrderMain.getOrderId());
prodProcessExec.setProcessId(String.valueOf(detail.getId()));
prodProcessExec.setProcessNo(String.valueOf(detail.getTaskSeq()));
prodProcessExec.setProcessName(detail.getName());
prodProcessExec.setMachineId(detail.getResourceCode());
prodProcessExec.setResourceGroup(String.valueOf(detail.getResourceId()));
prodProcessExec.setRoutingDetailId(String.valueOf(detail.getId()));
prodProcessExec.setTaskSeq(String.valueOf(detail.getTaskSeq()));
prodProcessExec.setRoutingDetailName(detail.getName());
prodProcessExec.setMachineId(detail.getEquipTypeId());
// prodProcessExec.setResourceGroup(String.valueOf(detail.getResourceId()));
prodProcessExec.setPlanQty(prodOrderMain.getQuantity());
prodProcessExec.setTargetStartDate(prodOrderMain.getStartDate());
prodProcessExec.setTargetEndDate(prodOrderMain.getEndDate());
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;
}
......@@ -512,7 +551,8 @@ public class LanuchServiceImpl implements LanuchService {
*/
private List<ProdOrderProcess> createProcessRelations(ProdLaunchOrder prodOrderMain, String sceneId) {
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);
......@@ -535,9 +575,9 @@ public class LanuchServiceImpl implements LanuchService {
ProdOrderProcess prodOrderProcess = new ProdOrderProcess();
prodOrderProcess.setSceneId(sceneId);
prodOrderProcess.setOrderId(prodOrderMain.getOrderId());
prodOrderProcess.setProcessNo(connection.getSourceoperation());
prodOrderProcess.setTaskSeq(connection.getSourceoperation());
prodOrderProcess.setTargetOrderId(prodOrderMain.getOrderId());
prodOrderProcess.setTargetProcessNo(connection.getDestoperation());
prodOrderProcess.setTargetTaskSeq(connection.getDestoperation());
return prodOrderProcess;
}
......
......@@ -38,7 +38,7 @@ public class ProdEquipSpecialCalServiceImpl extends ServiceImpl<ProdEquipSpecial
// 过滤出is_deleted为0的记录
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());
// 转换对象并设置必要字段
......
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