From ffb7c59cadfb8a043a41849fd6d093f7967ea4cb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 06 八月 2026 10:24:59 +0800
Subject: [PATCH] feat(quality): 增加不合格品拒收处理功能
---
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java | 102 +++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 94 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 876d68e..d696912 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -6,11 +6,17 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
+import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
@@ -24,16 +30,21 @@
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.quality.service.IQualityUnqualifiedService;
import com.ruoyi.stock.service.StockUninventoryService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import jakarta.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -51,6 +62,10 @@
private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
private final ProductionOperationTaskMapper productionOperationTaskMapper;
private final StockUninventoryService stockUninventoryService;
+ private final StockInRecordService stockInRecordService;
+ private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
+ private final PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
+ private final PurchaseLedgerMapper purchaseLedgerMapper;
@Override
public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -65,9 +80,12 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public int deal(QualityUnqualified qualityUnqualified) {
QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
+ String batchNo = qualityInspect == null ? null
+ : resolveProductionBatchNo(qualityInspect.getProductMainId(), qualityInspect.getId(), qualityInspect.getProductModelId());
if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
switch (qualityUnqualified.getDealResult()) {
case "杩斾慨":
@@ -81,12 +99,12 @@
}
break;
case "鎶ュ簾":
- stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
- StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+ stockUtils.addUnStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+ StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId(), batchNo);
break;
case "璁╂鏀捐":
- stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
- StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ stockUtils.addStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+ StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(), batchNo);
break;
default:
break;
@@ -96,11 +114,14 @@
switch (qualityUnqualified.getDealResult()) {
case "鎶ュ簾":
stockUtils.addUnStock(modelId, unqualified.getQuantity(),
- StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+ StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
break;
case "璁╂鏀捐":
stockUtils.addStock(modelId, unqualified.getQuantity(),
StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ break;
+ case "鎷掓敹":
+ createRejectPurchaseReturn(qualityInspect, qualityUnqualified);
break;
default:
break;
@@ -163,13 +184,13 @@
BeanUtils.copyProperties(sourceOperation, newOperation);
newOperation.setId(null);
newOperation.setProductionOrderId(newOrder.getId());
- newOperation.setTechnologyRoutingId(routingIdMap.get(sourceOperation.getTechnologyRoutingId()));
+ newOperation.setOrderRoutingId(routingIdMap.get(sourceOperation.getOrderRoutingId()));
newOperation.setCreateTime(null);
newOperation.setUpdateTime(null);
productionOrderRoutingOperationMapper.insert(newOperation);
ProductionOperationTask newTask = new ProductionOperationTask();
- newTask.setTechnologyRoutingOperationId(newOperation.getId());
+ newTask.setProductionOrderRoutingOperationId(newOperation.getId());
newTask.setProductionOrderId(newOrder.getId());
newTask.setPlanQuantity(newOrder.getQuantity());
newTask.setCompleteQuantity(BigDecimal.ZERO);
@@ -220,4 +241,69 @@
private BigDecimal defaultDecimal(BigDecimal value) {
return value == null ? BigDecimal.ZERO : value;
}
+
+ private void createRejectPurchaseReturn(QualityInspect qualityInspect, QualityUnqualified qualityUnqualified) {
+ if (qualityInspect == null) {
+ throw new ServiceException("鎵嬪姩鏂板鐨勪笉鍚堟牸璁板綍涓嶆敮鎸佹嫆鏀跺鐞嗭紝璇烽�夋嫨鎶ュ簾鎴栬姝ユ斁琛�");
+ }
+ Long supplierId = null;
+ Long purchaseLedgerId = qualityInspect.getPurchaseLedgerId();
+ if (purchaseLedgerId != null) {
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerId);
+ if (purchaseLedger != null) {
+ supplierId = purchaseLedger.getSupplierId();
+ }
+ }
+ PurchaseReturnOrders returnOrder = new PurchaseReturnOrders();
+ returnOrder.setReturnType(1);
+ returnOrder.setSupplierId(supplierId);
+ returnOrder.setPurchaseLedgerId(purchaseLedgerId);
+ returnOrder.setPreparedAt(LocalDate.now());
+ returnOrder.setReturnUserName(qualityUnqualified.getDealName());
+ returnOrder.setRemark("鍘熸枡妫�楠屼笉鍚堟牸-鎷掓敹");
+ returnOrder.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL", "no", LocalDateTime.now()));
+ purchaseReturnOrdersMapper.insert(returnOrder);
+ PurchaseReturnOrderProducts product = new PurchaseReturnOrderProducts();
+ product.setPurchaseReturnOrderId(returnOrder.getId());
+ product.setReturnQuantity(qualityUnqualified.getQuantity());
+ product.setStockInRecordId(0L);
+ purchaseReturnOrderProductsMapper.insert(product);
+ }
+
+ private String resolveProductionBatchNo(Long productionProductMainId,
+ Long qualityInspectId,
+ Long productModelId) {
+ if (productModelId == null) {
+ return null;
+ }
+ if (productionProductMainId != null) {
+ StockInRecord productionRecord = stockInRecordService.getOne(
+ Wrappers.<StockInRecord>lambdaQuery()
+ .eq(StockInRecord::getRecordId, productionProductMainId)
+ .eq(StockInRecord::getProductModelId, productModelId)
+ .in(StockInRecord::getRecordType, Arrays.asList(
+ StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+ StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()))
+ .isNotNull(StockInRecord::getBatchNo)
+ .orderByDesc(StockInRecord::getId)
+ .last("limit 1"),
+ false);
+ if (productionRecord != null) {
+ return productionRecord.getBatchNo();
+ }
+ }
+ if (qualityInspectId == null) {
+ return null;
+ }
+ StockInRecord inspectRecord = stockInRecordService.getOne(
+ Wrappers.<StockInRecord>lambdaQuery()
+ .eq(StockInRecord::getRecordId, qualityInspectId)
+ .eq(StockInRecord::getProductModelId, productModelId)
+ .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())
+ .isNotNull(StockInRecord::getBatchNo)
+ .orderByDesc(StockInRecord::getId)
+ .last("limit 1"),
+ false);
+ return inspectRecord == null ? null : inspectRecord.getBatchNo();
+ }
}
--
Gitblit v1.9.3