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.
 
 
 
 
 
 

29 lines
31 KiB

import{g as ge,j as ye,B as he,c as d,a as e,m as r,v as O,F as E,r as $,q as x,l as z,H as K,t as i,J as we,s as Bt,p as Yt,n as Kt,d as g,z as S,x as n,y as ke,o as u}from"./T3_facgV.js";import{u as Ce}from"./YYZWHM5Z.js";import{u as _e}from"./D7TmXHpa.js";import"./BaPL5gDJ.js";const Se={class:"space-y-6"},Me={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-4"},Ue={class:"flex items-end gap-3 flex-wrap"},Ve={class:"form-control"},De=["value"],Ae={class:"form-control"},je=["value"],Ne={class:"form-control"},Be={class:"form-control"},Ie={class:"grid grid-cols-3 gap-4"},Te={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-5"},Pe={class:"text-2xl font-bold text-slate-800"},Le={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-5"},Oe={class:"text-2xl font-bold text-indigo-600"},Ee={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-5"},$e={class:"text-base font-semibold text-slate-700"},ze={class:"bg-white rounded-xl shadow-sm border border-slate-100 mt-5"},Fe={class:"flex items-center justify-between px-5 py-3 border-b border-slate-100"},qe={class:"flex items-center gap-2"},Re={class:"text-xs text-slate-400"},He={class:"overflow-x-auto",style:{"max-height":"360px"}},Ge={class:"table table-pin-rows text-sm"},Je={key:0},Xe={key:1},Ye={colspan:"9",class:"text-center text-red-400 py-8"},Ke={key:2},Qe={class:"text-xs text-slate-500 whitespace-nowrap"},We={class:"text-xs"},Ze={class:"text-xs"},ts={class:"text-xs font-medium"},es={class:"font-mono text-xs"},ss={class:"font-mono text-xs"},ls={class:"font-mono text-xs"},os={class:"text-right font-medium"},ns={class:"flex gap-1"},as=["onClick"],is=["onClick"],ds={class:"bg-white rounded-xl shadow-sm border border-slate-100 mt-5"},us={class:"flex items-center justify-between px-5 py-3 border-b border-slate-100 flex-wrap gap-2"},rs={class:"flex items-end gap-2 flex-wrap"},cs={class:"form-control"},vs={class:"form-control"},bs={class:"form-control"},ps={class:"form-control"},ms={class:"form-control"},xs={class:"form-control"},fs={class:"form-control"},gs={class:"form-control"},ys=["disabled"],hs=["disabled"],ws=["disabled"],ks=["disabled"],Cs={class:"overflow-x-auto"},_s={class:"w-8"},Ss={key:0},Ms={key:1},Us={colspan:"10",class:"text-center text-red-400 py-8"},Vs={key:2},Ds=["value"],As={class:"font-mono text-xs"},js={class:"font-mono text-xs"},Ns={key:0,class:"badge badge-success badge-sm"},Bs={key:1,class:"badge badge-warning badge-sm"},Is={key:2,class:"badge badge-error badge-sm"},Ts={key:0,class:"badge badge-error badge-sm"},Ps={key:1,class:"badge badge-ghost badge-sm"},Ls={class:"text-xs"},Os={class:"text-xs text-slate-500"},Es={class:"flex gap-1"},$s=["onClick"],zs=["onClick"],Fs=["onClick"],qs={class:"flex items-center justify-between px-5 py-3 border-t border-slate-100"},Rs={class:"text-xs text-slate-500"},Hs={class:"flex items-center gap-2"},Gs=["disabled"],Js={class:"text-xs text-slate-500"},Xs=["disabled"],Ys={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"},Ks={class:"form-control mb-4"},Qs=["value"],Ws={class:"form-control mb-4"},Zs=["disabled"],tl={value:0},el=["value"],sl={class:"tabs tabs-boxed mb-4 bg-slate-100 inline-flex"},ll={class:"form-control mb-4"},ol={class:"form-control mb-4"},nl=["required"],al={class:"form-control mb-2"},il={class:"form-control mb-4"},dl={class:"form-control mb-4"},ul={class:"flex gap-3 mt-2"},rl=["disabled"],cl={key:0,class:"loading loading-spinner loading-xs"},vl={class:"modal-box w-11/12 max-w-2xl"},bl={class:"grid grid-cols-2 gap-4 mb-3"},pl={class:"form-control"},ml={class:"form-control"},xl={class:"form-control mb-3"},fl={class:"form-control mb-3"},gl={class:"form-control mb-4"},yl={class:"text-sm text-slate-500"},hl={class:"modal-action"},wl=["disabled"],kl={key:0,class:"loading loading-spinner loading-xs"},Cl={class:"modal-box max-w-md"},_l={class:"text-sm space-y-1 mb-4"},Sl={class:"font-medium"},Ml={class:"font-medium"},Ul={class:"font-mono font-medium text-red-600"},Vl={class:"font-medium"},Dl={class:"form-control mb-2"},Al={class:"label"},jl={class:"label-text text-xs"},Nl={class:"font-mono text-red-600"},Bl={class:"text-xs text-red-500 min-h-[1em] mb-2"},Il={class:"modal-action"},Tl=["disabled"],Pl={key:0,class:"loading loading-spinner loading-xs"},Fl=ge({__name:"device",setup(Ll){const{webApi:y}=Ce(),{success:h,error:V,warn:M}=_e(),w=ye(),Qt=S(()=>w.identity===1),Wt=S(()=>w.identity>0&&w.identity<=2),D=n([]),A=n([]),j=n([]),k=n([]),f=n([]),F=n(0),C=n(0),Q=n(200),N=n("production"),W=n("main"),U=n(0),b=n(0),mt=n(""),xt=n(""),ft=n("-"),gt=n("-"),yt=n("-"),ht=n(""),wt=n(!1),Z=n(""),tt=n("1"),kt=n("usedtime"),et=n(""),Ct=n(""),_t=n(""),St=n(""),q=n("200"),Mt=n(null),R=n(""),st=n(!1),B=n([]),It=S(()=>B.value.length),Tt=n(null),I=n(0),H=n(0),lt=n(!1),ot=n(null),G=n(""),nt=n(""),at=n(!1),J=n(null),T=n(""),it=n(null),dt=n(!1),v=ke({to:"",cc:"",subject:"",content:""}),Ut=n(null),m=n(null),ut=n(""),rt=n(""),ct=n(!1),Vt=S(()=>m.value?String(m.value.batchno||m.value.batchid||""):""),Zt=S(()=>!!m.value&&ut.value.trim()===Vt.value),Pt=S(()=>Math.max(1,Math.ceil(F.value/Q.value))),te=S(()=>b.value?"第 "+(C.value+1)+" / "+Pt.value+" 页":"-"),Lt=S(()=>U.value?A.value.filter(l=>l.brandid===U.value):A.value),Ot=S(()=>I.value?A.value.filter(l=>l.brandid===I.value):[]);function vt(l){if(!l)return"-";const t=new Date(l*1e3);return t.getFullYear()+"-"+String(t.getMonth()+1).padStart(2,"0")+"-"+String(t.getDate()).padStart(2,"0")+" "+String(t.getHours()).padStart(2,"0")+":"+String(t.getMinutes()).padStart(2,"0")}function Et(l,t){if(!l)return 0;const s=new Date(l+(t?"T23:59:59":"T00:00:00"));return Math.floor(s.getTime()/1e3)}function Dt(l){const t=D.value.find(s=>s.id===l);return t?t.brand:String(l||"")}function At(l){const t=j.value.find(s=>s.id===l);return t?t.devicename:String(l||"")}function $t(l){return l?Number(l).toString(16).toUpperCase():""}function zt(l){const t=l.serialstart!=null&&l.serialstart!==""?String(l.serialstart):"",s=l.serialend!=null&&l.serialend!==""?String(l.serialend):"";return!t&&!s?"-":t+" - "+s}async function ee(){try{const[t,s]=await Promise.all([y("getbrands",{}),y("getproducts",{})]);D.value=t?.brands??[],j.value=s?.products??[]}catch(t){V(t?.message??"加载基础数据失败"),D.value=[],j.value=[]}const l=w.products.map(t=>parseInt(t)).filter(t=>!isNaN(t)&&t>0);w.identity!==1&&l.length>0?A.value=j.value.filter(t=>l.indexOf(t.id)>=0):A.value=j.value.slice(),A.value.length>0&&(b.value=A.value[0].id),P()}function bt(){W.value="main"}function se(){W.value="create",I.value=0,H.value=0,lt.value=!1,ot.value=null,G.value="",nt.value="",jt("production")}function le(){b.value&&!Lt.value.find(l=>l.id===b.value)&&(b.value=0),P()}function oe(){C.value=0,P()}function Ft(){let l;if(q.value==="custom"){if(l=Number(Mt.value),!l||l<1)return}else l=parseInt(q.value);l>2e3&&(l=2e3),Q.value=l,L(!0)}function P(){qt(),L(!0)}async function qt(){wt.value=!0,Z.value="";const l={limit:500};U.value&&(l.brandid=U.value),b.value&&(l.productid=b.value);const t=Et(mt.value,!1);t&&(l.start=t);const s=Et(xt.value,!0);s&&(l.end=s);try{const o=await y("getproductionbatches",l);k.value=o?.notes??[],ft.value=o?.total_batch??0,gt.value=o?.total_devices??0,yt.value=k.value.length?vt(k.value[0].ts):"-",ht.value="共 "+k.value.length+" 条"}catch(o){Z.value=o?.message??"",k.value=[],ft.value="0",gt.value="0",yt.value="-",ht.value=""}finally{wt.value=!1}}function ne(l,t,s,o,a){m.value={brandid:l,productid:t,batchid:s,batchno:o,devicenum:a},ut.value="",rt.value="",Ut.value?.showModal()}function Rt(){Ut.value?.close(),m.value=null}async function ae(){if(m.value){ct.value=!0,rt.value="";try{const l=await y("revokeproductionbatch",{productid:m.value.productid,batchid:m.value.batchid});Rt(),h("已撤销批次,删除 "+(l?.deleted??0)+" 个授权码"),P()}catch(l){rt.value=l?.message??"撤销失败"}finally{ct.value=!1}}}function ie(l,t){b.value=l,et.value=String(t),tt.value="0",C.value=0,L(!0),setTimeout(()=>{Tt.value?.scrollIntoView({behavior:"smooth",block:"start"})},100)}function Ht(){const l={productid:b.value,sortby:kt.value,order:"desc"},t=parseInt(tt.value);isNaN(t)||(l.status=t),U.value&&(l.brandid=U.value);const s=parseInt(et.value);s&&(l.batchid=s);const o=Ct.value.trim();o&&(l.code=o);const a=_t.value.trim();a&&(l.devicemac=a);const p=St.value.trim();return p&&(l.uid=p),l}async function L(l){if(l&&(C.value=0),B.value=[],st.value=!1,!b.value){f.value=[],F.value=0,R.value="";return}const t=Object.assign(Ht(),{limit:Q.value,offset:C.value*Q.value});try{const s=await y("getauthcodes",t);f.value=s?.devices??[],F.value=s?.total??0,R.value=""}catch(s){R.value=s?.message??"",f.value=[],F.value=0}}function Gt(l){C.value=Math.max(0,C.value+l),L(!1)}async function de(l){if(window.confirm("确定重置该设备授权状态?"))try{await y("resetlicensestatus",{licenses:l}),h("重置成功"),L(!1),qt()}catch(t){V(t?.message??"失败")}}function ue(){st.value?B.value=f.value.map(l=>l.code||""):B.value=[]}async function pt(l,t){if(!b.value){M("请先选择产品");return}const s=t??B.value.slice();if(!s.length){M("请先勾选授权码");return}const o=l===-1?"禁用":"恢复";if(window.confirm("确定"+o+" "+s.length+" 个授权码?"+(l===-1?`
禁用后该授权码将无法绑定。`:"")))try{const a=await y("disableauthcodes",{productid:b.value,codes:s,disabled:l});h(o+"成功("+(a?.affected??0)+" 条)"),L(!1)}catch(a){V(a?.message??o+"失败")}}function re(){H.value=0}function jt(l){N.value=l}function ce(l){const s=l.target.files?.[0];if(!s)return;const o=new FileReader;o.onload=a=>{const p=String(a.target?.result??"").split(`
`),c=[];p.forEach(_=>{const X=_.split(",");X[0]&&X[0].trim()&&c.push(X[0].trim())}),G.value=c.join(", "),h("读取 "+c.length+" 个 MAC 地址")},o.readAsText(s,"UTF-8")}async function ve(){const l=Number(I.value),t=Number(H.value);if(!l||!t){M("请选择品牌商和产品");return}const s={brandid:l,productid:t,remark:nt.value.trim()};if(N.value==="production"){if(s.createtype=1,s.number=Number(ot.value),s.isbindmac=lt.value,!s.number||s.number<1){M("请输入有效数量");return}}else{s.createtype=2;const o=G.value.trim();if(!o){M("请输入或上传 MAC 地址");return}s.macaddresses=o}at.value=!0;try{const o=await y("createauthcodes",s),p=(o?.devices??[]).map(c=>typeof c=="string"?{code:c,brandid:o?.brandid??l,productid:o?.productid??t}:{...c,brandid:c.brandid??o?.brandid??l,productid:c.productid??o?.productid??t});p.length>0?(h("成功生成 "+p.length+" 个授权码"),Nt(p),me(o??{},l,t)):(h("创建成功"),bt(),P())}catch(o){V(o?.message??"创建失败")}finally{at.value=!1}}function Nt(l){const t=l.some(c=>c.devicemac),s=t?["License","Mac地址"]:["License"],o=l.map(c=>t?[c.code||"",c.devicemac||""]:[c.code||""]),a=[s.join(",")].concat(o.map(c=>c.join(","))).join(`
`);J.value=new Blob([a],{type:"text/csv;charset=utf-8;"});const p=l[0];T.value="设备生产_"+(p.brandid||"unknown")+"_"+(p.productid||"unknown")+"_"+new Date().toISOString().split("T")[0]+".csv"}async function be(){if(!b.value){M("请先选择产品");return}try{const l=Ht(),t=2e3;let s=[],o=0,a=1/0;for(;s.length<a;){const p=Object.assign({},l,{limit:t,offset:o}),c=await y("getauthcodes",p);a=c?.total??0;const _=c?.devices??[];if(s=s.concat(_),_.length===0)break;o+=t}if(s.length===0){M("没有数据可导出");return}Nt(s),J.value&&Jt(J.value,T.value),h("已导出全部 "+s.length+" 条")}catch(l){V(l?.message??"导出失败")}}function pe(){if(!k.value.length){M("没有数据可导出");return}const l=["生产时间","品牌商","产品","批次号","序号区间","起始MAC","结束MAC","数量"],t=k.value.map(a=>[vt(a.ts),Dt(a.brandid),At(a.productid),a.batchno||"",zt(a),a.startmac||"",a.endmac||"",a.devicenum||0]),s=[l.join(",")].concat(t.map(a=>a.join(","))).join(`
`),o=new Blob([s],{type:"text/csv;charset=utf-8;"});Jt(o,"生产记录_"+new Date().toISOString().split("T")[0]+".csv"),h("导出成功")}function Jt(l,t){const s=URL.createObjectURL(l),o=document.createElement("a");o.href=s,o.download=t,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(s)}function me(l,t,s){const o=D.value.find(Y=>Y.id===t),a=j.value.find(Y=>Y.id===s),p=a?a.devicename:"未知产品(ID:"+s+")",c=o&&o.providerid!=null?Number(o.providerid):null;let _=[];o&&o.contactmails&&(_=o.contactmails.split(",").map(Y=>Y.trim()).filter(Boolean)),v.to=_[0]||"",v.cc=_.length>1?_.slice(1).join(","):"";const X=new Date().toLocaleDateString();v.subject="【生产通知】批次"+(l.batchid||"")+"设备生产通知 - "+X,v.content=`尊敬的合作伙伴:
我公司向贵司发送产品生产通知函。
设备地址区间为:`+(l.startmac||"")+"-"+(l.endmac||"")+`
序号区间:`+(l.serialstart??"")+" - "+(l.serialend??"")+`
生产批次(BatchID):`+(l.batchid||"")+`
服务ID(CID): 0x`+(c!=null?c.toString(16).padStart(4,"0").toUpperCase():"N/A")+`
品牌ID(BID): 0x`+(t!=null?Number(t).toString(16).padStart(4,"0").toUpperCase():"N/A")+`
产品ID(PID): 0x`+(s!=null?Number(s).toString(16).padStart(4,"0").toUpperCase():"N/A")+`
产品名称: `+p+`
生产数量:`+(l.number||0)+`
请查收附件中的设备详细信息。
此致
敬礼!`,it.value?.showModal()}function xe(){if(f.value.length===0)return;Nt(f.value);const l=f.value[0],t=D.value.find(c=>c.id===l.brandid),s=j.value.find(c=>c.id===l.productid),o=s?s.devicename:"";let a=[];t&&t.contactmails&&(a=t.contactmails.split(",").map(c=>c.trim()).filter(Boolean)),v.to=a[0]||"",v.cc=a.length>1?a.slice(1).join(","):"";const p=new Date().toLocaleDateString();v.subject="【授权码清单】"+(o||"设备")+" - "+p,v.content=`尊敬的合作伙伴:
附件为当前查询的授权码清单,共 `+f.value.length+` 条记录。
`+(o?"产品:"+o+`
`:"")+`
请查收。
此致
敬礼!`,it.value?.showModal()}function Xt(){it.value?.close()}async function fe(){dt.value=!0;const l=new FormData;l.append("to",v.to),l.append("subject",v.subject),l.append("content",v.content);const t=v.cc.trim();if(t&&l.append("cc",t),J.value&&T.value){const s=new File([J.value],T.value,{type:"text/csv"});l.append("file",s,T.value)}try{const s={};w.token&&(s.Authorization=w.token),w.currentAppId&&(s["X-App-Id"]=String(w.currentAppId));const a=await(await fetch("/web/api/api_sendsmtpemail",{method:"POST",headers:s,body:l})).json();a.code===0?(h("邮件发送成功"),Xt(),bt(),P()):V("发送失败: "+(a.msg||"未知错误"))}catch(s){V("发送失败: "+(s?.message??""))}finally{dt.value=!1}}return he(ee),(l,t)=>(u(),d("div",Se,[e("div",Me,[e("div",Ue,[e("div",Ve,[t[33]||(t[33]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"品牌商")],-1)),r(e("select",{"onUpdate:modelValue":t[0]||(t[0]=s=>U.value=s),class:"select select-bordered select-sm",style:{"min-width":"160px"},onChange:le},[t[32]||(t[32]=e("option",{value:0},"全部",-1)),(u(!0),d(E,null,$(D.value,s=>(u(),d("option",{key:s.id,value:s.id},i(s.brand||""),9,De))),128))],544),[[O,U.value,void 0,{number:!0}]])]),e("div",Ae,[t[35]||(t[35]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"产品")],-1)),r(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>b.value=s),class:"select select-bordered select-sm",style:{"min-width":"200px"},onChange:oe},[t[34]||(t[34]=e("option",{value:0},"请选择产品",-1)),(u(!0),d(E,null,$(Lt.value,s=>(u(),d("option",{key:s.id,value:s.id},i(s.devicename||""),9,je))),128))],544),[[O,b.value,void 0,{number:!0}]])]),e("div",Ne,[t[36]||(t[36]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"起始时间")],-1)),r(e("input",{"onUpdate:modelValue":t[2]||(t[2]=s=>mt.value=s),type:"date",class:"input input-bordered input-sm"},null,512),[[x,mt.value]])]),e("div",Be,[t[37]||(t[37]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"结束时间")],-1)),r(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>xt.value=s),type:"date",class:"input input-bordered input-sm"},null,512),[[x,xt.value]])]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:P},"查询"),Wt.value?(u(),d("button",{key:0,class:"btn btn-success btn-sm text-white",onClick:se},"+ 生成授权码")):z("",!0)])]),r(e("div",null,[e("div",Ie,[e("div",Te,[t[38]||(t[38]=e("div",{class:"text-xs text-slate-400 mb-1"},"命中批次数",-1)),e("div",Pe,i(ft.value),1)]),e("div",Le,[t[39]||(t[39]=e("div",{class:"text-xs text-slate-400 mb-1"},"生产授权码总数",-1)),e("div",Oe,i(gt.value),1)]),e("div",Ee,[t[40]||(t[40]=e("div",{class:"text-xs text-slate-400 mb-1"},"最近一次生产时间",-1)),e("div",$e,i(yt.value),1)])]),e("div",ze,[e("div",Fe,[t[41]||(t[41]=e("h3",{class:"text-sm font-semibold text-slate-700"},"生产记录(按批次)",-1)),e("div",qe,[e("span",Re,i(ht.value),1),e("button",{class:"btn btn-ghost btn-xs",onClick:pe},"导出CSV")])]),e("div",He,[e("table",Ge,[t[44]||(t[44]=e("thead",null,[e("tr",null,[e("th",{class:"w-40"},"生产时间"),e("th",null,"品牌商"),e("th",null,"产品"),e("th",null,"批次号"),e("th",null,"序号区间"),e("th",null,"起始MAC"),e("th",null,"结束MAC"),e("th",{class:"text-right"},"数量"),e("th",null,"操作")])],-1)),e("tbody",null,[wt.value?(u(),d("tr",Je,[...t[42]||(t[42]=[e("td",{colspan:"9",class:"text-center text-slate-400 py-8"},"加载中…",-1)])])):Z.value?(u(),d("tr",Xe,[e("td",Ye,"查询失败: "+i(Z.value),1)])):k.value.length?(u(!0),d(E,{key:3},$(k.value,(s,o)=>(u(),d("tr",{key:o,class:"hover"},[e("td",Qe,i(vt(s.ts)),1),e("td",We,i(Dt(s.brandid)),1),e("td",Ze,i(At(s.productid)),1),e("td",ts,i(s.batchno||""),1),e("td",es,i(zt(s)),1),e("td",ss,i(s.startmac||""),1),e("td",ls,i(s.endmac||""),1),e("td",os,i(s.devicenum||0),1),e("td",null,[e("div",ns,[e("button",{class:"btn btn-ghost btn-xs text-indigo-500",onClick:a=>ie(s.productid,s.id)},"查看授权码",8,as),Qt.value?(u(),d("button",{key:0,class:"btn btn-ghost btn-xs text-red-500",onClick:a=>ne(s.brandid,s.productid,s.id,s.batchno,s.devicenum||0)},"撤销",8,is)):z("",!0)])])]))),128)):(u(),d("tr",Ke,[...t[43]||(t[43]=[e("td",{colspan:"9",class:"text-center text-slate-400 py-8"},"暂无数据",-1)])]))])])])]),e("div",ds,[e("div",us,[t[56]||(t[56]=e("h3",{class:"text-sm font-semibold text-slate-700"},"授权码记录",-1)),e("div",rs,[e("div",cs,[t[46]||(t[46]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"状态")],-1)),r(e("select",{"onUpdate:modelValue":t[4]||(t[4]=s=>tt.value=s),class:"select select-bordered select-xs"},[...t[45]||(t[45]=[e("option",{value:"1"},"已激活",-1),e("option",{value:"-1"},"未使用",-1),e("option",{value:"2"},"已过期",-1),e("option",{value:"0"},"全部",-1)])],512),[[O,tt.value]])]),e("div",vs,[t[48]||(t[48]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"排序")],-1)),r(e("select",{"onUpdate:modelValue":t[5]||(t[5]=s=>kt.value=s),class:"select select-bordered select-xs"},[...t[47]||(t[47]=[e("option",{value:"usedtime"},"激活时间",-1),e("option",{value:"createtime"},"创建时间",-1)])],512),[[O,kt.value]])]),e("div",bs,[t[49]||(t[49]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"批次")],-1)),r(e("input",{"onUpdate:modelValue":t[6]||(t[6]=s=>et.value=s),type:"number",class:"input input-bordered input-xs",placeholder:"批次ID",style:{width:"90px"}},null,512),[[x,et.value]])]),e("div",ps,[t[50]||(t[50]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"授权码")],-1)),r(e("input",{"onUpdate:modelValue":t[7]||(t[7]=s=>Ct.value=s),type:"text",class:"input input-bordered input-xs",placeholder:"授权码"},null,512),[[x,Ct.value]])]),e("div",ms,[t[51]||(t[51]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"MAC")],-1)),r(e("input",{"onUpdate:modelValue":t[8]||(t[8]=s=>_t.value=s),type:"text",class:"input input-bordered input-xs",placeholder:"MAC"},null,512),[[x,_t.value]])]),e("div",xs,[t[52]||(t[52]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"用户UID")],-1)),r(e("input",{"onUpdate:modelValue":t[9]||(t[9]=s=>St.value=s),type:"text",class:"input input-bordered input-xs",placeholder:"UID"},null,512),[[x,St.value]])]),e("div",fs,[t[54]||(t[54]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"每页数量")],-1)),r(e("select",{"onUpdate:modelValue":t[10]||(t[10]=s=>q.value=s),class:"select select-bordered select-xs",onChange:Ft},[...t[53]||(t[53]=[we('<option value="20">20</option><option value="50">50</option><option value="100">100</option><option value="200">200</option><option value="500">500</option><option value="custom">自定义</option>',6)])],544),[[O,q.value]])]),r(e("div",gs,[t[55]||(t[55]=e("label",{class:"label py-0"},[e("span",{class:"label-text text-xs"},"自定义")],-1)),r(e("input",{"onUpdate:modelValue":t[11]||(t[11]=s=>Mt.value=s),type:"number",min:"1",max:"2000",class:"input input-bordered input-xs",placeholder:"1-2000",style:{width:"90px"},onChange:Ft},null,544),[[x,Mt.value,void 0,{number:!0}]])],512),[[K,q.value==="custom"]]),e("button",{class:"btn btn-primary btn-xs text-white",onClick:t[12]||(t[12]=s=>L(!0))},"搜索"),e("button",{class:"btn btn-error btn-xs text-white",disabled:It.value===0,onClick:t[13]||(t[13]=s=>pt(-1))},"批量禁用",8,ys),e("button",{class:"btn btn-warning btn-xs text-white",disabled:It.value===0,onClick:t[14]||(t[14]=s=>pt(0))},"批量恢复",8,hs),e("button",{class:"btn btn-ghost btn-xs",disabled:!f.value.length,onClick:be},"导出",8,ws),e("button",{class:"btn btn-ghost btn-xs",disabled:!f.value.length,onClick:xe},"发邮件",8,ks)])]),e("div",Cs,[e("table",{ref_key:"devicesTable",ref:Tt,class:"table table-zebra text-sm"},[e("thead",null,[e("tr",null,[e("th",_s,[r(e("input",{"onUpdate:modelValue":t[15]||(t[15]=s=>st.value=s),type:"checkbox",class:"checkbox checkbox-xs",onChange:ue},null,544),[[Bt,st.value]])]),t[57]||(t[57]=e("th",null,"授权码",-1)),t[58]||(t[58]=e("th",null,"类型",-1)),t[59]||(t[59]=e("th",null,"批次",-1)),t[60]||(t[60]=e("th",null,"MAC",-1)),t[61]||(t[61]=e("th",null,"状态",-1)),t[62]||(t[62]=e("th",null,"封禁",-1)),t[63]||(t[63]=e("th",null,"用户UID",-1)),t[64]||(t[64]=e("th",null,"激活时间",-1)),t[65]||(t[65]=e("th",null,"操作",-1))])]),e("tbody",null,[b.value?R.value?(u(),d("tr",Ms,[e("td",Us,"查询失败: "+i(R.value),1)])):f.value.length?(u(!0),d(E,{key:3},$(f.value,(s,o)=>(u(),d("tr",{key:o},[e("td",null,[r(e("input",{"onUpdate:modelValue":t[16]||(t[16]=a=>B.value=a),type:"checkbox",class:"checkbox checkbox-xs",value:s.code||""},null,8,Ds),[[Bt,B.value]])]),e("td",As,i(s.code||""),1),e("td",null,i(s.codetype===0?"授权码":"设备码"),1),e("td",null,i(s.batchid),1),e("td",js,i(s.devicemac||""),1),e("td",null,[s.status===0?(u(),d("span",Ns,"未使用")):s.status===1?(u(),d("span",Bs,"已使用")):(u(),d("span",Is,"已过期"))]),e("td",null,[s.disabled!==0?(u(),d("span",Ts,"已禁用")):(u(),d("span",Ps,"正常"))]),e("td",Ls,i(s.uid||""),1),e("td",Os,i(s.usedtime?vt(s.usedtime):"-"),1),e("td",null,[e("div",Es,[s.disabled!==0?(u(),d("button",{key:0,class:"btn btn-ghost btn-xs text-warning",onClick:a=>pt(0,[s.code])},"恢复",8,$s)):(u(),d("button",{key:1,class:"btn btn-ghost btn-xs text-error",onClick:a=>pt(-1,[s.code])},"禁用",8,zs)),s.status!==0?(u(),d("button",{key:2,class:"btn btn-ghost btn-xs text-orange-500",onClick:a=>de(s.code)},"重置",8,Fs)):z("",!0)])])]))),128)):(u(),d("tr",Vs,[...t[67]||(t[67]=[e("td",{colspan:"10",class:"text-center text-slate-400 py-8"},"暂无数据",-1)])])):(u(),d("tr",Ss,[...t[66]||(t[66]=[e("td",{colspan:"10",class:"text-center text-slate-400 py-8"},"请先选择产品",-1)])]))])],512)]),e("div",qs,[e("span",Rs,i(b.value?"共 "+F.value+" 条":"-"),1),e("div",Hs,[e("button",{class:"btn btn-ghost btn-xs",disabled:C.value<=0||!b.value,onClick:t[17]||(t[17]=s=>Gt(-1))},"上一页",8,Gs),e("span",Js,i(te.value),1),e("button",{class:"btn btn-ghost btn-xs",disabled:!b.value||C.value+1>=Pt.value,onClick:t[18]||(t[18]=s=>Gt(1))},"下一页",8,Xs)])])])],512),[[K,W.value==="main"]]),r(e("div",null,[e("div",{class:"flex items-center gap-3 mb-5"},[e("button",{class:"btn btn-ghost btn-sm",onClick:bt},"← 返回"),t[68]||(t[68]=e("h2",{class:"text-lg font-semibold text-slate-800"},"生成授权码",-1))]),e("div",Ys,[e("form",{onSubmit:Yt(ve,["prevent"])},[e("div",Ks,[t[70]||(t[70]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"品牌商 *")],-1)),r(e("select",{"onUpdate:modelValue":t[19]||(t[19]=s=>I.value=s),class:"select select-bordered w-full",required:"",onChange:re},[t[69]||(t[69]=e("option",{value:0},"请选择品牌商",-1)),(u(!0),d(E,null,$(D.value,s=>(u(),d("option",{key:s.id,value:s.id},i((s.brand||"")+" ("+$t(s.id)+")"),9,Qs))),128))],544),[[O,I.value,void 0,{number:!0}]])]),e("div",Ws,[t[71]||(t[71]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"产品 *")],-1)),r(e("select",{"onUpdate:modelValue":t[20]||(t[20]=s=>H.value=s),class:"select select-bordered w-full",required:"",disabled:!Ot.value.length},[e("option",tl,i(I.value?"请选择产品":"请先选择品牌商"),1),(u(!0),d(E,null,$(Ot.value,s=>(u(),d("option",{key:s.id,value:s.id},i((s.devicename||"")+" ("+$t(s.id)+")"),9,el))),128))],8,Zs),[[O,H.value,void 0,{number:!0}]])]),e("div",sl,[e("a",{class:Kt(["tab",{"tab-active":N.value==="production"}]),onClick:t[21]||(t[21]=s=>jt("production"))},"生产",2),e("a",{class:Kt(["tab",{"tab-active":N.value==="import"}]),onClick:t[22]||(t[22]=s=>jt("import"))},"导入",2)]),r(e("div",null,[e("div",ll,[t[72]||(t[72]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"绑定MAC地址")],-1)),r(e("input",{"onUpdate:modelValue":t[23]||(t[23]=s=>lt.value=s),type:"checkbox",class:"toggle toggle-primary"},null,512),[[Bt,lt.value]])]),e("div",ol,[t[73]||(t[73]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"数量 *")],-1)),r(e("input",{"onUpdate:modelValue":t[24]||(t[24]=s=>ot.value=s),type:"number",class:"input input-bordered w-full",min:"1",max:"10000",placeholder:"请输入生产数量",required:N.value==="production"},null,8,nl),[[x,ot.value,void 0,{number:!0}]])])],512),[[K,N.value==="production"]]),r(e("div",null,[e("div",al,[t[74]||(t[74]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"上传 CSV 文件")],-1)),e("input",{type:"file",class:"file-input file-input-bordered file-input-sm w-full",accept:".csv",onChange:ce},null,32),t[75]||(t[75]=e("p",{class:"text-xs text-slate-400 mt-1"},"上传 CSV 文件,系统将读取第一列作为 MAC 地址",-1))]),e("div",il,[t[76]||(t[76]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"MAC 地址列表 *")],-1)),r(e("textarea",{"onUpdate:modelValue":t[25]||(t[25]=s=>G.value=s),class:"textarea textarea-bordered w-full",rows:"4",placeholder:"MAC 地址以逗号分隔,可手动输入或通过CSV导入"},null,512),[[x,G.value]])])],512),[[K,N.value==="import"]]),e("div",dl,[t[77]||(t[77]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"备注")],-1)),r(e("input",{"onUpdate:modelValue":t[26]||(t[26]=s=>nt.value=s),type:"text",class:"input input-bordered w-full",placeholder:"批次备注(选填)"},null,512),[[x,nt.value]])]),e("div",ul,[e("button",{type:"button",class:"btn btn-ghost",onClick:bt},"取消"),e("button",{type:"submit",class:"btn btn-primary text-white",disabled:at.value},[at.value?(u(),d("span",cl)):z("",!0),t[78]||(t[78]=g("生成 ",-1))],8,rl)])],32)])],512),[[K,W.value==="create"]]),e("dialog",{ref_key:"emailModal",ref:it,class:"modal"},[e("div",vl,[t[85]||(t[85]=e("h3",{class:"font-bold text-lg mb-4 flex items-center gap-2"},[e("svg",{class:"h-5 w-5 text-blue-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})]),g(" 发送邮件通知 ")],-1)),e("form",{onSubmit:Yt(fe,["prevent"])},[e("div",bl,[e("div",pl,[t[79]||(t[79]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"收件人 *")],-1)),r(e("input",{"onUpdate:modelValue":t[27]||(t[27]=s=>v.to=s),type:"email",class:"input input-bordered input-sm w-full",required:""},null,512),[[x,v.to]])]),e("div",ml,[t[80]||(t[80]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"抄送")],-1)),r(e("input",{"onUpdate:modelValue":t[28]||(t[28]=s=>v.cc=s),type:"text",class:"input input-bordered input-sm w-full",placeholder:"多个邮箱用逗号分隔"},null,512),[[x,v.cc]])])]),e("div",xl,[t[81]||(t[81]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"主题 *")],-1)),r(e("input",{"onUpdate:modelValue":t[29]||(t[29]=s=>v.subject=s),type:"text",class:"input input-bordered input-sm w-full",required:""},null,512),[[x,v.subject]])]),e("div",fl,[t[82]||(t[82]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"内容 *")],-1)),r(e("textarea",{"onUpdate:modelValue":t[30]||(t[30]=s=>v.content=s),class:"textarea textarea-bordered w-full",rows:"10",required:""},null,512),[[x,v.content]])]),e("div",gl,[t[83]||(t[83]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"附件")],-1)),e("div",yl,i(T.value?"📎 "+T.value:"无附件"),1)]),e("div",hl,[e("button",{type:"button",class:"btn btn-ghost btn-sm",onClick:Xt},"取消"),e("button",{type:"submit",class:"btn btn-primary btn-sm text-white",disabled:dt.value},[dt.value?(u(),d("span",kl)):z("",!0),t[84]||(t[84]=g("发送邮件 ",-1))],8,wl)])],32)]),t[86]||(t[86]=e("form",{method:"dialog",class:"modal-backdrop"},[e("button",null,"close")],-1))],512),e("dialog",{ref_key:"revokeModal",ref:Ut,class:"modal"},[e("div",Cl,[t[94]||(t[94]=e("h3",{class:"font-bold text-lg mb-3 flex items-center gap-2 text-red-600"},[e("svg",{class:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01M4.93 19h14.14a2 2 0 001.74-3L13.74 4a2 2 0 00-3.48 0L3.19 16a2 2 0 001.74 3z"})]),g(" 撤销生产批次 ")],-1)),t[95]||(t[95]=e("div",{class:"bg-red-50 border border-red-200 rounded-lg p-3 text-sm text-red-700 mb-4"},[g(" 此操作将"),e("strong",null,"删除该批次的全部授权码"),g("以及对应的生产出货记录,"),e("strong",null,"不可恢复"),g("。"),e("br"),g(" 若该批次中已有任意授权码被激活/绑定,撤销会被拒绝。 ")],-1)),e("div",_l,[e("div",null,[t[87]||(t[87]=e("span",{class:"text-slate-500"},"品牌商:",-1)),e("span",Sl,i(m.value?Dt(m.value.brandid):""),1)]),e("div",null,[t[88]||(t[88]=e("span",{class:"text-slate-500"},"产品:",-1)),e("span",Ml,i(m.value?At(m.value.productid):""),1)]),e("div",null,[t[89]||(t[89]=e("span",{class:"text-slate-500"},"批次号:",-1)),e("span",Ul,i(Vt.value),1)]),e("div",null,[t[90]||(t[90]=e("span",{class:"text-slate-500"},"授权码数量:",-1)),e("span",Vl,i(m.value?m.value.devicenum:""),1)])]),e("div",Dl,[e("label",Al,[e("span",jl,[t[91]||(t[91]=g("请输入批次号 ",-1)),e("span",Nl,i(Vt.value),1),t[92]||(t[92]=g(" 以确认撤销",-1))])]),r(e("input",{"onUpdate:modelValue":t[31]||(t[31]=s=>ut.value=s),type:"text",class:"input input-bordered input-sm w-full",autocomplete:"off"},null,512),[[x,ut.value]])]),e("p",Bl,i(rt.value),1),e("div",Il,[e("button",{type:"button",class:"btn btn-ghost btn-sm",onClick:Rt},"取消"),e("button",{type:"button",class:"btn btn-error btn-sm text-white",disabled:!Zt.value||ct.value,onClick:ae},[ct.value?(u(),d("span",Pl)):z("",!0),t[93]||(t[93]=g("确认撤销 ",-1))],8,Tl)])]),t[96]||(t[96]=e("form",{method:"dialog",class:"modal-backdrop"},[e("button",null,"close")],-1))],512)]))}});export{Fl as default};