| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.mock.prompt; |
| | | |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | 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. ä¸è¦ä½¿ç¨emojiæç¹æ®unicodeå符 |
| | | 7. æéè¦ï¼æ¥æåªä»"æå®æ¶é´èå´"ä¸åï¼ç»å¯¹ä¸è¦ç¨å
¶ä»å¹´ä»½ï¼ |
| | | 8. 人ååæ®µï¼å¦entryPersonãsalesmançï¼å¿
é¡»ä»"ç³»ç»ç¨æ·å表"ä¸éåï¼æ ¹æ®è§è²åé¨é¨å¹é
å¯¹åºæ¨¡åï¼ä¸è¦ç¼é 人åï¼ |
| | | """; |
| | | } |
| | | |
| | | public static String buildUserMessage(List<String> modules, List<String> industries, |
| | | int countMin, int countMax, |
| | | String dateStart, String dateEnd, |
| | | String additionalInfo, |
| | | Map<Long, String> productModelIdToCategory, |
| | | List<SysUser> systemUsers, |
| | | List<String> existingCustomerNames, |
| | | List<String> existingSupplierNames) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append("æå®è¡ä¸: ").append(String.join("ã", industries)).append("\n"); |
| | | sb.append("æ¯ç§å®ä½çæ: ").append(countMin).append("-").append(countMax).append(" æ¡\n"); |
| | | sb.append("æå®æ¶é´èå´: ").append(dateStart).append(" å° ").append(dateEnd); |
| | | sb.append("ï¼æææ¥æå段å¿
é¡»å¨è¿ä¸ªèå´å
ï¼ç¦æ¢ä½¿ç¨2023ã2024ã2025çä»»ä½è¶
åºèå´ç年份ï¼ï¼\n"); |
| | | if (additionalInfo != null && !additionalInfo.isBlank()) { |
| | | sb.append("è¡¥å
ä¿¡æ¯: ").append(additionalInfo).append("\n"); |
| | | } |
| | | sb.append("\n"); |
| | | |
| | | // æé¡¶çº§äº§ååç±»ï¼æå/åææ/åæåï¼åç»ååºäº§åè§æ ¼ |
| | | Map<String, List<Map.Entry<Long, String>>> grouped = productModelIdToCategory.entrySet().stream() |
| | | .collect(Collectors.groupingBy( |
| | | e -> categorize(e.getValue()), |
| | | java.util.LinkedHashMap::new, |
| | | Collectors.toList())); |
| | | |
| | | sb.append("=== 产åè§æ ¼å表 ===\n"); |
| | | for (Map.Entry<String, List<Map.Entry<Long, String>>> entry : grouped.entrySet()) { |
| | | String label = entry.getKey(); |
| | | List<Map.Entry<Long, String>> items = entry.getValue(); |
| | | sb.append("ã").append(label).append("ã: "); |
| | | sb.append(items.stream() |
| | | .map(e -> e.getKey() + "(" + e.getValue() + ")") |
| | | .collect(Collectors.joining(", "))).append("\n"); |
| | | } |
| | | sb.append("éå®å°è´¦çproductDataåªè½éãæåç±»ãè§æ ¼ï¼éè´å°è´¦åªè½éãåææç±»ãè§æ ¼ã\n\n"); |
| | | |
| | | // ç³»ç»ç¨æ·å表ï¼å«è§è²åé¨é¨ï¼ |
| | | sb.append("=== ç³»ç»ç¨æ·å表ï¼äººååæ®µå¿
é¡»ä»ä¸éåï¼ä¸è¦ç¼é 人åï¼===\n"); |
| | | for (SysUser u : systemUsers) { |
| | | String roleNames = u.getRoleNames() != null && !u.getRoleNames().isBlank() ? u.getRoleNames() : "æ è§è²"; |
| | | String deptNames = u.getDeptNames() != null && !u.getDeptNames().isBlank() ? u.getDeptNames() : "æ é¨é¨"; |
| | | sb.append(u.getNickName()).append("ï¼è§è²: ").append(roleNames).append(", é¨é¨: ").append(deptNames).append("ï¼\n"); |
| | | } |
| | | sb.append("éæ©è§åï¼\n"); |
| | | sb.append("- é宿¨¡åç人å(entryPersonãsalesman)éè§è²æé¨é¨å«\"éå®\"çç¨æ·\n"); |
| | | sb.append("- éè´æ¨¡åç人åéè§è²æé¨é¨å«\"éè´\"çç¨æ·\n"); |
| | | sb.append("- ç产模åç人åéè§è²æé¨é¨å«\"ç产\"çç¨æ·\n"); |
| | | sb.append("- è´¨éæ¨¡åç人åéè§è²æé¨é¨å«\"è´¨é\"æ\"è´¨æ£\"çç¨æ·\n"); |
| | | sb.append("- ä»åºæ¨¡åç人åéè§è²æé¨é¨å«\"ä»åº\"æ\"åºå\"çç¨æ·\n\n"); |
| | | |
| | | if (!existingCustomerNames.isEmpty()) { |
| | | sb.append("=== å·²æå®¢æ·ï¼åªè½å¼ç¨ï¼ä¸è¦çææ°customerå®ä½ï¼===\n"); |
| | | sb.append(String.join("ã", existingCustomerNames)).append("\n\n"); |
| | | } |
| | | if (!existingSupplierNames.isEmpty()) { |
| | | sb.append("=== å·²æä¾åºåï¼åªè½å¼ç¨ï¼ä¸è¦çææ°supplierå®ä½ï¼===\n"); |
| | | sb.append(String.join("ã", existingSupplierNames)).append("\n\n"); |
| | | } |
| | | |
| | | sb.append("æ°æ®æ¨¡å: ").append(String.join("ã", modules)).append("\n\n"); |
| | | |
| | | if (modules.contains("sales")) { |
| | | sb.append(buildSalesPrompt(countMin, countMax, dateStart, dateEnd, existingCustomerNames)); |
| | | } |
| | | if (modules.contains("purchase")) { |
| | | sb.append(buildPurchasePrompt(countMin, countMax, dateStart, dateEnd, existingSupplierNames)); |
| | | } |
| | | if (modules.contains("quality")) { |
| | | sb.append(buildQualityPrompt(countMin, countMax, dateStart)); |
| | | } |
| | | if (modules.contains("production")) { |
| | | sb.append(buildProductionPrompt(countMin, countMax, dateStart, dateEnd)); |
| | | } |
| | | if (modules.contains("stock")) { |
| | | sb.append(buildStockPrompt(countMin, countMax, dateStart)); |
| | | } |
| | | |
| | | sb.append("\nè¯·ç´æ¥è¾åºJSONæ°ç»:"); |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * å°é¡¶çº§äº§ååç§°æ å°ä¸ºåç±»æ ç¾ |
| | | */ |
| | | private static String categorize(String rootProductName) { |
| | | if (rootProductName == null) return "å
¶ä»ç±»"; |
| | | if (rootProductName.contains("æå") || rootProductName.contains("产æå")) return "æåç±»-éå®ä¼å
éè¿äº"; |
| | | if (rootProductName.contains("åæ") || rootProductName.contains("åææ") || rootProductName.contains("ææ")) return "åææç±»-éè´ä¼å
éè¿äº"; |
| | | if (rootProductName.contains("åæå")) return "åæåç±»"; |
| | | return "å
¶ä»ç±»"; |
| | | } |
| | | |
| | | private static String buildSalesPrompt(int min, int max, String dateStart, String dateEnd, |
| | | List<String> existingCustomerNames) { |
| | | String namesHint = existingCustomerNames.isEmpty() ? "" |
| | | : "customerNameå¿
é¡»ä»ä»¥ä¸å·²æå®¢æ·ä¸éæ©: " + String.join("ã", existingCustomerNames) + "\n"; |
| | | return """ |
| | | é宿¨¡åæ ¼å¼ï¼æææ¥æå¿
é¡»å¨ %s ~ %s èå´å
ï¼: |
| | | %s注æï¼ä¸è¦çæcustomerå®ä½ï¼åªçæsalesLedgerï¼ |
| | | productDataä¸çproductModelIdå¿
é¡»éãæåç±»ãè§æ ¼IDï¼ |
| | | entryPersonåsalesmanå¿
é¡»ä»ç³»ç»ç¨æ·å表ä¸è§è²æé¨é¨å«"éå®"çç¨æ·ä¸éåï¼ |
| | | { |
| | | "entity": "salesLedger", |
| | | "customerName": "å¼ç¨ä¸é¢çæç客æ·åç§°", |
| | | "salesContractNo": "XS-YYYYMMDD-001", |
| | | "projectName": "XX项ç®", |
| | | "entryDate": "%s", |
| | | "entryPerson": "ä»ç¨æ·å表ä¸é", |
| | | "salesman": "ä»ç¨æ·å表ä¸é", |
| | | "contractAmount": 50000.00, |
| | | "paymentMethod": "æç»30天", |
| | | "executionDate": "%s", |
| | | "deliveryDate": "%s", |
| | | "type": 1, |
| | | "productData": [{ |
| | | "productId": 1, "productModelId": 1, "quantity": 100, |
| | | "taxInclusiveUnitPrice": 500.00, "taxInclusiveTotalPrice": 50000.00, |
| | | "taxExclusiveTotalPrice": 44247.79, "taxRate": 13.00, "unit": "ä»¶", "type": 1 |
| | | }] |
| | | } |
| | | salesContractNoä¸YYYYMMDDæ¿æ¢ä¸ºentryDateçæ¥æã%d-%dæ¡ã |
| | | """.formatted(dateStart, dateEnd, namesHint, dateStart, dateStart, dateEnd, min, max); |
| | | } |
| | | |
| | | private static String buildPurchasePrompt(int min, int max, String dateStart, String dateEnd, |
| | | List<String> existingSupplierNames) { |
| | | String namesHint = existingSupplierNames.isEmpty() ? "" |
| | | : "supplierNameå¿
é¡»ä»ä»¥ä¸å·²æä¾åºåä¸éæ©: " + String.join("ã", existingSupplierNames) + "\n"; |
| | | return """ |
| | | éè´æ¨¡åæ ¼å¼ï¼æææ¥æå¿
é¡»å¨ %s ~ %s èå´å
ï¼: |
| | | %s注æï¼ä¸è¦çæsupplierå®ä½ï¼åªçæpurchaseLedgerï¼ |
| | | productDataä¸çproductModelIdå¿
é¡»éãåææç±»ãè§æ ¼IDï¼ |
| | | 人ååæ®µå¿
é¡»ä»ç³»ç»ç¨æ·å表ä¸è§è²æé¨é¨å«"éè´"çç¨æ·ä¸éåï¼ |
| | | { |
| | | "entity": "purchaseLedger", |
| | | "supplierName": "ä»å·²æä¾åºåä¸éæ©", |
| | | "purchaseContractNumber": "CG-YYYYMMDD-001", |
| | | "projectName": "XXéè´é¡¹ç®", |
| | | "entryDate": "%s", |
| | | "contractAmount": 30000.00, |
| | | "paymentMethod": "è´§å°ä»æ¬¾", |
| | | "executionDate": "%s", |
| | | "productData": [{ |
| | | "productId": 1, "productModelId": 1, "quantity": 50, |
| | | "taxInclusiveUnitPrice": 600.00, "taxInclusiveTotalPrice": 30000.00, |
| | | "taxExclusiveTotalPrice": 26548.67, "taxRate": 13.00, "unit": "ä»¶", "type": 2 |
| | | }] |
| | | } |
| | | purchaseContractNumberä¸YYYYMMDDæ¿æ¢ä¸ºentryDateçæ¥æã%d-%dæ¡ã |
| | | """.formatted(dateStart, dateEnd, namesHint, dateStart, dateStart, min, max); |
| | | } |
| | | |
| | | private static String buildQualityPrompt(int min, int max, String dateStart) { |
| | | return """ |
| | | è´¨éæ¨¡åæ ¼å¼: |
| | | { |
| | | "entity": "qualityTestStandard", |
| | | "standardNo": "QTS-YYYYMMDD-001", |
| | | "standardName": "XXäº§åæ£éªæ å", |
| | | "inspectType": 0, |
| | | "remark": "éç¨äºXXè¡ä¸çè´¨éæ£éªæ å" |
| | | } |
| | | inspectType: 0=åæææ£éª, 1=è¿ç¨æ£éª, 2=åºåæ£éªãä¸ç§ç±»åé½è¦è¦çã |
| | | standardNoä¸YYYYMMDDæ¿æ¢ä¸º %sã%d-%dæ¡ã |
| | | { |
| | | "entity": "qualityTestStandardBinding", |
| | | "productId": 1, |
| | | "testStandardId": 1 |
| | | } |
| | | %d-%dæ¡ã |
| | | """.formatted(dateStart.replace("-", ""), min, max, min, max); |
| | | } |
| | | |
| | | private static String buildProductionPrompt(int min, int max, String dateStart, String dateEnd) { |
| | | return """ |
| | | çäº§æ¨¡åæ ¼å¼ï¼æææ¥æå¿
é¡»å¨ %s ~ %s èå´å
ï¼: |
| | | { |
| | | "entity": "productionPlan", |
| | | "productModelId": 1, |
| | | "qtyRequired": 200, |
| | | "requiredDate": "%s", |
| | | "source": "éå®", |
| | | "promisedDeliveryDate": "%s", |
| | | "remark": "XX客æ·è®¢åéæ±" |
| | | } |
| | | { |
| | | "entity": "productionOrder", |
| | | "productModelId": 1, |
| | | "quantity": 200, |
| | | "planCompleteTime": "%s", |
| | | "remark": "æ ¹æ®ç产计åXXçæ" |
| | | } |
| | | sourceå¯é"éå®"æ"å
é¨"ã%d-%dæ¡ã |
| | | """.formatted(dateStart, dateEnd, dateStart, dateEnd, dateEnd, min, max); |
| | | } |
| | | |
| | | private static String buildStockPrompt(int min, int max, String dateStart) { |
| | | return """ |
| | | åºåæ¨¡åæ ¼å¼: |
| | | { |
| | | "entity": "stockInventory", |
| | | "productModelId": 1, |
| | | "qualitity": 500, |
| | | "batchNo": "BATCH-YYYYMMDD-001", |
| | | "warnNum": 50, |
| | | "remark": "å®å
¨åºå" |
| | | } |
| | | batchNoä¸YYYYMMDDæ¿æ¢ä¸º %sã%d-%dæ¡ã |
| | | """.formatted(dateStart.replace("-", ""), min, max); |
| | | } |
| | | } |