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
37 KiB

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