17 lines
17 KiB
JavaScript
17 lines
17 KiB
JavaScript
import{o as $e,q as i,O as f,D as n,r as k,s as o,T as y,v as g,bh as Je,P as b,bZ as We,bB as Ke,K as Xe,L as _,br as Ye,Y as Ze,F as Ie,G as He,X as Qe,ac as et,a2 as tt,b7 as rt,u as X,bi as st,ae as at,bt as ot,y as re,M as R,ba as it,p as U}from"./.pnpm-CC7b2w5D.js";import{c as nt,d as lt,b as ut}from"./tcm-3syQyebu.js";import{u as pt,i as B,_ as dt}from"./index-DjOYOm7k.js";const ct={class:"dialog-heading"},ft=["id"],vt={key:0,class:"report-shell"},mt={class:"prescription-snapshot"},yt={class:"snapshot-content"},_t={key:1,class:"report-loading"},gt={key:2,class:"report-error"},bt={class:"error-message"},kt={key:3,class:"report-error"},Et={class:"model-tab-label"},ht={class:"model-name"},Rt={class:"report-pane","element-loading-text":"正在重新生成整个诊断报告…"},wt={key:0,class:"report-error"},At={class:"error-message"},St={class:"report-document"},Ct={class:"report-meta"},xt={class:"report-meta-main"},$t={class:"report-title-line"},It={class:"report-times"},Tt={key:0},Vt={key:1,class:"report-editor"},Bt={class:"editor-actions"},zt={key:0,class:"report-summary"},Lt={class:"report-grid"},Nt={class:"report-section"},Pt={class:"report-section"},Dt={class:"report-section"},Ft={class:"report-section"},Ot={key:1,class:"report-section report-section-wide"},qt={class:"report-cautions"},Ut={class:"report-disclaimer"},jt={key:3,class:"report-section report-section-wide"},Gt={class:"raw-content"},Mt=$e({__name:"PrescriptionAiReportDialog",setup(Jt,{expose:Te}){const j=$e({name:"PrescriptionAiReportList",props:{items:{type:Array,default:()=>[]},emptyText:{type:String,default:"暂无"}},setup(t){return()=>t.items.length?re("ul",{class:"report-list"},t.items.map(e=>re("li",{key:e},e))):re("p",{class:"report-empty-text"},t.emptyText)}}),x=[{profile:"qwen",label:"千问",name:"qwen3.6-35b"},{profile:"openai",label:"OpenAI",name:"gpt-5.6-sol"}],Ve=["tcm.prescriptionLibrary/editAiReport","wcf.prescription/editAiReport"],Y=()=>({error:"",data:null,editing:!1,structuredEdit:!1,saving:!1,draft:"",originalContent:"",editError:""}),Be=pt(),z=R(!1),E=R(null),L=R("qwen"),I=R(0),N=R(0),T=R(!1),$=R(""),h=R(!1),A=R(""),C=R(!1),P=R(!1),s=it({qwen:Y(),openai:Y()}),ze=U(()=>{var e;const t=((e=E.value)==null?void 0:e.herbs)||[];return t.length?t.map(a=>`${a.name||"未命名药材"} ${a.dosage??"-"}g`).join("、"):"暂无药材"}),Z=U(()=>x.some(({profile:t})=>!!(s[t].data||s[t].error))),D=U(()=>x.some(({profile:t})=>s[t].saving)),F=U(()=>x.some(({profile:t})=>s[t].editing)),Le=U(()=>{const t=Be.perms||[];return t.includes("*")||Ve.some(e=>t.includes(e))}),H=()=>{x.forEach(({profile:t})=>Object.assign(s[t],Y()))},G=t=>{if(typeof t=="string"&&t.trim())return t;if(t&&typeof t=="object"){const e=t,a=e.msg||e.message||e.error;if(typeof a=="string"&&a.trim())return a}return"模型服务暂时不可用,请稍后重试"},S=t=>t===I.value&&z.value&&!!E.value,se=t=>{var l,m;H(),C.value=t.can_refresh===!0||((l=t.capabilities)==null?void 0:l.can_refresh)===!0,P.value=t.can_edit===!0||((m=t.capabilities)==null?void 0:m.can_edit)===!0,(Array.isArray(t.reports)?t.reports:[]).forEach(c=>{const v=s[c.model_key];v&&(v.data=c)}),(Array.isArray(t.results)?t.results:[]).forEach(c=>{const v=s[c.model_key];!v||c.status!=="error"||(v.error=c.error_message||"该模型报告生成失败,请重新生成整个报告")});const u=s[L.value];if(!u.data&&!u.error){const c=x.find(({profile:v})=>s[v].data||s[v].error);c&&(L.value=c.profile)}},Q=async(t=I.value,e={})=>{const a=E.value;if(!a)return;const u=++N.value;e.silent||(T.value=!0,$.value="");try{const l=await nt({id:a.id});if(!S(t)||u!==N.value)return;se(l),$.value=""}catch(l){if(!S(t)||u!==N.value)return;e.silent?A.value=`报告已保存,但刷新最新内容失败:${G(l)}`:$.value=G(l)}finally{S(t)&&u===N.value&&!e.silent&&(T.value=!1)}},Ne=async()=>{const t=E.value;if(!t||h.value)return;if(F.value){B.msgWarning("请先保存或取消正在编辑的报告");return}const e=I.value;h.value=!0,A.value="";try{const a=await ut({id:t.id});if(!S(e))return;se(a),a.status==="partial"?(A.value="部分模型重新生成失败;成功结果已保存,失败模型仍显示上一次保存版本。",B.msgWarning("诊断报告部分生成成功")):a.status==="error"?(A.value="全部模型重新生成失败,已保留原有报告。",B.msgError("诊断报告生成失败")):B.msgSuccess("诊断报告已生成并保存")}catch(a){if(!S(e))return;A.value=G(a)}finally{S(e)&&(h.value=!1)}},M=async()=>{if(Z.value)try{await B.confirm("重新生成会再次调用全部模型,并以新结果覆盖当前诊断报告。确定继续吗?")}catch{return}await Ne()},ae=t=>x.find(e=>e.profile===t),oe=t=>{var e;return((e=s[t].data)==null?void 0:e.model_label)||ae(t).label},ie=t=>{var e;return((e=s[t].data)==null?void 0:e.model_name)||ae(t).name},Pe=t=>{const e=s[t].data;return(e==null?void 0:e.generated_at)||"—"},ne=t=>{const e=s[t].data;return(e==null?void 0:e.edited_at)||""},De=t=>{const e=s[t].data;return(e==null?void 0:e.is_edited)===!0},Fe=t=>{var e;return!!((e=s[t].data)!=null&&e.report)},J=["核心判断","可能症状与证候","主治方向","主要功效","可能适用人群","配伍分析","用药与复核提醒","免责声明"],le=t=>{const e=t.replace(/^\uFEFF/,"").replace(/\r\n?/g,`
|
|
`).split(`
|
|
`),a=[];for(const p of J){const d=e.reduce((w,V,te)=>(V.trim()===p&&w.push(te),w),[]);if(!d.length)return{ok:!1,error:`缺少章节标题“${p}”。请保留全部八个中文章节标题后再保存。`};if(d.length>1)return{ok:!1,error:`章节标题“${p}”出现了多次,请仅保留一个标题。`};a.push(d[0])}for(let p=1;p<a.length;p++)if(a[p]<=a[p-1])return{ok:!1,error:`章节顺序不正确,请依次保留:${J.join("、")}。`};const u=p=>{const d=a[p]+1,w=a[p+1]??e.length;return e.slice(d,w).join(`
|
|
`).trim()},l=J.map((p,d)=>u(d)),m=l.findIndex(p=>!p);if(m>=0)return{ok:!1,error:`章节“${J[m]}”内容不能为空;如无内容请填写“暂无”。`};const c=p=>p==="暂无"?"":p,v=p=>p==="暂无"?[]:p.split(`
|
|
`).map(d=>d.trim()).filter(Boolean).map(d=>d.replace(/^(?:[-*•]\s+|\d+[.)、]\s*)/,"").trim()).filter(Boolean);return{ok:!0,report:{summary:c(l[0]),possible_symptoms:v(l[1]),main_indications:c(l[2]),efficacy:v(l[3]),suitable_people:v(l[4]),compatibility_analysis:c(l[5]),cautions:v(l[6]),disclaimer:c(l[7])}}},ue=t=>{if(!t)return"";const e=a=>a.length?a.map(u=>`- ${u}`).join(`
|
|
`):"暂无";return[`核心判断
|
|
${t.summary||"暂无"}`,`可能症状与证候
|
|
${e(t.possible_symptoms||[])}`,`主治方向
|
|
${t.main_indications||"暂无"}`,`主要功效
|
|
${e(t.efficacy||[])}`,`可能适用人群
|
|
${e(t.suitable_people||[])}`,`配伍分析
|
|
${t.compatibility_analysis||"暂无"}`,`用药与复核提醒
|
|
${e(t.cautions||[])}`,`免责声明
|
|
${t.disclaimer||"仅供专业人员辅助审方,不替代辨证、诊断和处方审核。"}`].join(`
|
|
|
|
`)},ee=t=>!!s[t].data&&P.value&&Le.value,Oe=t=>{const e=s[t];if(!e.data||!ee(t))return;let a=e.data.report;if(!a&&e.data.content){const l=le(e.data.content);l.ok&&(a=l.report)}e.structuredEdit=!!a;const u=a?ue(a):e.data.content;e.originalContent=u,e.draft=u,e.editError="",e.editing=!0},qe=t=>{const e=s[t];e.draft=e.originalContent,e.editError="",e.editing=!1,e.structuredEdit=!1},Ue=t=>t.report,je=async t=>{var p;const e=s[t],a=e.data;if(!a||e.saving||!ee(t))return;if(!e.draft.trim()){e.editError="报告内容不能为空";return}let u=null,l=e.draft;if(e.structuredEdit){const d=le(e.draft);if(!d.ok){e.editError=d.error;return}u=d.report,l=JSON.stringify(d.report)}if(l.length>12e3){e.editError="报告保存内容不能超过 12000 个字符,请精简后再保存";return}const m=Number(a.report_id||a.id||0);if(!m){e.editError="报告标识缺失,请重新加载后再试";return}const c=Number(((p=E.value)==null?void 0:p.id)||0);if(!c){e.editError="处方标识缺失,请关闭窗口后重试";return}const v=I.value;e.saving=!0,e.editError="";try{const d=await lt({id:c,report_id:m,content:l});if(!S(v))return;const w=Ue(d),V=u&&!w.report?{...w,report:u}:w;e.data=V,e.error="",P.value=d.can_edit===!0,C.value=d.can_refresh===!0,e.originalContent=u?ue(u):V.content||e.draft,e.draft=e.originalContent,e.editing=!1,e.structuredEdit=!1,B.msgSuccess("报告修改已保存"),await Q(v,{silent:!0})}catch(d){if(!S(v))return;e.editError=G(d)}finally{S(v)&&(e.saving=!1)}},Ge=t=>{E.value={id:t.id,prescription_name:t.prescription_name,formula_type:t.formula_type,herbs:t.herbs?JSON.parse(JSON.stringify(t.herbs)):[]},L.value="qwen",H(),$.value="",A.value="",C.value=!1,P.value=!1,T.value=!1,h.value=!1;const e=++I.value;z.value=!0,Q(e)},Me=()=>{I.value++,N.value++,E.value=null,T.value=!1,h.value=!1,$.value="",A.value="",C.value=!1,P.value=!1,H()};return Te({open:Ge}),(t,e)=>{const a=Ye,u=Je,l=We,m=Xe,c=Ke,v=rt,p=tt,d=Qe,w=Ze,V=ot,te=st;return i(),f(V,{modelValue:z.value,"onUpdate:modelValue":e[3]||(e[3]=r=>z.value=r),class:"prescription-ai-dialog",width:"min(920px, calc(100vw - 32px))",top:"5vh",title:"AI 处方解释","close-on-click-modal":!1,"destroy-on-close":"",onClosed:Me},{header:n(({titleId:r,titleClass:W})=>{var O,q;return[o("div",ct,[o("div",null,[o("h2",{id:r,class:at(W)},"AI 处方解释",10,ft),o("p",null,y(((O=E.value)==null?void 0:O.prescription_name)||"未选择处方"),1)]),(q=E.value)!=null&&q.formula_type?(i(),f(a,{key:0,type:"info",effect:"plain"},{default:n(()=>[_(y(E.value.formula_type),1)]),_:1})):b("",!0)])]}),footer:n(()=>[g(m,{onClick:e[2]||(e[2]=r=>z.value=!1)},{default:n(()=>[...e[28]||(e[28]=[_("关闭",-1)])]),_:1}),C.value?(i(),f(m,{key:0,type:"primary",loading:h.value,disabled:!E.value||T.value||D.value||F.value,onClick:M},{default:n(()=>[_(y(Z.value?"重新生成整个诊断报告":"生成诊断报告"),1)]),_:1},8,["loading","disabled"])):b("",!0)]),default:n(()=>[E.value?(i(),k("div",vt,[o("div",mt,[e[4]||(e[4]=o("span",{class:"snapshot-label"},"药材组合",-1)),o("span",yt,y(ze.value),1)]),g(u,{class:"medical-notice",type:"warning",closable:!1,"show-icon":"",title:"AI 仅依据药材组合推测可能证候与主治方向,不能替代四诊、辨证和处方审核。"}),A.value?(i(),f(u,{key:0,class:"operation-error",type:"error",closable:!1,"show-icon":"",title:A.value},null,8,["title"])):b("",!0),T.value?(i(),k("div",_t,[g(l,{rows:9,animated:""})])):$.value?(i(),k("div",gt,[g(c,{description:"已保存报告加载失败","image-size":72},{default:n(()=>[o("p",bt,y($.value),1),g(m,{type:"primary",plain:"",onClick:e[0]||(e[0]=r=>Q())},{default:n(()=>[...e[5]||(e[5]=[_(" 重新加载 ",-1)])]),_:1})]),_:1})])):Z.value?(i(),f(w,{key:4,modelValue:L.value,"onUpdate:modelValue":e[1]||(e[1]=r=>L.value=r),class:"model-tabs"},{default:n(()=>[(i(),k(Ie,null,He(x,r=>g(d,{key:r.profile,name:r.profile},{label:n(()=>[o("span",Et,[o("span",null,y(oe(r.profile)),1),o("span",ht,y(ie(r.profile)),1),h.value?(i(),f(a,{key:0,size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[9]||(e[9]=[_(" 更新中 ",-1)])]),_:1})):s[r.profile].error?(i(),f(a,{key:1,size:"small",type:"danger",effect:"plain"},{default:n(()=>[...e[10]||(e[10]=[_(" 更新失败 ",-1)])]),_:1})):s[r.profile].data?(i(),f(a,{key:2,size:"small",type:"success",effect:"plain"},{default:n(()=>[...e[11]||(e[11]=[_(" 已保存 ",-1)])]),_:1})):(i(),f(a,{key:3,size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[12]||(e[12]=[_(" 未生成 ",-1)])]),_:1}))])]),default:n(()=>[et((i(),k("div",Rt,[s[r.profile].error&&!s[r.profile].data?(i(),k("div",wt,[g(c,{description:"这份模型报告生成失败","image-size":72},{default:n(()=>[o("p",At,y(s[r.profile].error),1),C.value?(i(),f(m,{key:0,type:"primary",plain:"",loading:h.value,disabled:D.value||F.value,onClick:M},{default:n(()=>[...e[13]||(e[13]=[_(" 重新生成整个报告 ",-1)])]),_:1},8,["loading","disabled"])):b("",!0)]),_:2},1024)])):s[r.profile].data?(i(),f(p,{key:1,"max-height":"56vh"},{default:n(()=>{var W,O,q,pe,de,ce,fe,ve,me,ye,_e,ge,be,ke,Ee,he,Re,we,Ae,Se,Ce,xe;return[o("article",St,[o("header",Ct,[o("div",xt,[o("div",$t,[o("strong",null,y(oe(r.profile))+"建议报告",1),o("span",null,y(ie(r.profile)),1),(W=s[r.profile].data)!=null&&W.is_stale?(i(),f(a,{key:0,size:"small",type:"warning",effect:"plain"},{default:n(()=>[...e[14]||(e[14]=[_(" 处方已变更 ",-1)])]),_:1})):b("",!0),De(r.profile)?(i(),f(a,{key:1,size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[15]||(e[15]=[_(" 已人工编辑 ",-1)])]),_:1})):b("",!0)]),o("div",It,[o("span",null,"生成时间:"+y(Pe(r.profile)),1),ne(r.profile)?(i(),k("span",Tt," 编辑时间:"+y(ne(r.profile)),1)):b("",!0)])]),ee(r.profile)&&!s[r.profile].editing?(i(),f(m,{key:0,type:"primary",link:"",disabled:h.value||D.value,onClick:K=>Oe(r.profile)},{default:n(()=>[...e[16]||(e[16]=[_(" 编辑报告 ",-1)])]),_:1},8,["disabled","onClick"])):b("",!0)]),s[r.profile].error?(i(),f(u,{key:0,class:"saved-version-warning",type:"warning",closable:!1,"show-icon":"",title:`本次重新生成失败,当前展示上一次保存的版本:${s[r.profile].error}`},null,8,["title"])):b("",!0),s[r.profile].editing?(i(),k("div",Vt,[s[r.profile].structuredEdit?(i(),f(u,{key:0,class:"editor-format-notice",type:"info",closable:!1,"show-icon":"",title:"结构化报告会按下方八个中文章节保存;请勿删除、重命名或调整章节标题顺序。"})):b("",!0),g(v,{modelValue:s[r.profile].draft,"onUpdate:modelValue":K=>s[r.profile].draft=K,type:"textarea",rows:18,resize:"vertical",maxlength:"12000","show-word-limit":"",placeholder:"请输入报告内容"},null,8,["modelValue","onUpdate:modelValue"]),s[r.profile].editError?(i(),f(u,{key:1,class:"editor-error",type:"error",closable:!1,"show-icon":"",title:s[r.profile].editError},null,8,["title"])):b("",!0),o("div",Bt,[g(m,{disabled:s[r.profile].saving,onClick:K=>qe(r.profile)},{default:n(()=>[...e[17]||(e[17]=[_(" 取消 ",-1)])]),_:1},8,["disabled","onClick"]),g(m,{type:"primary",loading:s[r.profile].saving,onClick:K=>je(r.profile)},{default:n(()=>[...e[18]||(e[18]=[_(" 保存修改 ",-1)])]),_:1},8,["loading","onClick"])])])):Fe(r.profile)?(i(),k(Ie,{key:2},[(q=(O=s[r.profile].data)==null?void 0:O.report)!=null&&q.summary?(i(),k("section",zt,[e[19]||(e[19]=o("h3",null,"核心判断",-1)),o("p",null,y((de=(pe=s[r.profile].data)==null?void 0:pe.report)==null?void 0:de.summary),1)])):b("",!0),o("div",Lt,[o("section",Nt,[e[20]||(e[20]=o("h3",null,"可能症状与证候",-1)),g(X(j),{items:((fe=(ce=s[r.profile].data)==null?void 0:ce.report)==null?void 0:fe.possible_symptoms)||[],"empty-text":"模型未给出明确症状推测"},null,8,["items"])]),o("section",Pt,[e[21]||(e[21]=o("h3",null,"主治方向",-1)),o("p",null,y(((me=(ve=s[r.profile].data)==null?void 0:ve.report)==null?void 0:me.main_indications)||"暂无"),1)]),o("section",Dt,[e[22]||(e[22]=o("h3",null,"主要功效",-1)),g(X(j),{items:((_e=(ye=s[r.profile].data)==null?void 0:ye.report)==null?void 0:_e.efficacy)||[],"empty-text":"暂无"},null,8,["items"])]),o("section",Ft,[e[23]||(e[23]=o("h3",null,"可能适用人群",-1)),g(X(j),{items:((be=(ge=s[r.profile].data)==null?void 0:ge.report)==null?void 0:be.suitable_people)||[],"empty-text":"暂无"},null,8,["items"])])]),(Ee=(ke=s[r.profile].data)==null?void 0:ke.report)!=null&&Ee.compatibility_analysis?(i(),k("section",Ot,[e[24]||(e[24]=o("h3",null,"配伍分析",-1)),o("p",null,y((Re=(he=s[r.profile].data)==null?void 0:he.report)==null?void 0:Re.compatibility_analysis),1)])):b("",!0),o("section",qt,[e[25]||(e[25]=o("h3",null,"用药与复核提醒",-1)),g(X(j),{items:((Ae=(we=s[r.profile].data)==null?void 0:we.report)==null?void 0:Ae.cautions)||[],"empty-text":"仍需结合患者情况完成禁忌与相互作用复核"},null,8,["items"])]),o("p",Ut,y(((Ce=(Se=s[r.profile].data)==null?void 0:Se.report)==null?void 0:Ce.disclaimer)||"仅供专业人员辅助审方,不替代辨证、诊断和处方审核。"),1)],64)):(i(),k("section",jt,[e[26]||(e[26]=o("h3",null,"报告正文",-1)),o("pre",Gt,y(((xe=s[r.profile].data)==null?void 0:xe.content)||"暂无报告正文"),1)]))])]}),_:2},1024)):(i(),f(c,{key:2,description:"该模型暂无已保存报告","image-size":72},{default:n(()=>[C.value?(i(),f(m,{key:0,type:"primary",plain:"",loading:h.value,disabled:D.value||F.value,onClick:M},{default:n(()=>[...e[27]||(e[27]=[_(" 重新生成整个报告 ",-1)])]),_:1},8,["loading","disabled"])):b("",!0)]),_:1}))])),[[te,h.value&&!!s[r.profile].data]])]),_:2},1032,["name"])),64))]),_:1},8,["modelValue"])):(i(),k("div",kt,[g(c,{description:"暂无已保存的 AI 诊断报告","image-size":76},{default:n(()=>[e[8]||(e[8]=o("p",{class:"empty-message"},"打开窗口不会自动调用模型;需要时请手动生成。",-1)),C.value?(i(),f(m,{key:0,type:"primary",loading:h.value,disabled:D.value||F.value,onClick:M},{default:n(()=>[...e[6]||(e[6]=[_(" 生成报告 ",-1)])]),_:1},8,["loading","disabled"])):(i(),f(a,{key:1,type:"info",effect:"plain"},{default:n(()=>[...e[7]||(e[7]=[_("当前账号无生成权限",-1)])]),_:1}))]),_:1})]))])):b("",!0)]),_:1},8,["modelValue"])}}}),Yt=dt(Mt,[["__scopeId","data-v-5a75a47c"]]);export{Yt as default};
|