7a7a4b207d96a88bb1b324513ad475071289260e..7a6f10169c1f56e7f0394463e1294fd2da3f6725
2026-03-30
yys 1.修改bug
7a6f10 对比 | 目录
2026-03-30
yys 1.修改bug
f4d4d2 对比 | 目录
已修改6个文件
102 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/work-order-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -74,7 +74,7 @@
    private Long tenantId;
    @ApiModelProperty(value ="是否质检")
    @Excel(name = "是否质检", readConverterExp = "0=否,1=是")
    @Excel(name = "是否质检", readConverterExp = "否=false,是=true")
    private Boolean isQuality;
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -117,11 +117,13 @@
        productProcessRoute.setBomId(processRoute.getBomId());
        productProcessRouteMapper.insert(productProcessRoute);
        // 绑定生产bom清单
        List<ProductStructureRecord> productStructureDtos = productOrder.getProductStructureRecords();
        productStructureDtos.forEach(item ->{
            item.setProductOrderId(productOrder.getId());
            productStructureRecordMapper.insert(item);
        });
        if(CollectionUtils.isNotEmpty(productOrder.getProductStructureRecords())){
            List<ProductStructureRecord> productStructureDtos = productOrder.getProductStructureRecords();
            productStructureDtos.forEach(item ->{
                item.setProductOrderId(productOrder.getId());
                productStructureRecordMapper.insert(item);
            });
        }
        //新增生产订单下的工艺路线子表
        List<ProductProcessRouteItem> processRouteItems = productOrder.getProcessRouteItems();
        // 生成当前日期的前缀:年月日
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -90,11 +90,10 @@
        return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto);
    }
    public BigDecimal getRatio(List<ProductWorkOrder> productWorkOrderList){
    public BigDecimal getRatio(List<ProductWorkOrder> productWorkOrderList,BigDecimal quantity){
        // 获取完成数量
        BigDecimal completeQuantity = productWorkOrderList
                .stream()
                .filter(item -> item.getStatus() == 3)
                .map(ProductWorkOrder::getCompleteQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 获取所有数量
@@ -102,13 +101,12 @@
                .stream()
                .map(ProductWorkOrder::getPlanQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 获取未完成数量
        BigDecimal unCompleteQuantity = totalQuantity.subtract(completeQuantity);
        if (unCompleteQuantity.compareTo(BigDecimal.ZERO) <= 0) {
        completeQuantity = completeQuantity.add(quantity); // 加上报工数量
        if (completeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        }
        // 计算比例
        return unCompleteQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
        return completeQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
    }
    @Override
@@ -126,7 +124,7 @@
        if(CollectionUtils.isEmpty(productWorkOrderList)){
            productWorkOrderList = new ArrayList<>();
        }
        BigDecimal ratio = getRatio(productWorkOrderList);
        BigDecimal ratio = getRatio(productWorkOrderList,dto.getQuantity().subtract(dto.getScrapQty() == null ? BigDecimal.ZERO : dto.getScrapQty()));
        //当前具体工序
        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
@@ -260,16 +258,17 @@
            }
            // 通过比例计算完成数量
            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
            if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                //如果是最后一道工序报工之后生产订单完成数量+
                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                    productOrder.setCompleteQuantity(productOrder.getQuantity());
                    productOrder.setEndTime(LocalDateTime.now());//结束时间
                    productOrder.setStatus("已完成");
                    // 生产完成入库
                    stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
                }
            //如果是最后一道工序报工之后生产订单完成数量+
            if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                productOrder.setCompleteQuantity(productOrder.getQuantity());
                productOrder.setEndTime(LocalDateTime.now());//结束时间
                productOrder.setStatus("已完成");
                // 生产完成入库
                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
            }
//            if (productWorkOrderList.stream().filter(item -> item.getStatus() == 3).count() == productProcessRouteItems.size() - 1) {
//
//            }
            productOrderMapper.updateById(productOrder);
            /*添加生产核算*/
            SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
@@ -322,31 +321,32 @@
        }
        //判断是否是最后一道工序
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
            if (productOrder != null) {
                BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
                BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
                BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
//        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
//        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
//
//        }
        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
        if (productOrder != null) {
            BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
            BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
            BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
                BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
            BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
                BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
                List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                        .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
                if(CollectionUtils.isEmpty(productWorkOrderList)){
                    productWorkOrderList = new ArrayList<>();
                }
                BigDecimal ratio = getRatio(productWorkOrderList);
                productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
                productOrder.setEndTime(null);
                productOrder.setStatus("生产中");
                productOrderMapper.updateById(productOrder);
            } else {
                throw new ServiceException("关联的生产订单不存在");
            BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
            List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
                    .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
            if(CollectionUtils.isEmpty(productWorkOrderList)){
                productWorkOrderList = new ArrayList<>();
            }
            BigDecimal ratio = getRatio(productWorkOrderList,BigDecimal.ZERO);
            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
            productOrder.setEndTime(null);
            productOrder.setStatus("生产中");
            productOrderMapper.updateById(productOrder);
        } else {
            throw new ServiceException("关联的生产订单不存在");
        }
        //删除质检
        qualityInspectMapper.selectList(
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -290,6 +290,7 @@
        productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
        String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
        productOrder.setNpsNo(string);
        productOrder.setStatus("待生产");
        productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量
        productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量
        productOrderMapper.insert(productOrder);
@@ -307,19 +308,20 @@
                productProcessRouteMapper.insert(productProcessRoute);
                // 绑定生产bom清单
                List<ProductBom> productBoms = productBomMapper.selectList(new LambdaQueryWrapper<ProductBom>()
                        .eq(ProductBom::getProductModelId, processRoute.getProductModelId())
                        .eq(ProductBom::getProductModelId, salesLedgerProduct.getProductModelId())
                        .orderByDesc(ProductBom::getId));
                if(com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(productBoms)){
                    ProductBom productBom = productBoms.get(0);
                    // 获取bom子表信息
                    List<ProductStructure> productStructures = productStructureMapper.selectList(new LambdaQueryWrapper<ProductStructure>()
                            .isNotNull(ProductStructure::getParentId)
                            .eq(ProductStructure::getBomId, productBom.getId()));
                    if(com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(productStructures)){
                        productStructures.forEach(item ->{
                            ProductStructureRecord item1 = new ProductStructureRecord();
                            BeanUtils.copyProperties(item, item1);
                            item1.setProductOrderId(productOrder.getId());
                            item1.setDemandedQuantity(item.getUnitQuantity().add(productOrder.getQuantity()));
                            item1.setDemandedQuantity(item.getUnitQuantity().multiply(productOrder.getQuantity()));
                            item1.setBomId(Long.valueOf(productBom.getId()));
                            productStructureRecordMapper.insert(item1);
                        });
@@ -464,10 +466,10 @@
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getSaleLedgerProductId, productIds));
            // 删除附件
            commonFileService.deleteByBusinessIds(productIds, FileNameType.PRODUCT_ORDER.getValue());
            commonFileService.deleteByBusinessIds(orderIds, FileNameType.PRODUCT_ORDER.getValue());
            // 删除生产订单-物料清单
            productStructureRecordMapper.delete(new LambdaQueryWrapper<ProductStructureRecord>()
                    .in(ProductStructureRecord::getProductOrderId, productIds));
                    .in(ProductStructureRecord::getProductOrderId, orderIds));
        }
    }
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
@@ -15,7 +15,7 @@
               slp.specification_model                                      as model,
               slp.unit                                      as unit,
               rsp.*,
               GREATEST(slp.quantity - COALESCE(rs.total_return_num, 0), 0) AS un_quantity,
               GREATEST(si.shipping_num - COALESCE(rs.total_return_num, 0), 0) AS un_quantity,
               COALESCE(rs.total_return_num, 0)                             AS total_return_num
        FROM return_sale_product rsp
                 LEFT JOIN return_management rm ON rm.id = rsp.return_management_id
src/main/resources/static/work-order-template.docx
Binary files differ