package com.ruoyi.mock.service.impl; import com.alibaba.fastjson2.JSON; 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; import com.ruoyi.mock.vo.DataGenerateResult; import com.ruoyi.mock.vo.DataGenerateResult.ModuleSummary; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.pojo.ProductionPlan; 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; import org.springframework.stereotype.Service; 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 @Service @RequiredArgsConstructor public class DataGenerateServiceImpl implements DataGenerateService { private final Assistant assistant; private final ProductMapper productMapper; private final ProductModelMapper productModelMapper; private final ICustomerService customerService; private final ISalesLedgerService salesLedgerService; private final ISupplierService supplierService; private final IPurchaseLedgerService purchaseLedgerService; private final IQualityTestStandardService qualityTestStandardService; private final QualityTestStandardBindingService qualityTestStandardBindingService; 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) { DataGenerateResult result = new DataGenerateResult(); List summaries = new ArrayList<>(); List errors = new ArrayList<>(); int totalGenerated = 0; try { List productIds = productMapper.selectList(null).stream() .map(p -> p.getId()).collect(Collectors.toList()); List productModelIds = productModelMapper.selectList(null).stream() .map(m -> m.getId()).collect(Collectors.toList()); String systemPrompt = MockDataPrompt.buildSystemPrompt(); String userMessage = MockDataPrompt.buildUserMessage( request.getModules(), request.getIndustries(), request.getCountMin(), request.getCountMax(), request.getDateStart(), request.getDateEnd(), request.getAdditionalInfo(), productIds, productModelIds); String fullPrompt = systemPrompt + "\n\n" + userMessage; log.info("调用AI生成模拟数据, modules={}, industries={}", request.getModules(), request.getIndustries()); String llmResponse = assistant.chat(fullPrompt); log.info("AI返回数据长度: {}", llmResponse != null ? llmResponse.length() : 0); if (llmResponse == null || llmResponse.isBlank()) { result.setStatus("FAILED"); errors.add("AI未返回任何数据"); result.setErrors(errors); return result; } List entities = parseJsonResponse(llmResponse); if (entities.isEmpty()) { result.setStatus("FAILED"); errors.add("无法解析AI返回的数据"); result.setErrors(errors); return result; } Map> grouped = entities.stream() .collect(Collectors.groupingBy(e -> e.getString("entity"))); // 名称→ID 映射表,用于创建业务单据时回填外键 Map customerNameToId = new HashMap<>(); Map supplierNameToId = new HashMap<>(); // Tier 0: 基础数据 if (grouped.containsKey("customer")) { ModuleSummary s = createCustomers(grouped.get("customer"), customerNameToId); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("supplier")) { ModuleSummary s = createSuppliers(grouped.get("supplier"), supplierNameToId); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("qualityTestStandard")) { ModuleSummary s = createQualityStandards(grouped.get("qualityTestStandard")); summaries.add(s); totalGenerated += s.getSuccessCount(); } // Tier 1: 业务单据 if (grouped.containsKey("salesLedger")) { ModuleSummary s = createSalesLedgers(grouped.get("salesLedger"), customerNameToId); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("purchaseLedger")) { ModuleSummary s = createPurchaseLedgers(grouped.get("purchaseLedger"), supplierNameToId, request.getAdditionalInfo(), request.getDateEnd()); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("productionPlan")) { ModuleSummary s = createProductionPlans(grouped.get("productionPlan")); summaries.add(s); totalGenerated += s.getSuccessCount(); } // Tier 2 if (grouped.containsKey("productionOrder")) { ModuleSummary s = createProductionOrders(grouped.get("productionOrder")); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("qualityTestStandardBinding")) { ModuleSummary s = createQualityBindings(grouped.get("qualityTestStandardBinding")); summaries.add(s); totalGenerated += s.getSuccessCount(); } if (grouped.containsKey("stockInventory")) { ModuleSummary s = createStockInventories(grouped.get("stockInventory")); summaries.add(s); totalGenerated += s.getSuccessCount(); } result.setStatus(errors.isEmpty() ? "SUCCESS" : "PARTIAL"); result.setTotalGenerated(totalGenerated); result.setModuleSummaries(summaries); result.setErrors(errors); } catch (Exception e) { log.error("数据生成失败", e); result.setStatus("FAILED"); errors.add("数据生成异常: " + e.getMessage()); result.setErrors(errors); } return result; } private List parseJsonResponse(String response) { try { String trimmed = response.trim(); if (trimmed.startsWith("```")) { int start = trimmed.indexOf("\n"); int end = trimmed.lastIndexOf("```"); if (start > 0 && end > start) { trimmed = trimmed.substring(start + 1, end).trim(); } } return JSON.parseArray(trimmed, JSONObject.class); } catch (Exception e) { log.warn("JSON解析失败,尝试提取数组片段: {}", e.getMessage()); int start = response.indexOf('['); int end = response.lastIndexOf(']'); if (start >= 0 && end > start) { return JSON.parseArray(response.substring(start, end + 1), JSONObject.class); } return List.of(); } } // ---- Tier 0: 基础数据 ---- private ModuleSummary createCustomers(List items, Map nameToId) { int success = 0, fail = 0; for (JSONObject item : items) { try { Customer c = new Customer(); c.setCustomerName(item.getString("customerName")); c.setCustomerType(item.getString("customerType")); c.setContactPerson(item.getString("contactPerson")); c.setContactPhone(item.getString("contactPhone")); c.setCompanyAddress(item.getString("companyAddress")); c.setCompanyPhone(item.getString("companyPhone")); c.setTaxpayerIdentificationNumber(item.getString("taxpayerIdentificationNumber")); c.setMaintainer(item.getString("maintainer")); if (item.containsKey("maintenanceTime")) { c.setMaintenanceTime(java.sql.Date.valueOf(item.getString("maintenanceTime"))); } else { c.setMaintenanceTime(new java.sql.Date(System.currentTimeMillis())); } if (item.containsKey("bankAccount")) { c.setBankAccount(item.getString("bankAccount")); } if (item.containsKey("basicBankAccount")) { c.setBasicBankAccount(item.getString("basicBankAccount")); } if (item.containsKey("bankCode")) { c.setBankCode(item.getString("bankCode")); } customerService.insertCustomer(c); if (c.getId() != null) { nameToId.put(c.getCustomerName(), c.getId()); } success++; } catch (Exception e) { log.warn("创建客户失败: {}", e.getMessage()); fail++; } } return summary("sales", "客户", items.size(), success, fail); } private ModuleSummary createSuppliers(List items, Map nameToId) { int success = 0, fail = 0; for (JSONObject item : items) { try { SupplierManage s = new SupplierManage(); s.setSupplierName(item.getString("supplierName")); s.setSupplierType(item.getString("supplierType")); s.setContactUserName(item.getString("contactUserName")); s.setContactUserPhone(item.getString("contactUserPhone")); s.setCompanyAddress(item.getString("companyAddress")); s.setCompanyPhone(item.getString("companyPhone")); s.setTaxpayerIdentificationNum(item.getString("taxpayerIdentificationNum")); s.setBankAccountName(item.getString("bankAccountName")); s.setBankAccountNum(item.getString("bankAccountNum")); if (item.containsKey("isWhite")) { s.setIsWhite(item.getInteger("isWhite")); } supplierService.saveSupplier(s); if (s.getId() != null) { nameToId.put(s.getSupplierName(), s.getId()); } success++; } catch (Exception e) { log.warn("创建供应商失败: {}", e.getMessage()); fail++; } } return summary("purchase", "供应商", items.size(), success, fail); } private ModuleSummary createQualityStandards(List items) { int success = 0, fail = 0; for (JSONObject item : items) { try { QualityTestStandard std = new QualityTestStandard(); std.setStandardNo(item.getString("standardNo")); std.setStandardName(item.getString("standardName")); std.setInspectType(item.getInteger("inspectType")); std.setRemark(item.getString("remark")); qualityTestStandardService.save(std); success++; } catch (Exception e) { log.warn("创建检测标准失败: {}", e.getMessage()); fail++; } } return summary("quality", "检测标准", items.size(), success, fail); } // ---- Tier 1: 业务单据 ---- private ModuleSummary createSalesLedgers(List items, Map customerNameToId) { int success = 0, fail = 0; for (JSONObject item : items) { try { String customerName = item.getString("customerName"); Long customerId = customerNameToId.get(customerName); SalesLedgerDto dto = new SalesLedgerDto(); dto.setCustomerId(customerId); dto.setCustomerName(customerName); dto.setProjectName(item.getString("projectName")); dto.setSalesman(item.getString("salesman")); dto.setPaymentMethod(item.getString("paymentMethod")); dto.setType(item.getInteger("type")); // 录入人:优先使用AI提供的数据,否则用当前登录用户 if (item.containsKey("entryPerson")) { dto.setEntryPerson(item.getString("entryPerson")); } if (item.containsKey("entryDate")) { dto.setEntryDate(java.sql.Date.valueOf(item.getString("entryDate"))); } if (item.containsKey("executionDate")) { dto.setExecutionDate(LocalDate.parse(item.getString("executionDate"))); } if (item.containsKey("deliveryDate")) { dto.setDeliveryDate(LocalDate.parse(item.getString("deliveryDate"))); } JSONArray productData = item.getJSONArray("productData"); if (productData != null) { List products = new ArrayList<>(); for (int i = 0; i < productData.size(); i++) { JSONObject pd = productData.getJSONObject(i); SalesLedgerProduct slp = new SalesLedgerProduct(); slp.setProductId(pd.getLong("productId")); slp.setProductModelId(pd.getLong("productModelId")); slp.setQuantity(pd.getBigDecimal("quantity")); slp.setTaxInclusiveUnitPrice(pd.getBigDecimal("taxInclusiveUnitPrice")); slp.setTaxInclusiveTotalPrice(pd.getBigDecimal("taxInclusiveTotalPrice")); slp.setTaxRate(pd.getBigDecimal("taxRate")); slp.setUnit(pd.getString("unit")); slp.setType(pd.getInteger("type")); if (pd.containsKey("taxExclusiveTotalPrice")) { slp.setTaxExclusiveTotalPrice(pd.getBigDecimal("taxExclusiveTotalPrice")); } else if (pd.getBigDecimal("taxInclusiveTotalPrice") != null && pd.getBigDecimal("taxRate") != null) { // 不含税总价 = 含税总价 / (1 + 税率/100) slp.setTaxExclusiveTotalPrice( pd.getBigDecimal("taxInclusiveTotalPrice").divide( BigDecimal.ONE.add(pd.getBigDecimal("taxRate").divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)), 2, RoundingMode.HALF_UP)); } else { slp.setTaxExclusiveTotalPrice(BigDecimal.ZERO); } products.add(slp); } dto.setProductData(products); } salesLedgerService.addOrUpdateSalesLedger(dto); success++; } catch (Exception e) { log.warn("创建销售台账失败: {}", e.getMessage()); fail++; } } return summary("sales", "销售台账", items.size(), success, fail); } private ModuleSummary createPurchaseLedgers(List items, Map supplierNameToId, String additionalInfo, String dateEnd) { // 是否需要质检,从补充信息判断,默认不需要 boolean needQualityInspect = additionalInfo != null && (additionalInfo.contains("质检") || additionalInfo.contains("需要检验")); int success = 0, fail = 0; for (JSONObject item : items) { try { String supplierName = item.getString("supplierName"); Long supplierId = supplierNameToId.get(supplierName); PurchaseLedgerDto dto = new PurchaseLedgerDto(); dto.setSupplierId(supplierId); dto.setSupplierName(supplierName); dto.setPurchaseContractNumber(item.getString("purchaseContractNumber")); 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")) { entryDate = LocalDate.parse(entryDateStr); dto.setEntryDate(java.sql.Date.valueOf(entryDateStr)); } if (item.containsKey("executionDate")) { dto.setExecutionDate(java.sql.Date.valueOf(item.getString("executionDate"))); } JSONArray productData = item.getJSONArray("productData"); if (productData != null) { List products = new ArrayList<>(); for (int i = 0; i < productData.size(); i++) { JSONObject pd = productData.getJSONObject(i); SalesLedgerProduct slp = new SalesLedgerProduct(); slp.setProductId(pd.getLong("productId")); slp.setProductModelId(pd.getLong("productModelId")); slp.setQuantity(pd.getBigDecimal("quantity")); slp.setTaxInclusiveUnitPrice(pd.getBigDecimal("taxInclusiveUnitPrice")); slp.setTaxInclusiveTotalPrice(pd.getBigDecimal("taxInclusiveTotalPrice")); 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) { slp.setTaxExclusiveTotalPrice( pd.getBigDecimal("taxInclusiveTotalPrice").divide( BigDecimal.ONE.add(pd.getBigDecimal("taxRate").divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)), 2, RoundingMode.HALF_UP)); } else { slp.setTaxExclusiveTotalPrice(BigDecimal.ZERO); } products.add(slp); } dto.setProductData(products); } purchaseLedgerService.addOrEditPurchase(dto); // 通过合同号找到刚创建的采购台账 PurchaseLedger savedLedger = purchaseLedgerService.getOne( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .eq(PurchaseLedger::getPurchaseContractNumber, dto.getPurchaseContractNumber()) .last("limit 1")); if (savedLedger != null) { // 走完整流程:审核通过 → 质检(可选) → 入库 + 入库审核通过 processPurchaseFullFlow(savedLedger, needQualityInspect, entryDate, dateEnd); } success++; } catch (Exception e) { log.warn("创建采购台账失败: {}", e.getMessage()); fail++; } } 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() .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 inspectList = qualityInspectService.list( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .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 stockRecords = stockInRecordService.list( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .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()))); // 如果按PURCHASE_STOCK_IN找不到,尝试CUSTOMIZATION_UNSTOCK_OUT(质检合格入库) if (stockRecords.isEmpty()) { stockRecords = stockInRecordService.list( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .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()))); } // 也尝试按质检单ID查找(质检单的recordId是质检单ID) for (QualityInspect qi : qualityInspectService.list( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .eq(QualityInspect::getPurchaseLedgerId, purchaseLedger.getId()))) { List qiRecords = stockInRecordService.list( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .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 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 items) { int success = 0, fail = 0; for (JSONObject item : items) { try { ProductionPlan plan = new ProductionPlan(); plan.setProductModelId(item.getLong("productModelId")); plan.setQtyRequired(item.getBigDecimal("qtyRequired")); plan.setSource(item.getString("source")); plan.setRemark(item.getString("remark")); if (item.containsKey("requiredDate")) { plan.setRequiredDate(LocalDate.parse(item.getString("requiredDate"))); } if (item.containsKey("promisedDeliveryDate")) { plan.setPromisedDeliveryDate(LocalDate.parse(item.getString("promisedDeliveryDate"))); } productionPlanService.save(plan); success++; } catch (Exception e) { log.warn("创建生产计划失败: {}", e.getMessage()); fail++; } } return summary("production", "生产计划", items.size(), success, fail); } // ---- Tier 2: 后续单据 ---- private ModuleSummary createProductionOrders(List items) { int success = 0, fail = 0; for (JSONObject item : items) { try { ProductionOrder order = new ProductionOrder(); order.setProductModelId(item.getLong("productModelId")); order.setQuantity(item.getBigDecimal("quantity")); if (item.containsKey("planCompleteTime")) { order.setPlanCompleteTime(LocalDate.parse(item.getString("planCompleteTime"))); } productionOrderService.saveProductionOrder(order); success++; } catch (Exception e) { log.warn("创建生产订单失败: {}", e.getMessage()); fail++; } } return summary("production", "生产订单", items.size(), success, fail); } private ModuleSummary createQualityBindings(List items) { int success = 0, fail = 0; for (JSONObject item : items) { try { QualityTestStandardBinding binding = new QualityTestStandardBinding(); binding.setProductId(item.getLong("productId")); binding.setTestStandardId(item.getInteger("testStandardId")); qualityTestStandardBindingService.add(List.of(binding)); success++; } catch (Exception e) { log.warn("创建指标绑定失败: {}", e.getMessage()); fail++; } } return summary("quality", "指标绑定", items.size(), success, fail); } private ModuleSummary createStockInventories(List items) { int success = 0, fail = 0; for (JSONObject item : items) { try { StockInventoryDto dto = new StockInventoryDto(); dto.setProductModelId(item.getLong("productModelId")); dto.setQualitity(item.getBigDecimal("qualitity")); dto.setBatchNo(item.getString("batchNo")); dto.setWarnNum(item.getBigDecimal("warnNum")); dto.setRemark(item.getString("remark")); stockInventoryService.addstockInventory(dto); success++; } catch (Exception e) { log.warn("创建库存记录失败: {}", e.getMessage()); fail++; } } return summary("stock", "库存记录", items.size(), success, fail); } private ModuleSummary summary(String module, String entityName, int total, int success, int fail) { ModuleSummary s = new ModuleSummary(); s.setModule(module); s.setEntityName(entityName); s.setGeneratedCount(total); s.setSuccessCount(success); s.setFailCount(fail); return s; } }