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