From 027a1c30ea0216080c3472c6c6b28acec4077c7d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 16 六月 2026 13:33:16 +0800
Subject: [PATCH] 优化数据

---
 src/main/java/com/ruoyi/mock/service/impl/DataGenerateServiceImpl.java |  145 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 142 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/mock/service/impl/DataGenerateServiceImpl.java b/src/main/java/com/ruoyi/mock/service/impl/DataGenerateServiceImpl.java
index c414da5..046633d 100644
--- a/src/main/java/com/ruoyi/mock/service/impl/DataGenerateServiceImpl.java
+++ b/src/main/java/com/ruoyi/mock/service/impl/DataGenerateServiceImpl.java
@@ -4,12 +4,16 @@
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.ai.assistant.Assistant;
+import com.ruoyi.approve.mapper.ApprovalInstanceMapper;
+import com.ruoyi.approve.pojo.ApprovalInstance;
+import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.service.ICustomerService;
 import com.ruoyi.basic.service.ISupplierService;
+import com.ruoyi.common.enums.ReviewStatusEnum;
 import com.ruoyi.mock.dto.DataGenerateRequest;
 import com.ruoyi.mock.prompt.MockDataPrompt;
 import com.ruoyi.mock.service.DataGenerateService;
@@ -20,15 +24,19 @@
 import com.ruoyi.production.service.ProductionOrderService;
 import com.ruoyi.production.service.ProductionPlanService;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
+import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardBinding;
+import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.quality.service.IQualityTestStandardService;
 import com.ruoyi.quality.service.QualityTestStandardBindingService;
 import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -37,10 +45,13 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -61,6 +72,12 @@
     private final ProductionPlanService productionPlanService;
     private final ProductionOrderService productionOrderService;
     private final StockInventoryService stockInventoryService;
+
+    // 閲囪喘瀹屾暣娴佺▼闇�瑕佺殑service
+    private final ApprovalInstanceService approvalInstanceService;
+    private final ApprovalInstanceMapper approvalInstanceMapper;
+    private final IQualityInspectService qualityInspectService;
+    private final StockInRecordService stockInRecordService;
 
     @Override
     public DataGenerateResult generate(DataGenerateRequest request) {
@@ -134,7 +151,8 @@
                 totalGenerated += s.getSuccessCount();
             }
             if (grouped.containsKey("purchaseLedger")) {
-                ModuleSummary s = createPurchaseLedgers(grouped.get("purchaseLedger"), supplierNameToId);
+                ModuleSummary s = createPurchaseLedgers(grouped.get("purchaseLedger"), supplierNameToId,
+                        request.getAdditionalInfo(), request.getDateEnd());
                 summaries.add(s);
                 totalGenerated += s.getSuccessCount();
             }
@@ -357,7 +375,11 @@
         return summary("sales", "閿�鍞彴璐�", items.size(), success, fail);
     }
 
-    private ModuleSummary createPurchaseLedgers(List<JSONObject> items, Map<String, Long> supplierNameToId) {
+    private ModuleSummary createPurchaseLedgers(List<JSONObject> items, Map<String, Long> supplierNameToId,
+                                                 String additionalInfo, String dateEnd) {
+        // 鏄惁闇�瑕佽川妫�锛屼粠琛ュ厖淇℃伅鍒ゆ柇锛岄粯璁や笉闇�瑕�
+        boolean needQualityInspect = additionalInfo != null
+                && (additionalInfo.contains("璐ㄦ") || additionalInfo.contains("闇�瑕佹楠�"));
         int success = 0, fail = 0;
         for (JSONObject item : items) {
             try {
@@ -371,8 +393,12 @@
                 dto.setProjectName(item.getString("projectName"));
                 dto.setContractAmount(item.getBigDecimal("contractAmount"));
                 dto.setPaymentMethod(item.getString("paymentMethod"));
+
+                String entryDateStr = item.getString("entryDate");
+                LocalDate entryDate = null;
                 if (item.containsKey("entryDate")) {
-                    dto.setEntryDate(java.sql.Date.valueOf(item.getString("entryDate")));
+                    entryDate = LocalDate.parse(entryDateStr);
+                    dto.setEntryDate(java.sql.Date.valueOf(entryDateStr));
                 }
                 if (item.containsKey("executionDate")) {
                     dto.setExecutionDate(java.sql.Date.valueOf(item.getString("executionDate")));
@@ -391,6 +417,8 @@
                         slp.setTaxRate(pd.getBigDecimal("taxRate"));
                         slp.setUnit(pd.getString("unit"));
                         slp.setType(2);
+                        // 鏄惁璐ㄦ锛氫粠琛ュ厖淇℃伅鍒ゆ柇锛岄粯璁や笉闇�瑕�
+                        slp.setIsChecked(needQualityInspect);
                         if (pd.containsKey("taxExclusiveTotalPrice")) {
                             slp.setTaxExclusiveTotalPrice(pd.getBigDecimal("taxExclusiveTotalPrice"));
                         } else if (pd.getBigDecimal("taxInclusiveTotalPrice") != null && pd.getBigDecimal("taxRate") != null) {
@@ -406,6 +434,15 @@
                     dto.setProductData(products);
                 }
                 purchaseLedgerService.addOrEditPurchase(dto);
+                // 閫氳繃鍚堝悓鍙锋壘鍒板垰鍒涘缓鐨勯噰璐彴璐�
+                PurchaseLedger savedLedger = purchaseLedgerService.getOne(
+                        new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<PurchaseLedger>()
+                                .eq(PurchaseLedger::getPurchaseContractNumber, dto.getPurchaseContractNumber())
+                                .last("limit 1"));
+                if (savedLedger != null) {
+                    // 璧板畬鏁存祦绋嬶細瀹℃牳閫氳繃 鈫� 璐ㄦ(鍙��) 鈫� 鍏ュ簱 + 鍏ュ簱瀹℃牳閫氳繃
+                    processPurchaseFullFlow(savedLedger, needQualityInspect, entryDate, dateEnd);
+                }
                 success++;
             } catch (Exception e) {
                 log.warn("鍒涘缓閲囪喘鍙拌处澶辫触: {}", e.getMessage());
@@ -415,6 +452,108 @@
         return summary("purchase", "閲囪喘鍙拌处", items.size(), success, fail);
     }
 
+    /**
+     * 閲囪喘瀹屾暣娴佺▼: 瀹℃牳閫氳繃 鈫� 璐ㄦ(鍙��) 鈫� 鍏ュ簱瀹℃牳閫氳繃
+     */
+    private void processPurchaseFullFlow(PurchaseLedger purchaseLedger, boolean needQualityInspect,
+                                          LocalDate entryDate, String dateEnd) {
+        try {
+            // 1. 瀹℃壒鑷姩閫氳繃
+            ApprovalInstance approvalInstance = approvalInstanceMapper.selectOne(
+                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ApprovalInstance>()
+                            .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
+                            .eq(ApprovalInstance::getBusinessType, 5L)
+                            .eq(ApprovalInstance::getDeleted, 0)
+                            .orderByDesc(ApprovalInstance::getId)
+                            .last("limit 1"));
+            if (approvalInstance != null) {
+                // 缁撶畻瀹℃壒寮�濮嬫椂闂达細鍩轰簬褰曞叆鏃ユ湡锛岄殢鏈烘帹0-3澶�
+                LocalDate baseDate = entryDate != null ? entryDate : LocalDate.now();
+                LocalDate approveDate = baseDate.plusDays(ThreadLocalRandom.current().nextInt(0, 4));
+                // 浣跨敤autoApprove瀹屾垚瀹℃壒
+                approvalInstanceService.autoApprove(approvalInstance.getId());
+                log.info("閲囪喘鍙拌处[{}]瀹℃壒閫氳繃, 瀹℃壒鏃ユ湡: {}", purchaseLedger.getPurchaseContractNumber(), approveDate);
+            }
+
+            // 2. 璐ㄦ娴佺▼锛堝鏋滈渶瑕佽川妫�锛�
+            if (needQualityInspect) {
+                processQualityInspect(purchaseLedger, entryDate, dateEnd);
+            }
+
+            // 3. 鍏ュ簱瀹℃壒閫氳繃
+            processStockInApprove(purchaseLedger, dateEnd);
+
+        } catch (Exception e) {
+            log.warn("閲囪喘瀹屾暣娴佺▼澶勭悊澶辫触[{}]: {}", purchaseLedger.getPurchaseContractNumber(), e.getMessage());
+        }
+    }
+
+    /**
+     * 璐ㄦ: 鎵惧埌閲囪喘鍏宠仈鐨勮川妫�鍗曪紝鑷姩鎻愪氦涓哄悎鏍�
+     */
+    private void processQualityInspect(PurchaseLedger purchaseLedger, LocalDate entryDate, String dateEnd) {
+        try {
+            List<QualityInspect> inspectList = qualityInspectService.list(
+                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<QualityInspect>()
+                            .eq(QualityInspect::getPurchaseLedgerId, purchaseLedger.getId()));
+            for (QualityInspect qi : inspectList) {
+                if (qi.getInspectState() == null || qi.getInspectState() == 0) {
+                    qualityInspectService.autoSubmit(qi.getId());
+                    log.info("閲囪喘鍙拌处[{}]璐ㄦ鍗昜{}]鑷姩鎻愪氦鍚堟牸", purchaseLedger.getPurchaseContractNumber(), qi.getId());
+                }
+            }
+        } catch (Exception e) {
+            log.warn("璐ㄦ娴佺▼澶勭悊澶辫触[{}]: {}", purchaseLedger.getPurchaseContractNumber(), e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏ュ簱瀹℃牳: 鎵惧埌鍏ュ簱璁板綍骞跺鎵归�氳繃
+     */
+    private void processStockInApprove(PurchaseLedger purchaseLedger, String dateEnd) {
+        try {
+            List<com.ruoyi.stock.pojo.StockInRecord> stockRecords = stockInRecordService.list(
+                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ruoyi.stock.pojo.StockInRecord>()
+                            .eq(com.ruoyi.stock.pojo.StockInRecord::getRecordId, purchaseLedger.getId())
+                            .eq(com.ruoyi.stock.pojo.StockInRecord::getRecordType,
+                                    String.valueOf(com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode())));
+            // 濡傛灉鎸塒URCHASE_STOCK_IN鎵句笉鍒帮紝灏濊瘯CUSTOMIZATION_UNSTOCK_OUT(璐ㄦ鍚堟牸鍏ュ簱)
+            if (stockRecords.isEmpty()) {
+                stockRecords = stockInRecordService.list(
+                        new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ruoyi.stock.pojo.StockInRecord>()
+                                .eq(com.ruoyi.stock.pojo.StockInRecord::getRecordId, purchaseLedger.getId())
+                                .eq(com.ruoyi.stock.pojo.StockInRecord::getRecordType,
+                                        String.valueOf(com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())));
+            }
+            // 涔熷皾璇曟寜璐ㄦ鍗旾D鏌ユ壘(璐ㄦ鍗曠殑recordId鏄川妫�鍗旾D)
+            for (QualityInspect qi : qualityInspectService.list(
+                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<QualityInspect>()
+                            .eq(QualityInspect::getPurchaseLedgerId, purchaseLedger.getId()))) {
+                List<com.ruoyi.stock.pojo.StockInRecord> qiRecords = stockInRecordService.list(
+                        new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ruoyi.stock.pojo.StockInRecord>()
+                                .eq(com.ruoyi.stock.pojo.StockInRecord::getRecordId, qi.getId()));
+                stockRecords.addAll(qiRecords);
+            }
+            // 鍘婚噸
+            stockRecords = stockRecords.stream()
+                    .collect(Collectors.toMap(com.ruoyi.stock.pojo.StockInRecord::getId, r -> r, (a, b) -> a))
+                    .values().stream().collect(Collectors.toList());
+
+            if (!stockRecords.isEmpty()) {
+                List<Long> recordIds = stockRecords.stream()
+                        .filter(r -> r.getApprovalStatus() == null || r.getApprovalStatus() == 0)
+                        .map(com.ruoyi.stock.pojo.StockInRecord::getId)
+                        .collect(Collectors.toList());
+                if (!recordIds.isEmpty()) {
+                    stockInRecordService.batchApprove(recordIds, ReviewStatusEnum.APPROVED.getCode());
+                    log.info("閲囪喘鍙拌处[{}]鍏ュ簱瀹℃壒閫氳繃, 鍏ュ簱璁板綍鏁�: {}", purchaseLedger.getPurchaseContractNumber(), recordIds.size());
+                }
+            }
+        } catch (Exception e) {
+            log.warn("鍏ュ簱瀹℃壒澶辫触[{}]: {}", purchaseLedger.getPurchaseContractNumber(), e.getMessage());
+        }
+    }
+
     private ModuleSummary createProductionPlans(List<JSONObject> items) {
         int success = 0, fail = 0;
         for (JSONObject item : items) {

--
Gitblit v1.9.3