buhuazhen
2026-05-12 15999f1d20063dec73abeeea435d6e0d5a55c491
src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
@@ -1,22 +1,33 @@
package com.ruoyi.production.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.excel.ProductionPrintOrderExcel;
import com.ruoyi.basic.service.CustomerFollowUpFileService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.dto.SimplePersonDto;
import com.ruoyi.production.dto.ProcessContentDto;
import com.ruoyi.production.dto.ProcessRouteAnticlockwiseDto;
import com.ruoyi.production.dto.SaveProductionPrintOrderDto;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.mapper.ProductionPrintOrderMapper;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.pojo.ProductionPrintOrder;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductBomService;
import com.ruoyi.production.service.ProductProcessRouteService;
import com.ruoyi.production.service.ProductionPrintOrderService;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -34,11 +45,31 @@
    private final ProductOrderMapper productOrderMapper;
    private final ProcessRouteServiceImpl processRouteService;
    private final ProductionPrintOrderExcel productionPrintOrderExcel;
    private final ProductWorkOrderMapper productWorkOrderMapper;
    private final ProductProcessRouteService productProcessRouteService;
    private final ProductBomService productBomService;
    private final CustomerFollowUpFileService customerFollowUpFileService;
    @Override
    @Transactional
    public void save(SaveProductionPrintOrderDto dto) {
        ProductionPrintOrder productionPrintOrder = BeanUtil.copyProperties(dto, ProductionPrintOrder.class);
        if(dto.getId() != null){
            // 先删除生产工单数据
            LambdaQueryWrapper<ProductWorkOrder> l1 = new LambdaQueryWrapper<>();
            l1.eq(ProductWorkOrder::getProductOrderId,dto.getProductOrderId());
            productWorkOrderMapper.delete(l1);
            LambdaQueryWrapper<ProductProcessRoute> l2 = new LambdaQueryWrapper<>();
            l2.eq(ProductProcessRoute::getProductOrderId,dto.getProductOrderId());
            List<ProductProcessRoute> needDeleteRoute = productProcessRouteService.list(l2);
            List<Long> needDeleteRouteIds = needDeleteRoute.stream().map(ProductProcessRoute::getId).collect(Collectors.toList());
            if(CollUtil.isNotEmpty(needDeleteRouteIds)){
                productProcessRouteService.removeBatchByIds(needDeleteRouteIds);
                List<Integer> needDeleteBom = needDeleteRoute.stream().map(ProductProcessRoute::getBomId).collect(Collectors.toList());
                productProcessRouteService.removeByIds(needDeleteBom);
            }
        }
        List<ProcessContentDto> processContentDtoList = productionPrintOrder.getProcessContent();
        // 给没有id的信息设置uuid
        processContentDtoList.forEach(processContentDto -> {
@@ -46,30 +77,119 @@
                processContentDto.setId(IdUtil.simpleUUID());
            }
        });
        MaterialInfoDto materialInfoDtoFirst = dto.getMaterialInfo().get(0);
        // 调用工序方增 函数
        List<ProcessRouteAnticlockwiseDto> processRouteAnticlockwiseDtos = processContentDtoList.stream().map(it -> {
            ProcessRouteAnticlockwiseDto pdto = new ProcessRouteAnticlockwiseDto();
            pdto.setProcessId(it.getProcessId());
            pdto.setProcessRouteName(it.getProcessContent());
            pdto.setProcessRouteName(it.getProcessName());
            pdto.setProcessRouteOpenNum(it.getOpenCount());
            pdto.setProcessRouteNum(it.getProcessPositive());
            pdto.setProcessRouteAddNum(it.getProcessPositive());
            pdto.setProcessRouteAddNum(it.getAllowanceQty());
//            pdto.setProcessRouteRequire(); 工艺要求
            pdto.setProductModelId(dto.getProductModelId());
            pdto.setUserIds(it.getReportWorkerList().stream().map(SimplePersonDto::getUserName).collect(Collectors.joining(",")));
            pdto.setProductModelId(Long.valueOf(materialInfoDtoFirst.getProductModelId()));
            pdto.setUserIds(it.getReportWorkerList().stream().map(SimplePersonDto::getUserId).map(String::valueOf).collect(Collectors.joining(",")));
            pdto.setUserNames(it.getReportWorkerList().stream().map(SimplePersonDto::getUserName).collect(Collectors.joining(",")));
            pdto.setDeviceId(it.getDeviceId());
            pdto.setUuid(it.getId());
            return pdto;
        }).collect(Collectors.toList());
        processRouteService.processRouteAnticlockwise(processRouteAnticlockwiseDtos,dto.getProductModelId(),dto.getProductOrderId());
        // 生成备注 备注由全部工序名称来 组成
        String remark = processContentDtoList.stream().map(ProcessContentDto::getProcessContent).collect(Collectors.joining("、"));
        String remark = processContentDtoList.stream().map(ProcessContentDto::getProcessName).collect(Collectors.joining("、"));
        ProductOrder productOrder = new ProductOrder();
        productOrder.setId(dto.getProductOrderId());
        productOrder.setRemark(remark);
        productOrderMapper.updateById(productOrder);
        int i = dto.getId() == null ? productionPrintOrderMapper.insert(productionPrintOrder) : productionPrintOrderMapper.updateById(productionPrintOrder);
        LambdaQueryWrapper<ProductionPrintOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProductionPrintOrder::getProductOrderId,dto.getProductModelId());
        queryWrapper.last("limit 1");
        ProductionPrintOrder ifExitPrint = productionPrintOrderMapper.selectOne(queryWrapper);
        if (ifExitPrint == null) {
            productionPrintOrderMapper.insert(productionPrintOrder);
        }else {
            productionPrintOrder.setId(ifExitPrint.getId());
            productionPrintOrderMapper.updateById(productionPrintOrder);
        }
    }
    @Override
    public ProductionPrintOrderDto getByProductWordId(Long id) {
        LambdaQueryWrapper<ProductionPrintOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProductionPrintOrder::getProductOrderId, id);
        queryWrapper.orderByDesc(ProductionPrintOrder::getCreateTime);
        queryWrapper.last("limit 1");
        ProductionPrintOrder productionPrintOrder = productionPrintOrderMapper.selectOne(queryWrapper);
        ProductionPrintOrderDto productionPrintOrderDto = BeanUtil.copyProperties(productionPrintOrder, ProductionPrintOrderDto.class);
        // 获取附件信息
        productionPrintOrderDto.setCuttingFileVo(customerFollowUpFileService.getSimpleFileVoById(productionPrintOrderDto.getCuttingFileId()));
        return productionPrintOrderDto;
    }
    @Override
    public List<ProductionPrintOrder> getListByOrders(List<Long> orderIds) {
        if(CollUtil.isEmpty(orderIds)){
            return new ArrayList<>();
        }
        LambdaQueryWrapper<ProductionPrintOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(ProductionPrintOrder::getProductOrderId, orderIds);
        List<ProductionPrintOrder> productionPrintOrders = productionPrintOrderMapper.selectList(queryWrapper);
        // 去除重复的orderIds的记录只保留id最大的一个
        return productionPrintOrders.stream().collect(Collectors.collectingAndThen(
            Collectors.toMap(
                ProductionPrintOrder::getProductOrderId,
                productionPrintOrder -> productionPrintOrder,
                (existing, replacement) -> existing.getId() > replacement.getId() ? existing : replacement
            ),
            map -> new ArrayList<>(map.values())
        ));
    }
    @Override
    public byte[] exportPrintExcelByWordId(@Nullable Long orderId) {
        ProductionPrintOrderDto printOrderDto = this.getByProductWordId(orderId);
        List<MaterialInfoDto> materialInfo = printOrderDto.getMaterialInfo();
        Assert.isTrue(CollUtil.isNotEmpty(materialInfo),"未有材料信息,请添加改信息!");
        MaterialInfoDto materialInfoDto = materialInfo.get(0);
        ExportProductionPrintOrderDto exportProductionPrintOrderDto = BeanUtil.copyProperties(printOrderDto, ExportProductionPrintOrderDto.class);
        exportProductionPrintOrderDto.setNumSuffix(materialInfoDto.getNumSuffix());
        exportProductionPrintOrderDto.setUnitSuffix(materialInfoDto.getUnitSuffix());
        exportProductionPrintOrderDto.setPriceSuffix(materialInfoDto.getPriceSuffix());
        StringUtils.fillStringNull(exportProductionPrintOrderDto);
        // 日期修正为 yyyy年 MM 月 mm 日yyyy-MM-dd
        exportProductionPrintOrderDto.setPrintOrderTimeStr(DateUtil.format(exportProductionPrintOrderDto.getPrintOrderTime(),"yyyy年 MM 月 dd 日"));
        exportProductionPrintOrderDto.setFinishTimeStr(DateUtil.format(exportProductionPrintOrderDto.getFinishTime(),"yyyy年 MM 月 dd 日"));
        // 介绍信 勾选框
        String introductionLetter = exportProductionPrintOrderDto.getIntroductionLetter();
        List<String> introductionLetterItem = StrUtil.split(introductionLetter, ",");
        exportProductionPrintOrderDto.setIntroductionLetter1(introductionLetterItem.contains("介绍信")?"R" : "£");
        exportProductionPrintOrderDto.setIntroductionLetter2(introductionLetterItem.contains("商标注册")?"R" : "£");
        exportProductionPrintOrderDto.setIntroductionLetter3(introductionLetterItem.contains("委印单")?"R" : "£");
        exportProductionPrintOrderDto.setIntroductionLetter4(introductionLetterItem.contains("书号")?"R" : "£");
        // 切料图示
        exportProductionPrintOrderDto.setCuttingDiagramCheckout1("平张".equals(exportProductionPrintOrderDto.getCuttingDiagramCheckout())?"R" : "£");
        exportProductionPrintOrderDto.setCuttingDiagramCheckout2("卷筒".equals(exportProductionPrintOrderDto.getCuttingDiagramCheckout())?"R" : "£");
        // 读取图片信息
        if(exportProductionPrintOrderDto.getCuttingFileVo() != null){
            byte[] bytes = FileUtil.readBytes(exportProductionPrintOrderDto.getCuttingFileVo().getFileUrl());
            exportProductionPrintOrderDto.setCuttingImage(bytes);
        }
        // cutNum 为小盒数量+中盒数量
        exportProductionPrintOrderDto.setCutNum(String.valueOf(NumberUtil.add(exportProductionPrintOrderDto.getSmallBoxQty(),exportProductionPrintOrderDto.getMediumBoxQty())));
        byte[] printOrderTemplate = productionPrintOrderExcel.createPrintOrderTemplate(exportProductionPrintOrderDto, this.getClass().getResourceAsStream("/static/printOrderTemp.xlsx"));
        return printOrderTemplate;
    }
}