实际合格率低于【合格率】时,每个【生产工单】、【生产报工】台账需要标红显示。并发送消息到管理员,内容为:【xxx生产订单,xx工序合格率xx%低于标准xx%】
已修改6个文件
62 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -64,4 +64,10 @@
    @ApiModelProperty(value = "状态文本")
    private String statusText;
    @ApiModelProperty(value = "工序合格率")
    private BigDecimal processQualifiedRate;
    @ApiModelProperty(value = "实际合格率")
    private BigDecimal actualQualifiedRate;
}
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -61,6 +61,10 @@
    //工序
    @Excel(name = "工序")
    private String process;
    // 工序合格率
    private BigDecimal processQualifiedRate;
    // 实际合格率
    private BigDecimal actualQualifiedRate;
    private BigDecimal workHours;
    private BigDecimal wages;
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -73,6 +73,25 @@
                    record.setIsCanReport(true);
                }
            }
            // 查询当前实际的合格率
            // 查询关联产出表数据
            List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery().eq(ProductionProductMain::getWorkOrderId, record.getId()));
            BigDecimal totalScrapQty = BigDecimal.ZERO;
            if (CollectionUtils.isNotEmpty(productionProductMains)) {
                // 计算报废数量
                List<Long> mainIds = productionProductMains.stream().map(ProductionProductMain::getId).collect(Collectors.toList());
                List<ProductionProductOutput> productionProductOutputs = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().in(ProductionProductOutput::getProductMainId, mainIds));
                totalScrapQty = productionProductOutputs.stream().map(ProductionProductOutput::getScrapQty).reduce(BigDecimal.ZERO, BigDecimal::add);
            }
            if (record.getCompleteQuantity().compareTo(BigDecimal.ZERO) > 0) {
                record.setActualQualifiedRate((record.getCompleteQuantity().subtract(totalScrapQty))
                        .divide(record.getCompleteQuantity(), 2, RoundingMode.HALF_UP)
                        .multiply(new BigDecimal("100"))
                );
            } else {
                record.setActualQualifiedRate((record.getCompleteQuantity().subtract(totalScrapQty)).multiply(BigDecimal.valueOf(100)));
            }
        });
        return productWorkOrderDtoIPage;
    }
@@ -154,10 +173,11 @@
                    scrapQty = productionProductOutputs.stream().map(ProductionProductOutput::getScrapQty).reduce(BigDecimal.ZERO, BigDecimal::add);
                }
                if (productWorkOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) > 0) {
                    productWorkOrderDto.setScrapRate(scrapQty.divide(productWorkOrderDto.getCompleteQuantity(), 2, RoundingMode.HALF_UP));
                    productWorkOrderDto.setScrapRate(scrapQty.divide(productWorkOrderDto.getCompleteQuantity(), 4, RoundingMode.HALF_UP));
                } else {
                    productWorkOrderDto.setScrapRate(scrapQty.multiply(BigDecimal.valueOf(100)));
                }
                productWorkOrderDto.setScrapQty(scrapQty);
                productWorkOrderDto.setCompleteQty(productWorkOrderDto.getCompleteQuantity().subtract(scrapQty));
            });
        }
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -24,6 +24,7 @@
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.quality.service.IQualityInspectService;
@@ -33,13 +34,11 @@
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -85,6 +84,7 @@
    private StockUtils stockUtils;
    private ISysNoticeService sysNoticeService;
    @Override
    public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) {
@@ -187,8 +187,24 @@
        productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
        productionProductOutput.setOtherData(dto.getOtherData() != null ? dto.getOtherData() : "");
        productionProductOutputMapper.insert(productionProductOutput);
        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
        //合格数量=报工数量-报废数量
        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
        // 合格率=合格数量/报工数量
        BigDecimal productQtyRate = productQty.divide(productionProductOutput.getQuantity(), 2, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("100"));
        // 该工序的合格率 < 合格率
        if (productQtyRate.compareTo(productProcess.getQualifiedRate()) < 0) {
            // 发送通知给管理员
            sysNoticeService.simpleNoticeByUser("报工提示",
                    String.format("%s生产订单,%s工序合格率%.2f%%低于标准%.2f%%", productOrder.getNpsNo(), productProcess.getName(), productQtyRate, productProcess.getQualifiedRate()),
                    Arrays.asList(Long.valueOf(1L)),
                    "/productionManagement/productionReporting");
        }
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        //只有合格数量>0才能增加相应数据
        if (productQty.compareTo(BigDecimal.ZERO) > 0) {
@@ -242,7 +258,6 @@
                }
            }
            /*更新工单和生产订单*/
            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
            productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
            if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
                productWorkOrder.setActualStartTime(LocalDate.now());//实际开始时间
@@ -252,7 +267,6 @@
            }
            productWorkOrderMapper.updateById(productWorkOrder);
            //生产订单
            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
            if (ObjectUtils.isNull(productOrder.getStartTime())) {
                productOrder.setStartTime(LocalDateTime.now());//开始时间
            }
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -23,6 +23,7 @@
        pwo.*,
        pp.id as processId,
        pp.NAME as processName,
        pp.qualified_rate as processQualifiedRate,
        pm.model,
        pm.unit,
        p.product_name AS productName,
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -19,9 +19,12 @@
        u.nick_name as nickName,
        p.product_name as productName,
        pp.name as process,
        pp.qualified_rate as processQualifiedRate,
        pm.model as productModelName,
        ppo.quantity,
        ppo.scrap_qty,
        (ppo.quantity - ppo.scrap_qty) as qualifiedQty,
        case when ppo.quantity > 0 then round((ppo.quantity - ppo.scrap_qty) / ppo.quantity * 100, 2) else 0 end as actualQualifiedRate,
        ppo.other_data,
        pm.unit,
        sl.sales_contract_no salesContractNo