buhuazhen
2026-04-24 0ca7d78f0e8e8a6984314803aba21ab1d25472b3
feat(production): 新增印刷定印单实体及相关接口和分页信息完善

- 新增 ProductionPrintOrder 实体,涵盖印刷定印单相关信息字段
- 在 ProductionPrintOrderService 增加根据订单列表批量查询印刷单方法
- 实现 ProductionPrintOrderServiceImpl 中批量查询逻辑,支持订单去重取最新印刷单
- 在 ProductOrderServiceImpl 的分页查询中整合印刷单信息,填充 DTO 相关字段
- 修改 ProductOrderDto 及 ProductOrder,新增多个导出字段及相关注解
- 更新 ProductOrderMapper.xml,增加实际交货日期和下单日期字段映射
- 修正 ProcessRouteServiceImpl 中工序排序字段 dragSort 的设置逻辑
- 新增 SalesLedger 实体,包括销售台账详细字段及导出注解
已修改9个文件
145 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductOrder.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.pojo.ProductOrder;
@@ -10,53 +11,87 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ExcelIgnoreUnannotated
public class ProductOrderDto extends ProductOrder {
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
    @Excel(name = "单号",sort = 2)
    private String salesContractNo;
    @ApiModelProperty(value = "项目名")
    @Excel(name = "项目名")
    private String projectName;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    @Excel(name = "厂家",sort = 3)
    private String customerName;
    @ApiModelProperty(value = "产品名称")
    @Excel(name = "产品名称")
    @Excel(name = "产品名称",sort = 4)
    private String productCategory;
    @ApiModelProperty(value = "规格")
    @Excel(name = "规格")
    @Excel(name = "纸张规格",sort = 5)
    private String specificationModel;
    @ApiModelProperty(value = "工艺路线编号")
    @Excel(name = "工艺路线编号")
    private String processRouteCode;
    @ApiModelProperty(value = "完成进度")
    @Excel(name = "完成进度", suffix = "%")
    private BigDecimal completionStatus;
    @ApiModelProperty(value = "BOM编号")
    @Excel(name = "BOM编号")
    private String bomNo;
    @ApiModelProperty(value = "交期偏差")
    private Integer deliveryDaysDiff;
    @ApiModelProperty(value = "交期")
    @ApiModelProperty(value = "计划交货日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "计划交货日期",sort = 10)
    private LocalDate deliveryDate;
    @ApiModelProperty(value = "实际交货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "实际交货日期",sort = 11)
    private LocalDateTime actuallyDeliveryDate;
    @ApiModelProperty(value = "签订日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "下单日期",sort = 1)
    private LocalDate executionDate;
    //是否发货(台账页面颜色控制)
    private Boolean isFh;
    private Long saleLedgerId;
    /**
     * 尺寸
     */
    private String cutSize;
    /**
     * 小盒数量
     */
    @Excel(name = "小盒数量",sort = 7)
    private String smallBoxQty;
    /**
     * 中盒数量
     */
    @Excel(name = "小盒数量",sort = 8)
    private String mediumBoxQty;
    /**
     * 色数
     */
    @Excel(name = "色数",sort = 9)
    private String printColorCount;
}
src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -49,7 +49,6 @@
     * 生产订单号
     */
    @ApiModelProperty(value = "生产订单号")
    @Excel(name = "生产订单号")
    private String npsNo;
    /**
@@ -64,7 +63,6 @@
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "创建时间")
    private LocalDateTime createTime;
    //修改时间
@@ -79,24 +77,21 @@
     * 需求数量
     */
    @ApiModelProperty(value = "需求数量")
    @Excel(name = "需求数量")
    @Excel(name = "印刷数量",sort = 6)
    private BigDecimal quantity;
    /**
     * 完成数量
     */
    @ApiModelProperty(value = "完成数量")
    @Excel(name = "完成数量")
    private BigDecimal completeQuantity;
    @Excel(name = "开始时间")
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @Excel(name = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
@@ -114,6 +109,7 @@
     * 备注
     */
    @TableField(value = "remark")
    @Excel(name = "备注",sort = 12)
    private String remark;
}
src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.pojo;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
@@ -11,9 +13,12 @@
import com.ruoyi.production.dto.MaterialInfoDto;
import com.ruoyi.production.dto.PlateMakingDto;
import com.ruoyi.production.dto.ProcessContentDto;
import com.ruoyi.production.dto.ProductOrderDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
/**
 * 印刷定印单
@@ -256,4 +261,21 @@
     */
    @TableField(value = "client_name")
    private String clientName;
    public ProductOrderDto convertProductOrderDto(@NotNull ProductOrderDto dto) {
        dto.setCutSize(this.getCutSize());
        dto.setSmallBoxQty(this.getSmallBoxQty());
        dto.setMediumBoxQty(this.getMediumBoxQty());
        // 色数 为工序开数第一个
        if(CollUtil.isNotEmpty(this.processContent)){
            ProcessContentDto processContentDto = BeanUtil.toBean(
                    processContent.get(0),
                    ProcessContentDto.class
            );
            dto.setPrintColorCount(processContentDto.getOpenCount());
        }
        // 备注已经填充到了 ProductOrderDto中无需关心
        return dto;
    }
}
src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java
@@ -5,6 +5,9 @@
import com.ruoyi.production.pojo.ProductionPrintOrder;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.annotation.Nullable;
import java.util.List;
/**
* @author buhuazhen
* @description 针对表【production_print_order(印刷定印单)】的数据库操作Service
@@ -24,4 +27,7 @@
     * @return
     */
    ProductionPrintOrderDto getByProductWordId(Long id);
    List<ProductionPrintOrder> getListByOrders(@Nullable List<Long> orderIds);
}
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -174,6 +174,7 @@
     */
    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);
@@ -184,6 +185,7 @@
            item.setProcessRouteNum(dto.getProcessRouteNum());
            item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            item.setProcessRouteRequire(dto.getProcessRouteRequire());
            item.setDragSort(num++);
            items.add(item);
        }
        return items;
@@ -208,6 +210,7 @@
     */
    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);
@@ -218,6 +221,7 @@
            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());
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -17,9 +17,11 @@
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.production.service.ProductProcessService;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.production.service.ProductionPrintOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@@ -29,6 +31,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@@ -37,6 +40,10 @@
    private final ProductWorkOrderService productWorkOrderService;
    private final ProductProcessService productProcessService;
    @Autowired
    @Lazy
    private ProductionPrintOrderService  productionPrintOrderService;
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
@@ -64,7 +71,23 @@
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
        return productOrderMapper.pageProductOrder(page, productOrder);
        IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(page, productOrder);
        // 填充印刷单信息
        List<ProductOrderDto> records = productOrderDtoIPage.getRecords();
        if (CollUtil.isNotEmpty(records)) {
            List<Long> orderIds = records.stream().map(ProductOrderDto::getId).collect(Collectors.toList());
            Map<Long, ProductionPrintOrder> collect = productionPrintOrderService.getListByOrders(orderIds).stream().collect(Collectors.toMap(ProductionPrintOrder::getProductOrderId, Function.identity()));
            records.forEach(record -> {
                ProductionPrintOrder productionPrintOrder = collect.get(record.getId());
                if (productionPrintOrder != null) {
                    productionPrintOrder.convertProductOrderDto(record);
                }
            });
        }
        return productOrderDtoIPage;
    }
    @Override
src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,6 +21,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -91,6 +93,25 @@
        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())
        ));
    }
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -136,6 +136,10 @@
    @TableField(value = "delivery_date")
    private LocalDate deliveryDate;
    @ApiModelProperty(value = "实际交货日期")
    @TableField(value = "actually_delivery_date")
    private LocalDate actuallyDeliveryDate;
    @TableField(exist = false)
    @ApiModelProperty(value = "交货天数差")
    private Integer deliveryDaysDiff;
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -26,6 +26,8 @@
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        sl.actually_delivery_date,
        sl.execution_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true