huminmin
4 小时以前 5cabba0016c61d51204c7e28bf0613b1cd335327
工序不合格处理为隔离后,后续工序不继续报工
已修改10个文件
133 ■■■■ 文件已修改
doc/20260317_鹏创电子.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260317_Åô´´µç×Ó.sql
@@ -3,4 +3,4 @@
    add defective_reason varchar(255) default '' not null comment '不良原因';
alter table quality_unqualified
    add quarantine_lifted boolean not null default false comment '是否已取消隔离';
    add quarantine_lifted boolean not null default true comment '是否已取消隔离';
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -11,6 +11,9 @@
@Data
public class ProductWorkOrderDto extends ProductWorkOrder {
    @ApiModelProperty(value = "产品ID")
    private String productId;
    //产品名称
    @ApiModelProperty(value = "产品名称")
    private String productName;
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -35,4 +35,12 @@
    ArrayList<Long> listMain(List<Long> idList);
    List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId);
    /**
     * æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
     * @param productRouteId å½“前工序的路由ID
     * @param currentDragSort å½“前工序的排序
     * @return æ˜¯å¦æœ‰éš”离的不合格记录
     */
    boolean checkPreviousProcessReported(@Param("productRouteId") Long productRouteId, @Param("currentDragSort") Integer currentDragSort);
}
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -14,6 +14,10 @@
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityUnqualified;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -39,9 +43,13 @@
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProductionProductMainMapper productionProductMainMapper;
    @Autowired
    private ProductionProductOutputMapper productionProductOutputMapper;
    @Autowired
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    @Value("${file.temp-dir}")
    private String tempDir;
@@ -50,27 +58,43 @@
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        IPage<ProductWorkOrderDto> productWorkOrderDtoIPage = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
        productWorkOrderDtoIPage.getRecords().forEach(record -> {
            //检查上一个工序是否已报工
            // æ˜¯å¦èƒ½æŠ¥å·¥ï¼š 1. ç¬¬ä¸€ä¸ªå·¥åºèƒ½æŠ¥å·¥ 2. ä¸Šä¸€ä¸ªå·¥åºå·²æŠ¥å·¥ 3. ä¹‹å‰çš„工序未被隔离
            Integer currentDragSort = record.getDragSort();
            if (currentDragSort == null || currentDragSort == 1) {
                record.setIsCanReport(true);
            } else {
                //查找上一个工序
                ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
                        Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                // ä¸Šä¸€ä¸ªå·¥åºæ˜¯å¦å·²æŠ¥å·¥
                boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
                        record.getProductRouteId(),
                        currentDragSort
                );
                record.setIsCanReport(isPreviousReported);
                if (previousItem != null) {
                    //检查上一个工序是否有报工记录
                    Long count = productionProductMainMapper.selectCount(
                            Wrappers.<ProductionProductMain>lambdaQuery()
                                    .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                // ä¹‹å‰çš„工序是否被隔离
                if (record.getIsCanReport()) {
                    // æŸ¥è¯¢æ‰€æœ‰ä¹‹å‰çš„工序(排序号小于当前工序)
                    List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                            Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                    .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                    .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
                    );
                    record.setIsCanReport(count > 0);
                } else {
                    record.setIsCanReport(true);
                    if (CollectionUtils.isNotEmpty(previousItems)) {
                        // æå–之前工序的名称列表
                        List<String> previousProcessNames = new ArrayList<>();
                        for (ProductProcessRouteItem item : previousItems) {
                            ProductProcess process = productProcessMapper.selectById(item.getProcessId());
                            if (process != null) {
                                previousProcessNames.add(process.getName());
                            }
                        }
                        // æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
                        List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
                        if (CollectionUtils.isNotEmpty(unqualifiedList)) {
                            record.setIsCanReport(false);
                        }
                    }
                }
            }
@@ -183,4 +207,4 @@
        }
        return productWorkOrderDtos;
    }
}
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -100,24 +101,38 @@
        if (productProcessRouteItem == null) {
            throw new RuntimeException("工艺路线项不存在");
        }
        // æ˜¯å¦èƒ½æŠ¥å·¥ï¼š 1. ç¬¬ä¸€ä¸ªå·¥åºèƒ½æŠ¥å·¥ 2. ä¸Šä¸€ä¸ªå·¥åºå·²æŠ¥å·¥ 3. ä¹‹å‰çš„工序未被隔离
        //检查上一个工序是否已报工
        Integer currentDragSort = productProcessRouteItem.getDragSort();
        if (currentDragSort != null && currentDragSort > 1) {
            ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
            boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
                    productProcessRouteItem.getProductRouteId(),
                    currentDragSort
            );
            if (isPreviousReported) {
                throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工");
            }
            // æŸ¥è¯¢æ‰€æœ‰ä¹‹å‰çš„工序(排序号小于当前工序)
            List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                    Wrappers.<ProductProcessRouteItem>lambdaQuery()
                            .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())
                            .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                            .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
            );
            if (CollectionUtils.isNotEmpty(previousItems)) {
                // æå–之前工序的名称列表
                List<String> previousProcessNames = new ArrayList<>();
                for (ProductProcessRouteItem item : previousItems) {
                    ProductProcess process = productProcessMapper.selectById(item.getProcessId());
                    if (process != null) {
                        previousProcessNames.add(process.getName());
                    }
                }
            if (previousItem != null) {
                //检查上一个工序是否有报工记录
                Long count = productionProductMainMapper.selectCount(
                        Wrappers.<ProductionProductMain>lambdaQuery()
                                .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                );
                if (count == 0) {
                    throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工");
                // æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
                List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
                if (CollectionUtils.isNotEmpty(unqualifiedList)) {
                    throw new RuntimeException("之前的工序已被隔离,不能进行当前工序报工");
                }
            }
        }
src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java
@@ -22,4 +22,7 @@
    //手动新增不合格的时候,根据产品名称和规格型号查出对应的规格型号id
    Long getModelId(@Param("productName") String productName, @Param("model") String model);
}
    //根据工序名称列表查询被隔离的不合格记录
    List<QualityUnqualified> selectUnqualifiedByProcessNames(@Param("processNames") List<String> processNames);
}
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -148,6 +148,9 @@
                        stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
                    }
                    break;
                case "隔离":
                    qualityUnqualified.setQuarantineLifted(false);
                    break;
                default:
                    break;
            }
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -27,6 +27,7 @@
        pm.model,
        pm.unit,
        p.product_name AS productName,
        p.id AS productId,
        po.nps_no AS productOrderNpsNo,
        ppri.drag_sort,
        ppri.product_route_id,
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -150,4 +150,13 @@
            #{id}
        </foreach>
    </delete>
    <select id="checkPreviousProcessReported" resultType="java.lang.Boolean">
        SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END
        FROM production_product_main ppm
        JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
        JOIN product_process_route_item ppri ON pwo.product_process_route_item_id = ppri.id
        WHERE ppri.product_route_id = #{productRouteId}
        AND ppri.drag_sort = #{currentDragSort} - 1
    </select>
</mapper>
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -99,4 +99,15 @@
        where pm.model=#{model}
          and  p.product_name=#{productName}
    </select>
    <select id="selectUnqualifiedByProcessNames" resultType="com.ruoyi.quality.pojo.QualityUnqualified">
        SELECT DISTINCT qu.*
        FROM quality_unqualified qu
        JOIN quality_inspect qi ON qu.inspect_id = qi.id
        WHERE qi.process IN
        <foreach collection="processNames" item="processName" open="(" separator="," close=")">
            #{processName}
        </foreach>
        AND qu.deal_result = '隔离'
        AND qu.quarantine_lifted = false
    </select>
</mapper>