Files
zyt/server/public/admin/assets/ImChatRecordPanel-Du80SRDM.js
T

2 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{K as W,d as O,i as Q,W as U,L as X,T as Z,v as ee,S as te,E as se}from"./element-plus-CWHdHlgZ.js";import{d as re}from"./dayjs-DG77mNTn.js";import{ae as ne,M as oe}from"./@element-plus/icons-vue-CbYn5zW9.js";import{at as ie,au as ae}from"./tcm-CSYiFMlc.js";import{p as ce}from"./im-business-message-parse-QKjFLn3X.js";import{r as le,K as ue,y as i}from"./@vue/reactivity-DiY1c2vO.js";import{f as de,w as fe,b as me,ac as pe,af as ye,ae as _e,ak as o,I as c,a as S,aN as E,J as k,O as w,F as D,H as v,G as R,ap as j,aP as he,A as J}from"./@vue/runtime-core-C6bnekPw.js";import{Q as m,o as ve}from"./@vue/shared-mAAVTE9n.js";import{_ as ge}from"./index-MKPKssyT.js";import"./@vue/runtime-dom-DDAG46FW.js";import"./lodash-D3kF6u-c.js";import"./lodash-es-C2A-Pj28.js";import"./@popperjs/core-C5az9QE8.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-QlpZ4wdW.js";import"./pinia-B8cvXbiZ.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-1S4fJlii.js";import"./@vueuse/shared-Cl3lVqjz.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-CNLwa9wG.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DRNXw7y3.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-C4onkBvW.js";function ke(a){const t=le({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=a.now??Date.now,b=a.setTimer??setTimeout,_=a.clearTimer??clearTimeout;let r=0,A=0,g=a.visible??!0,I=!1,h,P;function y(e){return!I&&g&&e===h&&e.generation===A&&e.diagnosisId===r}function x(){P!==void 0&&_(P),P=void 0}function L(){A++,x(),h=void 0,t.loading=!1,t.syncing=!1}async function N(e,l=!1){if(!y(e))return!1;if(e.archiveRequest){const u=await e.archiveRequest;return!l||!y(e)?u:N(e)}t.loading=!0;const f=Promise.resolve().then(async()=>{if(!y(e))return!1;try{const u=await a.load(e.diagnosisId);if(!y(e))return!1;if(!Array.isArray(u==null?void 0:u.lists))throw new Error("聊天记录接口返回的数据不完整");return t.rows=u.lists,t.patientImId=u.patient_im_id||"",t.patientName=u.patient_name||"",t.hasLoaded=!0,t.readError="",!0}catch(u){return y(e)&&(t.readError=K(u,"读取聊天记录失败")),!1}});e.archiveRequest=f;try{return await f}finally{e.archiveRequest===f&&(e.archiveRequest=void 0),y(e)&&(t.loading=!1)}}function F(e){x(),y(e)&&(P=b(()=>{P=void 0,y(e)&&q(e)},3e4))}async function q(e,l=!1){if(!y(e))return;if(e.syncRequest)return e.syncRequest;x(),t.syncing=!0,t.syncError="",t.partialErrors=[],t.inserted=0,t.processedPeers=0,t.totalPeers=0,t.phase="checking_accounts",t.checkedAccounts=0,t.candidateAccounts=0,t.skippedAccounts=0;const f=Promise.resolve().then(async()=>{var z,H,s,G;let u,T=0,Y=d();const $=new Set;try{for(;y(e);){const p=await a.sync(e.diagnosisId,u);if(!y(e))return;if(typeof(p==null?void 0:p.completed)!="boolean")throw new Error("同步接口未返回有效的完成状态");t.inserted=Number(p.inserted)||0,t.processedPeers=Number(p.processed_peers)||0,t.totalPeers=Number(p.total_peers)||0,t.phase=p.phase||"syncing",t.checkedAccounts=Number(p.checked_accounts)||0,t.candidateAccounts=Number(p.candidate_accounts)||0,t.skippedAccounts=Number(p.skipped_accounts)||0;for(const B of[p.error,...p.errors||[]])typeof B=="string"&&B.trim()&&$.add(B);if(t.partialErrors=[...$],p.completed){const B=await N(e,!0);if(!y(e))return;t.lastSyncAt=d(),l&&($.size?(z=a.notify)==null||z.call(a,"warning",`同步完成,部分会话失败:${[...$].join("")}`):B?(s=a.notify)==null||s.call(a,"success",`聊天记录已更新,本次新增 ${t.inserted} 条`):(H=a.notify)==null||H.call(a,"warning",`同步已完成,但读取聊天记录失败:${t.readError}`));return}if(!p.sync_token)throw new Error("同步接口未返回继续同步所需的进度标识");u=p.sync_token,T++,(T>=3||d()-Y>=2e3)&&(await N(e,!0),T=0,Y=d())}}catch(p){if(!y(e))return;t.syncError=K(p,"同步聊天记录失败"),l&&((G=a.notify)==null||G.call(a,"error",t.syncError))}});e.syncRequest=f;try{await f}finally{e.syncRequest===f&&(e.syncRequest=void 0),y(e)&&(t.syncing=!1,F(e))}}function V(){if(I||!g||!r)return;const e={diagnosisId:r,generation:A};h=e,N(e),q(e)}function M(e){const l=Number(e)>0?Number(e):0;I||l===r&&h||(L(),r=l,t.rows=[],t.patientImId="",t.patientName="",t.hasLoaded=!1,t.readError="",t.syncError="",t.partialErrors=[],t.inserted=0,t.processedPeers=0,t.totalPeers=0,t.phase="",t.checkedAccounts=0,t.candidateAccounts=0,t.skippedAccounts=0,t.lastSyncAt=null,V())}function C(e){I||e===g||(g=e,L(),g&&V())}function n(){I=!0,L()}return{state:t,setDiagnosis:M,setVisible:C,dispose:n,reload:()=>h?N(h):Promise.resolve(!1),sync:()=>h?q(h,!0):Promise.resolve()}}function K(a,t){var b,_;if(typeof a=="string"&&a.trim())return a;const d=a;return((_=(b=d==null?void 0:d.response)==null?void 0:b.data)==null?void 0:_.msg)||(d==null?void 0:d.msg)||(d==null?void 0:d.error)||(d==null?void 0:d.message)||t}const we={class:"im-chat-record-panel"},Ee={class:"toolbar mb-3"},be={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"},Ne={key:0},Se={class:"chat-wrap"},Re={key:0,class:"chat-list"},Le={class:"meta"},qe={class:"name"},Ce={class:"time"},$e={class:"bubble"},De={key:0,class:"friendly-text"},Me={class:"friendly-main"},Te={key:0,class:"friendly-sub"},Be={key:1,class:"text-content"},Ve={key:2,class:"text-content"},Ye={key:3,class:"muted"},ze=de({__name:"ImChatRecordPanel",props:{diagnosisId:{}},setup(a,{expose:t}){const d=a,b=()=>typeof document>"u"||document.visibilityState!=="hidden",_=ke({load:n=>ae({diagnosis_id:n,only_archived:1}),sync:(n,e)=>ie({diagnosis_id:n,...e?{sync_token:e}:{}}),notify:(n,e)=>se[n](e),visible:b()}),r=_.state,{loading:A,syncing:g,rows:I,patientName:h}=ue(r),P=J(()=>r.readError?"聊天记录读取失败,请重试":r.syncError||r.partialErrors.length?"暂未读取到聊天记录,请重试同步":g.value?"正在同步聊天记录…":r.hasLoaded?"暂无聊天记录":"正在加载聊天记录…"),y={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=N(l);let u="";return f!=null&&f.tag?u=f.tag:u=y[l.msg_type]||(l.msg_type!=="other"?l.msg_type:""),{raw:l,friendly:f,tag:u}})));function L(n){if(n==null||!n)return"—";const e=n>1e12?Math.floor(n/1e3):n;return re.unix(e).format("YYYY-MM-DD HH:mm:ss")}function N(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?ce(e):null}function F(n){return n.is_from_doctor?n.from_staff_name?`医生(${n.from_staff_name}`:"医生/员工":h.value?`患者(${h.value}`:"患者"}function q(){return _.reload()}function V(){return _.sync()}fe(()=>d.diagnosisId,n=>_.setDiagnosis(n),{immediate:!0});let M=!0;function C(){_.setVisible(M&&b())}return me(()=>document.addEventListener("visibilitychange",C)),pe(()=>{M=!0,C()}),ye(()=>{M=!1,C()}),_e(()=>{document.removeEventListener("visibilitychange",C),_.dispose()}),t({refresh:q}),(n,e)=>{const l=W,f=O,u=Q,T=Z,Y=ee,$=te,z=U,H=X;return o(),c("div",we,[S(l,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"说明"},{default:E(()=>[...e[0]||(e[0]=[k("p",{class:"panel-tip"},[w(" 展示患者所有诊单中与 "),k("strong",null,"所有医生 / 医助账号"),w("分别产生的会话,按时间排序。 打开页面后自动加载并同步最新消息,页面可见期间每 30 秒继续检查更新。 ")],-1)])]),_:1}),k("div",Ee,[S(u,{type:"primary",link:"",loading:i(g),onClick:V},{default:E(()=>[S(f,{class:"mr-1"},{default:E(()=>[S(i(ne))]),_:1}),e[1]||(e[1]=w(" 同步最新 ",-1))]),_:1},8,["loading"]),S(u,{type:"primary",link:"",loading:i(A),onClick:q},{default:E(()=>[S(f,{class:"mr-1"},{default:E(()=>[S(i(oe))]),_:1}),e[2]||(e[2]=w(" 重新加载已归档 ",-1))]),_:1},8,["loading"])]),i(g)?(o(),c("p",be,[i(r).phase==="checking_accounts"?(o(),c(D,{key:0},[e[3]||(e[3]=w(" 正在核验聊天账号",-1)),i(r).candidateAccounts?(o(),c("span",Ae,""+m(i(r).checkedAccounts)+" / "+m(i(r).candidateAccounts),1)):v("",!0)],64)):(o(),c(D,{key:1},[e[4]||(e[4]=w("正在同步聊天记录",-1)),i(r).totalPeers?(o(),c("span",Ie,",已处理 "+m(i(r).processedPeers)+" / "+m(i(r).totalPeers)+" 个会话",1)):v("",!0),w(",新增 "+m(i(r).inserted)+" 条",1)],64))])):i(r).lastSyncAt?(o(),c("p",Pe,"上次同步:"+m(L(i(r).lastSyncAt)),1)):v("",!0),i(r).skippedAccounts?(o(),c("p",xe,"已跳过 "+m(i(r).skippedAccounts)+" 个未注册或已失效的聊天账号,已有归档不受影响。",1)):v("",!0),i(r).readError?(o(),R(l,{key:3,type:"error","show-icon":"",closable:!1,class:"mb-3",title:`读取聊天记录失败:${i(r).readError}`},null,8,["title"])):v("",!0),i(r).syncError?(o(),R(l,{key:4,type:"error","show-icon":"",closable:!1,class:"mb-3",title:`同步失败:${i(r).syncError}`},null,8,["title"])):v("",!0),i(r).partialErrors.length?(o(),R(l,{key:5,type:"warning","show-icon":"",closable:!1,class:"mb-3",title:"聊天记录未完全同步"},{default:E(()=>[(o(!0),c(D,null,j(i(r).partialErrors.slice(0,3),s=>(o(),c("p",{key:s,class:"panel-tip"},m(s),1))),128)),i(r).partialErrors.length>3?(o(),c("details",Ne,[k("summary",null,"查看其余 "+m(i(r).partialErrors.length-3)+" 项同步问题",1),(o(!0),c(D,null,j(i(r).partialErrors.slice(3),s=>(o(),c("p",{key:s,class:"panel-tip"},m(s),1))),128))])):v("",!0)]),_:1})):v("",!0),he((o(),c("div",Se,[x.value.length?(o(),c("div",Re,[(o(!0),c(D,null,j(x.value,s=>(o(),c("div",{key:`${s.raw.from_account||""}-${s.raw.to_account||""}-${s.raw.msg_id}`,class:ve(["chat-row",s.raw.is_from_doctor?"from-doctor":"from-patient"])},[k("div",Le,[k("span",qe,m(F(s.raw)),1),k("span",Ce,m(L(s.raw.time)),1),s.tag?(o(),R(T,{key:0,size:"small",type:"info",class:"ml-2"},{default:E(()=>[w(m(s.tag),1)]),_:2},1024)):v("",!0)]),k("div",$e,[s.raw.msg_type==="image"&&s.raw.image_url?(o(),R(Y,{key:0,src:s.raw.image_url,"preview-src-list":[s.raw.image_url],fit:"contain",class:"chat-img"},null,8,["src","preview-src-list"])):(s.raw.msg_type==="file"||s.raw.msg_type==="sound"||s.raw.msg_type==="video")&&s.raw.file_url?(o(),R($,{key:1,href:s.raw.file_url,target:"_blank",type:"primary"},{default:E(()=>[w(m(s.raw.file_name||"打开文件"),1)]),_:2},1032,["href"])):(o(),c(D,{key:2},[s.friendly?(o(),c("div",De,[k("div",Me,m(s.friendly.main),1),s.friendly.sub?(o(),c("div",Te,m(s.friendly.sub),1)):v("",!0)])):s.raw.msg_type==="text"&&s.raw.text?(o(),c("div",Be,m(s.raw.text),1)):s.raw.text?(o(),c("div",Ve,m(s.raw.text),1)):(o(),c("span",Ye,"(无法展示该消息类型)"))],64))])],2))),128))])):i(A)?v("",!0):(o(),R(z,{key:1,description:P.value},null,8,["description"]))])),[[H,i(A)&&!x.value.length]])])}}}),xt=ge(ze,[["__scopeId","data-v-ed56fa43"]]);export{xt as default};