package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.mapper.ProductionOperationTaskMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductionOperationTask; import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.service.ProductionOrderRoutingOperationService; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.technology.mapper.TechnologyOperationParamMapper; import com.ruoyi.technology.mapper.TechnologyParamMapper; import com.ruoyi.technology.pojo.TechnologyOperationParam; import com.ruoyi.technology.pojo.TechnologyParam; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class ProductionOrderRoutingOperationServiceImpl extends ServiceImpl implements ProductionOrderRoutingOperationService { private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; private final ProductionOperationTaskMapper productionOperationTaskMapper; private final ProductionProductMainMapper productionProductMainMapper; private final ProductionProductMainService productionProductMainService; private final TechnologyOperationParamMapper technologyOperationParamMapper; private final TechnologyParamMapper technologyParamMapper; private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper; @Override public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) { int insert = productionOrderRoutingOperationMapper.insert(productionOrderRoutingOperation); //工序关联的参数需要同步新增 List technologyOperationParams = technologyOperationParamMapper.selectList(Wrappers.lambdaQuery() .eq(TechnologyOperationParam::getTechnologyOperationId, productionOrderRoutingOperation.getTechnologyOperationId())); if (CollectionUtils.isNotEmpty(technologyOperationParams)){ ArrayList productionOrderRoutingOperationParams = new ArrayList<>(); for (TechnologyOperationParam technologyOperationParam : technologyOperationParams) { TechnologyParam technologyParam = technologyParamMapper.selectById(technologyOperationParam.getTechnologyParamId()); ProductionOrderRoutingOperationParam productionOrderRoutingOperationParam = new ProductionOrderRoutingOperationParam(); productionOrderRoutingOperationParam.setProductionOrderId(productionOrderRoutingOperation.getProductionOrderId()); productionOrderRoutingOperationParam.setProductionOrderRoutingOperationId(productionOrderRoutingOperation.getId()); productionOrderRoutingOperationParam.setParamCode(technologyParam.getParamCode()); productionOrderRoutingOperationParam.setParamName(technologyParam.getParamName()); productionOrderRoutingOperationParam.setParamType(technologyParam.getParamType()); productionOrderRoutingOperationParam.setParamFormat(technologyParam.getParamFormat()); productionOrderRoutingOperationParam.setUnit(technologyParam.getUnit()); productionOrderRoutingOperationParam.setIsRequired(technologyParam.getIsRequired()); productionOrderRoutingOperationParam.setRemark(technologyParam.getRemark()); productionOrderRoutingOperationParam.setParamId(technologyParam.getId()); productionOrderRoutingOperationParam.setTechnologyOperationId(productionOrderRoutingOperation.getTechnologyOperationId()); productionOrderRoutingOperationParams.add(productionOrderRoutingOperationParam); } productionOrderRoutingOperationParamMapper.insert(productionOrderRoutingOperationParams); } String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); if (insert > 0) { ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne( Wrappers.lambdaQuery() .likeRight(ProductionOperationTask::getWorkOrderNo, "GD" + datePrefix) .orderByDesc(ProductionOperationTask::getWorkOrderNo) .last("limit 1")); int sequenceNumber = 1; if (lastTask != null && lastTask.getWorkOrderNo() != null) { String lastNo = lastTask.getWorkOrderNo(); if (lastNo.startsWith("GD" + datePrefix)) { String seqStr = lastNo.substring(("GD" + datePrefix).length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber); ProductionOperationTask productionOperationTask = new ProductionOperationTask(); productionOperationTask.setProductionOrderRoutingOperationId(productionOrderRoutingOperation.getId()); productionOperationTask.setProductionOrderId(productionOrderRoutingOperation.getProductionOrderId()); productionOperationTask.setPlanQuantity(BigDecimal.ZERO); productionOperationTask.setCompleteQuantity(BigDecimal.ZERO); productionOperationTask.setWorkOrderNo(workOrderNoStr); productionOperationTask.setStatus(1); productionOperationTaskMapper.insert(productionOperationTask); } return R.ok(); } @Override public R deleteRouteItem(Long id) { try { ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectOne( new LambdaQueryWrapper() .eq(ProductionOperationTask::getProductionOrderRoutingOperationId, id) .last("limit 1")); if (productionOperationTask == null) { throw new RuntimeException("删除失败:未找到关联的生产工单"); } if (productionOperationTask.getCompleteQuantity() != null && BigDecimal.ZERO.compareTo(productionOperationTask.getCompleteQuantity()) < 0) { throw new RuntimeException("删除失败:该工单已开始生产,请先删除生产报工"); } List productionProductMains = productionProductMainMapper.selectList( new LambdaQueryWrapper() .eq(ProductionProductMain::getProductionOperationTaskId, productionOperationTask.getId())); for (ProductionProductMain main : productionProductMains) { productionProductMainService.removeProductMain(main.getId()); } Long productionOrderId = productionOperationTask.getProductionOrderId(); Long routingId = null; ProductionOrderRoutingOperation deleteItem = productionOrderRoutingOperationMapper.selectById(id); if (deleteItem != null) { routingId = deleteItem.getOrderRoutingId(); } productionOperationTaskMapper.delete(new LambdaQueryWrapper() .eq(ProductionOperationTask::getProductionOrderRoutingOperationId, id)); productionOrderRoutingOperationMapper.deleteById(id); if (routingId != null) { List operationList = productionOrderRoutingOperationMapper.selectList( Wrappers.lambdaQuery() .eq(ProductionOrderRoutingOperation::getOrderRoutingId, routingId) .eq(ProductionOrderRoutingOperation::getProductionOrderId, productionOrderId) .orderByAsc(ProductionOrderRoutingOperation::getDragSort)); for (int i = 0; i < operationList.size(); i++) { ProductionOrderRoutingOperation item = operationList.get(i); if (!Integer.valueOf(i + 1).equals(item.getDragSort())) { item.setDragSort(i + 1); productionOrderRoutingOperationMapper.updateById(item); } } } return R.ok(); } catch (Exception e) { throw new RuntimeException("删除生产工艺路线失败:" + e.getMessage()); } } @Override public int sortRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) { ProductionOrderRoutingOperation oldItem = productionOrderRoutingOperationMapper.selectById(productionOrderRoutingOperation.getId()); List operationList = productionOrderRoutingOperationMapper.selectList( Wrappers.lambdaQuery() .eq(ProductionOrderRoutingOperation::getOrderRoutingId, oldItem.getOrderRoutingId()) .orderByAsc(ProductionOrderRoutingOperation::getDragSort)); Integer targetPosition = productionOrderRoutingOperation.getDragSort(); if (targetPosition != null && targetPosition >= 1) { operationList.removeIf(item -> item.getId().equals(oldItem.getId())); operationList.add(targetPosition - 1, oldItem); for (int i = 0; i < operationList.size(); i++) { ProductionOrderRoutingOperation item = operationList.get(i); int dragSort = i + 1; if (!Integer.valueOf(dragSort).equals(item.getDragSort())) { item.setDragSort(dragSort); productionOrderRoutingOperationMapper.updateById(item); } } return 1; } return 0; } }