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.*; 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; /** * @author buhuazhen * @description 针对表【production_print_order(印刷定印单)】的数据库操作Service实现 * @createDate 2026-04-22 15:14:51 */ @Service @RequiredArgsConstructor public class ProductionPrintOrderServiceImpl extends ServiceImpl implements ProductionPrintOrderService{ private final ProductionPrintOrderMapper productionPrintOrderMapper; 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.getProductOrderId() != null){ // 先删除生产工单数据 LambdaQueryWrapper l1 = new LambdaQueryWrapper<>(); l1.eq(ProductWorkOrder::getProductOrderId,dto.getProductOrderId()); productWorkOrderMapper.delete(l1); LambdaQueryWrapper l2 = new LambdaQueryWrapper<>(); l2.eq(ProductProcessRoute::getProductOrderId,dto.getProductOrderId()); List needDeleteRoute = productProcessRouteService.list(l2); List needDeleteRouteIds = needDeleteRoute.stream().map(ProductProcessRoute::getId).collect(Collectors.toList()); if(CollUtil.isNotEmpty(needDeleteRouteIds)){ productProcessRouteService.removeBatchByIds(needDeleteRouteIds); List needDeleteBom = needDeleteRoute.stream().map(ProductProcessRoute::getBomId).collect(Collectors.toList()); productProcessRouteService.removeByIds(needDeleteBom); } } List processContentDtoList = productionPrintOrder.getProcessContent(); // 给没有id的信息设置uuid processContentDtoList.forEach(processContentDto -> { if (StrUtil.isBlank(processContentDto.getId())) { processContentDto.setId(IdUtil.simpleUUID()); } }); MaterialInfoDto materialInfoDtoFirst = dto.getMaterialInfo().get(0); // 调用工序方增 函数 List processRouteAnticlockwiseDtos = processContentDtoList.stream().map(it -> { ProcessRouteAnticlockwiseDto pdto = new ProcessRouteAnticlockwiseDto(); pdto.setProcessId(it.getProcessId()); pdto.setProcessRouteName(it.getProcessName()); pdto.setProcessRouteOpenNum(it.getOpenCount()); pdto.setProcessRouteNum(it.getProcessPositive()); pdto.setProcessRouteAddNum(it.getAllowanceQty()); // pdto.setProcessRouteRequire(); 工艺要求 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::getProcessName).collect(Collectors.joining("、")); ProductOrder productOrder = new ProductOrder(); productOrder.setId(dto.getProductOrderId()); productOrder.setRemark(remark); productOrderMapper.updateById(productOrder); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProductionPrintOrder::getProductOrderId,dto.getProductOrderId()); queryWrapper.last("limit 1"); ProductionPrintOrder ifExitPrint = productionPrintOrderMapper.selectOne(queryWrapper); if (ifExitPrint == null) { productionPrintOrder.setId(null); productionPrintOrderMapper.insert(productionPrintOrder); }else { productionPrintOrder.setId(ifExitPrint.getId()); productionPrintOrderMapper.updateById(productionPrintOrder); } } @Override public ProductionPrintOrderDto getByProductWordId(Long id) { LambdaQueryWrapper 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 getListByOrders(List orderIds) { if(CollUtil.isEmpty(orderIds)){ return new ArrayList<>(); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ProductionPrintOrder::getProductOrderId, orderIds); List 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 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 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; } }