diff --git a/backend/archive-service/.gitignore b/backend/archive-service/.gitignore index 59a54cd..2f7896d 100644 --- a/backend/archive-service/.gitignore +++ b/backend/archive-service/.gitignore @@ -1,2 +1 @@ target/ -target \ No newline at end of file diff --git a/backend/archive-service/src/main/java/com/artedu/archive/controller/ArchiveMessageController.java b/backend/archive-service/src/main/java/com/artedu/archive/controller/ArchiveMessageController.java index 0a19773..0bcdb76 100644 --- a/backend/archive-service/src/main/java/com/artedu/archive/controller/ArchiveMessageController.java +++ b/backend/archive-service/src/main/java/com/artedu/archive/controller/ArchiveMessageController.java @@ -270,32 +270,48 @@ public class ArchiveMessageController { nameMap.putAll(customerNameMap); // 对未找到昵称或昵称为ID的外部客户,实时调用企微API获取并更新数据库 + log.info("enrichSenderNames 开始处理, userIds={}, nameMap keys={}", userIds, nameMap.keySet()); for (String uid : userIds) { String currentName = nameMap.get(uid); - if (isExternalUserId(uid) && (currentName == null || currentName.equals(uid))) { + boolean isExternal = isExternalUserId(uid); + boolean needFetch = isExternal && (currentName == null || currentName.equals(uid)); + log.info("处理uid={}, currentName={}, isExternal={}, needFetch={}", uid, currentName, isExternal, needFetch); + if (needFetch) { try { Map detail = weComApiClient.getExternalContact(uid); + log.info("getExternalContact 返回: uid={}, detail={}", uid, detail); if (detail != null && !detail.isEmpty()) { Map contact = (Map) detail.get("external_contact"); if (contact != null) { String name = (String) contact.get("name"); + log.info("解析到name: uid={}, name={}", uid, name); if (name != null && !name.isEmpty()) { nameMap.put(uid, name); - // 更新数据库 + // 更新或创建数据库记录 Customer customer = customerMapper.selectOne( new LambdaQueryWrapper() .eq(Customer::getCustomerId, uid) - .eq(Customer::getCorpId, "wwd483c2fba24ae30a") + .eq(Customer::getCorpId, corpId) ); if (customer != null) { customer.setName(name); customerMapper.updateById(customer); + log.info("更新客户昵称成功: uid={}, name={}", uid, name); + } else { + Customer newCustomer = new Customer(); + newCustomer.setCustomerId(uid); + newCustomer.setCorpId(corpId); + newCustomer.setName(name); + newCustomer.setType("UNKNOWN"); + newCustomer.setStatus("ACTIVE"); + customerMapper.insert(newCustomer); + log.info("创建客户记录成功: uid={}, name={}", uid, name); } } } } } catch (Exception e) { - log.debug("实时获取客户昵称失败: {}", uid); + log.warn("实时获取客户昵称失败: uid={}, err={}", uid, e.getMessage()); } } } diff --git a/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar b/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar index e51bd63..a185b59 100644 Binary files a/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar and b/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar differ diff --git a/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar.original b/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar.original index e6c33ff..6ed0cd6 100644 Binary files a/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar.original and b/backend/archive-service/target/archive-service-1.0.0-SNAPSHOT.jar.original differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication$1.class b/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication$1.class index 5dbf0fe..4e4e4a1 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication$1.class and b/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication$1.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication.class b/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication.class index 70247aa..d76f608 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication.class and b/backend/archive-service/target/classes/com/artedu/archive/ArchiveServiceApplication.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/client/WeComApiClient.class b/backend/archive-service/target/classes/com/artedu/archive/client/WeComApiClient.class index 615471c..8f1f6de 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/client/WeComApiClient.class and b/backend/archive-service/target/classes/com/artedu/archive/client/WeComApiClient.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveCallbackController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveCallbackController.class index d4721a9..37e1454 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveCallbackController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveCallbackController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveContactController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveContactController.class index 792fcc9..8549eaf 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveContactController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveContactController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveExportController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveExportController.class index fb37f43..f136dac 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveExportController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveExportController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController$ArchiveStatsVO.class b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController$ArchiveStatsVO.class index 6d665a4..367ff97 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController$ArchiveStatsVO.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController$ArchiveStatsVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController.class index f158c3b..7fd9317 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/ArchiveMessageController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController$TrendVO.class b/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController$TrendVO.class index 0685e9e..48e782c 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController$TrendVO.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController$TrendVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController.class index cc5a5f4..04997e4 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/DashboardController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskController.class index e1097ef..4345a69 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController$HandleRequest.class b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController$HandleRequest.class index b1cf660..d58964a 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController$HandleRequest.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController$HandleRequest.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController.class index 6e0ab46..24b4b7d 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventNotifyController.class b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventNotifyController.class index 682a493..01f28a7 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventNotifyController.class and b/backend/archive-service/target/classes/com/artedu/archive/controller/RiskEventNotifyController.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/ArchiveMessage.class b/backend/archive-service/target/classes/com/artedu/archive/entity/ArchiveMessage.class index 7024e9d..9f7d406 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/ArchiveMessage.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/ArchiveMessage.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/Customer.class b/backend/archive-service/target/classes/com/artedu/archive/entity/Customer.class index 7539800..5699c54 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/Customer.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/Customer.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/RiskConfig.class b/backend/archive-service/target/classes/com/artedu/archive/entity/RiskConfig.class index 484772c..ddcca5b 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/RiskConfig.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/RiskConfig.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/RiskEvent.class b/backend/archive-service/target/classes/com/artedu/archive/entity/RiskEvent.class index ec572ca..97bcd62 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/RiskEvent.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/RiskEvent.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWord.class b/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWord.class index 41546d1..7bac12a 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWord.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWord.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWordHit.class b/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWordHit.class index 5cddfb5..5afa213 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWordHit.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/SensitiveWordHit.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/entity/Staff.class b/backend/archive-service/target/classes/com/artedu/archive/entity/Staff.class index 1ba5b11..8348c0b 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/entity/Staff.class and b/backend/archive-service/target/classes/com/artedu/archive/entity/Staff.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/excel/RiskEventExcel.class b/backend/archive-service/target/classes/com/artedu/archive/excel/RiskEventExcel.class index 226d0f4..f98e154 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/excel/RiskEventExcel.class and b/backend/archive-service/target/classes/com/artedu/archive/excel/RiskEventExcel.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/excel/SensitiveWordHitExcel.class b/backend/archive-service/target/classes/com/artedu/archive/excel/SensitiveWordHitExcel.class index aff027d..8c7a48f 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/excel/SensitiveWordHitExcel.class and b/backend/archive-service/target/classes/com/artedu/archive/excel/SensitiveWordHitExcel.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/ArchiveMessageMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/ArchiveMessageMapper.class index 5830ddb..55d7408 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/ArchiveMessageMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/ArchiveMessageMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/CustomerMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/CustomerMapper.class index 00f1181..4c377d3 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/CustomerMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/CustomerMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskConfigMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskConfigMapper.class index e42100f..889ab3b 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskConfigMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskConfigMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskEventMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskEventMapper.class index b696035..24ba626 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskEventMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/RiskEventMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordHitMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordHitMapper.class index 12be432..d843b69 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordHitMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordHitMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordMapper.class index 20e5769..65024e2 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/SensitiveWordMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/mapper/StaffMapper.class b/backend/archive-service/target/classes/com/artedu/archive/mapper/StaffMapper.class index dc821df..e16d507 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/mapper/StaffMapper.class and b/backend/archive-service/target/classes/com/artedu/archive/mapper/StaffMapper.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveContactService.class b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveContactService.class index c0d9b92..5581ac8 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveContactService.class and b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveContactService.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/ArchivePullService.class b/backend/archive-service/target/classes/com/artedu/archive/service/ArchivePullService.class index ccb47b4..0b4f9a1 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/ArchivePullService.class and b/backend/archive-service/target/classes/com/artedu/archive/service/ArchivePullService.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveRiskService.class b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveRiskService.class index ca122f6..da85094 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveRiskService.class and b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveRiskService.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveSessionService.class b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveSessionService.class index 7bd627a..6ba5460 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveSessionService.class and b/backend/archive-service/target/classes/com/artedu/archive/service/ArchiveSessionService.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/MockArchiveDataProvider.class b/backend/archive-service/target/classes/com/artedu/archive/service/MockArchiveDataProvider.class index 51ec260..2c8b179 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/MockArchiveDataProvider.class and b/backend/archive-service/target/classes/com/artedu/archive/service/MockArchiveDataProvider.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventDetector.class b/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventDetector.class index 05c2d59..fd58604 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventDetector.class and b/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventDetector.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventNotifyService.class b/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventNotifyService.class index 6b8e5bd..d440c04 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventNotifyService.class and b/backend/archive-service/target/classes/com/artedu/archive/service/RiskEventNotifyService.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner$HitResult.class b/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner$HitResult.class index 280b05f..b004b22 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner$HitResult.class and b/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner$HitResult.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner.class b/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner.class index 649a9bd..8b4dc81 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner.class and b/backend/archive-service/target/classes/com/artedu/archive/service/SensitiveWordScanner.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/util/RsaDecryptUtil.class b/backend/archive-service/target/classes/com/artedu/archive/util/RsaDecryptUtil.class index 5565a31..9c3315b 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/util/RsaDecryptUtil.class and b/backend/archive-service/target/classes/com/artedu/archive/util/RsaDecryptUtil.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/util/WeComCryptUtil.class b/backend/archive-service/target/classes/com/artedu/archive/util/WeComCryptUtil.class index 3dfa8ab..ea08843 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/util/WeComCryptUtil.class and b/backend/archive-service/target/classes/com/artedu/archive/util/WeComCryptUtil.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/vo/ArchiveMessageVO.class b/backend/archive-service/target/classes/com/artedu/archive/vo/ArchiveMessageVO.class index db30b3b..3549634 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/vo/ArchiveMessageVO.class and b/backend/archive-service/target/classes/com/artedu/archive/vo/ArchiveMessageVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/vo/CustomerSessionVO.class b/backend/archive-service/target/classes/com/artedu/archive/vo/CustomerSessionVO.class index f7fd74b..b007f00 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/vo/CustomerSessionVO.class and b/backend/archive-service/target/classes/com/artedu/archive/vo/CustomerSessionVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/vo/SessionVO.class b/backend/archive-service/target/classes/com/artedu/archive/vo/SessionVO.class index 0364eb0..13c6e4a 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/vo/SessionVO.class and b/backend/archive-service/target/classes/com/artedu/archive/vo/SessionVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/vo/StaffSessionVO.class b/backend/archive-service/target/classes/com/artedu/archive/vo/StaffSessionVO.class index f267eb0..f30e133 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/vo/StaffSessionVO.class and b/backend/archive-service/target/classes/com/artedu/archive/vo/StaffSessionVO.class differ diff --git a/backend/archive-service/target/classes/com/artedu/archive/worker/SdkWorker.class b/backend/archive-service/target/classes/com/artedu/archive/worker/SdkWorker.class index 7193828..4478a22 100644 Binary files a/backend/archive-service/target/classes/com/artedu/archive/worker/SdkWorker.class and b/backend/archive-service/target/classes/com/artedu/archive/worker/SdkWorker.class differ diff --git a/backend/archive-service/target/classes/com/tencent/wework/Finance.class b/backend/archive-service/target/classes/com/tencent/wework/Finance.class index 4fde298..378b7d5 100644 Binary files a/backend/archive-service/target/classes/com/tencent/wework/Finance.class and b/backend/archive-service/target/classes/com/tencent/wework/Finance.class differ diff --git a/backend/archive-service/target/classes/com/tencent/wework/Finance.java.utf8 b/backend/archive-service/target/classes/com/tencent/wework/Finance.java.utf8 deleted file mode 100644 index e69de29..0000000 diff --git a/backend/archive-service/target/test-classes/com/artedu/archive/controller/ArchiveCallbackControllerTest.class b/backend/archive-service/target/test-classes/com/artedu/archive/controller/ArchiveCallbackControllerTest.class index 706b9df..c4b5a36 100644 Binary files a/backend/archive-service/target/test-classes/com/artedu/archive/controller/ArchiveCallbackControllerTest.class and b/backend/archive-service/target/test-classes/com/artedu/archive/controller/ArchiveCallbackControllerTest.class differ diff --git a/backend/archive-service/target/test-classes/com/artedu/archive/service/ArchivePullServiceTest.class b/backend/archive-service/target/test-classes/com/artedu/archive/service/ArchivePullServiceTest.class index 38666d0..f76c9a5 100644 Binary files a/backend/archive-service/target/test-classes/com/artedu/archive/service/ArchivePullServiceTest.class and b/backend/archive-service/target/test-classes/com/artedu/archive/service/ArchivePullServiceTest.class differ diff --git a/backend/generation-service/src/main/java/com/artedu/generation/controller/GenerationController.java b/backend/generation-service/src/main/java/com/artedu/generation/controller/GenerationController.java index b30f2e2..e28d3a3 100644 --- a/backend/generation-service/src/main/java/com/artedu/generation/controller/GenerationController.java +++ b/backend/generation-service/src/main/java/com/artedu/generation/controller/GenerationController.java @@ -112,11 +112,12 @@ public class GenerationController { public Result> generateUtterance( @RequestParam(value = "fromUser", required = false) String fromUser, @RequestParam(value = "toUser", required = false) String toUser, - @RequestParam(value = "roomid", required = false) String roomid) { + @RequestParam(value = "roomid", required = false) String roomid, + @RequestParam(value = "staffName", required = false) String staffName) { String chatContext = buildChatContext(fromUser, toUser, roomid); - String[] promptPair = promptEngine.buildUtterancePrompt(chatContext); + String[] promptPair = promptEngine.buildUtterancePrompt(chatContext, staffName); String systemPrompt = promptPair[0]; String userPrompt = promptPair[1]; @@ -187,7 +188,8 @@ public class GenerationController { public SseEmitter streamUtterance( @RequestParam("fromUser") String fromUser, @RequestParam("toUser") String toUser, - @RequestParam(value = "roomid", required = false) String roomid) { + @RequestParam(value = "roomid", required = false) String roomid, + @RequestParam(value = "staffName", required = false) String staffName) { SseEmitter emitter = new SseEmitter(120000L); @@ -208,8 +210,8 @@ public class GenerationController { return; } - String systemPrompt = promptEngine.buildSystemPrompt(chatContext); - String userPrompt = promptEngine.buildMultiStyleUserPrompt(); + String systemPrompt = promptEngine.buildSystemPrompt(chatContext, staffName); + String userPrompt = promptEngine.buildMultiStyleUserPrompt(staffName); long startTime = System.currentTimeMillis(); String generated = qianwenClient.generate(systemPrompt, userPrompt, 1200); diff --git a/backend/generation-service/src/main/java/com/artedu/generation/service/PromptEngine.java b/backend/generation-service/src/main/java/com/artedu/generation/service/PromptEngine.java index ecdb384..03dd6fd 100644 --- a/backend/generation-service/src/main/java/com/artedu/generation/service/PromptEngine.java +++ b/backend/generation-service/src/main/java/com/artedu/generation/service/PromptEngine.java @@ -10,9 +10,14 @@ public class PromptEngine { /** * 构建生成话术的系统提示词(角色设定) */ - public String buildSystemPrompt(String chatHistoryContext) { + public String buildSystemPrompt(String chatHistoryContext, String staffName) { StringBuilder sb = new StringBuilder(); sb.append("资深销售教练,仅输出符合规范的 3 条推荐回复话术,全程禁止输出任何对话分析、客户判断、前置解读、总结说明文字,任何分析类文字一律不写,正文只保留 3 条话术条目。\n"); + if (staffName != null && !staffName.isEmpty()) { + sb.append("## 重要约束\n"); + sb.append("你的名字是「").append(staffName).append("」,在回复中如果需要自称或介绍自己,必须使用这个名字,绝对禁止编造任何其他名字(如小王、小李、小张等)。\n"); + } + sb.append("## 对话历史\n"); sb.append(chatHistoryContext); sb.append("\n"); @@ -80,8 +85,8 @@ public class PromptEngine { * 构建完整话术 Prompt(system + user 分离) * 返回 String[]{systemPrompt, userPrompt} */ - public String[] buildUtterancePrompt(String chatHistoryContext) { - String system = buildSystemPrompt(chatHistoryContext); + public String[] buildUtterancePrompt(String chatHistoryContext, String staffName) { + String system = buildSystemPrompt(chatHistoryContext, staffName); // String user = buildUserPrompt(message, context, customerProfile, conversationContext, // referenceUtterances, intent, stage, stageLabel, intentLabel); String user = ""; @@ -133,8 +138,11 @@ public class PromptEngine { * 多风格话术生成的用户提示词 * 要求 LLM 输出 3 条不同风格话术,用 ||| 分隔 */ - public String buildMultiStyleUserPrompt() { + public String buildMultiStyleUserPrompt(String staffName) { StringBuilder sb = new StringBuilder(); + if (staffName != null && !staffName.isEmpty()) { + sb.append("你的名字是「").append(staffName).append("」,请用这个名字进行回复,不要编造其他名字。\n\n"); + } sb.append("请根据上述对话历史,生成 3 条不同风格的推荐回复话术。\n\n"); sb.append("风格要求(严格按顺序输出):\n"); sb.append("第1条 - 亲和风格:温暖亲切,像朋友聊天,拉近距离\n"); diff --git a/backend/generation-service/target/classes/com/artedu/generation/controller/GenerationController.class b/backend/generation-service/target/classes/com/artedu/generation/controller/GenerationController.class index b67cb92..16c5aac 100644 Binary files a/backend/generation-service/target/classes/com/artedu/generation/controller/GenerationController.class and b/backend/generation-service/target/classes/com/artedu/generation/controller/GenerationController.class differ diff --git a/backend/generation-service/target/classes/com/artedu/generation/service/PromptEngine.class b/backend/generation-service/target/classes/com/artedu/generation/service/PromptEngine.class index 4dd7362..35c0e92 100644 Binary files a/backend/generation-service/target/classes/com/artedu/generation/service/PromptEngine.class and b/backend/generation-service/target/classes/com/artedu/generation/service/PromptEngine.class differ diff --git a/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar b/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar index 5e5987d..e88db32 100644 Binary files a/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar and b/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar differ diff --git a/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar.original b/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar.original index 6857d42..68488f8 100644 Binary files a/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar.original and b/backend/generation-service/target/generation-service-1.0.0-SNAPSHOT.jar.original differ diff --git a/docker-compose-server.yml b/docker-compose-server.yml new file mode 100644 index 0000000..a0973af --- /dev/null +++ b/docker-compose-server.yml @@ -0,0 +1,338 @@ +version: '3.8' + +services: + # ---------------------- 基础设施 ---------------------- + mysql: + image: mysql:5.7 + container_name: ai-assistant-mysql + restart: always + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + MYSQL_DATABASE: ${MYSQL_DATABASE:-ai_assistant} + MYSQL_CHARACTER_SET_SERVER: utf8mb4 + MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + command: > + --default-authentication-plugin=mysql_native_password + --character-set-server=utf8mb4 + --collation-server=utf8mb4_unicode_ci + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + networks: + - ai-assistant-network + + redis: + image: redis:6-alpine + container_name: ai-assistant-redis + restart: always + ports: + - "6379:6379" + volumes: + - redis_data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - ai-assistant-network + + rabbitmq: + image: rabbitmq:3-management-alpine + container_name: ai-assistant-rabbitmq + restart: always + ports: + - "5672:5672" + - "15672:15672" + environment: + RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-admin} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-admin} + volumes: + - rabbitmq_data:/var/lib/rabbitmq + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "ping"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - ai-assistant-network + + # ---------------------- 后端服务 ---------------------- + gateway: + build: ./backend/gateway + container_name: ai-assistant-gateway + restart: always + ports: + - "8080:8080" + volumes: + - ./gateway-application.yml:/app/config/application.yml + depends_on: + - auth-service + - archive-service + - conversation-service + - intent-service + - recommend-service + - generation-service + - kb-admin-service + - analytics-service + networks: + - ai-assistant-network + + auth-service: + build: ./backend/auth-service + container_name: ai-assistant-auth + restart: always + ports: + - "8081:8081" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - MYSQL_DATABASE=ai_assistant + - SPRING_DATASOURCE_USERNAME=assistant_prod + - SPRING_DATASOURCE_PASSWORD=U%$4Tu_C3+4 + - SPRING_DATASOURCE_URL=jdbc:mysql://sh-cdb-6fzlwnms.sql.tencentcdb.com:63912/ai_assistant?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false + - REDIS_HOST=redis + - JWT_SECRET=${JWT_SECRET:-your-256-bit-secret-key-here-at-least-32-characters} + depends_on: + - mysql + - redis + networks: + - ai-assistant-network + + archive-service: + build: ./backend/archive-service + container_name: ai-assistant-archive + restart: always + ports: + - "8082:8082" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - REDIS_HOST=redis + - RABBITMQ_HOST=rabbitmq + - WECOM_ARCHIVE_SECRET=${WECOM_ARCHIVE_SECRET:-} + - WECOM_ARCHIVE_CALLBACK_TOKEN=${WECOM_ARCHIVE_CALLBACK_TOKEN:-} + - WECOM_ARCHIVE_CALLBACK_AESKEY=${WECOM_ARCHIVE_CALLBACK_AESKEY:-} + - WECOM_ARCHIVE_SDK_PATH=${WECOM_ARCHIVE_SDK_PATH:-/app/sdk} + - ARCHIVE_REPAIR_ON_STARTUP=true + - WECOM_AGENT_SECRET=nU1xezyHyonS9rOJ9Kwo3i5OM9iuWc1TrjXf-rOYZx0 + - WECOM_CONTACT_SECRET=zrZkae10k1T7bqrt-jVYjj9LQ4GgMibj-wUMy48OsyY + volumes: + - ./keys:/app/keys + # 如需真实企微SDK,取消注释下行并将Linux .so文件放入 ./sdk/linux/ + - ./sdk/linux:/app/sdk + depends_on: + - mysql + - redis + - rabbitmq + networks: + - ai-assistant-network + + conversation-service: + build: ./backend/conversation-service + container_name: ai-assistant-conversation + restart: always + ports: + - "8083:8083" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - REDIS_HOST=redis + - RABBITMQ_HOST=rabbitmq + depends_on: + - mysql + - redis + - rabbitmq + networks: + - ai-assistant-network + + intent-service: + build: ./backend/intent-service + container_name: ai-assistant-intent + restart: always + ports: + - "8084:8084" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - REDIS_HOST=redis + - RABBITMQ_HOST=rabbitmq + depends_on: + - mysql + - redis + - rabbitmq + networks: + - ai-assistant-network + + recommend-service: + build: ./backend/recommendation-service + container_name: ai-assistant-recommend + restart: always + ports: + - "8085:8085" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - REDIS_HOST=redis + - RABBITMQ_HOST=rabbitmq + - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-} + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_PORT=63912 + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_DATABASE=ai_assistant + depends_on: + - mysql + - redis + - rabbitmq + networks: + - ai-assistant-network + + generation-service: + build: ./backend/generation-service + container_name: ai-assistant-generation + restart: always + ports: + - "8086:8086" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - REDIS_HOST=redis + - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-} + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_PORT=63912 + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_DATABASE=ai_assistant + depends_on: + - redis + networks: + - ai-assistant-network + + kb-admin-service: + build: ./backend/kb-admin-service + container_name: ai-assistant-kbadmin + restart: always + ports: + - "8087:8087" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - REDIS_HOST=redis + depends_on: + - mysql + - redis + networks: + - ai-assistant-network + + analytics-service: + build: ./backend/analytics-service + container_name: ai-assistant-analytics + restart: always + ports: + - "8088:8088" + environment: + - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 + - SERVER_SERVLET_ENCODING_ENABLED=true + - SERVER_SERVLET_ENCODING_FORCE=true + - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com + - MYSQL_USERNAME=assistant_prod + - MYSQL_PASSWORD=U%$4Tu_C3+4 + - MYSQL_PORT=63912 + - REDIS_HOST=redis + depends_on: + - mysql + - redis + networks: + - ai-assistant-network + + # ---------------------- 前端服务 ---------------------- + admin: + build: ./frontend/admin + container_name: ai-assistant-admin + restart: always + ports: + - "5174:80" + depends_on: + - gateway + networks: + - ai-assistant-network + + sidebar: + build: ./frontend/sidebar + container_name: ai-assistant-sidebar + restart: always + ports: + - "5173:80" + depends_on: + - gateway + networks: + - ai-assistant-network + + # ---------------------- 统一入口 Nginx ---------------------- + nginx: + image: nginx:alpine + container_name: ai-assistant-nginx + restart: always + ports: + - "8089:80" + volumes: + - ./nginx.conf:/etc/nginx/conf.d/default.conf + depends_on: + - gateway + - admin + - sidebar + networks: + - ai-assistant-network + +# ---------------------- 数据卷 ---------------------- +volumes: + mysql_data: + redis_data: + rabbitmq_data: + +# ---------------------- 网络 ---------------------- +networks: + ai-assistant-network: + driver: bridge diff --git a/frontend/sidebar/src/components/ScriptRecommendStream.tsx b/frontend/sidebar/src/components/ScriptRecommendStream.tsx index 8a297af..02706fc 100644 --- a/frontend/sidebar/src/components/ScriptRecommendStream.tsx +++ b/frontend/sidebar/src/components/ScriptRecommendStream.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState, useCallback } from 'react' -import { Button, Toast, SpinLoading, Tag, Space } from 'antd-mobile' +import { Button, Toast, SpinLoading } from 'antd-mobile' interface StyleConfig { id: string @@ -31,8 +31,7 @@ const STYLES: StyleConfig[] = [ export default function ScriptRecommendStream({ userInfo, customerId: propCustomerId, chatContext }: Props) { const [loading, setLoading] = useState(true) const [generating, setGenerating] = useState(false) - const [customerMsg, setCustomerMsg] = useState('') - const [profileTags, setProfileTags] = useState([]) + const [, setProfileTags] = useState([]) const [utterances, setUtterances] = useState([]) const [error, setError] = useState('') const sseRef = useRef(null) @@ -123,7 +122,7 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom } } - // 构建 SSE URL:群聊传 roomid,单聊传 fromUser+toUser + // 构建 SSE URL:群聊传 roomid,单聊传 fromUser+toUser+staffName const params = new URLSearchParams() if (isGroupChat && chatId) { params.append('roomid', chatId) @@ -131,6 +130,9 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom params.append('fromUser', customerId) params.append('toUser', staffId) } + if (userInfo?.userName) { + params.append('staffName', userInfo.userName) + } const url = `/api/v1/generation/utterance-stream?${params.toString()}` console.log('SSE connect:', url) @@ -211,12 +213,20 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom const init = async () => { setLoading(true) try { - // 单聊获取最后一条消息用于展示(限定当前销售与学员的对话,避免串消息) - if (!isGroupChat && customerId && staffId) { - const res = await fetch(`/api/v1/conversations/last-message?customerId=${customerId}&staffId=${staffId}&corpId=${corpId}`) - const data = await res.json() - if (data.code === 0 && data.data?.content) { - setCustomerMsg(data.data.content) + // 单聊获取画像标签 + if (!isGroupChat && customerId) { + const profileRes = await fetch(`/api/v1/intent/profile/${encodeURIComponent(customerId)}?corpId=${corpId}`) + const profileData = await profileRes.json() + if (profileData.code === 0 && profileData.data) { + const p = profileData.data + const tags: string[] = [] + if (p.currentOccupation) tags.push(p.currentOccupation) + if (p.studentType) tags.push(p.studentType) + if (p.skillLevel) tags.push(p.skillLevel) + if (p.intentLevel) tags.push(p.intentLevel) + if (p.concernFocus) tags.push(p.concernFocus) + if (p.decisionStage) tags.push(p.decisionStage) + setProfileTags(tags) } } } catch (e) { @@ -247,30 +257,7 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom return (
- {/* 学员/群聊消息 + 标签 */} -
-
- 💬 - {isGroupChat ? '群聊消息' : '学员消息'}: - - {customerMsg || '暂无'} -
- {profileTags.length > 0 && ( - - {profileTags.map(tag => ( - {tag} - ))} - - )} -
- - {/* 生成中状态 */} + {/* 生成中状态 --> {generating && utterances.every(u => !u.isComplete) && (