buhuazhen
4 天以前 0007e69142f83757094a941a855fca923171689d
feat(production): 新增自动报工功能及生产订单管理

- 在ProductionProductMainService中添加executeAutoReportWork方法声明,用于根据工艺路线及上次路线item自动报工
- 在ProductionProductMainServiceImpl实现executeAutoReportWork方法骨架
- 重构删除报工逻辑,防止已不合格处理记录被删除
- 添加ProductOrderServiceImpl实现生产订单绑定工艺路线及管理功能
- 新增工序ProductProcess实体类定义,支持工资定额及类型区分
- 新增ProductWorkOrderDto,支持工单详细字段及业务扩展
- 新增ProductWorkOrderMapper.xml,提供工单分页查询及流水号相关SQL
- 新增StatisticsReportWorkByProcessDto,用于统计报工完成数量按工序分组
- 优化代码格式及导入语句顺序,提升代码规范性
已添加1个文件
已修改6个文件
61 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -43,4 +43,6 @@
    @ApiModelProperty(value = "工单类型 æ­£å¸¸ /返工返修")
    private String workOrderType;
    private Boolean isReportWork;
}
src/main/java/com/ruoyi/production/dto/StatisticsReportWorkByProcessDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.production.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * ç»Ÿè®¡æŠ¥å·¥æƒ…况通过工序的dto
 * @author buhuazhen
 * @date 2026/4/1
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsReportWorkByProcessDto implements Serializable {
    private Long processId;
    // å®Œæˆæ•°é‡
    private BigDecimal completedQuantity;
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -78,5 +78,7 @@
    @ApiModelProperty(value ="是否质检")
    private Boolean isQuality;
    // å¦‚果为true ç›´æŽ¥å…¥åº“操作不需要人工报工
    @TableField(value = "is_report_work")
    private Boolean isReportWork;
}
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -6,6 +6,7 @@
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.pojo.ProductionProductMain;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@@ -17,4 +18,7 @@
    Boolean removeProductMain(Long id);
    ArrayList<Long> listMain(List<Long> idList);
    // æ ¹æ®å·¥è‰ºè·¯çº¿ ä»¥åŠä¸Šæ¬¡è·¯çº¿item è¿›è¡Œè‡ªåŠ¨æŠ¥å·¥æ“ä½œ
    void executeAutoReportWork(@NotNull Long productOrderId);
}
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -91,6 +91,7 @@
            productProcessRouteItem.setProductOrderId(productOrder.getId());
            productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
            productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
            productProcessRouteItem.setIsQuality(false);
            int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
            if (insert > 0) {
                // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -12,8 +12,8 @@
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -30,7 +30,6 @@
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -46,6 +45,7 @@
@Transactional(rollbackFor = Exception.class)
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
    private final ProcessRouteItemMapper processRouteItemMapper;
    private IQualityInspectService qualityInspectService;
    private ProductionProductMainMapper productionProductMainMapper;
@@ -207,7 +207,7 @@
                                qualityInspectParamMapper.insert(param);
                            });
                }
            }else {
            } else {
                //直接入库
                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
            }
@@ -264,10 +264,10 @@
    public Boolean removeProductMain(Long id) {
        //判断该条报工是否不合格处理,如果不合格处理了,则不允许删除
        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
        if (qualityInspects.size() > 0){
        if (qualityInspects.size() > 0) {
            List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
                    .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
                throw new ServiceException("该条报工已经不合格处理了,不允许删除");
            }
        }
@@ -321,7 +321,7 @@
                    new LambdaQueryWrapper<QualityInspectParam>()
                            .eq(QualityInspectParam::getInspectId, q.getId()));
            qualityInspectMapper.deleteById(q.getId());
                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
            stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
        });
        // åˆ é™¤äº§å‡ºè®°å½•
@@ -345,4 +345,17 @@
    public ArrayList<Long> listMain(List<Long> idList) {
        return productionProductMainMapper.listMain(idList);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void executeAutoReportWork(Long productOrderId) {
        ProductOrder productOrder = productOrderMapper.selectById(productOrderId);
        // èŽ·å–å¯¹åº”å·¥åº
        LambdaQueryWrapper<ProductProcessRouteItem> queryWrapperProductProcessRouteItem = new LambdaQueryWrapper<>();
        queryWrapperProductProcessRouteItem.eq(ProductProcessRouteItem::getProductOrderId, productOrder.getId());
        queryWrapperProductProcessRouteItem.orderByAsc(ProductProcessRouteItem::getId);
        List<ProductProcessRouteItem> processRouteItems = productProcessRouteItemMapper.selectList(queryWrapperProductProcessRouteItem);
        // æŸ¥è¯¢å¯¹åº”的报工情况。
    }
}
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,6 +21,7 @@
    <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
        SELECT
        pwo.*,
        pp.is_report_work,
        pp.NAME as processName,
        pm.model,
        pm.unit,