package com.ruoyi.mock.prompt; import java.util.List; import java.util.stream.Collectors; /** * 各模块的 AI Prompt 模板 */ public final class MockDataPrompt { private MockDataPrompt() {} public static String buildSystemPrompt() { return """ 你是一个企业ERP系统的数据模拟专家。你需要根据用户提供的行业、数量、时间范围等信息, 生成符合业务逻辑的模拟数据。 要求: 1. 输出必须是纯JSON数组,不要用markdown代码块包裹,不要有任何其他文字 2. 每个JSON对象必须包含 "entity" 字段,值为实体类型名 3. 数据内容要符合指定行业的特征(公司名称、产品名称、联系人等要像该行业的) 4. 日期字段在指定的时间范围内随机分布 5. 金额、数量等数值字段要合理 6. 同一模块内的实体之间要有引用关系(如销售台账引用客户名称) 7. 所有字符串字段不要使用emoji或特殊unicode字符 """; } public static String buildUserMessage(List modules, List industries, int countMin, int countMax, String dateStart, String dateEnd, String additionalInfo, List productIds, List productModelIds) { StringBuilder sb = new StringBuilder(); sb.append("请为以下行业生成模拟ERP业务数据:\n"); sb.append("- 行业: ").append(String.join("、", industries)).append("\n"); sb.append("- 数据条数: 每种实体 ").append(countMin).append("-").append(countMax).append(" 条\n"); sb.append("- 时间范围: ").append(dateStart).append(" ~ ").append(dateEnd).append("\n"); if (additionalInfo != null && !additionalInfo.isBlank()) { sb.append("- 补充信息: ").append(additionalInfo).append("\n"); } sb.append("\n"); sb.append("可用的产品ID列表: ").append(productIds.stream().map(String::valueOf).collect(Collectors.joining(","))).append("\n"); sb.append("可用的产品规格ID列表: ").append(productModelIds.stream().map(String::valueOf).collect(Collectors.joining(","))).append("\n"); sb.append("\n"); sb.append("需要生成的模块: ").append(String.join("、", modules)).append("\n\n"); if (modules.contains("sales")) { sb.append(buildSalesPrompt(countMin, countMax, dateStart, dateEnd)); } if (modules.contains("purchase")) { sb.append(buildPurchasePrompt(countMin, countMax, dateStart, dateEnd)); } if (modules.contains("quality")) { sb.append(buildQualityPrompt(countMin, countMax)); } if (modules.contains("production")) { sb.append(buildProductionPrompt(countMin, countMax, dateStart, dateEnd)); } if (modules.contains("stock")) { sb.append(buildStockPrompt(countMin, countMax)); } sb.append("\n请直接输出JSON数组,不要有任何其他内容:"); return sb.toString(); } private static String buildSalesPrompt(int min, int max, String dateStart, String dateEnd) { return """ 销售模块 - 按以下格式生成: { "entity": "customer", "customerName": "XX科技有限公司", "customerType": "企业客户", "contactPerson": "张三", "contactPhone": "13800138000", "companyAddress": "XX省XX市XX区XX路XX号", "companyPhone": "0513-XXXXXXXX", "taxpayerIdentificationNumber": "91110108XXXXXXXXXX", "maintainer": "李四", "maintenanceTime": "2026-06-01", "bankAccount": "622202XXXXXXXXXXXX", "basicBankAccount": "XX银行XX支行", "bankCode": "308100XXXXXX" } { "entity": "salesLedger", "customerName": "引用上面生成的客户名称", "salesContractNo": "XS-20260601-001", "projectName": "XX项目", "entryDate": "2026-06-01", "entryPerson": "张三", "salesman": "销售员姓名", "contractAmount": 50000.00, "paymentMethod": "月结30天", "executionDate": "2026-06-01", "deliveryDate": "2026-07-01", "type": 1, "productData": [ { "productId": 1, "productModelId": 1, "quantity": 100, "taxInclusiveUnitPrice": 500.00, "taxInclusiveTotalPrice": 50000.00, "taxExclusiveTotalPrice": 44247.79, "taxRate": 13.00, "unit": "件", "type": 1 } ] } 客户名称要像指定行业的公司,合同编号格式XS-年月日-序号,金额合理。 注意 taxExclusiveTotalPrice 是不含税总价,需要根据含税总价和税率计算(=含税总价/(1+税率/100))。 日期范围: %s ~ %s,每种实体生成%d-%d条。 """.formatted(dateStart, dateEnd, min, max); } private static String buildPurchasePrompt(int min, int max, String dateStart, String dateEnd) { return """ 采购模块 - 按以下格式生成: { "entity": "supplier", "supplierName": "XX原材料有限公司", "supplierType": "原材料供应商", "contactUserName": "李四", "contactUserPhone": "13900139000", "companyAddress": "XX省XX市XX区XX路XX号", "companyPhone": "0513-XXXXXXXX", "taxpayerIdentificationNum": "91110108XXXXXXXXXX", "bankAccountName": "XX银行XX支行", "bankAccountNum": "622202XXXXXXXXXXXX", "isWhite": 0 } { "entity": "purchaseLedger", "supplierName": "引用上面生成的供应商名称", "purchaseContractNumber": "CG-20260601-001", "projectName": "XX采购项目", "entryDate": "2026-06-01", "contractAmount": 30000.00, "paymentMethod": "货到付款", "executionDate": "2026-06-01", "productData": [ { "productId": 1, "productModelId": 1, "quantity": 50, "taxInclusiveUnitPrice": 600.00, "taxInclusiveTotalPrice": 30000.00, "taxExclusiveTotalPrice": 26548.67, "taxRate": 13.00, "unit": "件", "type": 2 } ] } 供应商名称要像指定行业的供应商,合同编号格式CG-年月日-序号。 注意 taxExclusiveTotalPrice 是不含税总价,需要根据含税总价和税率计算(=含税总价/(1+税率/100))。 日期范围: %s ~ %s,每种实体生成%d-%d条。 """.formatted(dateStart, dateEnd, min, max); } private static String buildQualityPrompt(int min, int max) { return """ 质量模块 - 按以下格式生成: { "entity": "qualityTestStandard", "standardNo": "QTS-20260601-001", "standardName": "XX产品检验标准", "inspectType": 0, "remark": "适用于XX行业的质量检验标准" } inspectType: 0=原材料检验, 1=过程检验, 2=出厂检验。三种类型都要覆盖。 { "entity": "qualityTestStandardBinding", "productId": 1, "testStandardId": 1 } 每种实体生成%d-%d条。 """.formatted(min, max); } private static String buildProductionPrompt(int min, int max, String dateStart, String dateEnd) { return """ 生产模块 - 按以下格式生成: { "entity": "productionPlan", "productModelId": 1, "qtyRequired": 200, "requiredDate": "2026-06-15", "source": "销售", "promisedDeliveryDate": "2026-07-01", "remark": "XX客户订单需求" } { "entity": "productionOrder", "productModelId": 1, "quantity": 200, "planCompleteTime": "2026-06-30", "remark": "根据生产计划XX生成" } productionPlan的source可选"销售"或"内部"。 日期范围: %s ~ %s,每种实体生成%d-%d条。 """.formatted(dateStart, dateEnd, min, max); } private static String buildStockPrompt(int min, int max) { return """ 库存模块 - 按以下格式生成: { "entity": "stockInventory", "productModelId": 1, "qualitity": 500, "batchNo": "BATCH-20260601-001", "warnNum": 50, "remark": "安全库存" } 每种实体生成%d-%d条。batchNo格式BATCH-年月日-序号。 """.formatted(min, max); } }