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