You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
13 KiB

import{g as W,B as X,c as r,a as t,p as a,q as Q,F,r as N,H as T,t as l,l as Z,m as tt,v as b,s as et,x as i,y as B,o as u}from"./CCjf5Io-.js";import{u as st}from"./C-6Qe-lq.js";import{u as nt}from"./DTVGNZEd.js";import"./42htcooJ.js";const ot={class:"space-y-6"},lt={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-4"},at={class:"flex items-end gap-3 flex-wrap"},dt={class:"form-control"},rt=["value"],it={class:"form-control"},ut=["disabled"],ct={class:"bg-white rounded-xl shadow-sm border border-slate-100"},mt={class:"overflow-x-auto"},bt={class:"table table-zebra"},pt={key:0},vt={key:1},ft={colspan:"9",class:"text-center text-slate-400 py-8"},xt={class:"font-mono text-base font-bold text-indigo-700"},gt={class:"text-sm"},wt={class:"text-sm"},ht={class:"text-sm text-slate-500"},yt={class:"text-sm"},kt={class:"text-sm"},_t={class:"text-sm"},Ct={key:0,class:"badge badge-success badge-sm text-white"},Vt={key:1,class:"badge badge-ghost badge-sm"},Mt={class:"flex gap-1"},Ut=["onClick"],Dt=["onClick"],Qt=["onClick"],Ft=["onClick"],Nt={class:"flex items-center gap-3 mb-5"},Tt={class:"text-lg font-semibold text-slate-800"},qt={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"},Lt={class:"form-control mb-4"},St=["value"],Bt={class:"form-control mb-4"},Et={class:"grid grid-cols-3 gap-3 mb-4"},$t={class:"form-control"},Rt={class:"form-control"},jt={class:"form-control"},It={class:"grid grid-cols-2 gap-3 mb-4"},Ht={class:"form-control"},Pt={class:"form-control"},zt={class:"form-control mb-6"},At={class:"label cursor-pointer justify-start gap-3"},Yt={class:"modal-box max-w-md"},Gt={class:"flex flex-col items-center gap-4"},Jt={class:"text-center"},Kt={class:"font-mono text-2xl font-bold text-indigo-700 tracking-widest"},Ot="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs/qrcode.min.js",se=W({__name:"code",setup(Wt){const{webApi:c}=st(),{success:g,error:p,warn:w}=nt(),h=i("list"),C=i(!1),v=i(!1),m=i(0),V=i(-1),y=i([]),M=i([]),k=i([]),U=B({}),o=B({code:"",productid:0,remark:"",bindrewardvpitime:0,bindrewardtranslate:0,bindrewardmeeting:0,maxuses:0,expire:"",disabled:!1});function E(n){return n?new Date(n*1e3).toLocaleString():"永久"}function $(n){if(!n)return"";const e=new Date(n*1e3),s=d=>d<10?"0"+d:""+d;return e.getFullYear()+"-"+s(e.getMonth()+1)+"-"+s(e.getDate())+"T"+s(e.getHours())+":"+s(e.getMinutes())}function R(n){return n?Math.floor(new Date(n).getTime()/1e3):0}function j(n){return U[n.brandid]||(n.brandid?"品牌商#"+n.brandid:"-")}function I(n){const e=k.value.find(s=>s.id===n.productid);return e?e.devicename||"#"+n.productid:n.productid?"#"+n.productid:"-"}function _(){h.value="list",f()}function H(){_()}async function f(){C.value=!0;try{const n=await c("getfactorypubliccodes",{brandid:m.value,status:V.value});y.value=n?.codes??[]}catch(n){p(n?.message??"获取公码列表失败"),y.value=[]}finally{C.value=!1}}function q(n){if(!m.value){w("请先选择品牌商");return}n?(v.value=!0,o.code=n.code,o.productid=n.productid||0,o.remark=n.remark||"",o.bindrewardvpitime=n.bindrewardvpitime||0,o.bindrewardtranslate=n.bindrewardtranslate||0,o.bindrewardmeeting=n.bindrewardmeeting||0,o.maxuses=n.maxuses||0,o.expire=$(n.expiretime),o.disabled=n.status===1):(v.value=!1,o.code="",o.productid=0,o.remark="",o.bindrewardvpitime=0,o.bindrewardtranslate=0,o.bindrewardmeeting=0,o.maxuses=0,o.expire="",o.disabled=!1),h.value="form"}async function P(){const n={productid:Number(o.productid)||0,remark:o.remark,maxuses:Number(o.maxuses)||0,expiretime:R(o.expire),bindrewardvpitime:Number(o.bindrewardvpitime)||0,bindrewardtranslate:Number(o.bindrewardtranslate)||0,bindrewardmeeting:Number(o.bindrewardmeeting)||0};try{if(v.value)n.code=o.code,n.status=o.disabled?1:0,await c("updatefactorypubliccode",n),g("保存成功");else{n.brandid=m.value;const e=await c("createfactorypubliccode",n);g("新公码已生成:"+(e?.code?.code||""))}_()}catch(e){p(e?.message??"保存失败")}}async function z(n){const e=n.status===0?1:0;try{await c("updatefactorypubliccode",{code:n.code,productid:n.productid||0,remark:n.remark||"",status:e,maxuses:n.maxuses||0,expiretime:n.expiretime||0,bindrewardvpitime:n.bindrewardvpitime||0,bindrewardtranslate:n.bindrewardtranslate||0,bindrewardmeeting:n.bindrewardmeeting||0}),g(e===1?"已停用":"已启用"),f()}catch(s){p(s?.message??"操作失败")}}function A(n){window.confirm(`确定删除公码 "${n}" 吗?删除后该码无法再被领取(已领取记录保留)`)&&c("delfactorypubliccode",{code:n}).then(()=>{g("删除成功"),f()}).catch(e=>p(e?.message??"删除失败"))}const L=i(null),D=i(null),x=i("");function Y(){return new Promise((n,e)=>{const s=window;if(s.QRCode){n(s.QRCode);return}const d=document.createElement("script");d.src=Ot,d.onload=()=>n(s.QRCode),d.onerror=()=>e(new Error("二维码库加载失败")),document.head.appendChild(d)})}async function G(n){x.value=n,L.value?.showModal();let e;try{e=await Y()}catch{p("二维码库加载失败");return}const s=D.value;!s||!e||(s.innerHTML="",new e(s,{text:n,width:240,height:240,colorDark:"#1E293B",colorLight:"#FFFFFF",correctLevel:e.CorrectLevel.H}))}function S(){const n=D.value;if(!n)return"";const e=n.querySelector("canvas");if(e)return e.toDataURL("image/png");const s=n.querySelector("img");return s?s.src:""}function J(){const n=S();if(!n){w("二维码尚未生成");return}const e=document.createElement("a");e.href=n,e.download="publiccode_"+x.value+".png",document.body.appendChild(e),e.click(),document.body.removeChild(e)}function K(){const n=S();if(!n){w("二维码尚未生成");return}const e=window.open("","_blank");if(!e){w("浏览器拦截了打印窗口");return}e.document.write("<html><head><title>"+x.value+'</title><style>body{font-family:sans-serif;text-align:center;padding:48px;}img{width:320px;height:320px;}h2{font-size:36px;letter-spacing:6px;margin:24px 0 8px;}p{color:#666;font-size:14px;}</style></head><body><img src="'+n+'" /><h2>'+x.value+"</h2><p>新用户扫码领取奖励</p><script>window.onload=function(){window.print();}<\/script></body></html>"),e.document.close()}async function O(){try{const e=(await c("getbrands",{}))?.brands??[];M.value=e,e.forEach(s=>{U[s.id]=s.brand||"品牌商#"+s.id})}catch{M.value=[]}try{const n=await c("getproducts",{});k.value=n?.products??[]}catch{k.value=[]}f()}return X(O),(n,e)=>(u(),r("div",ot,[t("div",lt,[t("div",at,[t("div",dt,[e[12]||(e[12]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"品牌商")],-1)),a(t("select",{"onUpdate:modelValue":e[0]||(e[0]=s=>m.value=s),class:"select select-bordered select-sm",style:{"min-width":"200px"},onChange:H},[e[11]||(e[11]=t("option",{value:0},"全部品牌商",-1)),(u(!0),r(F,null,N(M.value,s=>(u(),r("option",{key:s.id,value:s.id},l(U[s.id]),9,rt))),128))],544),[[Q,m.value,void 0,{number:!0}]])]),t("div",it,[e[14]||(e[14]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"状态")],-1)),a(t("select",{"onUpdate:modelValue":e[1]||(e[1]=s=>V.value=s),class:"select select-bordered select-sm",onChange:f},[...e[13]||(e[13]=[t("option",{value:-1},"全部",-1),t("option",{value:0},"启用",-1),t("option",{value:1},"停用",-1)])],544),[[Q,V.value,void 0,{number:!0}]])]),t("button",{class:"btn btn-primary btn-sm text-white",title:"新增公码需先选择具体品牌商",disabled:m.value===0,onClick:e[2]||(e[2]=s=>q())},"+ 新增公码",8,ut)])]),a(t("div",null,[t("div",ct,[t("div",mt,[t("table",bt,[e[16]||(e[16]=t("thead",null,[t("tr",null,[t("th",null,"公码"),t("th",null,"品牌商"),t("th",null,"关联产品"),t("th",null,"备注"),t("th",null,"VIP天/翻译分/会议分"),t("th",null,"核销/上限"),t("th",null,"失效时间"),t("th",null,"状态"),t("th",null,"操作")])],-1)),t("tbody",null,[C.value?(u(),r("tr",pt,[...e[15]||(e[15]=[t("td",{colspan:"9",class:"text-center text-slate-400 py-8"},"加载中…",-1)])])):y.value.length?Z("",!0):(u(),r("tr",vt,[t("td",ft,l(m.value?"暂无公码,点击右上角“新增公码”创建":"暂无公码"),1)])),(u(!0),r(F,null,N(y.value,s=>(u(),r("tr",{key:s.code},[t("td",xt,l(s.code||""),1),t("td",gt,l(j(s)),1),t("td",wt,l(I(s)),1),t("td",ht,l(s.remark||"-"),1),t("td",yt,l(s.bindrewardvpitime||0)+" / "+l(s.bindrewardtranslate||0)+" / "+l(s.bindrewardmeeting||0),1),t("td",kt,l(s.useduses||0)+" / "+l(s.maxuses?s.maxuses:"∞"),1),t("td",_t,l(E(s.expiretime)),1),t("td",null,[s.status===0?(u(),r("span",Ct,"启用")):(u(),r("span",Vt,"停用"))]),t("td",null,[t("div",Mt,[t("button",{class:"btn btn-ghost btn-xs text-indigo-600",onClick:d=>G(s.code)},"二维码",8,Ut),t("button",{class:"btn btn-ghost btn-xs",onClick:d=>q(s)},"编辑",8,Dt),t("button",{class:"btn btn-ghost btn-xs text-amber-600",onClick:d=>z(s)},l(s.status===0?"停用":"启用"),9,Qt),t("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:d=>A(s.code)},"删除",8,Ft)])])]))),128))])])])])],512),[[T,h.value==="list"]]),a(t("div",null,[t("div",Nt,[t("button",{class:"btn btn-ghost btn-sm",onClick:_},"← 返回公码列表"),t("h2",Tt,l(v.value?`编辑公码 ${o.code}`:"新增公码"),1)]),t("div",qt,[t("form",{onSubmit:tt(P,["prevent"])},[t("div",Lt,[e[18]||(e[18]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"关联产品(选填,仅作分类)")],-1)),a(t("select",{"onUpdate:modelValue":e[3]||(e[3]=s=>o.productid=s),class:"select select-bordered w-full"},[e[17]||(e[17]=t("option",{value:0},"不关联",-1)),(u(!0),r(F,null,N(k.value,s=>(u(),r("option",{key:s.id,value:s.id},l(s.devicename||"#"+s.id),9,St))),128))],512),[[Q,o.productid,void 0,{number:!0}]])]),t("div",Bt,[e[19]||(e[19]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"备注")],-1)),a(t("input",{"onUpdate:modelValue":e[4]||(e[4]=s=>o.remark=s),type:"text",class:"input input-bordered w-full",placeholder:"例如:包装海报-2026春季"},null,512),[[b,o.remark]])]),t("div",Et,[t("div",$t,[e[20]||(e[20]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"奖励VIP天数")],-1)),a(t("input",{"onUpdate:modelValue":e[5]||(e[5]=s=>o.bindrewardvpitime=s),type:"number",min:"0",class:"input input-bordered"},null,512),[[b,o.bindrewardvpitime,void 0,{number:!0}]])]),t("div",Rt,[e[21]||(e[21]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"奖励翻译分钟")],-1)),a(t("input",{"onUpdate:modelValue":e[6]||(e[6]=s=>o.bindrewardtranslate=s),type:"number",min:"0",class:"input input-bordered"},null,512),[[b,o.bindrewardtranslate,void 0,{number:!0}]])]),t("div",jt,[e[22]||(e[22]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"奖励会议分钟")],-1)),a(t("input",{"onUpdate:modelValue":e[7]||(e[7]=s=>o.bindrewardmeeting=s),type:"number",min:"0",class:"input input-bordered"},null,512),[[b,o.bindrewardmeeting,void 0,{number:!0}]])])]),t("div",It,[t("div",Ht,[e[23]||(e[23]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"最大核销人数(0=不限)")],-1)),a(t("input",{"onUpdate:modelValue":e[8]||(e[8]=s=>o.maxuses=s),type:"number",min:"0",class:"input input-bordered"},null,512),[[b,o.maxuses,void 0,{number:!0}]])]),t("div",Pt,[e[24]||(e[24]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"失效时间(留空=永久)")],-1)),a(t("input",{"onUpdate:modelValue":e[9]||(e[9]=s=>o.expire=s),type:"datetime-local",class:"input input-bordered"},null,512),[[b,o.expire]])])]),a(t("div",zt,[t("label",At,[a(t("input",{"onUpdate:modelValue":e[10]||(e[10]=s=>o.disabled=s),type:"checkbox",class:"checkbox"},null,512),[[et,o.disabled]]),e[25]||(e[25]=t("span",{class:"label-text font-medium"},"停用",-1))])],512),[[T,v.value]]),t("div",{class:"flex gap-3"},[t("button",{type:"button",class:"btn btn-ghost",onClick:_},"取消"),e[26]||(e[26]=t("button",{type:"submit",class:"btn btn-primary text-white"},"保存",-1))])],32)])],512),[[T,h.value==="form"]]),t("dialog",{ref_key:"qrModal",ref:L,class:"modal"},[t("div",Yt,[e[30]||(e[30]=t("h3",{class:"font-bold text-lg mb-4 text-slate-800"},"公码二维码",-1)),t("div",Gt,[t("div",{ref_key:"qrCanvas",ref:D,class:"p-3 bg-white border border-slate-200 rounded-lg"},null,512),t("div",Jt,[e[27]||(e[27]=t("div",{class:"text-xs text-slate-500 mb-1"},"公码",-1)),t("div",Kt,l(x.value),1)]),e[28]||(e[28]=t("div",{class:"text-xs text-slate-400 text-center"}," 新用户使用 App 扫描即可领取奖励,每人仅可领取 1 次 ",-1))]),t("div",{class:"modal-action"},[t("button",{type:"button",class:"btn btn-outline btn-sm",onClick:J},"下载图片"),t("button",{type:"button",class:"btn btn-outline btn-sm",onClick:K},"打印"),e[29]||(e[29]=t("form",{method:"dialog"},[t("button",{class:"btn btn-sm"},"关闭")],-1))])]),e[31]||(e[31]=t("form",{method:"dialog",class:"modal-backdrop"},[t("button",null,"close")],-1))],512)]))}});export{se as default};