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