2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import{i as ge,L as ye,B as be,C as we,P as ke,Q as xe,D as Ce,N as Me,T as Ve,M as Se,U as Le,V as Te,a as ze}from"./element-plus-CWHdHlgZ.js";import{w as le,s as Ne}from"./@vue/runtime-dom-DDAG46FW.js";import{M as Ee,O as A,S as $e,aq as Ue}from"./@element-plus/icons-vue-CbYn5zW9.js";import{r as L,j as he,_ as Be}from"./index-dDVfDL1w.js";import{f as ne,b as Pe,as as De,ak as u,I as k,J as t,aP as E,G as $,aN as i,O as f,H as ie,a as n,F as M,ap as Ie}from"./@vue/runtime-core-C6bnekPw.js";import{y as S,n as c,r as qe}from"./@vue/reactivity-DiY1c2vO.js";import{Q as s,o as Fe}from"./@vue/shared-mAAVTE9n.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-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 G(){let r=0;return{next(p){r+=1;const T=Array.isArray(p)?[...p]:p&&typeof p=="object"?{...p}:p;return Object.freeze({generation:r,snapshot:T})},invalidate(){return r+=1,r},isLatest(p){return(p==null?void 0:p.generation)===r}}}function Oe(r){return L.get({url:"/pharmacy.medicineMapping/lists",params:r})}function Re(){return L.get({url:"/pharmacy.medicineMapping/status"})}function je(r){return L.get({url:"/pharmacy.medicineMapping/catalogOptions",params:r})}function Ke(r){return L.post({url:"/pharmacy.medicineMapping/save",params:r})}function Ae(r){return L.post({url:"/pharmacy.medicineMapping/unlink",params:r})}function Ge(){return L.post({url:"/pharmacy.medicineMapping/sync"})}const Qe={class:"mapping-page"},He={class:"page-header"},Je={class:"status-strip"},We={class:"status-item"},Xe={class:"status-item warning"},Ye={class:"status-item"},Ze=["title"],ea={class:"table-wrap"},aa={class:"medicine-name"},ta={class:"subline"},la={class:"medicine-name"},ia={class:"subline code"},na={class:"subline"},sa={class:"subline"},oa={class:"pagination-wrap"},ra={class:"local-summary"},ua={class:"option-row"},da=ne({name:"pharmacyMedicineMapping"}),ma=ne({...da,setup(r){const p=()=>({sync_enabled:!1,cursor:0,last_success_time:0,last_failure_time:0,last_error_summary:"",is_syncing:!1,catalog_total:0,catalog_active:0,unmapped_local:0}),T=c(!1),D=c(!1),I=c(!1),q=c(!1),F=c(!1),Q=c([]),H=c(0),d=c(p()),o=qe({page_no:1,page_size:20,local_name:"",remote_keyword:"",mapping_status:""}),z=c(!1),v=c(null),b=c(""),U=c([]);let N;const O=G(),V=G(),R=G(),J=l=>{const e=Number(l||0);return Number.isFinite(e)?e.toFixed(2):"0.00"},W=l=>l?new Date(l*1e3).toLocaleString("zh-CN",{hour12:!1}):"",se=l=>l===1?"已映射":l===2?"远端失效":"未映射",oe=l=>l===1?"success":l===2?"warning":"info",C=async()=>{const l=O.next({...o});T.value=!0;try{const e=await Oe(l.snapshot);O.isLatest(l)&&(Q.value=e.lists||[],H.value=e.count||0)}finally{O.isLatest(l)&&(T.value=!1)}},h=async()=>{const l=R.next(void 0);D.value=!0;try{const e=await Re();R.isLatest(l)&&(d.value=e)}finally{R.isLatest(l)&&(D.value=!1)}},B=()=>{o.page_no=1,C()},re=()=>{o.local_name="",o.remote_keyword="",o.mapping_status="",B()},ue=async()=>{I.value=!0;try{const l=await Ge();he.msgSuccess(`同步完成:拉取 ${l.pulled},新增 ${l.created},更新 ${l.updated},停用 ${l.deactivated}`),await Promise.all([C(),h()])}finally{I.value=!1}},j=async(l,e=Number((m=>(m=v.value)==null?void 0:m.local_medicine_id)()||0))=>{var _;const g=V.next({keyword:l.trim(),localMedicineId:e});F.value=!0;try{const x=await je({keyword:g.snapshot.keyword,limit:30});V.isLatest(g)&&Number(((_=v.value)==null?void 0:_.local_medicine_id)||0)===g.snapshot.localMedicineId&&(U.value=x)}finally{V.isLatest(g)&&(F.value=!1)}return g},de=l=>{N&&window.clearTimeout(N),V.invalidate(),N=window.setTimeout(()=>void j(l),250)},me=async l=>{var _;N&&window.clearTimeout(N),V.invalidate();const e={...l},m=Number(e.local_medicine_id);v.value=e,b.value=e.mapping_status===1&&e.medicine_code||"",U.value=[],z.value=!0;const g=await j(e.local_name,m);!V.isLatest(g)||Number(((_=v.value)==null?void 0:_.local_medicine_id)||0)!==m||b.value&&!U.value.some(x=>x.medicine_code===b.value)&&await j(b.value,m)},pe=async()=>{if(!(!v.value||!b.value)){q.value=!0;try{await Ke({local_medicine_id:v.value.local_medicine_id,medicine_code:b.value}),z.value=!1,await Promise.all([C(),h()])}finally{q.value=!1}}},ce=async l=>{await ze.confirm(`确认解除“${l.local_name}”与 ${l.medicine_code} 的映射?`,"解除映射",{type:"warning",confirmButtonText:"解除",cancelButtonText:"取消"}),await Ae({local_medicine_id:l.local_medicine_id}),await Promise.all([C(),h()])};return Pe(()=>{Promise.all([C(),h()])}),(l,e)=>{var ae;const m=ge,g=we,_=be,x=xe,X=ke,Y=Ce,w=Me,Z=Ve,_e=Se,fe=Le,ve=Te,K=De("perms"),ee=ye;return u(),k("div",Qe,[t("header",He,[e[10]||(e[10]=t("h1",null,"洛阳药房药材映射",-1)),d.value.sync_enabled?E((u(),$(m,{key:0,type:"primary",icon:S(Ee),loading:I.value,onClick:ue},{default:i(()=>[...e[9]||(e[9]=[f(" 增量同步 ",-1)])]),_:1},8,["icon","loading"])),[[K,["pharmacy.medicineMapping/sync"]]]):ie("",!0)]),E((u(),k("section",Je,[t("div",We,[e[11]||(e[11]=t("span",null,"目录",-1)),t("strong",null,s(d.value.catalog_active)+" / "+s(d.value.catalog_total),1),e[12]||(e[12]=t("small",null,"启用 / 总数",-1))]),t("div",Xe,[e[13]||(e[13]=t("span",null,"未映射本地药材",-1)),t("strong",null,s(d.value.unmapped_local),1),e[14]||(e[14]=t("small",null,"仅统计启用药材",-1))]),t("div",Ye,[e[15]||(e[15]=t("span",null,"同步游标",-1)),t("strong",null,s(d.value.cursor),1),t("small",null,s(W(d.value.last_success_time)||"尚未成功同步"),1)]),t("div",{class:Fe(["status-item",{danger:!!d.value.last_error_summary}])},[e[16]||(e[16]=t("span",null,"最近同步",-1)),t("strong",null,s(d.value.is_syncing?"进行中":d.value.last_error_summary?"失败":"正常"),1),t("small",{title:d.value.last_error_summary},s(d.value.last_error_summary||W(d.value.last_failure_time)||"无失败记录"),9,Ze)],2)])),[[ee,D.value]]),n(Y,{class:"filter-bar",inline:"",onSubmit:e[3]||(e[3]=Ne(()=>{},["prevent"]))},{default:i(()=>[n(_,{label:"本地药材"},{default:i(()=>[n(g,{modelValue:o.local_name,"onUpdate:modelValue":e[0]||(e[0]=a=>o.local_name=a),clearable:"",placeholder:"名称","prefix-icon":S(A),onKeyup:le(B,["enter"])},null,8,["modelValue","prefix-icon"])]),_:1}),n(_,{label:"远端目录"},{default:i(()=>[n(g,{modelValue:o.remote_keyword,"onUpdate:modelValue":e[1]||(e[1]=a=>o.remote_keyword=a),clearable:"",placeholder:"名称或编码","prefix-icon":S(A),onKeyup:le(B,["enter"])},null,8,["modelValue","prefix-icon"])]),_:1}),n(_,{label:"映射状态"},{default:i(()=>[n(X,{modelValue:o.mapping_status,"onUpdate:modelValue":e[2]||(e[2]=a=>o.mapping_status=a),clearable:"",placeholder:"全部",style:{width:"150px"}},{default:i(()=>[n(x,{label:"已映射",value:"mapped"}),n(x,{label:"未映射",value:"unmapped"}),n(x,{label:"远端失效",value:"invalid"})]),_:1},8,["modelValue"])]),_:1}),n(_,null,{default:i(()=>[n(m,{type:"primary",icon:S(A),onClick:B},{default:i(()=>[...e[17]||(e[17]=[f("查询",-1)])]),_:1},8,["icon"]),n(m,{onClick:re},{default:i(()=>[...e[18]||(e[18]=[f("重置",-1)])]),_:1})]),_:1})]),_:1}),t("div",ea,[E((u(),$(_e,{data:Q.value,border:"",stripe:"","table-layout":"fixed"},{default:i(()=>[n(w,{label:"本地药材","min-width":"190",fixed:"left"},{default:i(({row:a})=>[t("div",aa,s(a.local_name),1),t("div",ta," ID "+s(a.local_medicine_id)+" · "+s(a.local_unit||"-"),1)]),_:1}),n(w,{label:"本地状态",width:"90",align:"center"},{default:i(({row:a})=>[n(Z,{type:a.local_status===1?"success":"info",size:"small"},{default:i(()=>[f(s(a.local_status===1?"启用":"停用"),1)]),_:2},1032,["type"])]),_:1}),n(w,{label:"映射状态",width:"105",align:"center"},{default:i(({row:a})=>[n(Z,{type:oe(a.mapping_status),size:"small"},{default:i(()=>[f(s(se(a.mapping_status)),1)]),_:2},1032,["type"])]),_:1}),n(w,{label:"洛阳药房目录","min-width":"250"},{default:i(({row:a})=>[a.medicine_code?(u(),k(M,{key:0},[t("div",la,s(a.remote_name||"目录项不可用"),1),t("div",ia,s(a.medicine_code),1)],64)):(u(),k(M,{key:1},[e[19]||(e[19]=t("div",{class:"medicine-name"},"-",-1)),e[20]||(e[20]=t("div",{class:"subline"},"未映射",-1))],64))]),_:1}),n(w,{label:"品牌","min-width":"130","show-overflow-tooltip":""},{default:i(({row:a})=>[f(s(a.mapping_status===0?"-":a.remote_brand||"-"),1)]),_:1}),n(w,{label:"单位",width:"80",align:"center"},{default:i(({row:a})=>[f(s(a.remote_unit||"-"),1)]),_:1}),n(w,{label:"价格",width:"155",align:"right"},{default:i(({row:a})=>[a.mapping_status!==0?(u(),k(M,{key:0},[t("div",null,"结算 ¥"+s(J(a.settlement_price)),1),t("div",na,"零售 ¥"+s(J(a.retail_price)),1)],64)):(u(),k(M,{key:1},[e[21]||(e[21]=t("div",null,"-",-1)),e[22]||(e[22]=t("div",{class:"subline"},"未映射",-1))],64))]),_:1}),n(w,{label:"版本 / 状态",width:"130",align:"center"},{default:i(({row:a})=>[a.medicine_code?(u(),k(M,{key:0},[t("div",null,"v"+s(a.catalog_version||0),1),t("div",sa,s(a.remote_status===1&&a.remote_deleted!==1?"远端启用":"远端停用"),1)],64)):(u(),k(M,{key:1},[e[23]||(e[23]=t("div",null,"-",-1)),e[24]||(e[24]=t("div",{class:"subline"},"未映射",-1))],64))]),_:1}),n(w,{label:"操作",width:"170",fixed:"right",align:"center"},{default:i(({row:a})=>[E((u(),$(m,{type:"primary",link:"",icon:S($e),disabled:a.local_status!==1,onClick:P=>me(a)},{default:i(()=>[f(s(a.mapping_status===1?"更换":"映射"),1)]),_:2},1032,["icon","disabled","onClick"])),[[K,["pharmacy.medicineMapping/save"]]]),a.mapping_status===1||a.mapping_status===2?E((u(),$(m,{key:0,type:"danger",link:"",icon:S(Ue),onClick:P=>ce(a)},{default:i(()=>[...e[25]||(e[25]=[f(" 解除 ",-1)])]),_:1},8,["icon","onClick"])),[[K,["pharmacy.medicineMapping/unlink"]]]):ie("",!0)]),_:1})]),_:1},8,["data"])),[[ee,T.value]])]),t("div",oa,[n(fe,{"current-page":o.page_no,"onUpdate:currentPage":e[4]||(e[4]=a=>o.page_no=a),"page-size":o.page_size,"onUpdate:pageSize":e[5]||(e[5]=a=>o.page_size=a),total:H.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next, jumper",onSizeChange:C,onCurrentChange:C},null,8,["current-page","page-size","total"])]),n(ve,{modelValue:z.value,"onUpdate:modelValue":e[8]||(e[8]=a=>z.value=a),title:`${((ae=v.value)==null?void 0:ae.mapping_status)===1?"更换":"建立"}药材映射`,width:"min(560px, calc(100vw - 32px))","destroy-on-close":""},{footer:i(()=>[n(m,{onClick:e[7]||(e[7]=a=>z.value=!1)},{default:i(()=>[...e[27]||(e[27]=[f("取消",-1)])]),_:1}),n(m,{type:"primary",loading:q.value,disabled:!b.value,onClick:pe},{default:i(()=>[...e[28]||(e[28]=[f(" 保存映射 ",-1)])]),_:1},8,["loading","disabled"])]),default:i(()=>{var a,P,te;return[t("div",ra,[e[26]||(e[26]=t("span",null,"本地药材",-1)),t("strong",null,s((a=v.value)==null?void 0:a.local_name),1),t("small",null,"ID "+s((P=v.value)==null?void 0:P.local_medicine_id)+" · "+s(((te=v.value)==null?void 0:te.local_unit)||"-"),1)]),n(Y,{"label-position":"top",class:"mapping-form"},{default:i(()=>[n(_,{label:"洛阳药房药材"},{default:i(()=>[n(X,{modelValue:b.value,"onUpdate:modelValue":e[6]||(e[6]=y=>b.value=y),filterable:"",remote:"","reserve-keyword":"",clearable:"","remote-method":de,loading:F.value,placeholder:"输入药材名称或编码检索",style:{width:"100%"}},{default:i(()=>[(u(!0),k(M,null,Ie(U.value,y=>(u(),$(x,{key:y.medicine_code,label:`${y.name} · ${y.medicine_code}`,value:y.medicine_code},{default:i(()=>[t("div",ua,[t("span",null,s(y.name),1),t("small",null,s(y.medicine_code)+" · "+s(y.brand||"无品牌")+" · "+s(y.unit),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),_:1})]),_:1})]}),_:1},8,["modelValue","title"])])}}}),Ja=Be(ma,[["__scopeId","data-v-1b7afda4"]]);export{Ja as default};
|