From 5606a5677721c22ea8a4d07111b9bf396261626f Mon Sep 17 00:00:00 2001 From: jiao Date: Thu, 11 Jun 2026 13:23:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=A4=9A=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=E8=AF=9D=E6=9C=AF=E6=B5=81=E5=BC=8F=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增多风格话术生成SSE接口,支持亲和/专业/促单风格话术流式输出 2. 重构对话查询逻辑,增加staffId参数避免消息串扰,新增自动推断员工身份接口 3. 优化前端侧边栏,适配企微聊天上下文,新增员工信息展示和登录流程 4. 补充相关Mapper和Service代码,完善归档消息查询能力 5. 更新部署文档,优化前端缓存处理 --- AGENTS.md | 40 ++- .../controller/ConversationController.java | 4 +- .../mapper/ArchiveMessageMapper.java | 9 +- .../ConversationServiceApplication.class | Bin 838 -> 838 bytes .../controller/ConversationController.class | Bin 6345 -> 6540 bytes .../conversation/entity/ArchiveMessage.class | Bin 10768 -> 9791 bytes .../conversation/entity/Conversation.class | Bin 14006 -> 12872 bytes .../entity/ConversationTurn.class | Bin 9586 -> 8702 bytes .../mapper/ArchiveMessageMapper.class | Bin 939 -> 1005 bytes .../mapper/ConversationMapper.class | Bin 421 -> 421 bytes .../mapper/ConversationTurnMapper.class | Bin 433 -> 433 bytes ...versationManager$ArchiveMessageEvent.class | Bin 2452 -> 2433 bytes .../ConversationManager$ContextMessage.class | Bin 1362 -> 1343 bytes .../service/ConversationManager.class | Bin 16210 -> 15760 bytes .../conversation-service-1.0.0-SNAPSHOT.jar | Bin 40809099 -> 40809216 bytes ...sation-service-1.0.0-SNAPSHOT.jar.original | Bin 27261 -> 27378 bytes .../ConversationControllerTest.class | Bin 7010 -> 6890 bytes .../controller/GenerationController.java | 204 +++++++++++- .../mapper/ArchiveMessageMapper.java | 22 ++ .../generation/service/PromptEngine.java | 24 ++ .../generation/client/BailianClient.class | Bin 7333 -> 6990 bytes .../generation/client/DoubaoClient.class | Bin 6438 -> 6069 bytes .../generation/client/HunyuanClient.class | Bin 5740 -> 5363 bytes .../artedu/generation/client/LLMClient.class | Bin 641 -> 641 bytes .../generation/client/LLMClientFactory.class | Bin 2991 -> 2973 bytes .../controller/GenerationController.class | Bin 9036 -> 16554 bytes .../controller/LlmModelController.class | Bin 7776 -> 7403 bytes .../generation/service/LlmModelService.class | Bin 7497 -> 7444 bytes .../generation/service/PromptEngine.class | Bin 6268 -> 6851 bytes .../generation/service/QianwenClient.class | Bin 6835 -> 6754 bytes .../generation-service-1.0.0-SNAPSHOT.jar | Bin 40375226 -> 40382298 bytes ...ration-service-1.0.0-SNAPSHOT.jar.original | Bin 40779 -> 47751 bytes .../compile/default-compile/createdFiles.lst | 2 + .../compile/default-compile/inputFiles.lst | 2 + frontend/sidebar/src/App.tsx | 301 ++++++++++++------ .../src/components/ScriptRecommendStream.tsx | 175 ++++------ 36 files changed, 562 insertions(+), 221 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c7f6389..a40cd63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,17 +20,36 @@ # 1. 本地构建 cd frontend/sidebar && npm run build -# 2. 同步到服务器 +# 2. 同步到服务器(注意带 JS hash 的文件名会变化) scp -r -o StrictHostKeyChecking=no -i root.pem frontend/sidebar/dist/* root@8.133.162.25:/www/wwwroot/deploy-package/frontend/sidebar/dist/ -# 3. SSH 登录服务器,重新构建镜像并重启容器 +# 3. SSH 登录服务器,更新 index.html 缓存戳并重启容器 ssh -o StrictHostKeyChecking=no -i root.pem root@8.133.162.25 << 'EOF' -cd /www/wwwroot/deploy-package/frontend/sidebar -docker build -t deploy-package-sidebar . -docker stop ai-assistant-sidebar -docker rm ai-assistant-sidebar -cd /www/wwwroot/deploy-package -docker-compose up -d sidebar +cd /www/wwwroot/deploy-package/frontend/sidebar/dist +# 更新 index.html 中的 JS/CSS 引用,带上版本戳防缓存 +JS_FILE=$(ls assets/index-*.js | head -1) +CSS_FILE=$(ls assets/index-*.css | head -1) +cat > index.html << HTML + + + + + + + AI坐席助手 + + + + + +
+ + +HTML +# 复制到容器并重启 +docker cp . ai-assistant-sidebar:/usr/share/nginx/html/ +docker exec ai-assistant-sidebar nginx -s reload +docker restart ai-assistant-nginx EOF ``` @@ -92,9 +111,12 @@ cd backend/auth-service && mvn clean package -DskipTests scp -o StrictHostKeyChecking=no -i root.pem target/*.jar root@8.133.162.25:/www/wwwroot/deploy-package/backend/auth-service/ # 3. SSH 登录服务器,重启对应容器 +# ⚠️ 注意:Dockerfile 中 COPY 的是 app.jar,必须先把新 jar 复制为 app.jar ssh -o StrictHostKeyChecking=no -i root.pem root@8.133.162.25 << 'EOF' +cd /www/wwwroot/deploy-package/backend/auth-service +cp auth-service-*.jar app.jar cd /www/wwwroot/deploy-package -docker-compose up -d --build auth-service +docker-compose up -d --build --no-cache auth-service EOF ``` diff --git a/backend/conversation-service/src/main/java/com/artedu/conversation/controller/ConversationController.java b/backend/conversation-service/src/main/java/com/artedu/conversation/controller/ConversationController.java index b8ee360..03889f3 100644 --- a/backend/conversation-service/src/main/java/com/artedu/conversation/controller/ConversationController.java +++ b/backend/conversation-service/src/main/java/com/artedu/conversation/controller/ConversationController.java @@ -65,15 +65,17 @@ public class ConversationController { @GetMapping("/last-message") public Result> getLastMessage( @NotBlank(message = "customerId不能为空") @RequestParam("customerId") String customerId, + @NotBlank(message = "staffId不能为空") @RequestParam("staffId") String staffId, @NotBlank(message = "corpId不能为空") @RequestParam("corpId") String corpId) { - ArchiveMessage message = archiveMessageMapper.selectLastMessage(customerId, corpId); + ArchiveMessage message = archiveMessageMapper.selectLastMessage(customerId, staffId, corpId); Map result = new HashMap<>(); if (message != null) { result.put("content", message.getContent()); result.put("msgTime", message.getMsgtime()); result.put("msgType", message.getMsgtype()); result.put("fromUser", message.getFromUser()); + result.put("fromRole", message.getFromRole()); } return Result.success(result); } diff --git a/backend/conversation-service/src/main/java/com/artedu/conversation/mapper/ArchiveMessageMapper.java b/backend/conversation-service/src/main/java/com/artedu/conversation/mapper/ArchiveMessageMapper.java index e192ba3..e5132b9 100644 --- a/backend/conversation-service/src/main/java/com/artedu/conversation/mapper/ArchiveMessageMapper.java +++ b/backend/conversation-service/src/main/java/com/artedu/conversation/mapper/ArchiveMessageMapper.java @@ -9,11 +9,18 @@ import org.apache.ibatis.annotations.Select; @Mapper public interface ArchiveMessageMapper extends BaseMapper { + /** + * 获取指定学员在指定对话中的最后一条消息 + * 通过 staffId 限定只查当前销售与学员的对话,避免学员同时和多个销售聊天时串消息 + */ @Select("SELECT * FROM archive_messages " + - "WHERE (from_user = #{userId} OR to_user LIKE CONCAT('%', #{userId}, '%')) " + + "WHERE from_user = #{userId} " + + "AND to_user LIKE CONCAT('%', #{staffId}, '%') " + "AND corp_id = #{corpId} " + + "AND from_role = 'EXTERNAL' " + "AND content IS NOT NULL AND content != '' " + "ORDER BY msgtime DESC LIMIT 1") ArchiveMessage selectLastMessage(@Param("userId") String userId, + @Param("staffId") String staffId, @Param("corpId") String corpId); } diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/ConversationServiceApplication.class b/backend/conversation-service/target/classes/com/artedu/conversation/ConversationServiceApplication.class index 5491d70fb7fc98f67c6e8ad3a33c712325c8b45f..b19dcb8364a27ce319211f69779a5754042e2049 100644 GIT binary patch delta 204 zcmX@cc8pE@)W2Q(7#J8#805Jam>8JZ8CZB2SQ*$RdMW|g920phdAS(47`WLPcz76i z8TcmiGU`sYXUt=9&QD35SkpOq730TxcA!oWU}9hd=>?MfK%PF3W(3l#TH6^IH-e=F zfFwwo0cfNkkmP|VU=U&u2J$!=L>NSYA|TCXV8a*~IE2`>b}(>;BlLru$pCZ;I|Coo JjLA~WIsj5!6|?{V delta 207 zcmYL>Jqp555QJy*_mXF#CMtrBXc-hcLD0%WcmZwo2!fsEBj*sYQYf$&Pxin zm|=Im*)k}D-l|wrZ478MsBsO@6K)ZjXz^mp^XeH8W|BY9-u(NT N3CJtb^^aoUPJRq<7BBz+ diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/controller/ConversationController.class b/backend/conversation-service/target/classes/com/artedu/conversation/controller/ConversationController.class index 50a5deed7eabb10a757030e2e3b543cefee0c554..4aa68631995b5fea680e3ac8bd785a00cf1aefa0 100644 GIT binary patch literal 6540 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 diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/entity/ArchiveMessage.class b/backend/conversation-service/target/classes/com/artedu/conversation/entity/ArchiveMessage.class index 0d9911e52697a02c143173797aaa4318a2beaa88..c566e27ad46f2c31daba3148be41ce6484079c41 100644 GIT binary patch literal 9791 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 literal 10768 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 YcR2Wq*_$~2%{Pwy7FkM^h!C0o0Sk#llmGw# diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/entity/Conversation.class b/backend/conversation-service/target/classes/com/artedu/conversation/entity/Conversation.class index 730a87f5c78dc0c19f9d3de84bf274851e48ad37..9de86b9d197995500728585f00213d2f9aea9787 100644 GIT binary patch literal 12872 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 XC`Vk4&wBAz)bJ~DagBJpu*v!#1yO!R diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/entity/ConversationTurn.class b/backend/conversation-service/target/classes/com/artedu/conversation/entity/ConversationTurn.class index 9cdba5567c2e68b0954771f251790ed753e2c515..b7cb2e6165db9ca44ef8dc0faf400c97a5b9aadd 100644 GIT binary patch literal 8702 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 YeDqIwCis_pZyLkcAH)B@OZ51E0i6+@IsgCw literal 9586 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 I{!03P0C)87t^fc4 diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ArchiveMessageMapper.class b/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ArchiveMessageMapper.class index a26a95ff59088099beb8f6a89cb124c47f6e416e..8d43de85f7b6b2a6644c0a43442d49755b61304a 100644 GIT binary patch delta 185 zcmZ3@{+6BV)W2Q(7#J8#7{n)X&0k%140xr-V25ljIDQ;>m~K?vw7CI(>!5il*vzzL+; JfJ(#|7y#1(DSZF{ delta 147 zcmaFMzM7ru)W2Q(7#J9A8N?=X&0-4Gn7CsxJjH-+plN%YunEZn#&tjBOD=khf z@=U4KQBYS^*VI&S^m9>2&Mzv6&rDIURZy-5v4PT)zcVgiXM=DiYcp$4Ud7ZrS&LC& oav8H3lQ`4lbdOW@BJv5M^Kh03=!^e*gdg diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ConversationMapper.class b/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ConversationMapper.class index ce17d442793a6b36922a63482622ad5171102a4b..49e1f975f7e6b554560566321ee7ed2896229ad5 100644 GIT binary patch delta 26 icmZ3=yp);a)W2Q(7#J8#CUUe*+}b#?Pkpi(V?F?k`wB7u delta 27 jcmZ3=yp);a)W2Q(7#J9ACvvn+=4Vu&*w;AOj4>YojY$cZ diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ConversationTurnMapper.class b/backend/conversation-service/target/classes/com/artedu/conversation/mapper/ConversationTurnMapper.class index c66c71fb4607792e73e635d4ad42e6bc1b538b91..12c9721c383c95c8ae3545317a85970a5ef20d35 100644 GIT binary patch delta 26 icmdnUypfsX)W2Q(7#J8#CUSI5+}k>FlJ;aL#(V&fHwtb5 delta 27 jcmdnUypfsX)W2Q(7#J9ACvtR67H8C+IH`5A6JtIAkf{mO diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager$ArchiveMessageEvent.class b/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager$ArchiveMessageEvent.class index 339ac83bd61099946d476bc2b34c6415d543f151..c3f38fa741eababa88174671f4743de4208b23f9 100644 GIT binary patch literal 2433 zcmb`JSyK~15P*AtoGcO&2=^%}hq5Xt3V2`y3n*h10oP*kUF!fmRYhy(R_P! z#_fPXbj=Y?@RULO%Y*|fZXA6HD<6;MDFez<#zW`Bb>2(99;YR4^lsU$&3A^ATG=q+udyF&P1xN5VmGTky_N}85TG9pA zwn~SV=a3#6JAzZkXOJ)ar-&jzyvT!{T2y;yW}5)RxT1&O@aUWQ+hO()ql=s5WXxrx z8{Y=n_v(RXVBk(oYA4Qah6!NMiIYuQI7fN7oU3Vc+P+Lj?X>!L676^u$_ayHjXG3t z28)a`Q=7R|!Zk8K=_>&UGgRM5dSsddARXxX$vwB?*?iL>)&Wg5FHpHM7~HLh0QWg` zd~Q>QqsEgGyG=^$ zFDbF5q{J?g5?e<~Y!@l9MNnn{n;W7y-bBqr$xue-z61Lr-EQGX)4(DygWpEY0cK$i zH3su=8^^1Qze4P@vN)w(dSg? z7UHfRqDzIyw1A)l5X3z#L`sF|)k56YL!?xQz7`OaeS%ojLS$5ktQKNP50OzJ`ddIy z=@G;OEkss@7|=pI)I(%dh`|;RRQCk2tc4gZlc&vpOQ6WaO z5G#6!5fx&z1q5|GL9A*a##M+hEyS80VqAq7ZvjEi4M9ACr#Pzb#FPp#p@nz`&%?!6 s-iav{VzLDUy><8x3D)JS^a64yJJIqIe;e;%6SmNhL?sTdU>g#D0Q|{+hyVZp literal 2452 zcmb`JSyK~15XXB0AtWpU3HObnhC>zw1-TR>M=+qp_2ApG3}GRerFNI7-%6{rtn$GR z;D@s8o?Re}lNZZ}Y|r%mXZp9@JyZGh`^QfJScXCZVhlEHw`^Koz>hCY+Z7e=`Bvb# z!t}XUacpkps+`-Fu!`IpUG?l!r^2_n@8f)}!bOmPdIqg$R>d+)mMEHUkIuLqFo>7^ zqI1k3UATF-7kG{+E;4AaUGE}~Z<9W5g;8nTc;dO`0}LMxcij?4Y2b#w1a267x@fMBl0v_cz$mVzVr&Sm+Cd;8WA z#Yz`k+bSJeoZpb2&BQ58rwW9fSqzT{dx67! z?2Tqe`VPdoa6gDTJh2SRlox_~xsv7Mc}YN?!OTB&BZG|Q0Aq{oa6i~|{QyQVQxq}@ zG3q`X#i*I2#eR_%8$wzvxwKeTX|Z77jbku;L>J!96Ekss@ z=+r`t>mjl#L{|+6YCVFO&_YbA5ZzjcDLurb3ei&og8H5yOfAH;3el^Dc%p}xRw4Ro zK+vHhh#4)!tP0Vug?Ofim{lPLYCzD5Cx|&M#JmbIsD)V2L(HoXLp31ix*>=~Si+}z zPb{kt!&-z-IvAx3II&|QcBFkn^QO0OV?wh2A2@wfIK)?ou3DV#9age|;Y I-$>!+A7prX>i_@% diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager$ContextMessage.class b/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager$ContextMessage.class index 3f31c296e9218e5dfed9e77fe558d144965daae1..d8731ecec6035d5708a8664570f43f671269abf1 100644 GIT binary patch literal 1343 zcmbu7+iuf95QhIv(l{|r8qzeBGc5%Y_h3N_NPxH?2ni_xiB`GaxU1kQSxdGP@mL@= zLgIo4;Gqz+Yc~$T1@!=A$^hFzf$gHq_E2T}w4RREw&VOno0K%P0%~Y% z^^}HMXL=CBHC#_Br`TsOK2uN*DfYum>>Ie5BtN5QC0x|VDQNuYM>@M1N6f*B2^hnz zOo+-d#6c#+?QDq3GQ{Bp5NecaV0UQH%L6<^Z5iTmCd3x*W_4m=WN{~+TmYfQ!Kgpm Ry6^XJpR7rq5+0z9@-Mh;_R|0W literal 1362 zcmbu8TW`}a6vzK=x~40kD{WWG{We%H+aeejiQ5B36G-il*wptlvr48mkz%*vV}Y~^ zi3dIa9}02oWKCBx9^l13cK+x1=l^kj{`&p{z$>&(WEkGK!Ps^}$&V(s8~9Tm3P*Z@ zZwnqyJ(t^^h0UJhJ3}6B(4ORqbWxtn}C zkfG-fUoe<-mgGLE%&{0AdSeon7KGhE%W^M0-;=Kyj7GCh6+6KZFTg<2LID>T*1De0 z_b1~44-cI|bXwp#qrMY*Y8`K8_+{*P&ks|~bCK?R8|KL1BQRB}a8bf}c z3;8Y(5_iZ#gWj=$jB=EsjPg^@^$i!lYS|i%Ikm}}C{b)h z0$f6wRw}tdqe>o8@hr_%mE3C2DA<~z*4mz-p46%l2w0o`hAnF6Hi~Qq6=v(&ttdaP zO_emX0;+24jE)qzL1$jYwfN)&`vlc5B+4Mcewd1V9XI0S=cHDJa~e4TjV}F2XV)Ud z94r@uG2Bdrs4YY6rb66Gho~(>JU$0PwNf?gwr=#<2A-h44Dlot;x6u`IkC{P$cd-t bK&W=8SGJ*jzmEqr7c|x;n)I!u_cwn7rb+oe diff --git a/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager.class b/backend/conversation-service/target/classes/com/artedu/conversation/service/ConversationManager.class index 3e55fcc6c8c49aa6a2010a09ff6478536195d519..ad70d610224decac0866a5b253bc7777c0f47473 100644 GIT binary patch literal 15760 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 ZC_Q%J8K+FORduTE>uZ diff --git a/backend/conversation-service/target/conversation-service-1.0.0-SNAPSHOT.jar b/backend/conversation-service/target/conversation-service-1.0.0-SNAPSHOT.jar index 0fce136cc904ef0a8f22876b36f744e050b0b287..faf73ad87f2947a2188029b6c50da762ac2abf03 100644 GIT binary patch delta 8122 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 G1^f>k4-2LM literal 7010 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 STYLES = List.of( + Map.of("id", "friendly", "name", "亲和风格", "desc", "温暖亲切,像朋友聊天"), + Map.of("id", "professional", "name", "专业风格", "desc", "数据驱动,专业权威"), + Map.of("id", "urgent", "name", "促单风格", "desc", "制造紧迫感,促成决策") + ); + + /** + * 根据当前聊天对象自动推断员工身份 + * 前端不知道 toUser 时调用,后端从聊天记录中反推 + */ + @GetMapping("/whoami") + public Result> whoami( + @RequestParam(value = "fromUser", required = false) String fromUser, + @RequestParam(value = "roomid", required = false) String roomid) { + + String staffId = null; + String chatType = null; + + if (roomid != null && !roomid.isEmpty()) { + // 群聊:从群消息中找最近一条 INTERNAL 角色的发送者 + chatType = "group"; + List msgs = archiveMessageMapper.selectGroupChatMessages( + roomid, get7DaysAgoStartTime(), getTodayEndTime()); + if (msgs != null && !msgs.isEmpty()) { + for (ArchiveMessage msg : msgs) { + if ("INTERNAL".equals(msg.getFromRole())) { + staffId = msg.getFromUser(); + break; + } + } + } + } else if (fromUser != null && !fromUser.isEmpty()) { + // 单聊:查该客户最近参与的所有消息,推断员工 + chatType = "single"; + List msgs = archiveMessageMapper.selectMessagesByFromUser( + fromUser, get7DaysAgoStartTime(), getTodayEndTime()); + if (msgs != null && !msgs.isEmpty()) { + // 取最近一条,fromUser 是客户则 from_user=客户/to_user=员工 或 from_user=员工/to_user=客户 + ArchiveMessage msg = msgs.get(0); + if (fromUser.equals(msg.getFromUser())) { + // 客户发的消息,to_user 里的是员工ID(JSON数组) + staffId = msg.getToUser(); + } else { + // 员工发的消息,from_user 就是员工ID + staffId = msg.getFromUser(); + } + // 清理 JSON 数组格式 ["userId"] + if (staffId != null) { + staffId = staffId.replaceAll("\\[|\\]|\"", "").trim(); + } + } + } + + if (staffId == null || staffId.isEmpty()) { + return Result.fail("未找到聊天记录,无法推断员工身份"); + } + + Map result = new HashMap<>(); + result.put("userId", staffId); + result.put("chatType", chatType); + result.put("fromUser", fromUser); + result.put("roomid", roomid); + return Result.success(result); + } + @PostMapping("/utterance") public Result> generateUtterance( @RequestParam(value = "fromUser", required = false) String fromUser, @@ -62,18 +135,25 @@ public class GenerationController { List messages; boolean isGroupChat = roomid != null && !roomid.isEmpty(); - long startTime = getTodayStartTime(); + // 查最近 7 天,避免今天没聊天就找不到记录 + long startTime = get7DaysAgoStartTime(); long endTime = getTodayEndTime(); if (isGroupChat) { messages = archiveMessageMapper.selectGroupChatMessages(roomid, startTime, endTime); } else { - if (fromUser == null || fromUser.isEmpty() || toUser == null || toUser.isEmpty()) { - log.warn("单聊模式需要fromUser和toUser参数"); + if (fromUser == null || fromUser.isEmpty()) { + log.warn("单聊模式需要fromUser参数"); return null; } - toUser = "[\""+toUser+"\"]"; - messages = archiveMessageMapper.selectSingleChatMessages(fromUser, toUser, startTime, endTime); + // toUser 为空或无效时,用兜底查询(根据 fromUser 查所有相关记录) + if (toUser == null || toUser.isEmpty() || "staff_001".equals(toUser)) { + log.warn("toUser无效,使用兜底查询, fromUser={}, toUser={}", fromUser, toUser); + messages = archiveMessageMapper.selectMessagesByFromUser(fromUser, startTime, endTime); + } else { + toUser = "[\""+toUser+"\"]"; + messages = archiveMessageMapper.selectSingleChatMessages(fromUser, toUser, startTime, endTime); + } } if (messages == null || messages.isEmpty()) { @@ -95,6 +175,120 @@ public class GenerationController { return java.time.LocalDate.now().plusDays(1).atStartOfDay(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli() - 1; } + private long get7DaysAgoStartTime() { + return java.time.LocalDate.now().minusDays(7).atStartOfDay(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 流式生成多风格话术(SSE) + * 页面打开即自动推荐 3 条不同风格话术 + */ + @GetMapping(value = "/utterance-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter streamUtterance( + @RequestParam("fromUser") String fromUser, + @RequestParam("toUser") String toUser, + @RequestParam(value = "roomid", required = false) String roomid) { + + SseEmitter emitter = new SseEmitter(120000L); + + sseExecutor.execute(() -> { + try { + Map startEvent = new HashMap<>(); + startEvent.put("type", "start"); + startEvent.put("styles", STYLES); + emitter.send(SseEmitter.event().name("start").data(startEvent)); + + String chatContext = buildChatContext(fromUser, toUser, roomid); + if (chatContext == null || chatContext.isEmpty()) { + Map err = new HashMap<>(); + err.put("type", "error"); + err.put("message", "未找到聊天记录"); + emitter.send(SseEmitter.event().name("error").data(err)); + emitter.complete(); + return; + } + + String systemPrompt = promptEngine.buildSystemPrompt(chatContext); + String userPrompt = promptEngine.buildMultiStyleUserPrompt(); + + long startTime = System.currentTimeMillis(); + String generated = qianwenClient.generate(systemPrompt, userPrompt, 1200); + log.info("多风格话术生成完成, elapsed={}ms", System.currentTimeMillis() - startTime); + + List utterances = parseMultiStyle(generated); + if (utterances.size() < 3) { + while (utterances.size() < 3) { + utterances.add(generated != null ? generated : "生成失败,请稍后重试"); + } + } + + for (int i = 0; i < Math.min(3, utterances.size()); i++) { + String text = utterances.get(i); + String styleId = STYLES.get(i).get("id"); + + Map itemStart = new HashMap<>(); + itemStart.put("type", "item-start"); + itemStart.put("styleId", styleId); + itemStart.put("index", i); + emitter.send(SseEmitter.event().name("item-start").data(itemStart)); + + for (int j = 0; j < text.length(); j++) { + String ch = text.substring(j, j + 1); + Map chunk = new HashMap<>(); + chunk.put("type", "chunk"); + chunk.put("styleId", styleId); + chunk.put("text", ch); + chunk.put("index", i); + emitter.send(SseEmitter.event().name("chunk").data(chunk)); + Thread.sleep(25); + } + + Map complete = new HashMap<>(); + complete.put("type", "complete"); + complete.put("styleId", styleId); + complete.put("fullText", text); + complete.put("index", i); + emitter.send(SseEmitter.event().name("complete").data(complete)); + } + + Map done = new HashMap<>(); + done.put("type", "done"); + done.put("model", qianwenClient.getCurrentModel() != null + ? qianwenClient.getCurrentModel().getModelName() : "default"); + emitter.send(SseEmitter.event().name("done").data(done)); + emitter.complete(); + + } catch (Exception e) { + log.error("流式生成失败", e); + try { + Map error = new HashMap<>(); + error.put("type", "error"); + error.put("message", e.getMessage()); + emitter.send(SseEmitter.event().name("error").data(error)); + } catch (IOException ignored) {} + emitter.completeWithError(e); + } + }); + + return emitter; + } + + /** + * 解析多风格话术,按 "|||" 分隔 + */ + private List parseMultiStyle(String text) { + List result = new ArrayList<>(); + if (text == null || text.isEmpty()) return result; + String[] parts = text.split("\\|\\|\\|"); + for (String part : parts) { + String trimmed = part.trim(); + if (!trimmed.isEmpty() && trimmed.length() > 5) { + result.add(trimmed); + } + } + return result; + } + @PostMapping("/summary") public Result> generateSummary( @NotBlank(message = "context不能为空") @RequestParam("context") String context) { diff --git a/backend/generation-service/src/main/java/com/artedu/generation/mapper/ArchiveMessageMapper.java b/backend/generation-service/src/main/java/com/artedu/generation/mapper/ArchiveMessageMapper.java index 18f15c2..28ad6c9 100644 --- a/backend/generation-service/src/main/java/com/artedu/generation/mapper/ArchiveMessageMapper.java +++ b/backend/generation-service/src/main/java/com/artedu/generation/mapper/ArchiveMessageMapper.java @@ -36,4 +36,26 @@ public interface ArchiveMessageMapper extends BaseMapper { List selectGroupChatMessages(@Param("roomid") String roomid, @Param("startTime") Long startTime, @Param("endTime") Long endTime); + + /** + * 根据 fromUser 查询该用户参与的所有单聊记录(不限制 toUser,用于 toUser 未知时兜底) + */ + @Select("SELECT msgtime, created_at, from_user, to_user, from_role, content FROM archive_messages " + + "WHERE (from_user = #{fromUser} OR to_user = #{fromUser}) " + + "AND msgtime >= #{startTime} AND msgtime < #{endTime} AND msgtype='text' " + + "AND content IS NOT NULL AND content != '' " + + "ORDER BY msgtime DESC LIMIT 100") + List selectMessagesByFromUser(@Param("fromUser") String fromUser, + @Param("startTime") Long startTime, + @Param("endTime") Long endTime); + + /** + * 根据 fromUser 查询最近一条消息的 to_user(推断员工身份) + * to_user 格式为 JSON 数组 ["userId"] + */ + @Select("SELECT to_user FROM archive_messages " + + "WHERE (from_user = #{fromUser} OR to_user LIKE CONCAT('%', #{fromUser}, '%')) " + + "AND msgtype='text' AND content IS NOT NULL AND content != '' " + + "ORDER BY msgtime DESC LIMIT 1") + String selectRecentToUserByFromUser(@Param("fromUser") String fromUser); } \ No newline at end of file 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 92bd109..ecdb384 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 @@ -129,6 +129,30 @@ public class PromptEngine { return sb.toString(); } + /** + * 多风格话术生成的用户提示词 + * 要求 LLM 输出 3 条不同风格话术,用 ||| 分隔 + */ + public String buildMultiStyleUserPrompt() { + StringBuilder sb = new StringBuilder(); + sb.append("请根据上述对话历史,生成 3 条不同风格的推荐回复话术。\n\n"); + sb.append("风格要求(严格按顺序输出):\n"); + sb.append("第1条 - 亲和风格:温暖亲切,像朋友聊天,拉近距离\n"); + sb.append("第2条 - 专业风格:用数据、案例、专业分析增强说服力\n"); + sb.append("第3条 - 促单风格:制造紧迫感,强调限时优惠或名额有限\n\n"); + sb.append("输出要求(必须遵守):\n"); + sb.append("- 每条话术 80-150 字,简洁自然\n"); + sb.append("- 话术之间用「|||」分隔,不要加序号、标题或任何解释\n"); + sb.append("- 直接输出话术内容,不要有开场白、总结、备注\n\n"); + sb.append("输出格式示例:\n"); + sb.append("亲和风格的话术内容...\n"); + sb.append("|||\n"); + sb.append("专业风格的话术内容...\n"); + sb.append("|||\n"); + sb.append("促单风格的话术内容..."); + return sb.toString(); + } + public String buildSummaryPrompt(String context) { return "请对以下对话进行简要总结(50字以内),提炼学员核心需求和当前阶段:\n\n" + context; } diff --git a/backend/generation-service/target/classes/com/artedu/generation/client/BailianClient.class b/backend/generation-service/target/classes/com/artedu/generation/client/BailianClient.class index ec3b8fd4ee481cf421ca2c715a6a56ae7a34c819..ad5336d019f9524b72ca6e6e21320e09e51432a4 100644 GIT binary patch literal 6990 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 Q$(-ZMq^K6Bis^{`7p<{9 diff --git a/backend/generation-service/target/classes/com/artedu/generation/client/DoubaoClient.class b/backend/generation-service/target/classes/com/artedu/generation/client/DoubaoClient.class index b4858b7a1f39ba57f5a05d3c1be3f58aced35a38..9313a9a8bbaf95bc71359079b8cdd9d726fe2323 100644 GIT binary patch literal 6069 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 AfdBvi literal 6438 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 diff --git a/backend/generation-service/target/classes/com/artedu/generation/client/HunyuanClient.class b/backend/generation-service/target/classes/com/artedu/generation/client/HunyuanClient.class index 562f5e34f86ada04dd588269418f4a3f6bc88b21..76bc3e351757256e435601090ce1b9921ce12f2e 100644 GIT binary patch literal 5363 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 B=NA9~ literal 5740 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 delta 29 kcmZo5cc1_lOO24QvvCPoIe$&QR-8`Ywj0D27u`~Uy| diff --git a/backend/generation-service/target/classes/com/artedu/generation/client/LLMClientFactory.class b/backend/generation-service/target/classes/com/artedu/generation/client/LLMClientFactory.class index fe3ef456f3bc8752d885c2483a75ee357cad5ad8..6976415fde11e2e1ec7368c02a394ca1e9e4707e 100644 GIT binary patch literal 2973 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 MDkyl9zj-+Q57U?$UH||9 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 760bcc293b79a70b0c565edcb5c1ba2b0bfeb8e5..b67cb923be0e0c9327b8f9eb39b2da9e218bb2c6 100644 GIT binary patch literal 16554 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 TUHrLQ82rZ4O7x4A7(o07-XZS} diff --git a/backend/generation-service/target/classes/com/artedu/generation/controller/LlmModelController.class b/backend/generation-service/target/classes/com/artedu/generation/controller/LlmModelController.class index 99e086753084675126b848c020ee1777f6683a35..ce732eac3d2618fc9423ab4a72f6505c77450956 100644 GIT binary patch literal 7403 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 A!T4!tN}GN4>ym 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 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 a5b39e038f2aeac1520b9b3e3d803d1a96f9eb67..4dd7362134d0123d3f5252e74221860cc1f7851e 100644 GIT binary patch delta 3183 zcmah~YfzNe8GaA9{aAJpRs>gqEEro6Rz<5O1cQko-XfY1LohZi3Q4etiJ~aryYmM^f}-8Kx~~BX7+i`?LF`1 zIqx^W=}%iT{`}L#G!gxRhRhT|fhG#FP%wosia3#XE^lK|Uh$_J4<0*FaJ+<3NP1y$ zVae-^0@o#dU?PQ4437+rQOsnbK!w8i-`L+36Im@3PRqC&@EVKc34tqCE@#Bd3awyd zUbDvG8y?Zx8ZnOHS%KS`omU3tvRM8@;2?|R^+7o-o_m5gOW@~&&$BiBNpK-s%RdS^ z$bQZTLo!(se-fgyWd0Y^_qfYxp$)W=PbrBf&6G-;O|->=V75Nze|E{~!s1UEnF`Nj zp8UMzOFe)i3T2bw#D;WMU&bwjb(-2;4S7OY#0C09Bav^a(40*`)fYqz1&osAE?<9{_RWRI zQ`MgFTR5cE*Z6xU)QKkFG*_!!6OX5A9#6I71hT%{d-rZCE^#;=o{4YOOU6A|*T(N? z?N`KPbrn29`nAqFwW-cmR;%{i!HiZ{gT(vBy1f09FjmNDAB=4_jE!^8c)N55#=Nb! zwafPr?VQ_Hru9~Prt9Y1WgdN#T3xAiH>)?g)u{;~zs?4=wgU!#!zc>|w-^Rz%GHL; ziw4!|QNO##J2K##8PqDS3kPxfe!2fzvvzgVGu5V*_h{8u)aC~N4V0$_^CCwl8MzYm zG)yceNu9aq@169Q{ZSpNUQEp?MoCVGHr#~UWtJVUY;vY<-Q-a3T@?iya%&@HzN)Xi z6{E2G1*82=JRYG0&%-+Z)e%HI=dLd;EuC{WAVPn8D^8)5K39L4THAwas7+(Yf!0&y zztIL)J(H83N0)sAH~m$$uy}^iE~mrWF`_lzG91>etCbhkp@)Vo)VZ@popP(46W(i& zgf;i1canpseO20n+alz%jH0ChNI{)ya(VkEkbbFv-!h6{T6gG61|hH6uwer%;7JA{ z5U{Vr_9c~l;r8D%TJ2dsP+V}(u2cC1JQkfLhi!ZCgA&E~(XfBkqtZ?ZZE@s1Vs}cw57R3 z3=Zk15d%D?CTd0$3YAa`U4j8doLXgE0dW|I}K0G+>MdN z_KI+VrG?ppX31s`(l?mxL1|$F6qzzh))dUR+9@OjTf$~3&K{<3SpgeqI4XvQ5xX)= z5q3piR_w|E1=~$&7JI0e4K-#%#cW8L6{pk1X^S|m=N2=siy7-Pd%?5hum|Jhj&@p! z^_^JCv75!z!j)#*n;0aEiMQmc?QMxhS_7$$JEG!QI^P+!UC(2q%*$dPpVDPLkH{5W z0TWVtN>{;zE}l{wSdh-Hfd%WV9V|p=9bhJ%b%H56>jDeK{}a6~W?DzzQ8(toT;!s! z=sKtcmljYDn3Z~QXf1`#(^?am<|*1lsn*qzZvf_LIesPE4Tjp@pqsM7^a;EYenqcG z_f|5wZvyCM5R9F|A>xfIouYLp)0XMrgEVOENMZBV1^RG3?+gYN(3{M2xce|%uphj zp+qo4iOgXru?CV8@`Dnuqx}i}S#FZ1qm0OHe}Ge>`#k5C{PJ`yu^P2dV~Wx%%QE5foy9L$0xl7M hp|-u_(`hIph3C|6gS)>`ZxE0#^C?} delta 2636 zcma);YfzL`7{~u-ukXIQEAT4Fh6v&%P*%E`3K%J=m=G!^VP!4whAYdyxcfrUZL!SM zO2kt}bg^tEKQv`m?CysenwmZ})5ktFOE%L?HGQaI=<=L%UeGRM!R-6|&pFR?&U2pg zJMZqtE2b_BfByS>9|2f{7yWSYPqb)(A0CF>J+b~+RU($`s%mcEV|LhlFsC?Ew5=~` z$9v38$^Ljc-kvbmCX<#Ov*T7W&0sVpte$qOyK1AEG*dC#?5ttXYC96~WZb@n!ChXl zgTYg8b(%WD$nj$q!(1!XRh3TMan+uxMyspKOl^pD*j8#Fgk0n?1iDOH^)oEyTXQbe z7-omyg^!=ismSxy%DHv8Q5Zr2bpBb+D*m%pGC?9(5~{#*I?{+&y1V<=Fo(UcR%Uz->^II-{a4)Av6E4`LI z%#C0jJH)pI%h)5lFIcyl5^L{^CpugDdU|51fh{SEN?{PEM?x6FJi?|Y)@{~X$&Q%a z8n<_oO53rdo#y?HfwTxctXQ73?@G_t24tGLYtCwx9StIblOb&ae{8e|H{yh7Z~PW z+?Bznwu1$9mTsyx!zJRXk@Zt6BZNl6PtO3vfd{EoL00?)4E7E}Z^C$;8ZOMCrw9S1Xqqyx1N}4K-(lL~^ zRvJsBS*9B0$}Cl;Qkmt-T&Bzw%3P())yk|=rdpX=W#(R^?6uO2VclzTTXXoQvzs$w zi=`?hCtpeq8?ccQ)?lLnn# z#&)qDs}4py<1iu~>7YkE)xlH9s~ks|w$+#!g|Cuag5xNT1f@$p&9Q?*MbnuiqKzXr zqRC+`qMd>_;;#-x0-`tI^aez)uR2W8H;L$wh?aGvo}Hp6e11OfI7%a4id-{_LK?q? zhFT-K=$c+qH+E4&oQH9{8a3LLbt>q_9KJQbgkGV0^H<6`9#M6fspBL%WgV$jFiE*Y z)o=$XfxslXNO`2%P0A}(oRm+hJ){J_ljtTT_?<+8RDk|}lINnM9ABb``hpo`a1W9s zLwJG~vq*)}OF@efn8IQ|il;zdkxk+Gd27i`VKzOL+DMAdb}v%ugegOh%&TB2Z9m;) z^xfe75KV3F%9b`yw8f!^rk*ADv7Pd5%}`P|N%)tl(3v6>I57F>i}6m%%0-@G+(pVw z%MHw6)j%U*x-AtmSkbxM?Nt6=VK0VRMnG2TKqgL95=6{7$9W1Rgj|t8PEjhx#l2FL z{wrX?e+4W=lS{xPp3{J3Bw>;{iG73!E0%ZenjF49G3irB!4B)rm%weTTt{5@~%_lJv#GxtRW=CE%7gV503%oQB!Z^ zha_PI%4K?UbV7$VzrO(rNmRjOf{v73d5|KXvjrmWQ diff --git a/backend/generation-service/target/classes/com/artedu/generation/service/QianwenClient.class b/backend/generation-service/target/classes/com/artedu/generation/service/QianwenClient.class index 7f7cf2c1c89cabd014bc2738598e1087bfee011d..84fa7e0f321cafb76b516dd3f2041ee562323114 100644 GIT binary patch delta 3150 zcmZWr3wRXO75?wO?(EF$X0wpc2_Q+RA;~5#VxVOcAUrIkBs>~YZ}?tjnC!RaqG&3W>|p+^8Tv9T%~aB{eGxZz<4Y>HkV4JV?>Sa@mICUc#|;Ax2` z~Y}>6niNL@AYyg?kel znl^>oQn8qs7LU4{*oVZM?zu`UKCELAJ|bp$sv0!3>1dY(#>C8|nT}fKs<^drfw>`? zNmv@Huv8LU#;~|nOyv_rrN(L0L^~f}q7u_;S(^?W*IGFHu>$A(ifqlB<`& zWtn|sWhh5?v~R7I+H59!6>O#Vo@koNZJFs_j&0&;Z{3(aDWXqe2gi*%`td1-Y7y29 zakuIfjcSY1hnsYK1~-c>>a4M!qkMBS*2YvienZrXr;-YGipSJ2&ALU$7jdh2OP$7U z6AfCevJ1PVs0YLvt(C|N@c>(1$?>I21!<+@$(WS#mvwvvUlseco&LS}I>$G3+=YD% zQ*1QLbiY`qw`lj^n;iG*_!hoRNh&=ZR@BP$if8n&vKRO1xF6pU+&5W!0N>;IzK$Q@ zhhnO4vRLh#L5hD+#{nD^clu_qhs9IAW^xVb7)DM6{4;4&4@-F+5zGCv*&|}NzgBC- zF}cr2I35!(`perC{D_p)*4BPz&%Rf7?mm6wrqjd2k;?5mR2;{MjuTSZs#Lbw+Z&CU z3Z7tqf|Im;sfB@OuU&p0rj*%M%$=A~lvp zD*lKUIbPE7GX5kcI4VT5qiNvfPO+Uea+1`1(yiF$sPnq4jd9XgW7|L=O9|EgC4Bj~e@54|Zv}eCgPuY+`4b+8l{DmwXte=Je{))fR z$YeXr2V*J)=j4kIBQUT2A(UrP5pf&t5p)>tP(u!tPDDJ0X9P13pe9)FISNOo({Sg| zz>vk%j!xI;%Z!drH-)J(hcUAwhdE9doKpsfkq+L;Xeh4bv9VJCv`ShC!wgcA-Zgc3fOshQB@JD z|KhFu)?hDDkr6`@S}2Q;MhM#pl*x*&4CS!eaH4?8a7nbZRYi1nm5sO2HRU6WVhZ6L z-lq5zbre&mfJvqNvTX0cL?x4$&LdpFG>t~NTFIAdjm+nO)SOf&sICRQf%>pgNb8Wd zS3ZCvM-zP{!BVNW!&pn&jmi=SyMpU;*xbLn?(@L*3cop&~j zz)$ZM3AQl*`hJ5K7xYn<8zPFK9KiN0K5Zz$&jvrA#TO1^SEu1Nlp)+6@e(67c!%K) z?s1aFv$!*&8fq3_JAk|Qqgk5!M{t!r9>bntd^e)i8`=;CBf8v?hl?p7;(!rj~nhRek{+A?X*RFnyP)Ay20D_=%RzNW8Agu1#xOzUT-&3 z`5wn)(%U<9wV$MWyO&g^llLqxkk5^3JdYGv9?ZibY$b~$jazV$Hb}v4Bp723QsBMl zWKQOyZgBx)n45W|R#<6KD`XXp7+Lla>xYZ^@@I_6o*_@C4TUKL#RfoD0RUMA0A%q( zTJLCDmD0-7*#hT9TnEmf(edPXmJVtx{|CaglcSGg7suX}g`Y36TVzJ-%4AN(sDXY8O$e)zT{MsUWYD%)g zbW_srNwOR^<#NhF8E}?J6~2+>u&H?A;O8-(z%z{|Ihal#=wha)g!crEE*c{QPjL?8 z83On#8&H1%;iQJ(uWiSY#u4}$kKt4nFHnQBC)*ENPMGOgLB$3Av*N|AD8nwgNp7Qk zza7&tV4uKxnpaJ`>SKPJS7ek|q`<3;j^uNBUN=&xJTdxc6SF^#5~GX6`wnXCU2(Ls wb8r?2me7Cl0YZ|$mt?1qKi;4=j6WPijl7W9dzu4vVv>@qOt5(Eu`$5^0FrLFasU7T delta 3286 zcmZ8j3w%@M75{&E-J6@6KGGMr6j~^hrfH2}K}iFX+6o9QNCoMtV`+OSfix+}4G*{3 zx#`AG9^L0Qhg9d>#BGk1qM_k6Hn-wr@2A75(+!>O;hc4Dh~W8dnlje*_r1?K|8vg& zoZDCG56{he_Ttf#02Z)f2^Iz)zl%*B7<6|_urcIq3~dSdBcW)Ie?{j;y~|**Mq)h- zp5?K4k3SJvU%%16Jl4~r#~TJt|hAjUTX1pSl{i zN}x#P{eNautVKJ2&05boc$saHXEknD@e!<}pl%JtqYOp-Eo*`5U87J~LMl2@%Xiy~ zWd=uIJl5OC_vD1@9C1C7j8OjFZAPeTQ%k7tmJnrFLhqFkGveWB4?k#Y&2=G&J`sed z(7TX3a>Hiewy4;OZQNyF!S3K4_BwerKCa>uxRdX-&*8CLf4K zUJMYW`jX_yb=7>fa|&;Fl&$EJaX;w_N9jVw7fCGR?z;7{cyEY~9-v?u`ZikaBSXER zZR?EKCOw*vv7h#Rp*ZEp(BlaS4>8Ojs%ev#7)IX`J=9I73I+w~9>Jp$zRECN-1BnD zNqPSozRs(qpgf2JDjvr-ctl!I_$>mkC~0hn#lv@)Pm``Hw~8NPl)B25Jj)|WrQ^r= zsf3^KeM%*1`5AuBPbl+{H{~$>D0{2^{ z@soKHf6-OUUgGb#s$Hw`vLM3?GXBIDsgqjI;WY`bG89~S@=%X&!5k4p-8^V$lX=U!OyCtEsVUgCxv~PDfHH$rWY9}h{V(@ z3ZymJ+o{JD=3+T2%VpG30u)%IgBZXXk$S+jS9^m zVHqW;K)*N!y`}~_F55_mgmhlb5lpW+h8gWgQ1ujMT~?7}V$LVj#iS^o)BtKm242*d z`lu^r^f86739rHCC6wcAP0G<^iEZE4(Mh2|I%QXfv^HVbNewJCgbh^$#r&Ibz0`|B_h z0aRfzW??0j#%fd(Cu^wvU1j24NYN&2ZP-BPc1%Gt zHqtu>Hj#8LEEloXCLt&xa-Q6!?+~J<`vKqpX%IHNS>J7%Z4@P%%~xBOM$CpxFdUkF zsHV0qh0R&`;llF%3KGmf^iDwZB0dh$Yl0OC^qOF;WV^zICd?_RYgzYqnL_oLu()gHW#W*I-CeTu*vgj&`CY$K$Ga4q)`G`}W zB>kjy0-bLhokBDd0kmDlG%bVaE;Nl}nnSaYmNVh{l(3g!t|$vo5-Vsl>DEs!X82|i zpR0Cccipf3RPZvI2u-<>7#=$;0?c3Xf^B=bN4bmY5dU!HWaW6nO8J>3V#;mV;-7xK8Fi9hgWgloNZJnmx?>sbG)M@ z!?(LL;mc-}j}Lz2L#JSDtKg}N*A2Qs%q!k~m<3CAy?r~`DFeI^#? zC}Q-9qw&9_%0e*{?e$?=iMCzkI}L~Dy&<3H{WLCFa03T8EWP$F+Cho@QOt|EPMY@2=O`wvI5{kgtFdRWDikvk)t43z*Zy*jhIVcik!GN-;OJD)YHHWKh#sN&yG% zC9C(5`dzf&O^tL9uEl^^i!~Wz6aECp{V7HjlTCkSpn&Bw53Ec7$2IXxxR!aAb&b9% c&i7Gm=Er(HJ5RB)umZAgVTIWbAu9qt06Ipmpa1{> 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 8079485526b6db28c10ed46d09b51f32a0f54929..5e5987dd08283ff82bc43af0c5d68c1e91a6bf3f 100644 GIT binary patch delta 30236 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 RIygGG`bUb|x{|;4{XZFl-x~k` delta 18873 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 z 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'loading') + const [authState, setAuthState] = useState<'loading' | 'authed' | 'needLogin' | 'error'>('loading') const [userInfo, setUserInfo] = useState(null) const [currentCustomerId, setCurrentCustomerId] = useState('') - + const [chatContext, setChatContext] = useState<{ chatType?: string; chatId?: string }>({}) useEffect(() => { - initWeCom() + initAuth() }, []) - const initWeCom = async () => { + useEffect(() => { + if (authState === 'authed') { + initWxConfig() + } + }, [authState]) + + const noCacheFetch = useCallback(async (url: string, options?: RequestInit) => { + const sep = url.includes('?') ? '&' : '?' + const nocacheUrl = `${url}${sep}_t=${Date.now()}` + return fetch(nocacheUrl, { + ...options, + headers: { + 'Cache-Control': 'no-cache, no-store, must-revalidate', + 'Pragma': 'no-cache', + ...options?.headers + } + }) + }, []) + + // ========== 认证流程 ========== + const initAuth = async () => { try { const urlParams = new URLSearchParams(window.location.search) const code = urlParams.get('code') + // 1. URL 中有 code → 移除并登录 if (code) { - const res = await fetch(`/api/v1/auth/login?code=${encodeURIComponent(code)}`, { method: 'POST' }) - const data = await res.json() - if (data.code === 0 && data.data) { - localStorage.setItem('staff_token', data.data.token) - setUserInfo(data.data) - setAuthState('authed') - } else { - setAuthState('error') - Toast.show({ content: '登录失败: ' + (data.message || '未知错误'), icon: 'fail' }) - } - } else { - const token = localStorage.getItem('staff_token') - if (token) { - const res = await fetch('/api/v1/auth/info', { - headers: { Authorization: `Bearer ${token}` } - }) - const data = await res.json() - if (data.code === 0 && data.data) { - setUserInfo(data.data) - setAuthState('authed') - } else { - redirectToOAuth() - } - } else { - redirectToOAuth() - } + const cleanUrl = window.location.pathname + window.location.hash + window.history.replaceState({}, document.title, cleanUrl) + + const ok = await tryCodeLogin(code) + if (ok) return + // login 失败 → 可能是 code 过期/已被使用,显示登录按钮让用户手动重试 + setAuthState('needLogin') + return } + + // 2. 无 code → 检查 localStorage 缓存 + const cachedUserId = localStorage.getItem('staff_user_id') + const cachedUserName = localStorage.getItem('staff_user_name') + const cachedToken = localStorage.getItem('staff_token') + if (cachedUserId && cachedToken) { + setUserInfo({ + userId: cachedUserId, + userName: cachedUserName || cachedUserId, + avatar: localStorage.getItem('staff_avatar') || '', + corpId: CORPID, + role: localStorage.getItem('staff_role') || 'SEAT' + }) + setAuthState('authed') + console.log('使用缓存员工信息:', cachedUserId) + return + } + + // 3. 无 code 无缓存 → 显示登录按钮(iframe 中自动跳转可能被拦截) + setAuthState('needLogin') + } catch (e) { + console.error('initAuth error:', e) setAuthState('error') - Toast.show({ content: '初始化失败', icon: 'fail' }) } } - const redirectToOAuth = () => { - setAuthState('authed') - setUserInfo({ - userId: 'staff_001', - userName: '测试顾问', - corpId: 'wwd483c2fba24ae30a', - role: 'SEAT' - }) + // 用 code 调后端 login 接口 + const tryCodeLogin = async (code: string): Promise => { + try { + const res = await noCacheFetch(`/api/v1/auth/login?code=${encodeURIComponent(code)}`, { method: 'POST' }) + const data = await res.json() + if (data.code === 0 && data.data) { + const info = data.data + localStorage.setItem('staff_token', info.token) + localStorage.setItem('staff_user_id', info.userId) + localStorage.setItem('staff_user_name', info.userName || '') + localStorage.setItem('staff_avatar', info.avatar || '') + localStorage.setItem('staff_role', info.role || 'SEAT') + setUserInfo(info) + setAuthState('authed') + console.log('OAuth 登录成功:', info.userId, info.userName) + return true + } + console.error('OAuth login failed:', data.message) + } catch (e) { + console.error('Code login error:', e) + } + return false } + // 跳转企微 OAuth 授权页 + const redirectToWeComOAuth = () => { + const oauthUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${CORPID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=snsapi_base&agentid=${AGENTID}&state=sidebar#wechat_redirect` + console.log('跳转企微 OAuth:', oauthUrl) + window.location.href = oauthUrl + } + + // ========== JS-SDK 初始化(认证完成后调用)========== const initWxConfig = async () => { const wx = (window as any).wx if (!wx || !wx.config) { - console.log('非企微环境,跳过JS-SDK初始化') + console.log('非企微环境,跳过 JS-SDK') return } - try { - const currentUrl = window.location.href.split('#')[0] + const currentUrl = window.location.href.split('#')[0] - // 1. 企业级 wx.config - const corpRes = await fetch(`/api/v1/auth/signature?url=${encodeURIComponent(currentUrl)}`) + try { + const corpRes = await noCacheFetch(`/api/v1/auth/signature?url=${encodeURIComponent(currentUrl)}`) const corpData = await corpRes.json() - if (corpData.code !== 0 || !corpData.data) { - console.error('获取JS-SDK企业签名失败') - return - } + if (corpData.code !== 0 || !corpData.data) return const cfg = corpData.data wx.config({ @@ -94,13 +137,9 @@ function App() { }) wx.ready(async () => { - console.log('JS-SDK wx.config 成功') - - // 2. 尝试应用级 agentConfig(获取客户联系权限) try { - const agentRes = await fetch(`/api/v1/auth/signature?type=agent&agentId=1000021&url=${encodeURIComponent(currentUrl)}`) + const agentRes = await noCacheFetch(`/api/v1/auth/signature?type=agent&agentId=${AGENTID}&url=${encodeURIComponent(currentUrl)}`) const agentData = await agentRes.json() - if (agentData.code === 0 && agentData.data) { const ac = agentData.data wx.agentConfig({ @@ -111,78 +150,140 @@ function App() { signature: ac.signature, jsApiList: ['sendChatMessage', 'getContext', 'getCurExternalContact'], success: () => { - console.log('✅ agentConfig 成功,已获取客户联系权限') - // agentConfig 成功后,获取当前客户ID + wx.invoke('getContext', {}, (ctx: any) => { + if (ctx.err_msg === 'getContext:ok') { + setChatContext({ chatType: ctx.chatType, chatId: ctx.chatId }) + if (ctx.chatType === 'single' && ctx.chatId) { + localStorage.setItem('current_customer_id', ctx.chatId) + setCurrentCustomerId(ctx.chatId) + } + } + }) wx.invoke('getCurExternalContact', {}, (res: any) => { if (res.err_msg === 'getCurExternalContact:ok' && res.userId) { - console.log('✅ 获取到客户ID:', res.userId) localStorage.setItem('current_customer_id', res.userId) setCurrentCustomerId(res.userId) - } else { - console.warn('getCurExternalContact 失败:', res.err_msg) - fallbackToCachedId() } }) }, - fail: (err: any) => { - console.warn('⚠️ agentConfig 失败(无客户联系权限):', err.err_msg || err) - fallbackToCachedId() - } + fail: (err: any) => console.warn('agentConfig fail:', err) }) - } else { - console.warn('⚠️ 获取应用签名失败:', agentData.message) - fallbackToCachedId() } } catch (e) { - console.warn('⚠️ agentConfig 流程异常:', e) - fallbackToCachedId() + console.error('agentConfig error:', e) } }) - wx.error((err: any) => { - console.error('JS-SDK wx.config 失败:', err) - fallbackToCachedId() - }) + wx.error((err: any) => console.error('wx.config error:', err)) } catch (e) { - console.error('初始化JS-SDK异常:', e) - fallbackToCachedId() + console.error('initWxConfig error:', e) } } - const fallbackToCachedId = () => { - const cachedId = localStorage.getItem('current_customer_id') - if (cachedId && cachedId !== '${userId}') { - setCurrentCustomerId(cachedId) - } - } - - useEffect(() => { - if (authState === 'authed') { - initWxConfig() - } - }, [authState]) - if (authState === 'loading') { return (
加载中...
-
正在连接企微
+
正在识别员工身份...
) } + if (authState === 'needLogin') { + return ( +
+
+
AI 坐席助手
+
请登录以获取员工身份
+ +
+ 登录后即可使用智能推荐和对话分析 +
+
+
+ ) + } + + if (authState === 'error') { + return ( +
+
+
⚠️ 登录失败
+
请关闭侧边栏后重新打开
+ +
+
+ ) + } + + // ========== 主界面(认证成功)========== return (
- - - - - - - - + {/* 顶部员工信息栏 */} +
+
+ {userInfo?.avatar ? ( + avatar + ) : ( +
+ {(userInfo?.userName || userInfo?.userId || '?').charAt(0)} +
+ )} +
+
+ {userInfo?.userName || userInfo?.userId || '未知员工'} +
+
+ {userInfo?.userId} +
+
+
+
+ AI 坐席助手 +
+
+ +
) } diff --git a/frontend/sidebar/src/components/ScriptRecommendStream.tsx b/frontend/sidebar/src/components/ScriptRecommendStream.tsx index 5782653..8b9f5ab 100644 --- a/frontend/sidebar/src/components/ScriptRecommendStream.tsx +++ b/frontend/sidebar/src/components/ScriptRecommendStream.tsx @@ -19,6 +19,7 @@ interface UtteranceItem { interface Props { userInfo?: any customerId?: string + chatContext?: { chatType?: string; chatId?: string } } const STYLES: StyleConfig[] = [ @@ -27,21 +28,24 @@ const STYLES: StyleConfig[] = [ { id: 'urgent', name: '促单风格', desc: '制造紧迫感,促成决策', color: '#fa8c16', bgColor: '#fff7e6' } ] -export default function ScriptRecommendStream({ userInfo, customerId: propCustomerId }: Props) { +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 [utterances, setUtterances] = useState([]) - const [progress, setProgress] = useState(0) const [error, setError] = useState('') const sseRef = useRef(null) - const sessionId = localStorage.getItem('current_session_id') || `session_${Date.now()}` - const customerId = propCustomerId || localStorage.getItem('current_customer_id') || 'wx_001' - const staffId = userInfo?.userId || 'staff_001' + const customerId = propCustomerId || localStorage.getItem('current_customer_id') || '' + const staffId = userInfo?.userId || '' const corpId = userInfo?.corpId || 'wwd483c2fba24ae30a' + const chatType = chatContext?.chatType + const chatId = chatContext?.chatId + const isGroupChat = chatType === 'group' + const isSingleChat = chatType === 'single' + const closeSse = useCallback(() => { if (sseRef.current) { sseRef.current.close() @@ -77,102 +81,68 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom const handleRegenerate = () => { closeSse() setUtterances([]) - setProgress(0) setError('') startGeneration() } + // 判断是否可以开始生成 + const canStartGeneration = useCallback(() => { + if (isGroupChat && chatId) return true + if (isSingleChat && customerId && staffId) return true + // 兼容:没有 chatContext 时(非企微/测试环境) + if (!chatType && customerId && staffId) return true + return false + }, [isGroupChat, isSingleChat, chatId, customerId, staffId, chatType]) + + // 核心:开始流式生成 const startGeneration = useCallback(async () => { - if (!customerMsg.trim()) { - setError('暂无学员消息') + if (!canStartGeneration()) { + setError('未获取到聊天信息') setLoading(false) return } setGenerating(true) setLoading(false) - setProgress(10) try { - const [profileRes, contextRes, recommendRes] = await Promise.all([ - fetch(`/api/v1/intent/profile/${encodeURIComponent(customerId)}?corpId=${corpId}`), - fetch(`/api/v1/conversations/${sessionId}/context`).catch(() => null), - fetch(`/api/v1/recommend/get?${new URLSearchParams({ - sessionId, customerId, staffId, corpId, - intentCode: 'INT-COURSE-01', - stage: 'STAGE-03', - studentType: '零基础', - message: customerMsg - }).toString()}`, { method: 'POST' }).catch(() => null) - ]) - - let customerProfileStr = '' - let tags: string[] = [] - const profileData = await profileRes.json() - if (profileData.code === 0 && profileData.data) { - const p = profileData.data - 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) } - customerProfileStr = [ - p.currentOccupation ? `身份/职业:${p.currentOccupation}` : '', - p.studentType ? `学员类型:${p.studentType}` : '', - p.skillLevel ? `基础水平:${p.skillLevel}` : '', - p.intentLevel ? `意向度:${p.intentLevel}(${p.intentScore != null ? Math.round(p.intentScore) : 0}分)` : '', - p.concernFocus ? `关注方向:${p.concernFocus}` : '', - p.decisionStage ? `决策阶段:${p.decisionStage}` : '' - ].filter(Boolean).join('\n') - } - setProfileTags(tags) - setProgress(30) - - let conversationContextStr = '' - if (contextRes) { - const contextData = await contextRes.json() - if (contextData.code === 0 && contextData.data?.messages) { - const msgs = contextData.data.messages as Array<{ role: string; content: string }> - conversationContextStr = msgs.slice(-3).map(m => { - const roleName = m.role === 'student' ? '学员' : '顾问' - return `${roleName}:${m.content}` - }).join('\n') + // 单聊才获取画像标签 + 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) } } - let referenceUtterancesStr = '' - if (recommendRes) { - const recData = await recommendRes.json() - if (recData.code === 0 && recData.data) { - const top3 = recData.data.slice(0, 3) - referenceUtterancesStr = top3.map((s: any, i: number) => `${i + 1}. "${s.contentText || s.content || s.title}"`).join('\n') - } + // 构建 SSE URL:群聊传 roomid,单聊传 fromUser+toUser + const params = new URLSearchParams() + if (isGroupChat && chatId) { + params.append('roomid', chatId) + } else if (customerId && staffId) { + params.append('fromUser', customerId) + params.append('toUser', staffId) } - setProgress(50) - - const params = new URLSearchParams({ - message: customerMsg, - intent: 'INT-COURSE-01', - stage: 'STAGE-03', - stageLabel: '方案呈现', - intentLabel: '课程咨询' - }) - if (customerProfileStr) params.append('customerProfile', customerProfileStr) - if (conversationContextStr) params.append('conversationContext', conversationContextStr) - if (referenceUtterancesStr) params.append('referenceUtterances', referenceUtterancesStr) const url = `/api/v1/generation/utterance-stream?${params.toString()}` + console.log('SSE connect:', url) const es = new EventSource(url) sseRef.current = es setUtterances(STYLES.map(s => ({ styleId: s.id, text: '', isComplete: false, isTyping: false }))) - // ===== 关键修复:用 addEventListener 接收命名事件 ===== es.addEventListener('start', (event: MessageEvent) => { try { const data = JSON.parse(event.data) - if (data.type === 'start') setProgress(60) + if (data.type === 'start') { /* 可处理 styles 信息 */ } } catch (e) { console.error('SSE start error:', e) } }) @@ -214,7 +184,6 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom const data = JSON.parse(event.data) if (data.type === 'done') { setGenerating(false) - setProgress(100) es.close() } } catch (e) { console.error('SSE done error:', e) } @@ -236,48 +205,49 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom setError('网络错误,请重试') setGenerating(false) } - }, [customerMsg, customerId, corpId, sessionId, staffId]) + }, [canStartGeneration, isGroupChat, customerId, staffId, chatId, corpId]) useEffect(() => { const init = async () => { setLoading(true) try { - const res = await fetch(`/api/v1/conversations/last-message?customerId=${customerId}&corpId=${corpId}`) - const data = await res.json() - if (data.code === 0 && data.data?.content) { - setCustomerMsg(data.data.content) - } else { - setLoading(false) - setError('暂无学员最新消息') + // 单聊获取最后一条消息用于展示(限定当前销售与学员的对话,避免串消息) + 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) + } } } catch (e) { - console.error('初始化失败:', e) + console.error('获取学员消息失败:', e) + } + + if (canStartGeneration()) { + startGeneration() + } else { setLoading(false) - setError('获取学员消息失败') + setError('未获取到聊天上下文') } } init() return () => { closeSse() } - }, [customerId, corpId, closeSse]) - - useEffect(() => { - if (customerMsg.trim() && !generating && utterances.length === 0) { - startGeneration() - } - }, [customerMsg, generating, utterances.length, startGeneration]) + }, [customerId, staffId, corpId, chatContext, isGroupChat, closeSse, startGeneration, canStartGeneration]) if (loading && !generating && utterances.length === 0) { return (
-
正在分析学员消息...
+
+ {isGroupChat ? '正在分析群聊消息...' : '正在分析学员消息...'} +
) } return (
- {/* 学员消息 + 标签 */} + {/* 学员/群聊消息 + 标签 */}
- 💬 学员消息: + 💬 + {isGroupChat ? '群聊消息' : '学员消息'}: + {customerMsg || '暂无'}
{profileTags.length > 0 && ( @@ -298,8 +270,8 @@ export default function ScriptRecommendStream({ userInfo, customerId: propCustom )}
- {/* 生成进度 */} - {generating && progress < 100 && ( + {/* 生成中状态 */} + {generating && utterances.every(u => !u.isComplete) && (
-
-
- {progress < 60 ? '正在分析学员画像和对话历史...' : 'AI 正在生成推荐话术...'} -
-
-
-
-
+
AI 正在生成推荐话术...
)}