buhuazhen
2026-04-27 0b42b65ec1cb58949f1f85718d1ad1d011802bae
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -1,20 +1,27 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProcessRouteAnticlockwiseDto;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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
@AllArgsConstructor
@@ -23,6 +30,28 @@
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
    private ProductStructureService productStructureService;
    @Autowired
    private ProcessRouteItemService processRouteItemService;
    @Autowired
    private ProductWorkOrderService productWorkOrderService;
    @Autowired
    private ProductBomService productBomService;
    @Autowired
    private ProductProcessRouteService productProcessRouteService;
    @Autowired
    private ProductProcessRouteItemService productProcessRouteItemService;
    @Autowired
    private ProductOrderService productOrderService;
    @Autowired
    private ProductProcessService productProcessService;
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
@@ -35,9 +64,178 @@
        this.save(processRoute);
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String newProductCode = "GY" + dateStr + idStr;
        String newProductCode = "GYLX" + dateStr + idStr;
        // 更新数据库中的productCode
        processRoute.setProcessRouteCode(newProductCode);
        return processRouteMapper.updateById(processRoute);
    }
    @Override
    public int batchDelete(List<Long> ids) {
        //先判断是否已经引用了
        List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
        if (productOrders.size() > 0) {
            throw new RuntimeException("该工艺路线生产已引用,不能删除");
        }
        //删除工艺路线详情
        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
        return processRouteMapper.deleteBatchIds(ids);
    }
    /**
     * 工艺路线反向新增  新增了bom bom子表  工艺路线  工艺路线子表 生产工艺路线主表  生产工艺路线子表 工单表
     *
     * @param processRouteAnticlockwiseDtos 工艺子表
     * @param productModelId                成品规格型号id
     * @param productOrderId                生产订单id
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Long processRouteAnticlockwise(List<ProcessRouteAnticlockwiseDto> processRouteAnticlockwiseDtos, Long productModelId, Long productOrderId) {
        ProductOrder byId = productOrderService.getById(productOrderId);
        // 1. 新增BOM
        ProductBom productBom = createProductBom(productModelId);
        // 2. 新增BOM子表
        List<ProductStructure> productStructures = buildProductStructures(processRouteAnticlockwiseDtos, productBom.getId());
        productStructureService.saveBatch(productStructures);
        // 3. 新增工艺路线
        ProcessRoute processRoute = createProcessRoute(productModelId, productBom.getId());
        // 4. 新增工艺路线子表
        List<ProcessRouteItem> processRouteItems = buildProcessRouteItems(processRouteAnticlockwiseDtos, processRoute.getId(), productModelId);
        processRouteItemService.saveBatch(processRouteItems);
        // 5. 新增生产工艺路线
        ProductProcessRoute productProcessRoute = createProductProcessRoute(productModelId, productOrderId, productBom.getId(), processRoute.getProcessRouteCode());
        // 6. 新增生产工艺路线子表
        buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId,productOrderId);
        return processRoute.getId();
    }
    /**
     * 创建产品BOM
     */
    private ProductBom createProductBom(Long productModelId) {
        ProductBom productBom = new ProductBom();
        productBom.setProductModelId(productModelId);
        productBom.setVersion("1.0.0");
        productBomService.save(productBom);
        productBom.setBomNo("BM." + String.format("%05d", productBom.getId()));
        productBomService.updateById(productBom);
        return productBom;
    }
    /**
     * 构建产品结构列表
     */
    private List<ProductStructure> buildProductStructures(List<ProcessRouteAnticlockwiseDto> dtos, Integer bomId) {
        List<ProductStructure> structures = new ArrayList<>(dtos.size());
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProductStructure structure = new ProductStructure();
            structure.setProductModelId(dto.getProductModelId());
            structure.setProcessId(dto.getProcessId());
            structure.setUnitQuantity(new BigDecimal(1));
            structure.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            structure.setProcessRouteNum(dto.getProcessRouteNum());
            structure.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            structure.setProcessRouteRequire(dto.getProcessRouteRequire());
            structure.setBomId(bomId);
            structure.setProcessRouteName(dto.getProcessRouteName());
            structures.add(structure);
        }
        return structures;
    }
    /**
     * 创建工艺路线
     */
    private ProcessRoute createProcessRoute(Long productModelId, Integer bomId) {
        ProcessRoute processRoute = new ProcessRoute();
        processRoute.setProductModelId(productModelId);
        processRoute.setBomId(bomId);
        processRoute.setDescription("");
        this.save(processRoute);
        processRoute.setProcessRouteCode("GYLX." + String.format("%05d", processRoute.getId()));
        this.updateById(processRoute);
        return processRoute;
    }
    /**
     * 构建工艺路线子项列表
     */
    private List<ProcessRouteItem> buildProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long routeId, Long productModelId) {
        List<ProcessRouteItem> items = new ArrayList<>(dtos.size());
        Integer num = 0;
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProcessRouteItem item = new ProcessRouteItem();
            item.setRouteId(routeId);
            item.setProcessId(dto.getProcessId());
            item.setProductModelId(productModelId);
            item.setProcessRouteName(dto.getProcessRouteName());
            item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            item.setProcessRouteNum(dto.getProcessRouteNum());
            item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            item.setProcessRouteRequire(dto.getProcessRouteRequire());
            item.setDragSort(num++);
            items.add(item);
        }
        return items;
    }
    /**
     * 创建生产工艺路线
     */
    private ProductProcessRoute createProductProcessRoute(Long productModelId, Long productOrderId, Integer bomId, String processRouteCode) {
        ProductProcessRoute productProcessRoute = new ProductProcessRoute();
        productProcessRoute.setProductModelId(productModelId);
        productProcessRoute.setProductOrderId(productOrderId);
        productProcessRoute.setBomId(bomId);
        productProcessRoute.setProcessRouteCode(processRouteCode);
        productProcessRouteService.save(productProcessRoute);
        return productProcessRoute;
    }
    /**
     * 构建生产工艺路线子项列表
     */
    private void buildProductProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long productRouteId, Long productModelId,Long productOrderId) {
        ProductOrder byId = productOrderService.getById(productOrderId);
        Integer num = 0;
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProductProcessRouteItem item = new ProductProcessRouteItem();
            item.setProductRouteId(productRouteId);
            item.setProcessId(dto.getProcessId());
            item.setProductModelId(dto.getProductModelId());
            item.setProcessRouteName(dto.getProcessRouteName());
            item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            item.setProcessRouteNum(dto.getProcessRouteNum());
            item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            item.setProcessRouteRequire(dto.getProcessRouteRequire());
            item.setDragSort(num++);
            item.setUuid(dto.getUuid());
            productProcessRouteItemService.save(item);
            ProductProcess productProcess = productProcessService.getById(item.getProcessId());
            //同步新增生产工单
            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
            productWorkOrder.setProductProcessRouteItemId(item.getId());
            productWorkOrder.setProductOrderId(productOrderId);
            productWorkOrder.setPlanQuantity(new BigDecimal(dto.getProcessRouteNum()));
            productWorkOrder.setDeviceId(dto.getDeviceId());
            productWorkOrder.setUserIds(dto.getUserIds());
            productWorkOrder.setUserNames(dto.getUserNames());
            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcess.getName(), byId.getNpsNo()));
            productWorkOrder.setStatus(1);
            productWorkOrderService.save(productWorkOrder);
        }
    }
}