2 lines
10 KiB
JavaScript
2 lines
10 KiB
JavaScript
import{ba as O,o as U,bR as W,R as Q,ap as X,bo as Z,c6 as ee,bx as se,q as a,r as c,v as N,D as w,s as k,L as b,bh as te,w as re,u as o,cY as ne,K as ae,by as oe,F as D,T as y,P as v,O as S,G as j,ac as ie,bB as ce,bi as le,p as J,ae as ue,br as de,aa as fe,bq as ye,E as me}from"./.pnpm-BHOjf1ZS.js";import{d as _e}from"./dayjs-CF5xpNFg.js";import{at as pe,au as he}from"./tcm-ChtuqNhm.js";import{p as ve}from"./im-business-message-parse-kN-fWnvR.js";import{_ as ge}from"./index-FUvp6yIk.js";function ke(i){const s=O({rows:[],patientImId:"",patientName:"",loading:!1,syncing:!1,hasLoaded:!1,readError:"",syncError:"",partialErrors:[],inserted:0,processedPeers:0,totalPeers:0,phase:"",checkedAccounts:0,candidateAccounts:0,skippedAccounts:0,lastSyncAt:null}),d=i.now??Date.now,E=i.setTimer??setTimeout,p=i.clearTimer??clearTimeout;let r=0,A=0,g=i.visible??!0,I=!1,h,P;function _(e){return!I&&g&&e===h&&e.generation===A&&e.diagnosisId===r}function x(){P!==void 0&&p(P),P=void 0}function q(){A++,x(),h=void 0,s.loading=!1,s.syncing=!1}async function R(e,l=!1){if(!_(e))return!1;if(e.archiveRequest){const u=await e.archiveRequest;return!l||!_(e)?u:R(e)}s.loading=!0;const f=Promise.resolve().then(async()=>{if(!_(e))return!1;try{const u=await i.load(e.diagnosisId);if(!_(e))return!1;if(!Array.isArray(u==null?void 0:u.lists))throw new Error("聊天记录接口返回的数据不完整");return s.rows=u.lists,s.patientImId=u.patient_im_id||"",s.patientName=u.patient_name||"",s.hasLoaded=!0,s.readError="",!0}catch(u){return _(e)&&(s.readError=K(u,"读取聊天记录失败")),!1}});e.archiveRequest=f;try{return await f}finally{e.archiveRequest===f&&(e.archiveRequest=void 0),_(e)&&(s.loading=!1)}}function H(e){x(),_(e)&&(P=E(()=>{P=void 0,_(e)&&L(e)},3e4))}async function L(e,l=!1){if(!_(e))return;if(e.syncRequest)return e.syncRequest;x(),s.syncing=!0,s.syncError="",s.partialErrors=[],s.inserted=0,s.processedPeers=0,s.totalPeers=0,s.phase="checking_accounts",s.checkedAccounts=0,s.candidateAccounts=0,s.skippedAccounts=0;const f=Promise.resolve().then(async()=>{var z,F,t,G;let u,T=0,Y=d();const $=new Set;try{for(;_(e);){const m=await i.sync(e.diagnosisId,u);if(!_(e))return;if(typeof(m==null?void 0:m.completed)!="boolean")throw new Error("同步接口未返回有效的完成状态");s.inserted=Number(m.inserted)||0,s.processedPeers=Number(m.processed_peers)||0,s.totalPeers=Number(m.total_peers)||0,s.phase=m.phase||"syncing",s.checkedAccounts=Number(m.checked_accounts)||0,s.candidateAccounts=Number(m.candidate_accounts)||0,s.skippedAccounts=Number(m.skipped_accounts)||0;for(const M of[m.error,...m.errors||[]])typeof M=="string"&&M.trim()&&$.add(M);if(s.partialErrors=[...$],m.completed){const M=await R(e,!0);if(!_(e))return;s.lastSyncAt=d(),l&&($.size?(z=i.notify)==null||z.call(i,"warning",`同步完成,部分会话失败:${[...$].join(";")}`):M?(t=i.notify)==null||t.call(i,"success",`聊天记录已更新,本次新增 ${s.inserted} 条`):(F=i.notify)==null||F.call(i,"warning",`同步已完成,但读取聊天记录失败:${s.readError}`));return}if(!m.sync_token)throw new Error("同步接口未返回继续同步所需的进度标识");u=m.sync_token,T++,(T>=3||d()-Y>=2e3)&&(await R(e,!0),T=0,Y=d())}}catch(m){if(!_(e))return;s.syncError=K(m,"同步聊天记录失败"),l&&((G=i.notify)==null||G.call(i,"error",s.syncError))}});e.syncRequest=f;try{await f}finally{e.syncRequest===f&&(e.syncRequest=void 0),_(e)&&(s.syncing=!1,H(e))}}function V(){if(I||!g||!r)return;const e={diagnosisId:r,generation:A};h=e,R(e),L(e)}function B(e){const l=Number(e)>0?Number(e):0;I||l===r&&h||(q(),r=l,s.rows=[],s.patientImId="",s.patientName="",s.hasLoaded=!1,s.readError="",s.syncError="",s.partialErrors=[],s.inserted=0,s.processedPeers=0,s.totalPeers=0,s.phase="",s.checkedAccounts=0,s.candidateAccounts=0,s.skippedAccounts=0,s.lastSyncAt=null,V())}function C(e){I||e===g||(g=e,q(),g&&V())}function n(){I=!0,q()}return{state:s,setDiagnosis:B,setVisible:C,dispose:n,reload:()=>h?R(h):Promise.resolve(!1),sync:()=>h?L(h,!0):Promise.resolve()}}function K(i,s){var E,p;if(typeof i=="string"&&i.trim())return i;const d=i;return((p=(E=d==null?void 0:d.response)==null?void 0:E.data)==null?void 0:p.msg)||(d==null?void 0:d.msg)||(d==null?void 0:d.error)||(d==null?void 0:d.message)||s}const be={class:"im-chat-record-panel"},we={class:"toolbar mb-3"},Ee={key:0,class:"sync-status",role:"status","aria-live":"polite"},Ae={key:0},Ie={key:0},Pe={key:1,class:"sync-status"},xe={key:2,class:"sync-status"},Re={key:0},Ne={class:"chat-wrap"},Se={key:0,class:"chat-list"},qe={class:"meta"},Le={class:"name"},Ce={class:"time"},$e={class:"bubble"},De={key:0,class:"friendly-text"},Be={class:"friendly-main"},Te={key:0,class:"friendly-sub"},Me={key:1,class:"text-content"},Ve={key:2,class:"text-content"},Ye={key:3,class:"muted"},ze=U({__name:"ImChatRecordPanel",props:{diagnosisId:{}},setup(i,{expose:s}){const d=i,E=()=>typeof document>"u"||document.visibilityState!=="hidden",p=ke({load:n=>he({diagnosis_id:n,only_archived:1}),sync:(n,e)=>pe({diagnosis_id:n,...e?{sync_token:e}:{}}),notify:(n,e)=>me[n](e),visible:E()}),r=p.state,{loading:A,syncing:g,rows:I,patientName:h}=W(r),P=J(()=>r.readError?"聊天记录读取失败,请重试":r.syncError||r.partialErrors.length?"暂未读取到聊天记录,请重试同步":g.value?"正在同步聊天记录…":r.hasLoaded?"暂无聊天记录":"正在加载聊天记录…"),_={text:"",image:"图片",file:"文件",sound:"语音",video:"视频",location:"位置",custom:"自定义",face:"表情",other:""},x=J(()=>I.value.flatMap(n=>(n.msg_type==="composite"&&Array.isArray(n.parts)?n.parts.map((l,f)=>({...n,...l,msg_id:`${n.msg_id}:${f}`})):[n]).map(l=>{const f=R(l);let u="";return f!=null&&f.tag?u=f.tag:u=_[l.msg_type]||(l.msg_type!=="other"?l.msg_type:""),{raw:l,friendly:f,tag:u}})));function q(n){if(n==null||!n)return"—";const e=n>1e12?Math.floor(n/1e3):n;return _e.unix(e).format("YYYY-MM-DD HH:mm:ss")}function R(n){const e=(n.text||"").trim();if(!e)return null;const l=e.startsWith("{")&&(/\bbusinessID\b/.test(e)||/\bcmd\b/.test(e));return n.msg_type==="custom"||l?ve(e):null}function H(n){return n.is_from_doctor?n.from_staff_name?`医生(${n.from_staff_name})`:"医生/员工":h.value?`患者(${h.value})`:"患者"}function L(){return p.reload()}function V(){return p.sync()}Q(()=>d.diagnosisId,n=>p.setDiagnosis(n),{immediate:!0});let B=!0;function C(){p.setVisible(B&&E())}return X(()=>document.addEventListener("visibilitychange",C)),Z(()=>{B=!0,C()}),ee(()=>{B=!1,C()}),se(()=>{document.removeEventListener("visibilitychange",C),p.dispose()}),s({refresh:L}),(n,e)=>{const l=te,f=re,u=ae,T=de,Y=fe,$=ye,z=ce,F=le;return a(),c("div",be,[N(l,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"说明"},{default:w(()=>[...e[0]||(e[0]=[k("p",{class:"panel-tip"},[b(" 展示患者所有诊单中与 "),k("strong",null,"所有医生 / 医助账号"),b("分别产生的会话,按时间排序。 打开页面后自动加载并同步最新消息,页面可见期间每 30 秒继续检查更新。 ")],-1)])]),_:1}),k("div",we,[N(u,{type:"primary",link:"",loading:o(g),onClick:V},{default:w(()=>[N(f,{class:"mr-1"},{default:w(()=>[N(o(ne))]),_:1}),e[1]||(e[1]=b(" 同步最新 ",-1))]),_:1},8,["loading"]),N(u,{type:"primary",link:"",loading:o(A),onClick:L},{default:w(()=>[N(f,{class:"mr-1"},{default:w(()=>[N(o(oe))]),_:1}),e[2]||(e[2]=b(" 重新加载已归档 ",-1))]),_:1},8,["loading"])]),o(g)?(a(),c("p",Ee,[o(r).phase==="checking_accounts"?(a(),c(D,{key:0},[e[3]||(e[3]=b(" 正在核验聊天账号",-1)),o(r).candidateAccounts?(a(),c("span",Ae,","+y(o(r).checkedAccounts)+" / "+y(o(r).candidateAccounts),1)):v("",!0)],64)):(a(),c(D,{key:1},[e[4]||(e[4]=b("正在同步聊天记录",-1)),o(r).totalPeers?(a(),c("span",Ie,",已处理 "+y(o(r).processedPeers)+" / "+y(o(r).totalPeers)+" 个会话",1)):v("",!0),b(",新增 "+y(o(r).inserted)+" 条",1)],64))])):o(r).lastSyncAt?(a(),c("p",Pe,"上次同步:"+y(q(o(r).lastSyncAt)),1)):v("",!0),o(r).skippedAccounts?(a(),c("p",xe,"已跳过 "+y(o(r).skippedAccounts)+" 个未注册或已失效的聊天账号,已有归档不受影响。",1)):v("",!0),o(r).readError?(a(),S(l,{key:3,type:"error","show-icon":"",closable:!1,class:"mb-3",title:`读取聊天记录失败:${o(r).readError}`},null,8,["title"])):v("",!0),o(r).syncError?(a(),S(l,{key:4,type:"error","show-icon":"",closable:!1,class:"mb-3",title:`同步失败:${o(r).syncError}`},null,8,["title"])):v("",!0),o(r).partialErrors.length?(a(),S(l,{key:5,type:"warning","show-icon":"",closable:!1,class:"mb-3",title:"聊天记录未完全同步"},{default:w(()=>[(a(!0),c(D,null,j(o(r).partialErrors.slice(0,3),t=>(a(),c("p",{key:t,class:"panel-tip"},y(t),1))),128)),o(r).partialErrors.length>3?(a(),c("details",Re,[k("summary",null,"查看其余 "+y(o(r).partialErrors.length-3)+" 项同步问题",1),(a(!0),c(D,null,j(o(r).partialErrors.slice(3),t=>(a(),c("p",{key:t,class:"panel-tip"},y(t),1))),128))])):v("",!0)]),_:1})):v("",!0),ie((a(),c("div",Ne,[x.value.length?(a(),c("div",Se,[(a(!0),c(D,null,j(x.value,t=>(a(),c("div",{key:`${t.raw.from_account||""}-${t.raw.to_account||""}-${t.raw.msg_id}`,class:ue(["chat-row",t.raw.is_from_doctor?"from-doctor":"from-patient"])},[k("div",qe,[k("span",Le,y(H(t.raw)),1),k("span",Ce,y(q(t.raw.time)),1),t.tag?(a(),S(T,{key:0,size:"small",type:"info",class:"ml-2"},{default:w(()=>[b(y(t.tag),1)]),_:2},1024)):v("",!0)]),k("div",$e,[t.raw.msg_type==="image"&&t.raw.image_url?(a(),S(Y,{key:0,src:t.raw.image_url,"preview-src-list":[t.raw.image_url],fit:"contain",class:"chat-img"},null,8,["src","preview-src-list"])):(t.raw.msg_type==="file"||t.raw.msg_type==="sound"||t.raw.msg_type==="video")&&t.raw.file_url?(a(),S($,{key:1,href:t.raw.file_url,target:"_blank",type:"primary"},{default:w(()=>[b(y(t.raw.file_name||"打开文件"),1)]),_:2},1032,["href"])):(a(),c(D,{key:2},[t.friendly?(a(),c("div",De,[k("div",Be,y(t.friendly.main),1),t.friendly.sub?(a(),c("div",Te,y(t.friendly.sub),1)):v("",!0)])):t.raw.msg_type==="text"&&t.raw.text?(a(),c("div",Me,y(t.raw.text),1)):t.raw.text?(a(),c("div",Ve,y(t.raw.text),1)):(a(),c("span",Ye,"(无法展示该消息类型)"))],64))])],2))),128))])):o(A)?v("",!0):(a(),S(z,{key:1,description:P.value},null,8,["description"]))])),[[F,o(A)&&!x.value.length]])])}}}),Ke=ge(ze,[["__scopeId","data-v-ed56fa43"]]);export{Ke as default};
|