| doc/quality_inspect_add_qualified_columns.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/quality/pojo/QualityInspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/quality/QualityInspectMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
doc/quality_inspect_add_qualified_columns.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ ALTER TABLE `quality_inspect` ADD COLUMN `qualified_quantity` decimal(18, 2) NULL DEFAULT NULL COMMENT 'åæ ¼æ°é' AFTER `quantity`, ADD COLUMN `unqualified_quantity` decimal(18, 2) NULL DEFAULT NULL COMMENT 'ä¸åæ ¼æ°é' AFTER `qualified_quantity`, ADD COLUMN `pass_rate` decimal(18, 2) NULL DEFAULT NULL COMMENT 'åæ ¼ç(%)' AFTER `unqualified_quantity`; -- å岿°æ®ï¼æåãæ£æµç»æã䏿»æ°éåå¡«ï¼æ æ»æ°éåè·³è¿ï¼ UPDATE `quality_inspect` SET `unqualified_quantity` = CASE WHEN `check_result` = 'ä¸åæ ¼' THEN IFNULL(`quantity`, 0) ELSE 0 END, `qualified_quantity` = CASE WHEN `check_result` = 'ä¸åæ ¼' THEN 0 ELSE IFNULL(`quantity`, 0) END WHERE `qualified_quantity` IS NULL AND `unqualified_quantity` IS NULL AND `quantity` IS NOT NULL; UPDATE `quality_inspect` SET `pass_rate` = CASE WHEN `quantity` IS NULL OR `quantity` = 0 THEN 0 ELSE ROUND(IFNULL(`qualified_quantity`, 0) * 100 / `quantity`, 2) END WHERE `pass_rate` IS NULL; src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -308,6 +308,47 @@ return analysisCustomerContractAmountsDto; } private static BigDecimal nz(BigDecimal v) { return v == null ? BigDecimal.ZERO : v; } /** * 大å±/æ¥è¡¨ç»è®¡ç¨åæ ¼æ°éï¼ä»¥ qualified_quantity */ private BigDecimal inspectQualifiedQtyForStat(QualityInspect item) { if (item.getQualifiedQuantity() != null) { return item.getQualifiedQuantity(); } BigDecimal qty = nz(item.getQuantity()); if ("åæ ¼".equals(item.getCheckResult())) { return qty; } return BigDecimal.ZERO; } /** * 大å±/æ¥è¡¨ç»è®¡ç¨ä¸åæ ¼æ°éï¼ä»¥ unqualified_quantity */ private BigDecimal inspectUnqualifiedQtyForStat(QualityInspect item) { if (item.getUnqualifiedQuantity() != null) { return item.getUnqualifiedQuantity(); } BigDecimal qty = nz(item.getQuantity()); String cr = item.getCheckResult(); if ("ä¸åæ ¼".equals(cr) || "é¨ååæ ¼".equals(cr)) { return qty; } return BigDecimal.ZERO; } private boolean inspectHasUnqualifiedVolume(QualityInspect item) { return inspectUnqualifiedQtyForStat(item).compareTo(BigDecimal.ZERO) > 0; } private static int toStatInt(BigDecimal v) { return nz(v).setScale(0, RoundingMode.HALF_UP).intValue(); } @Override public QualityStatisticsDto qualityStatistics() { // è·åè¿åä¸ªææ°æ®ï¼å¾åæ¨ä¸ä¸ªæï¼å ±4ä¸ªå®æ´æä»½ï¼ @@ -355,29 +396,27 @@ QualityStatisticsItem item = new QualityStatisticsItem(); item.setDate(monthStart.format(monthFormatter)); // æ¥ææ¾ç¤ºä¸ºâå¹´æâï¼å¦ 2025-10ï¼ // 1. ä¾åºåæ£éªï¼ç±»å0ï¼- åæ ¼æ°é BigDecimal supplierQualified = monthInspects.stream() // 1ï½3ï¼æ¬æãä¸åæ ¼æ°éãï¼ä» å·²æäº¤æ£éªï¼ï¼ææ£éªç±»å«æåââç¨äºå¾è¡¨å¾ä¾ãÃÃä¸åæ ¼æ°ã BigDecimal supplierUnq = monthInspects.stream() .filter(inspect -> inspect.getInspectType().equals(0) && "åæ ¼".equals(inspect.getCheckResult())) .map(QualityInspect::getQuantity) && Objects.equals(inspect.getInspectState(), 1)) .map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setSupplierNum(supplierQualified); item.setSupplierNum(supplierUnq); // 2. å·¥åºæ£éªï¼ç±»å1ï¼- åæ ¼æ°é BigDecimal processQualified = monthInspects.stream() BigDecimal processUnq = monthInspects.stream() .filter(inspect -> inspect.getInspectType().equals(1) && "åæ ¼".equals(inspect.getCheckResult())) .map(QualityInspect::getQuantity) && Objects.equals(inspect.getInspectState(), 1)) .map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setProcessNum(processQualified); item.setProcessNum(processUnq); // 3. 工忣éªï¼ç±»å2ï¼- åæ ¼æ°é BigDecimal factoryQualified = monthInspects.stream() BigDecimal factoryUnq = monthInspects.stream() .filter(inspect -> inspect.getInspectType().equals(2) && "åæ ¼".equals(inspect.getCheckResult())) .map(QualityInspect::getQuantity) && Objects.equals(inspect.getInspectState(), 1)) .map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setFactoryNum(factoryQualified); item.setFactoryNum(factoryUnq); qualityStatisticsItems.add(item); } @@ -1902,17 +1941,14 @@ BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : list) { if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(item.getQuantity()); } else { unqualifiedCount = unqualifiedCount.add(item.getQuantity()); } qualifiedCount = qualifiedCount.add(inspectQualifiedQtyForStat(item)); unqualifiedCount = unqualifiedCount.add(inspectUnqualifiedQtyForStat(item)); } BigDecimal totalCount = qualifiedCount.add(unqualifiedCount); dto.setQualifiedCount(qualifiedCount.intValue()); dto.setUnqualifiedCount(unqualifiedCount.intValue()); dto.setQualifiedCount(toStatInt(qualifiedCount)); dto.setUnqualifiedCount(toStatInt(unqualifiedCount)); if (totalCount.compareTo(BigDecimal.ZERO) == 0) { dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); @@ -2175,13 +2211,8 @@ continue; } BigDecimal quantity = item.getQuantity(); if ("åæ ¼".equals(item.getCheckResult())) { dto.setQualifiedCount(dto.getQualifiedCount().add(quantity)); } else { dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(quantity)); } dto.setQualifiedCount(dto.getQualifiedCount().add(inspectQualifiedQtyForStat(item))); dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(inspectUnqualifiedQtyForStat(item))); } // 计ç®åæ ¼ç @@ -2222,14 +2253,11 @@ BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : items) { BigDecimal qty = item.getQuantity(); BigDecimal qty = nz(item.getQuantity()); totalCount = totalCount.add(qty); if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(qty); } else { unqualifiedCount = unqualifiedCount.add(qty); } qualifiedCount = qualifiedCount.add(inspectQualifiedQtyForStat(item)); unqualifiedCount = unqualifiedCount.add(inspectUnqualifiedQtyForStat(item)); } if (totalCount.compareTo(BigDecimal.ZERO) == 0) { @@ -2358,10 +2386,10 @@ dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // è¿ç¨ dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // åºå // å设 qualityInspectList æ¯ä¸ä¸ª List<QualityInspect> ç±»åçéå Map<String, List<QualityInspect>> groupedByCheckResult = qualityInspectList.stream() .collect(Collectors.groupingBy(QualityInspect::getCheckResult)); List<QualityInspect> qualityInspects = groupedByCheckResult.get("ä¸åæ ¼"); // åå¨ä¸åæ ¼æ°éçæ£éªåï¼å«ææ°éæåçæ°æ°æ®ï¼æ§æ°æ®ä»å¯ç¨æ£æµç»æå åºï¼ List<QualityInspect> qualityInspects = qualityInspectList.stream() .filter(this::inspectHasUnqualifiedVolume) .collect(Collectors.toList()); if (ObjectUtils.isNull(qualityInspects) || qualityInspects.size() == 0) { return dto; } @@ -2416,11 +2444,11 @@ QualityStatisticsItem item = new QualityStatisticsItem(); item.setDate(dateLabel); item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(QualityInspect::getQuantity) item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add)); item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(QualityInspect::getQuantity) item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add)); item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(QualityInspect::getQuantity) item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(this::inspectUnqualifiedQtyForStat) .reduce(BigDecimal.ZERO, BigDecimal::add)); return item; src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -33,6 +33,7 @@ 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; @@ -187,6 +188,10 @@ qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(productQty); qualityInspect.setQualifiedQuantity(productQty); qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO); qualityInspect.setPassRate(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP)); qualityInspect.setCheckResult("åæ ¼"); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -272,6 +272,9 @@ qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspect.setQualifiedQuantity(saleProduct.getQuantity()); qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO); qualityInspect.setPassRate(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP)); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null); if (qualityTestStandard.size() > 0) { @@ -931,7 +934,7 @@ } // éè¦è´¨æ£ï¼æ«ç å ¥åºè¿å ¥åæææ£éªï¼ä¸ç´æ¥å ¥åæ ¼åºå if (Boolean.TRUE.equals(dbProduct.getIsChecked())) { // å卿ªéè¿/æªå¤ççåæææ£éªåï¼åç¦æ¢ç»§ç»æ«ç å ¥åº // å卿ªæäº¤æå ¥åºå®¡æ¹ä¸çåæææ£éªåï¼åç¦æ¢ç»§ç»æ«ç å ¥åº Long pendingInspectCount = qualityInspectMapper.selectCount(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectType, 0) .eq(QualityInspect::getPurchaseLedgerId, purchaseId) @@ -939,9 +942,8 @@ .and(w -> w .isNull(QualityInspect::getInspectState) .or(q0 -> q0.eq(QualityInspect::getInspectState, 0)) // inspect_state=1 ä¹è§ä¸ºâæªå¤çâ .or(q1 -> q1.eq(QualityInspect::getInspectState, 1) .isNull(QualityInspect::getCheckResult)))); .in(QualityInspect::getApprovalStatus, 1, 2)))); if (pendingInspectCount != null && pendingInspectCount > 0) { throw new ServiceException("å ¥åºå¤±è´¥,å卿ªéè¿ææªå¤ççè´¨æ£è®°å½,请å å¤çååæ«ç å ¥åº"); } @@ -956,9 +958,11 @@ .or(q1 -> q1.eq(QualityInspect::getInspectState, 1) .and(r -> r.isNull(QualityInspect::getCheckResult) .or() .eq(QualityInspect::getCheckResult, "åæ ¼"))))) .eq(QualityInspect::getCheckResult, "åæ ¼") .or() .eq(QualityInspect::getCheckResult, "é¨ååæ ¼"))))) .stream() .map(QualityInspect::getQuantity) .map(this::resolveInspectCountedQuantity) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); if (inspectQty.add(inboundThisLine).compareTo(orderQty) > 0) { @@ -1332,4 +1336,20 @@ } return sb.toString(); } private BigDecimal resolveInspectCountedQuantity(QualityInspect inspect) { if (inspect == null) { return BigDecimal.ZERO; } if (inspect.getInspectState() == null || inspect.getInspectState() == 0) { return inspect.getQuantity() == null ? BigDecimal.ZERO : inspect.getQuantity(); } if (inspect.getQualifiedQuantity() != null) { return inspect.getQualifiedQuantity(); } if ("åæ ¼".equals(inspect.getCheckResult()) || "é¨ååæ ¼".equals(inspect.getCheckResult())) { return inspect.getQuantity() == null ? BigDecimal.ZERO : inspect.getQuantity(); } return BigDecimal.ZERO; } } src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -94,12 +94,30 @@ private String unit; /** * æ°é * æ°éï¼æ»æ°éï¼å建åä¸å¯ä¿®æ¹ï¼ */ @Excel(name = "æ°é") private BigDecimal quantity; /** * åæ ¼æ°é */ @Excel(name = "åæ ¼æ°é") private BigDecimal qualifiedQuantity; /** * ä¸åæ ¼æ°é */ @Excel(name = "ä¸åæ ¼æ°é") private BigDecimal unqualifiedQuantity; /** * åæ ¼çï¼%ï¼ */ @Excel(name = "åæ ¼ç") private BigDecimal passRate; /** * æ£æµåä½ */ @Excel(name = "æ£æµåä½") src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -42,6 +42,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; @@ -74,6 +75,9 @@ QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); qualityInspect.setInspectState(0);//é»è®¤æªæäº¤ ensureQualifiedSplitDefaults(qualityInspect); // å端è¥å·²ä¼ åæ ¼/ä¸åæ ¼æ°éï¼defaults ä¸ä¼å pass_rateï¼è¿éè¡¥ç®å表å±ç¤ºç¨åæ ¼ç refreshPassRateFromQuantities(qualityInspect); qualityInspectMapper.insert(qualityInspect); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { qualityInspectParam.setInspectId(qualityInspect.getId()); @@ -96,41 +100,147 @@ @Override public int submit(QualityInspect inspect) { QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId()); //æäº¤åå¿ é¡»å¤ææ¯å¦åæ ¼ if (ObjectUtils.isNull(qualityInspect.getCheckResult())) { throw new RuntimeException("请å 夿æ¯å¦åæ ¼"); if (qualityInspect == null) { throw new RuntimeException("è´¨æ£åä¸åå¨"); } /*夿ä¸åæ ¼*/ if (qualityInspect.getCheckResult().equals("ä¸åæ ¼")) { if (Objects.equals(qualityInspect.getInspectState(), 1)) { throw new RuntimeException("该质æ£åå·²æäº¤ï¼ä¸è½éå¤æäº¤"); } if (inspect != null) { if (inspect.getQualifiedQuantity() != null) { qualityInspect.setQualifiedQuantity(inspect.getQualifiedQuantity()); } if (inspect.getUnqualifiedQuantity() != null) { qualityInspect.setUnqualifiedQuantity(inspect.getUnqualifiedQuantity()); } } validateAndCalculateQuantities(qualityInspect); BigDecimal qualifiedQty = qualityInspect.getQualifiedQuantity(); BigDecimal unqualifiedQty = qualityInspect.getUnqualifiedQuantity(); if (unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) { QualityUnqualified qualityUnqualified = new QualityUnqualified(); BeanUtils.copyProperties(qualityInspect, qualityUnqualified); qualityUnqualified.setInspectState(0);//å¾ å¤ç List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId())); String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); qualityUnqualified.setDefectivePhenomena(text + "è¿äºææ ä¸åå¨ä¸åæ ¼");//ä¸åæ ¼ç°è±¡ qualityUnqualified.setId(null); qualityUnqualified.setQuantity(unqualifiedQty); qualityUnqualified.setInspectState(0); qualityUnqualified.setDefectivePhenomena(buildDefectivePhenomena(qualityInspect)); qualityUnqualified.setInspectId(qualityInspect.getId()); qualityUnqualifiedMapper.insert(qualityUnqualified); } else { // åæææ£éªåæ ¼åï¼å åèµ·âå ¥åºå®¡æ¹âï¼å®¡æ¹éè¿ååå ¥åº } if (qualifiedQty.compareTo(BigDecimal.ZERO) > 0) { if (Objects.equals(qualityInspect.getInspectType(), 0)) { Long ledgerId = qualityInspect.getPurchaseLedgerId(); PurchaseLedger purchaseLedger = ledgerId == null ? null : purchaseLedgerMapper.selectById(ledgerId); if (purchaseLedger != null) { submitQualifiedInboundApprove(qualityInspect); } else { // ç´æ¥å ¥åº // æå¨æ°å¢çåæææ£éªï¼æ éè´å°è´¦ï¼ä¸èµ°éè´å ¥åºå®¡æ¹ï¼ç´æ¥å ¥åæ ¼åºåï¼ä¸è¿ç¨/åºåæ£éªä¸è´ï¼ stockUtils.addStock( qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(), null, null, qualityInspect.getProductModelId(), qualityInspect.getQuantity(), qualifiedQty, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId() ); syncQualifiedInboundToPurchaseProducts(qualityInspect); syncQualifiedInboundToPurchaseProducts(qualityInspect, qualifiedQty); } } else { stockUtils.addStock( qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId(), null, qualityInspect.getProductModelId(), qualifiedQty, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId() ); syncQualifiedInboundToPurchaseProducts(qualityInspect, qualifiedQty); } } qualityInspect.setInspectState(1);//å·²æäº¤ qualityInspect.setCheckResult(resolveCheckResult(qualifiedQty, unqualifiedQty)); qualityInspect.setInspectState(1); int updated = qualityInspectMapper.updateById(qualityInspect); refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId()); return updated; } private void validateAndCalculateQuantities(QualityInspect qualityInspect) { if (qualityInspect.getQualifiedQuantity() == null || qualityInspect.getUnqualifiedQuantity() == null) { throw new RuntimeException("请填ååæ ¼æ°éåä¸åæ ¼æ°é"); } if (qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) < 0 || qualityInspect.getUnqualifiedQuantity().compareTo(BigDecimal.ZERO) < 0) { throw new RuntimeException("åæ ¼æ°éåä¸åæ ¼æ°éä¸è½ä¸ºè´æ°"); } if (qualityInspect.getQuantity() == null) { throw new RuntimeException("è´¨æ£åæ»æ°éå¼å¸¸"); } BigDecimal total = qualityInspect.getQualifiedQuantity().add(qualityInspect.getUnqualifiedQuantity()); BigDecimal qtyScaled = qualityInspect.getQuantity().setScale(4, RoundingMode.HALF_UP); BigDecimal sumScaled = total.setScale(4, RoundingMode.HALF_UP); if (sumScaled.compareTo(qtyScaled) > 0) { throw new RuntimeException("åæ ¼æ°éä¸ä¸åæ ¼æ°éä¹åä¸è½è¶ è¿æ»æ°é"); } qualityInspect.setPassRate(calculatePassRate(qualityInspect.getQualifiedQuantity(), qualityInspect.getQuantity())); } /** * æ°å¢æ¶è¥æªæååæ ¼/ä¸åæ ¼ï¼é»è®¤å ¨é¨ä¸ºå¾ æ£åæ ¼æ° */ private void ensureQualifiedSplitDefaults(QualityInspect q) { if (q.getQuantity() == null) { return; } if (q.getQualifiedQuantity() == null && q.getUnqualifiedQuantity() == null) { q.setQualifiedQuantity(q.getQuantity()); q.setUnqualifiedQuantity(BigDecimal.ZERO); q.setPassRate(calculatePassRate(q.getQualifiedQuantity(), q.getQuantity())); if (q.getCheckResult() == null || q.getCheckResult().isEmpty()) { q.setCheckResult("åæ ¼"); } } } private BigDecimal calculatePassRate(BigDecimal qualifiedQty, BigDecimal totalQty) { if (totalQty == null || totalQty.compareTo(BigDecimal.ZERO) <= 0 || qualifiedQty == null) { return BigDecimal.ZERO; } return qualifiedQty.multiply(BigDecimal.valueOf(100)) .divide(totalQty, 2, RoundingMode.HALF_UP); } private void refreshPassRateFromQuantities(QualityInspect q) { if (q.getQuantity() == null || q.getQualifiedQuantity() == null) { return; } q.setPassRate(calculatePassRate(q.getQualifiedQuantity(), q.getQuantity())); } private String resolveCheckResult(BigDecimal qualifiedQty, BigDecimal unqualifiedQty) { if (unqualifiedQty.compareTo(BigDecimal.ZERO) <= 0) { return "åæ ¼"; } if (qualifiedQty.compareTo(BigDecimal.ZERO) <= 0) { return "ä¸åæ ¼"; } return "é¨ååæ ¼"; } private String buildDefectivePhenomena(QualityInspect qualityInspect) { if (ObjectUtils.isNotEmpty(qualityInspect.getDefectivePhenomena())) { return qualityInspect.getDefectivePhenomena(); } List<QualityInspectParam> inspectParams = qualityInspectParamService.list( Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspect.getId())); if (inspectParams.isEmpty()) { return "è´¨æ£ä¸åæ ¼æ°éï¼" + qualityInspect.getUnqualifiedQuantity(); } String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); return text + "çææ æ£éªä¸åæ ¼ï¼ä¸åæ ¼æ°éï¼" + qualityInspect.getUnqualifiedQuantity(); } private void submitQualifiedInboundApprove(QualityInspect qualityInspect) { @@ -188,18 +298,22 @@ if (!Objects.equals(qualityInspect.getInspectType(), 0)) { throw new RuntimeException("审æ¹å¤±è´¥ï¼ä» åæææ£éªæ¯æå ¥åºå®¡æ¹"); } if (!Objects.equals(qualityInspect.getInspectState(), 1) || !"åæ ¼".equals(qualityInspect.getCheckResult())) { if (!Objects.equals(qualityInspect.getInspectState(), 1)) { throw new RuntimeException("审æ¹å¤±è´¥ï¼å½åè´¨æ£åç¶æä¸å è®¸å ¥åº"); } BigDecimal qualifiedQty = qualityInspect.getQualifiedQuantity(); if (qualifiedQty == null || qualifiedQty.compareTo(BigDecimal.ZERO) <= 0) { throw new RuntimeException("审æ¹å¤±è´¥ï¼æ åæ ¼æ°éå¯å ¥åº"); } stockUtils.addStock( qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(), null, qualityInspect.getProductModelId(), qualityInspect.getQuantity(), qualifiedQty, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId() ); syncQualifiedInboundToPurchaseProducts(qualityInspect); syncQualifiedInboundToPurchaseProducts(qualityInspect, qualifiedQty); refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId()); qualityInspect.setApprovalStatus(3); qualityInspectMapper.updateById(qualityInspect); @@ -272,6 +386,13 @@ @Override public int updateQualityInspect(QualityInspectDto qualityInspectDto) { QualityInspect existing = qualityInspectMapper.selectById(qualityInspectDto.getId()); if (existing == null) { throw new RuntimeException("è´¨æ£åä¸åå¨"); } if (Objects.equals(existing.getInspectState(), 1)) { throw new RuntimeException("å·²æäº¤çæ°æ®ä¸å 许修æ¹"); } if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) { qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId())); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { @@ -281,6 +402,24 @@ } QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); qualityInspect.setQuantity(existing.getQuantity()); BigDecimal qf = qualityInspect.getQualifiedQuantity() != null ? qualityInspect.getQualifiedQuantity() : existing.getQualifiedQuantity(); BigDecimal uqf = qualityInspect.getUnqualifiedQuantity() != null ? qualityInspect.getUnqualifiedQuantity() : existing.getUnqualifiedQuantity(); if (qf == null || uqf == null) { BigDecimal qty = existing.getQuantity() != null ? existing.getQuantity() : BigDecimal.ZERO; if ("ä¸åæ ¼".equals(existing.getCheckResult())) { qf = BigDecimal.ZERO; uqf = qty; } else { qf = qty; uqf = BigDecimal.ZERO; } } qualityInspect.setQualifiedQuantity(qf); qualityInspect.setUnqualifiedQuantity(uqf); validateAndCalculateQuantities(qualityInspect); qualityInspect.setCheckResult(resolveCheckResult(qf, uqf)); return qualityInspectMapper.updateById(qualityInspect); } @@ -340,17 +479,16 @@ } } private void syncQualifiedInboundToPurchaseProducts(QualityInspect qualityInspect) { private void syncQualifiedInboundToPurchaseProducts(QualityInspect qualityInspect, BigDecimal inboundQty) { if (qualityInspect == null) { return; } if (!Objects.equals(qualityInspect.getInspectType(), 0) || qualityInspect.getPurchaseLedgerId() == null) { return; } if (qualityInspect.getProductModelId() == null || qualityInspect.getQuantity() == null) { if (qualityInspect.getProductModelId() == null || inboundQty == null) { return; } BigDecimal inboundQty = qualityInspect.getQuantity(); if (inboundQty.compareTo(BigDecimal.ZERO) <= 0) { return; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -2965,6 +2965,9 @@ qualityInspect.setModel(dbProduct.getSpecificationModel()); qualityInspect.setUnit(resolveInspectUnit(dbProduct)); qualityInspect.setQuantity(inspectQty); qualityInspect.setQualifiedQuantity(inspectQty); qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO); qualityInspect.setPassRate(BigDecimal.valueOf(100)); qualityInspect.setCheckResult("åæ ¼"); qualityInspect.setInspectState(1); qualityInspect.setApprovalStatus(1); src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -15,6 +15,9 @@ qi.model, ifnull(pm.unit, qi.unit) as unit, qi.quantity, qi.qualified_quantity, qi.unqualified_quantity, qi.pass_rate, qi.check_company, qi.check_result, qi.create_time, @@ -177,10 +180,14 @@ SELECT base.modelType, COALESCE(SUM(qi.quantity), 0) AS totalCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END), 0) AS qualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'ä¸åæ ¼' THEN qi.quantity ELSE 0 END), 0) AS unqualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END), 0) AS qualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.unqualified_quantity, CASE WHEN qi.check_result IN ('ä¸åæ ¼', 'é¨ååæ ¼') THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END), 0) AS unqualifiedCount, IF(COALESCE(SUM(qi.quantity), 0) = 0, 0, ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) @@ -188,7 +195,10 @@ ) AS completionRate, IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0, ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END) ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END) / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2) ) AS passRate @@ -249,10 +259,14 @@ COALESCE(SUM(qi.quantity), 0) AS totalCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END), 0) AS qualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'ä¸åæ ¼' THEN qi.quantity ELSE 0 END), 0) AS unqualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END), 0) AS qualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.unqualified_quantity, CASE WHEN qi.check_result IN ('ä¸åæ ¼', 'é¨ååæ ¼') THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END), 0) AS unqualifiedCount, /* 宿ç */ IF(COALESCE(SUM(qi.quantity), 0) = 0, 0, @@ -261,7 +275,10 @@ /* åæ ¼ç */ IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0, ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END) ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END) / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2) ) AS passRate @@ -306,11 +323,16 @@ COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END), 0) AS qualifiedCount, COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END), 0) AS qualifiedCount, IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0, ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END) ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity, CASE WHEN qi.check_result = 'åæ ¼' THEN IFNULL(qi.quantity, 0) ELSE 0 END) ELSE 0 END) / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2) ) AS passRate