| | |
| | | package com.ruoyi.production.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | 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.ProductionProductMainMapper; |
| | | import com.ruoyi.production.pojo.ProductionOperationTask; |
| | | import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; |
| | | import com.ruoyi.production.pojo.ProductionProductMain; |
| | | import com.ruoyi.production.service.ProductionOrderRoutingOperationService; |
| | | import com.ruoyi.production.service.ProductionProductMainService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | /** |
| | | * <p> |
| | | * 生产订单工艺路线工序表 服务实现类 |
| | | * </p> |
| | | * |
| | | * @author 芯导软件(江苏)有限公司 |
| | | * @since 2026-04-21 03:55:52 |
| | | */ |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | public class ProductionOrderRoutingOperationServiceImpl extends ServiceImpl<ProductionOrderRoutingOperationMapper, ProductionOrderRoutingOperation> implements ProductionOrderRoutingOperationService { |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @RequiredArgsConstructor |
| | | public class ProductionOrderRoutingOperationServiceImpl extends ServiceImpl<ProductionOrderRoutingOperationMapper, ProductionOrderRoutingOperation> |
| | | implements ProductionOrderRoutingOperationService { |
| | | |
| | | private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; |
| | | private final ProductionOperationTaskMapper productionOperationTaskMapper; |
| | | private final ProductionProductMainMapper productionProductMainMapper; |
| | | private final ProductionProductMainService productionProductMainService; |
| | | |
| | | @Override |
| | | public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) { |
| | | int insert = productionOrderRoutingOperationMapper.insert(productionOrderRoutingOperation); |
| | | String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); |
| | | if (insert > 0) { |
| | | ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne( |
| | | Wrappers.<ProductionOperationTask>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.setTechnologyRoutingOperationId(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<ProductionOperationTask>() |
| | | .eq(ProductionOperationTask::getTechnologyRoutingOperationId, id) |
| | | .last("limit 1")); |
| | | if (productionOperationTask == null) { |
| | | throw new RuntimeException("删除失败:未找到关联的生产工单"); |
| | | } |
| | | if (productionOperationTask.getCompleteQuantity() != null |
| | | && BigDecimal.ZERO.compareTo(productionOperationTask.getCompleteQuantity()) < 0) { |
| | | throw new RuntimeException("删除失败:该工单已开始生产,请先删除生产报工"); |
| | | } |
| | | List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList( |
| | | new LambdaQueryWrapper<ProductionProductMain>() |
| | | .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.getTechnologyRoutingId(); |
| | | } |
| | | productionOperationTaskMapper.delete(new LambdaQueryWrapper<ProductionOperationTask>() |
| | | .eq(ProductionOperationTask::getTechnologyRoutingOperationId, id)); |
| | | productionOrderRoutingOperationMapper.deleteById(id); |
| | | if (routingId != null) { |
| | | List<ProductionOrderRoutingOperation> operationList = productionOrderRoutingOperationMapper.selectList( |
| | | Wrappers.<ProductionOrderRoutingOperation>lambdaQuery() |
| | | .eq(ProductionOrderRoutingOperation::getTechnologyRoutingId, 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<ProductionOrderRoutingOperation> operationList = productionOrderRoutingOperationMapper.selectList( |
| | | Wrappers.<ProductionOrderRoutingOperation>lambdaQuery() |
| | | .eq(ProductionOrderRoutingOperation::getTechnologyRoutingId, oldItem.getTechnologyRoutingId()) |
| | | .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; |
| | | } |
| | | } |