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<ProductionPrintOrderMapper, ProductionPrintOrder>
|
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.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 -> {
|
if (StrUtil.isBlank(processContentDto.getId())) {
|
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.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<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;
|
}
|
|
|
}
|