Files
zyt/server/public/admin/assets/qywx-Cg8yhQdu.js
T
2026-04-20 09:04:54 +08:00

2 lines
12 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 yt,J as gt,U as vt,i as bt,D as wt,B as xt,C as St,M as Vt,N as kt,q as Ct,r as Et,L as Nt,g as qt,P as ht,Q as Tt,$ as It,a8 as Dt,a9 as Ut}from"./element-plus-6h1hTCrQ.js";import{_ as Lt}from"./index.vue_vue_type_script_setup_true_lang-CLVBLrJv.js";import{w as Y}from"./@vue/runtime-dom-iFk_KP8y.js";import{L as $t,M as Pt}from"./@element-plus/icons-vue-jYCthPJY.js";import{u as jt}from"./usePaging-B_C_SZ2Z.js";import{r as h,i as V,_ as At}from"./index-55neFmjq.js";import{f as zt,b as Bt,d as Ft,ak as c,I as x,a as l,aN as n,J as r,O as i,aP as Kt,G as $,F as Z,ap as tt,H as Ot,A as Mt}from"./@vue/runtime-core-C0pg79pw.js";import{Q as u}from"./@vue/shared-mAAVTE9n.js";import{y as g,a as Gt,o as P,r as K}from"./@vue/reactivity-BIbyPIZJ.js";import"./lodash-es-C2A-Pj28.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./lodash-D3kF6u-c.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-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.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-CZvD9OL_.js";import"./tslib-BDyQ-Jie.js";import"./zrender-BQyIY4j9.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";function Jt(T){return h.get({url:"/qywx.customer/lists",params:T})}function Qt(){return h.post({url:"/qywx.customer/sync"})}function Rt(){return h.get({url:"/qywx.customer/stats"})}function Ht(){return h.get({url:"/qywx.customer/getSyncSettings"})}function Wt(T){return h.post({url:"/qywx.customer/saveSyncSettings",params:T})}const Xt={class:"qywx-customer-page p-4"},Yt={class:"flex items-center justify-between"},Zt={class:"flex gap-2"},te={class:"grid grid-cols-4 gap-4 mb-4"},ee={class:"text-2xl font-bold text-primary"},le={class:"text-2xl font-bold text-success"},ne={class:"text-sm font-medium"},ae={class:"flex items-center gap-2"},se={class:"font-medium"},oe={class:"text-xs text-gray-400"},ie={key:0},re={key:1,class:"text-gray-400"},ue={class:"flex justify-end mt-4"},de={key:0},me={key:1,class:"text-gray-400"},ce=zt({__name:"qywx",setup(T){const k=P(!1),C=P(!1),j=P(!1),d=P(null),_=K({total:0,today:0,lastSync:"",syncStatus:"idle",syncStatusText:"未同步"}),et=Mt(()=>{switch(_.syncStatus){case"success":return"success";case"syncing":return"warning";case"failed":return"danger";default:return"info"}}),m=K({auto_sync:!1,interval:3600}),v=K({name:"",follow_user:""});let E=null,I=null;function A(){I!==null&&(clearInterval(I),I=null)}async function lt(e){return Jt(e)}const{pager:N,getLists:D,resetPage:z,resetParams:nt}=jt({fetchFun:lt,params:v});function at(){v.name="",v.follow_user="",nt()}function st(){A();let e=0;I=window.setInterval(async()=>{e+=1,await B(),await D(),(_.syncStatus!=="syncing"||e>=120)&&(A(),k.value=!1,e>=120&&_.syncStatus==="syncing"?V.msgWarning("长时间仍为「同步中」,请刷新页面或查看服务器 runtime/log/qywx_sync.log(可能未安装 CLI php 或禁用了 exec"):_.syncStatus==="failed"&&V.msgError("同步失败,请查看服务器 runtime/log/qywx_sync.log 或后台同步状态"))},3e3)}async function O(e){const t=(e==null?void 0:e.silent)===!0;k.value=!0;try{const s=await Qt();t||V.msgSuccess((s==null?void 0:s.message)||"操作成功"),await B(),await D(),s!=null&&s.background?st():k.value=!1}catch(s){const o=(s==null?void 0:s.message)||(s==null?void 0:s.msg)||"同步失败";(!t||!String(o).includes("正在执行"))&&V.msgError(o),k.value=!1}}async function B(){try{const e=await Rt();e&&typeof e=="object"&&Object.assign(_,e)}catch(e){console.error("加载统计失败",e)}}async function ot(){try{const e=await Ht();e&&typeof e=="object"&&Object.assign(m,e),m.auto_sync&&M()}catch(e){console.error("加载同步设置失败",e)}}async function it(){try{await Wt(m),V.msgSuccess("保存成功"),C.value=!1,G(),m.auto_sync&&M()}catch(e){V.msgError((e==null?void 0:e.message)||"保存失败")}}function M(){E||(E=window.setInterval(()=>{O({silent:!0})},m.interval*1e3))}function G(){E&&(clearInterval(E),E=null)}function rt(e){d.value=e,j.value=!0}function J(e){const t=String((e==null?void 0:e.admin_name)??"").trim(),s=String((e==null?void 0:e.userid)??"").trim(),o=String((e==null?void 0:e.name)??"").trim();return t||(o&&s?`${o}${s}`:o||s||"—")}function U(e){const t=String((e==null?void 0:e.admin_name)??"").trim(),s=String((e==null?void 0:e.userid)??"").trim(),o=[];return t&&o.push("后台:"+t),s&&o.push("企微:"+s),o.join("")}function Q(e){if(!e)return null;const t=Number(e.external_first_add_time??0);if(t>0)return t;const s=e.follow_users;if(Array.isArray(s)&&s.length>0){let o=0;for(const f of s){const b=Number((f==null?void 0:f.createtime)??0);b>0&&(o===0||b<o)&&(o=b)}if(o>0)return o}return e.create_time??null}function L(e){if(e===""||e===null||e===void 0)return"—";const t=Number(e),s=typeof e=="string"&&/^\d+$/.test(e.trim());let o;return typeof e=="number"?o=e<1e12?e*1e3:e:!Number.isNaN(t)&&s?o=t<1e12?t*1e3:t:o=new Date(e).getTime(),Number.isNaN(o)?"—":new Date(o).toLocaleString("zh-CN")}return Bt(()=>{D(),B(),ot()}),Ft(()=>{G(),A()}),(e,t)=>{const s=bt,o=yt,f=gt,b=vt,R=St,q=xt,H=wt,ut=Ct,w=kt,W=Et,dt=Vt,mt=Lt,ct=qt,S=Tt,ft=ht,X=It,y=Ut,pt=Dt,_t=Nt;return c(),x("div",Xt,[l(f,{shadow:"never",class:"mb-4"},{header:n(()=>[r("div",Yt,[t[12]||(t[12]=r("span",{class:"text-lg font-semibold"},"企业微信客户管理",-1)),r("div",Zt,[l(s,{type:"primary",loading:k.value,onClick:t[0]||(t[0]=a=>O())},{icon:n(()=>[l(g($t))]),default:n(()=>[t[10]||(t[10]=i(" 立即同步 ",-1))]),_:1},8,["loading"]),l(s,{onClick:t[1]||(t[1]=a=>C.value=!0)},{icon:n(()=>[l(g(Pt))]),default:n(()=>[t[11]||(t[11]=i(" 同步设置 ",-1))]),_:1})])])]),default:n(()=>[l(o,{title:"功能说明",type:"info",closable:!1,class:"mb-4"},{default:n(()=>[...t[13]||(t[13]=[r("div",{class:"text-sm"},[r("p",null,"自动从企业微信同步外部联系人(客户)信息,包括客户基本信息、跟进人等。"),r("p",{class:"mt-1"},"同步后的数据可用于患者信息匹配和自动关联。")],-1)])]),_:1}),r("div",te,[l(f,{shadow:"hover"},{default:n(()=>[t[14]||(t[14]=r("div",{class:"text-gray-500 text-sm mb-1"},"总客户数",-1)),r("div",ee,u(_.total),1)]),_:1}),l(f,{shadow:"hover"},{default:n(()=>[t[15]||(t[15]=r("div",{class:"text-gray-500 text-sm mb-1"},"今日新增",-1)),r("div",le,u(_.today),1)]),_:1}),l(f,{shadow:"hover"},{default:n(()=>[t[16]||(t[16]=r("div",{class:"text-gray-500 text-sm mb-1"},"最后同步",-1)),r("div",ne,u(_.lastSync||"未同步"),1)]),_:1}),l(f,{shadow:"hover"},{default:n(()=>[t[17]||(t[17]=r("div",{class:"text-gray-500 text-sm mb-1"},"同步状态",-1)),l(b,{type:et.value,size:"small"},{default:n(()=>[i(u(_.syncStatusText),1)]),_:1},8,["type"])]),_:1})])]),_:1}),l(f,{shadow:"never"},{default:n(()=>[l(H,{model:v,inline:"",class:"mb-4"},{default:n(()=>[l(q,{label:"客户名称"},{default:n(()=>[l(R,{modelValue:v.name,"onUpdate:modelValue":t[2]||(t[2]=a=>v.name=a),placeholder:"搜索客户名称",clearable:"",onKeyup:Y(g(z),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),l(q,{label:"跟进人"},{default:n(()=>[l(R,{modelValue:v.follow_user,"onUpdate:modelValue":t[3]||(t[3]=a=>v.follow_user=a),placeholder:"跟进人姓名",clearable:"",onKeyup:Y(g(z),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),l(q,null,{default:n(()=>[l(s,{type:"primary",onClick:g(z)},{default:n(()=>[...t[18]||(t[18]=[i("查询",-1)])]),_:1},8,["onClick"]),l(s,{onClick:at},{default:n(()=>[...t[19]||(t[19]=[i("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"]),Kt((c(),$(dt,{data:g(N).lists,stripe:""},{default:n(()=>[l(w,{label:"客户信息","min-width":"200"},{default:n(({row:a})=>[r("div",ae,[l(ut,{size:40,src:a.avatar},null,8,["src"]),r("div",null,[r("div",se,u(a.name),1),r("div",oe,u(a.external_userid),1)])])]),_:1}),l(w,{label:"类型",width:"80"},{default:n(({row:a})=>[l(b,{size:"small"},{default:n(()=>[i(u(a.type===1?"微信":"企微"),1)]),_:2},1024)]),_:1}),l(w,{label:"性别",width:"60"},{default:n(({row:a})=>[i(u(a.gender===1?"男":a.gender===2?"女":"未知"),1)]),_:1}),l(w,{label:"跟进人","min-width":"150"},{default:n(({row:a})=>[a.follow_users&&a.follow_users.length?(c(),x("div",ie,[(c(!0),x(Z,null,tt(a.follow_users,(p,F)=>(c(),$(W,{key:(p.userid||"")+"-"+F,disabled:!U(p),content:U(p),placement:"top"},{default:n(()=>[l(b,{size:"small",class:"mr-1 mb-1"},{default:n(()=>[i(u(J(p)),1)]),_:2},1024)]),_:2},1032,["disabled","content"]))),128))])):(c(),x("span",re,"—"))]),_:1}),l(w,{label:"添加时间",width:"160"},{default:n(({row:a})=>[i(u(L(Q(a))),1)]),_:1}),l(w,{label:"更新时间",width:"160"},{default:n(({row:a})=>[i(u(L(a.update_time)),1)]),_:1}),l(w,{label:"操作",width:"120",fixed:"right"},{default:n(({row:a})=>[l(s,{type:"primary",link:"",onClick:p=>rt(a)},{default:n(()=>[...t[20]||(t[20]=[i("查看详情",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[_t,g(N).loading]]),r("div",ue,[l(mt,{modelValue:g(N),"onUpdate:modelValue":t[4]||(t[4]=a=>Gt(N)?N.value=a:null),onChange:g(D)},null,8,["modelValue","onChange"])])]),_:1}),l(X,{modelValue:C.value,"onUpdate:modelValue":t[8]||(t[8]=a=>C.value=a),title:"同步设置",width:"500px"},{footer:n(()=>[l(s,{onClick:t[7]||(t[7]=a=>C.value=!1)},{default:n(()=>[...t[22]||(t[22]=[i("取消",-1)])]),_:1}),l(s,{type:"primary",onClick:it},{default:n(()=>[...t[23]||(t[23]=[i("保存",-1)])]),_:1})]),default:n(()=>[l(H,{model:m,"label-width":"120px"},{default:n(()=>[l(q,{label:"自动同步"},{default:n(()=>[l(ct,{modelValue:m.auto_sync,"onUpdate:modelValue":t[5]||(t[5]=a=>m.auto_sync=a)},null,8,["modelValue"]),t[21]||(t[21]=r("div",{class:"text-xs text-gray-400 mt-1"}," 开启后将定时自动同步企业微信客户数据 ",-1))]),_:1}),l(q,{label:"同步间隔"},{default:n(()=>[l(ft,{modelValue:m.interval,"onUpdate:modelValue":t[6]||(t[6]=a=>m.interval=a),disabled:!m.auto_sync},{default:n(()=>[l(S,{label:"每小时",value:3600}),l(S,{label:"每2小时",value:7200}),l(S,{label:"每4小时",value:14400}),l(S,{label:"每6小时",value:21600}),l(S,{label:"每12小时",value:43200}),l(S,{label:"每天",value:86400})]),_:1},8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),l(X,{modelValue:j.value,"onUpdate:modelValue":t[9]||(t[9]=a=>j.value=a),title:"客户详情",width:"600px"},{default:n(()=>[d.value?(c(),$(pt,{key:0,column:2,border:""},{default:n(()=>[l(y,{label:"客户名称"},{default:n(()=>[i(u(d.value.name),1)]),_:1}),l(y,{label:"External ID"},{default:n(()=>[i(u(d.value.external_userid),1)]),_:1}),l(y,{label:"性别"},{default:n(()=>[i(u(d.value.gender===1?"男":d.value.gender===2?"女":"未知"),1)]),_:1}),l(y,{label:"类型"},{default:n(()=>[i(u(d.value.type===1?"微信用户":"企业微信用户"),1)]),_:1}),l(y,{label:"企业名称",span:2},{default:n(()=>[i(u(d.value.corp_name||"—"),1)]),_:1}),l(y,{label:"职位",span:2},{default:n(()=>[i(u(d.value.position||"—"),1)]),_:1}),l(y,{label:"添加时间",span:2},{default:n(()=>[i(u(L(Q(d.value))),1)]),_:1}),l(y,{label:"更新时间",span:2},{default:n(()=>[i(u(L(d.value.update_time)),1)]),_:1}),l(y,{label:"跟进人",span:2},{default:n(()=>{var a;return[(a=d.value.follow_users)!=null&&a.length?(c(),x("div",de,[(c(!0),x(Z,null,tt(d.value.follow_users,(p,F)=>(c(),$(W,{key:(p.userid||"")+"-"+F,disabled:!U(p),content:U(p),placement:"top"},{default:n(()=>[l(b,{size:"small",class:"mr-1 mb-1"},{default:n(()=>[i(u(J(p)),1)]),_:2},1024)]),_:2},1032,["disabled","content"]))),128))])):(c(),x("span",me,"—"))]}),_:1})]),_:1})):Ot("",!0)]),_:1},8,["modelValue"])])}}}),Ye=At(ce,[["__scopeId","data-v-c52add30"]]);export{Ye as default};