2 lines
10 KiB
JavaScript
2 lines
10 KiB
JavaScript
import{d as a,r as s,o as e,b as t,e as l,f as n,w as o,i,E as c,j as u,l as r,m as d,F as f,n as _,k as m,g as p,t as v,s as h,C as g,q as b,y,z as w,x as k,u as C,S as A,R as x}from"./index-pnQqyMoS.js";import{_ as j}from"./config-doctor.TgARj_nM.js";import{F as S,a as E,r as I}from"./session.CQodznPl.js";import{b as D}from"./navigation.DVfJwOxJ.js";import{_ as O}from"./_plugin-vue_export-helper.BCo6x5W8.js";async function T(a){const s=(null==a?void 0:a.trim())?{title:a.trim().slice(0,100)}:{},e=await fetch(`${S}/learning-assistant/sessions`,{method:"POST",headers:E(),body:JSON.stringify(s)});if(!e.ok)throw new Error(await I(e));const t=await e.json();if("OK"!==t.code||!t.data)throw new Error(t.message||"新建会话失败");const l=function(a){const s=a.assistant_session_id||a.session_id||a.id;return"number"==typeof s||"string"==typeof s?s:""}(t.data);if(!l)throw new Error("新建会话返回缺少 assistant_session_id");return{...t.data,assistant_session_id:l}}function $(a,s){var e,t,l;const n=(null==(e=a.match(/^event:\s*(.+)$/m))?void 0:e[1])||"",o=a.split("\n").filter((a=>a.startsWith("data:"))).map((a=>a.replace(/^data:\s?/,"")));if(0===o.length)return;const i=o.join("\n");if("[DONE]"===i)return void(null==(t=s.onDone)||t.call(s,{}));let c=i;try{c=JSON.parse(i)}catch{}if("error"===n){const a="object"==typeof c&&c?c.message:c;throw new Error("string"==typeof a?a:"AI 学习助手回复失败")}const u=function(a){if("string"==typeof a)return a;if(!a||"object"!=typeof a)return"";const s=a,e=s.delta||s.content||s.answer||s.text;if("string"==typeof e)return e;const t=s.data;if(t&&"object"==typeof t){const a=t,s=a.delta||a.content||a.answer||a.text;if("string"==typeof s)return s}return""}(c);u&&s.onDelta(u),"done"!==n&&"message_done"!==n||null==(l=s.onDone)||l.call(s,"object"==typeof c&&c?c:{})}const q=O(a({__name:"learning-assistant",emits:["go-home","open-settings","open-profile"],setup(a,{emit:O}){const q=D(O),F=["更新指南","风险评估量表","药理学详情","病例研讨"],N=[{index:"1",title:"早期识别",description:"10分钟内完成12导联心电图。"},{index:"2",title:"药物干预",description:"阿司匹林、氯吡格雷。"},{index:"3",title:"再灌注策略",description:"STEMI需紧急PCI。"}],J=s([]),P=s(""),V=s(!1),M=s(!1),R=s(""),z=s(!1),H=s(0),K=s(null),U=s(!1);let W=null,B=null;async function G(){const a=P.value.trim();if(!a)return void Q("请输入问题");if(U.value)return;J.value.push({id:`user-${Date.now()}`,role:"user",content:a}),P.value="",M.value=!0,U.value=!0,L();const s=J.value.length;J.value.push({id:`assistant-${Date.now()}`,role:"assistant",variant:"simple",content:""});try{const e=await async function(a){if(K.value)return K.value;const s=await T(a);return K.value=s,h("clinical-thinking-learning-assistant-session",s),s}(a);null==B||B.abort(),B=new AbortController,await async function(a,s,e,t){const l=await fetch(`${S}/learning-assistant/sessions/${a}/chat/stream`,{method:"POST",headers:E("text/event-stream"),body:JSON.stringify(s),signal:t});if(!l.ok||!l.body)throw new Error(await I(l));const n=l.body.getReader(),o=new TextDecoder;let i="";for(;;){const{value:a,done:s}=await n.read();if(s)break;i+=o.decode(a,{stream:!0});const t=i.split("\n\n");i=t.pop()||"";for(const l of t)$(l,e)}i.trim()&&$(i,e)}(e.assistant_session_id,{question:a},{onDelta:a=>{J.value[s].content+=a,L()}},B.signal),J.value[s].content.trim()||(J.value[s].content="暂未生成回复,请稍后重试。")}catch(e){J.value[s].content=e instanceof Error?e.message:"AI 学习助手回复失败",Q(J.value[s].content)}finally{M.value=!1,U.value=!1,L()}}function L(){b((()=>{H.value+=1e3}))}function Q(a){W&&clearTimeout(W),R.value=a,z.value=!0,W=setTimeout((()=>{z.value=!1}),1800)}return e((()=>{!async function(){try{const a=g("clinical-thinking-learning-assistant-session");if(a&&"object"==typeof a)return void(K.value=a);K.value=await T("AI 学习助手"),h("clinical-thinking-learning-assistant-session",K.value)}catch(a){Q(a instanceof Error?a.message:"新建会话失败")}}()})),t((()=>{null==B||B.abort(),W&&clearTimeout(W)})),(a,s)=>{const e=y,t=w,h=k,g=C,b=A,S=x;return l(),n(e,{class:"learning-page"},{default:o((()=>[i(e,{class:"learning-shell"},{default:o((()=>[i(e,{class:"assistant-header"},{default:o((()=>[i(e,{class:"header-left"},{default:o((()=>[i(t,{class:"icon-button","aria-label":"返回",onClick:c(q)},{default:o((()=>[i(e,{class:"history-icon"})])),_:1},8,["onClick"]),i(h,{class:"page-title"},{default:o((()=>[u("AI 学习助手")])),_:1})])),_:1}),i(e,{class:"header-actions"},{default:o((()=>[i(t,{class:"director-chip",onClick:s[0]||(s[0]=a=>V.value=!0)},{default:o((()=>[i(g,{class:"director-thumb",src:j,mode:"aspectFill"}),i(h,null,{default:o((()=>[u("咨询王主任")])),_:1})])),_:1}),i(t,{class:"icon-button muted","aria-label":"更多",onClick:s[1]||(s[1]=a=>Q("更多功能即将开放"))},{default:o((()=>[i(e,{class:"more-icon"})])),_:1})])),_:1})])),_:1}),i(b,{class:"chat-canvas","scroll-y":"","scroll-top":H.value},{default:o((()=>[i(e,{class:"time-row"},{default:o((()=>[i(h,null,{default:o((()=>[u("今天 10:42 AM")])),_:1})])),_:1}),(l(!0),r(f,null,d(J.value,(a=>(l(),n(e,{key:a.id,class:_(["message-block",`message-${a.role}`])},{default:o((()=>["user"===a.role?(l(),n(e,{key:0,class:"user-bubble"},{default:o((()=>[i(h,null,{default:o((()=>[u(v(a.content),1)])),_:2},1024)])),_:2},1024)):(l(),n(e,{key:1,class:"assistant-message"},{default:o((()=>[i(e,{class:"assistant-meta"},{default:o((()=>[i(e,{class:"robot-badge"},{default:o((()=>[i(e,{class:"robot-icon"})])),_:1}),i(h,null,{default:o((()=>[u("AI 临床助理")])),_:1})])),_:1}),"acs-pathway"===a.variant?(l(),n(e,{key:0,class:"assistant-card"},{default:o((()=>[i(h,{class:"response-intro"},{default:o((()=>[u("急性冠脉综合征(ACS)临床路径:")])),_:1}),i(e,{class:"pathway-card"},{default:o((()=>[(l(),r(f,null,d(N,(a=>i(e,{key:a.title,class:"pathway-step"},{default:o((()=>[i(h,{class:"step-index"},{default:o((()=>[u(v(a.index),1)])),_:2},1024),i(e,{class:"step-copy"},{default:o((()=>[i(h,{class:"step-title"},{default:o((()=>[u(v(a.title),1)])),_:2},1024),i(h,{class:"step-desc"},{default:o((()=>[u(v(a.description),1)])),_:2},1024)])),_:2},1024)])),_:2},1024))),64))])),_:1}),i(e,{class:"evidence-box"},{default:o((()=>[i(e,{class:"evidence-heading"},{default:o((()=>[i(e,{class:"verified-icon"}),i(h,null,{default:o((()=>[u("循证来源")])),_:1})])),_:1}),i(h,{class:"evidence-item"},{default:o((()=>[u("[1] 2023 AHA/ACC ACS 管理指南")])),_:1}),i(h,{class:"evidence-item"},{default:o((()=>[u("[2] 《临床诊疗常规:心血管分册》")])),_:1})])),_:1})])),_:1})):(l(),n(e,{key:1,class:"assistant-card simple-card"},{default:o((()=>[i(h,null,{default:o((()=>[u(v(a.content),1)])),_:2},1024)])),_:2},1024))])),_:2},1024))])),_:2},1032,["class"])))),128)),i(e,{class:_(["typing-row",{visible:M.value}])},{default:o((()=>[i(e,{class:"typing-dots"},{default:o((()=>[i(e,{class:"dot dot-one"}),i(e,{class:"dot dot-two"}),i(e,{class:"dot dot-three"})])),_:1}),i(h,null,{default:o((()=>[u("正在思考中...")])),_:1})])),_:1},8,["class"])])),_:1},8,["scroll-top"]),i(e,{class:"input-panel"},{default:o((()=>[i(b,{class:"quick-actions","scroll-x":""},{default:o((()=>[i(e,{class:"quick-row"},{default:o((()=>[(l(),r(f,null,d(F,(a=>i(t,{key:a,class:"quick-chip",onClick:s=>function(a){P.value={"更新指南":"请帮我梳理 ACS 最新指南中需要重点关注的更新。","风险评估量表":"请列出 ACS 常用风险评估量表及适用场景。","药理学详情":"请说明 ACS 常用抗血小板药物的适应证和注意事项。","病例研讨":"请用病例研讨形式带我复盘一例胸痛患者。"}[a]||a}(a)},{default:o((()=>[u(v(a),1)])),_:2},1032,["onClick"]))),64))])),_:1})])),_:1}),i(e,{class:"composer"},{default:o((()=>[i(S,{class:"message-input",modelValue:P.value,"onUpdate:modelValue":s[2]||(s[2]=a=>P.value=a),"auto-height":"",maxlength:"1000",placeholder:"请输入您的问题...","placeholder-class":"input-placeholder",onConfirm:G},null,8,["modelValue"]),i(e,{class:"composer-actions"},{default:o((()=>[i(t,{class:"attach-button","aria-label":"附件",onClick:s[3]||(s[3]=a=>Q("附件上传即将开放"))},{default:o((()=>[i(e,{class:"attach-icon"})])),_:1}),i(t,{class:_(["send-button",{disabled:U.value}]),disabled:U.value,"aria-label":"发送",onClick:G},{default:o((()=>[i(e,{class:"send-icon"})])),_:1},8,["class","disabled"])])),_:1})])),_:1}),i(h,{class:"disclaimer"},{default:o((()=>[u("AI 生成内容仅供临床参考,最终医疗决策请咨询资深医师。")])),_:1})])),_:1}),V.value?(l(),n(e,{key:0,class:"modal-mask",onClick:s[9]||(s[9]=a=>V.value=!1)},{default:o((()=>[i(e,{class:"wang-modal",onClick:s[8]||(s[8]=m((()=>{}),["stop"]))},{default:o((()=>[i(e,{class:"modal-header"},{default:o((()=>[i(e,{class:"modal-doctor"},{default:o((()=>[i(g,{class:"modal-avatar",src:j,mode:"aspectFill"}),i(e,{class:"modal-title-group"},{default:o((()=>[i(h,{class:"modal-title"},{default:o((()=>[u("王主任")])),_:1}),i(h,{class:"modal-subtitle"},{default:o((()=>[u("临床教育首席专家")])),_:1})])),_:1})])),_:1}),i(t,{class:"icon-button muted","aria-label":"关闭",onClick:s[4]||(s[4]=a=>V.value=!1)},{default:o((()=>[i(e,{class:"close-icon"})])),_:1})])),_:1}),i(e,{class:"modal-body"},{default:o((()=>[i(e,{class:"quote-card"},{default:o((()=>[i(h,null,{default:o((()=>[u("“对于 ACS 患者,请务必牢记:时间就是心肌。虽然 AI 提供了标准的临床路径,但结合患者个体化风险特征的临床判断仍是您最关键的工具。”")])),_:1})])),_:1}),i(e,{class:"mentor-grid"},{default:o((()=>[i(t,{class:"mentor-card",onClick:s[5]||(s[5]=a=>Q("已选择查房带教"))},{default:o((()=>[i(e,{class:"school-small-icon"}),i(h,null,{default:o((()=>[u("查房带教")])),_:1})])),_:1}),i(t,{class:"mentor-card",onClick:s[6]||(s[6]=a=>Q("已选择疑难会诊"))},{default:o((()=>[i(e,{class:"notes-small-icon"}),i(h,null,{default:o((()=>[u("疑难会诊")])),_:1})])),_:1})])),_:1}),i(t,{class:"guidance-button",onClick:s[7]||(s[7]=a=>Q("一对一指导即将开始"))},{default:o((()=>[u(" 开始一对一指导 ")])),_:1})])),_:1})])),_:1})])),_:1})):p("",!0),i(e,{class:_(["toast",{visible:z.value}])},{default:o((()=>[u(v(R.value),1)])),_:1},8,["class"])])),_:1})])),_:1})}}}),[["__scopeId","data-v-bbdc4119"]]);export{q as default};
|