import{d as ce,u as be,q as ye,s as ge,c as V,e as t,w as n,a as o,t as r,p as M,x as _e,F as R,l as Ve,y as P,k as b,j as Z,v as H,E as T,r as f,z as ke,o as m,i as u}from"./index-CcdGGfCj.js";import{h as q,a as xe,_ as G}from"./http-CGjljVXL.js";import{A as j}from"./AdminNumberInput-BCSDw1QF.js";import{_ as $e}from"./PageHeader.vue_vue_type_script_setup_true_lang-ClDoYPHj.js";import{_ as we}from"./_plugin-vue_export-helper-DlAUqK2U.js";const Ce={class:"page-stack management-page"},Ne={class:"panel filter-bar"},qe={key:0,class:"batch-toolbar"},Ue={class:"panel table-panel"},Be={class:"limit-cell"},Fe={key:0,class:"mobile-card-list"},Ie={class:"limit-cell"},De={class:"card-actions"},Se={key:0,class:"point-grant-summary"},Ee={class:"dialog-form-grid batch-account-grid"},Le=ce({__name:"UsersView",setup(Me){const k=be(),U=b(!1),S=b([]),O=b(0),x=b([]),g=b(""),E=b(!1),$=b(),w=b(!1),D=b(""),B=b(null),z=b(""),v=Z({keyword:"",enabled:"",page:1,page_size:15}),s=Z({account:"",prefix:"",start_sequence:"001",end_sequence:"001",password:"",daily_limit:9999}),y=Z({points:null,reason:"",request_id:""}),J=b(),K=H({get:()=>g.value!=="",set:a=>{a||(g.value="")}}),Q=H(()=>Number.isFinite(Number(y.points))&&Number(y.points)>0&&!!y.reason.trim()),_=H(()=>{const a=s.prefix.trim(),e=s.start_sequence.trim(),i=s.end_sequence.trim();if(!a)return{error:"请输入账号前缀",count:0,first:"",last:""};if(!/^\d+$/.test(e)||!/^\d+$/.test(i))return{error:"起始序号和终止序号必须为数字",count:0,first:"",last:""};const c=Number(e),I=Number(i);if(!Number.isSafeInteger(c)||!Number.isSafeInteger(I))return{error:"序号超出有效范围",count:0,first:"",last:""};if(c>I)return{error:"起始序号不能大于终止序号",count:0,first:"",last:""};const L=I-c+1;if(L>50)return{error:"每次最多批量创建 50 个用户",count:L,first:"",last:""};const p=Math.max(e.length,i.length);return{error:"",count:L,first:`${a}-${String(c).padStart(p,"0")}`,last:`${a}-${String(I).padStart(p,"0")}`}});async function C(a=!1){if(!(a&&D.value)){a||(U.value=!0);try{const{data:e}=await q.get("/users",{params:v});S.value=e.data.items,O.value=e.data.total}catch(e){F(e)}finally{U.value=!1}}}function X(a){D.value=a.id,B.value=Number(a.daily_limit)}function A(){D.value="",B.value=null}async function Y(a){if(D.value!==a.id)return;const e=Number(B.value);if(!Number.isFinite(e)||e<0){k.warning("每日限额不能小于 0"),A();return}if(e===Number(a.daily_limit)){A();return}z.value=a.id;try{await q.patch("/users/batch",{ids:[a.id],daily_limit:e.toFixed(2),reason:"管理员原地修改每日限额"}),a.daily_limit=e,k.success("每日限额已保存")}catch(i){F(i)}finally{z.value="",A()}}function h(a){Object.assign(s,{account:"",prefix:"",start_sequence:"001",end_sequence:"001",password:"",daily_limit:9999}),g.value=a}async function oe(){var a;if(await((a=J.value)==null?void 0:a.validate().catch(()=>!1))){if(g.value==="batch"&&_.value.error){k.warning(_.value.error);return}U.value=!0;try{g.value==="single"?await q.post("/users",{account:s.account,password:s.password,daily_limit:s.daily_limit}):await q.post("/users/batch",{prefix:s.prefix,start_sequence:s.start_sequence,end_sequence:s.end_sequence,password:s.password,daily_limit:s.daily_limit}),k.success("用户创建成功"),g.value="",C()}catch(e){F(e)}finally{U.value=!1}}}async function ee(a,e){try{await T.confirm(`${e?"启用":"停用"}用户 ${a.account}(${a.username})?停用后会撤销其有效会话。`,"确认状态变更",{type:"warning"}),await q.patch("/users/batch",{ids:[a.id],enabled:e,reason:`管理员${e?"启用":"停用"}用户`}),a.enabled=e,k.success("用户状态已更新")}catch(i){a.enabled=!e,i!=="cancel"&&i!=="close"&&F(i)}}async function se(){try{const{value:a}=await T.prompt("请输入新的每日限额(0 表示禁止消耗,9999 表示不限制)","批量调整每日限额",{inputType:"text",inputValue:"9999",inputValidator:i=>Number(i)>=0||"限额不能小于 0"}),e=await T.prompt("请填写调整原因","填写审计原因",{inputValidator:i=>!!i.trim()||"调整原因不能为空"});await q.patch("/users/batch",{ids:x.value.map(i=>i.id),daily_limit:Number(a).toFixed(2),reason:e.value}),k.success("每日限额已调整"),x.value=[],C()}catch(a){a!=="cancel"&&a!=="close"&&F(a)}}function le(a){$.value=a,Object.assign(y,{points:null,reason:"",request_id:crypto.randomUUID()}),E.value=!0}async function ue(){if(!(!$.value||!Q.value)){w.value=!0;try{const a=Number(y.points).toFixed(2),{data:e}=await q.post(`/users/${$.value.id}/points`,{request_id:y.request_id,points:a,reason:y.reason.trim()});$.value.point_balance=e.data.balance,k.success(`已增加 ${a} 积分`),E.value=!1}catch(a){F(a)}finally{w.value=!1}}}async function W(a){try{const e=await T.prompt(`确认软删除 ${a.length} 个用户?其订单、流水和使用记录将保留。`,"确认删除",{type:"warning",inputPlaceholder:"请输入删除原因",inputValidator:i=>!!i.trim()||"删除原因不能为空",confirmButtonText:"确认删除"});await q.delete("/users/batch",{data:{ids:a,reason:e.value}}),k.success("用户已删除"),x.value=[],C()}catch(e){e!=="cancel"&&e!=="close"&&F(e)}}const te=a=>a?new Date(a).toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",hour12:!1}):"从未在线";function F(a){const e=xe(a);k.error(e.message,e.copyText)}const de=window.setInterval(()=>C(!0),3e5);return ye(C),ge(()=>clearInterval(de)),(a,e)=>{const i=f("el-button"),c=f("el-input"),I=f("el-option"),L=f("el-select"),p=f("el-table-column"),ae=f("el-switch"),re=f("el-table"),me=f("el-empty"),pe=f("el-pagination"),N=f("el-form-item"),ne=f("el-form"),ie=f("el-dialog"),fe=f("el-alert"),ve=ke("loading");return m(),V("div",Ce,[t($e,{title:"用户管理",description:"管理 WEB 用户账号、每日限额和启用状态"},{default:n(()=>[t(i,{onClick:e[0]||(e[0]=l=>h("batch"))},{default:n(()=>[t(G,{name:"UserFilled"}),e[24]||(e[24]=u("批量新建 ",-1))]),_:1}),t(i,{type:"primary",onClick:e[1]||(e[1]=l=>h("single"))},{default:n(()=>[t(G,{name:"Plus"}),e[25]||(e[25]=u("新建用户 ",-1))]),_:1})]),_:1}),o("section",Ne,[t(c,{modelValue:v.keyword,"onUpdate:modelValue":e[2]||(e[2]=l=>v.keyword=l),clearable:"",placeholder:"账号、用户名或 UID"},null,8,["modelValue"]),t(L,{modelValue:v.enabled,"onUpdate:modelValue":e[3]||(e[3]=l=>v.enabled=l),clearable:"",placeholder:"启用状态"},{default:n(()=>[t(I,{label:"已启用",value:"true"}),t(I,{label:"已停用",value:"false"})]),_:1},8,["modelValue"]),t(i,{type:"primary",onClick:e[4]||(e[4]=l=>{v.page=1,C()})},{default:n(()=>[...e[26]||(e[26]=[u("查询",-1)])]),_:1}),t(i,{onClick:e[5]||(e[5]=l=>{v.keyword="",v.enabled="",v.page=1,C()})},{default:n(()=>[...e[27]||(e[27]=[u("重置",-1)])]),_:1})]),x.value.length?(m(),V("section",qe,[o("strong",null,"已选择 "+r(x.value.length)+" 项",1),t(i,{onClick:e[6]||(e[6]=l=>x.value=[])},{default:n(()=>[...e[28]||(e[28]=[u("取消选择",-1)])]),_:1}),t(i,{onClick:se},{default:n(()=>[...e[29]||(e[29]=[u("调整每日限额",-1)])]),_:1}),t(i,{type:"danger",onClick:e[7]||(e[7]=l=>W(x.value.map(d=>d.id)))},{default:n(()=>[...e[30]||(e[30]=[u("批量删除",-1)])]),_:1})])):M("",!0),_e((m(),V("section",Ue,[t(re,{class:"desktop-user-table",data:S.value,onSelectionChange:e[9]||(e[9]=l=>x.value=l)},{default:n(()=>[t(p,{type:"selection",width:"46"}),t(p,{prop:"account",label:"账号","min-width":"150","show-overflow-tooltip":""}),t(p,{prop:"username",label:"用户名","min-width":"170"}),t(p,{prop:"uid",label:"UID","min-width":"125"}),t(p,{label:"积分余额","min-width":"120"},{default:n(({row:l})=>[u(r(Number(l.point_balance).toFixed(2)),1)]),_:1}),t(p,{label:"今日消耗","min-width":"120"},{default:n(({row:l})=>[u(r(Number(l.today_consumption).toFixed(2)),1)]),_:1}),t(p,{label:"每日限额","min-width":"170"},{default:n(({row:l})=>[o("div",Be,[D.value===l.id?(m(),P(j,{key:0,modelValue:B.value,"onUpdate:modelValue":e[8]||(e[8]=d=>B.value=d),class:"limit-input",min:0,precision:2,disabled:z.value===l.id,autofocus:"",onBlur:d=>Y(l)},null,8,["modelValue","disabled","onBlur"])):(m(),V(R,{key:1},[o("span",null,r(Number(l.daily_limit)===9999?"不限制":Number(l.daily_limit).toFixed(2)),1),t(i,{class:"limit-edit-button",text:"",circle:"",type:"primary",title:"编辑每日限额",onClick:d=>X(l)},{default:n(()=>[t(G,{name:"Edit",size:15})]),_:1},8,["onClick"])],64))])]),_:1}),t(p,{label:"启用状态",width:"96"},{default:n(({row:l})=>[t(ae,{"model-value":l.enabled,onChange:d=>ee(l,!!d)},null,8,["model-value","onChange"])]),_:1}),t(p,{label:"最后在线时间","min-width":"190"},{default:n(({row:l})=>[u(r(te(l.last_online_at)),1)]),_:1}),t(p,{label:"操作",width:"150"},{default:n(({row:l})=>[t(i,{link:"",type:"primary",disabled:!l.enabled,title:l.enabled?"增加积分":"停用用户不可增加积分",onClick:d=>le(l)},{default:n(()=>[...e[31]||(e[31]=[u("增加积分",-1)])]),_:1},8,["disabled","title","onClick"]),t(i,{link:"",type:"danger",onClick:d=>W([l.id])},{default:n(()=>[...e[32]||(e[32]=[u("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),S.value.length?(m(),V("div",Fe,[(m(!0),V(R,null,Ve(S.value,l=>(m(),V("article",{key:l.id,class:"data-card"},[o("dl",null,[e[33]||(e[33]=o("dt",null,"账号",-1)),o("dd",null,r(l.account),1),e[34]||(e[34]=o("dt",null,"用户名",-1)),o("dd",null,r(l.username),1),e[35]||(e[35]=o("dt",null,"UID",-1)),o("dd",null,r(l.uid),1),e[36]||(e[36]=o("dt",null,"积分余额",-1)),o("dd",null,r(Number(l.point_balance).toFixed(2)),1),e[37]||(e[37]=o("dt",null,"今日消耗",-1)),o("dd",null,r(Number(l.today_consumption).toFixed(2)),1),e[38]||(e[38]=o("dt",null,"每日限额",-1)),o("dd",null,[o("div",Ie,[D.value===l.id?(m(),P(j,{key:0,modelValue:B.value,"onUpdate:modelValue":e[10]||(e[10]=d=>B.value=d),class:"limit-input",min:0,precision:2,disabled:z.value===l.id,autofocus:"",onBlur:d=>Y(l)},null,8,["modelValue","disabled","onBlur"])):(m(),V(R,{key:1},[o("span",null,r(Number(l.daily_limit)===9999?"不限制":Number(l.daily_limit).toFixed(2)),1),t(i,{class:"limit-edit-button",text:"",circle:"",type:"primary",title:"编辑每日限额",onClick:d=>X(l)},{default:n(()=>[t(G,{name:"Edit",size:15})]),_:1},8,["onClick"])],64))])]),e[39]||(e[39]=o("dt",null,"最后在线",-1)),o("dd",null,r(te(l.last_online_at)),1)]),o("div",De,[t(ae,{"model-value":l.enabled,onChange:d=>ee(l,!!d)},null,8,["model-value","onChange"]),t(i,{type:"primary",plain:"",disabled:!l.enabled,onClick:d=>le(l)},{default:n(()=>[...e[40]||(e[40]=[u("增加积分",-1)])]),_:1},8,["disabled","onClick"]),t(i,{type:"danger",plain:"",onClick:d=>W([l.id])},{default:n(()=>[...e[41]||(e[41]=[u("删除",-1)])]),_:1},8,["onClick"])])]))),128))])):M("",!0),!U.value&&!S.value.length?(m(),P(me,{key:1,description:"暂无用户"})):M("",!0),O.value>v.page_size?(m(),P(pe,{key:2,"current-page":v.page,"onUpdate:currentPage":e[11]||(e[11]=l=>v.page=l),background:"",layout:"total,prev,pager,next",total:O.value,onCurrentChange:C},null,8,["current-page","total"])):M("",!0)])),[[ve,U.value]]),t(ie,{modelValue:E.value,"onUpdate:modelValue":e[15]||(e[15]=l=>E.value=l),title:"增加用户积分",width:"min(480px, calc(100vw - 32px))","close-on-click-modal":!w.value,"show-close":!w.value},{footer:n(()=>[t(i,{disabled:w.value,onClick:e[14]||(e[14]=l=>E.value=!1)},{default:n(()=>[...e[43]||(e[43]=[u("取消",-1)])]),_:1},8,["disabled"]),t(i,{type:"primary",loading:w.value,disabled:!Q.value,onClick:ue},{default:n(()=>[...e[44]||(e[44]=[u("确认增加",-1)])]),_:1},8,["loading","disabled"])]),default:n(()=>[$.value?(m(),V("div",Se,[o("strong",null,r($.value.account)+"("+r($.value.username)+")",1),o("span",null,"当前余额 "+r(Number($.value.point_balance).toFixed(2))+" 积分",1)])):M("",!0),t(ne,{"label-position":"top"},{default:n(()=>[t(N,{label:"增加积分"},{default:n(()=>[t(j,{modelValue:y.points,"onUpdate:modelValue":e[12]||(e[12]=l=>y.points=l),min:.01,precision:2,disabled:w.value,placeholder:"请输入大于 0 的积分数量"},null,8,["modelValue","disabled"]),e[42]||(e[42]=o("div",{class:"field-helper"},"仅支持增加积分,到账后会写入用户积分变动记录",-1))]),_:1}),t(N,{label:"操作原因"},{default:n(()=>[t(c,{modelValue:y.reason,"onUpdate:modelValue":e[13]||(e[13]=l=>y.reason=l),modelModifiers:{trim:!0},maxlength:"200","show-word-limit":"",disabled:w.value,placeholder:"用于管理后台审计,不会向用户展示"},null,8,["modelValue","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue","close-on-click-modal","show-close"]),t(ie,{modelValue:K.value,"onUpdate:modelValue":e[23]||(e[23]=l=>K.value=l),title:g.value==="single"?"新建用户":"批量新建用户",width:"min(560px, calc(100vw - 32px))"},{footer:n(()=>[t(i,{onClick:e[22]||(e[22]=l=>g.value="")},{default:n(()=>[...e[48]||(e[48]=[u("取消",-1)])]),_:1}),t(i,{type:"primary",loading:U.value,disabled:g.value==="batch"&&!!_.value.error,onClick:oe},{default:n(()=>[...e[49]||(e[49]=[u("创建",-1)])]),_:1},8,["loading","disabled"])]),default:n(()=>[t(ne,{ref_key:"formRef",ref:J,model:s,"label-position":"top"},{default:n(()=>[g.value==="single"?(m(),P(N,{key:0,label:"账号",prop:"account",rules:[{required:!0,message:"请输入账号"}]},{default:n(()=>[t(c,{modelValue:s.account,"onUpdate:modelValue":e[16]||(e[16]=l=>s.account=l),modelModifiers:{trim:!0},placeholder:"用于用户登录,创建后不可修改"},null,8,["modelValue"]),e[45]||(e[45]=o("div",{class:"field-helper"},"系统将自动生成随机用户名,账号创建后不可修改",-1))]),_:1})):(m(),V(R,{key:1},[o("div",Ee,[t(N,{class:"dialog-field--full",label:"账号前缀",prop:"prefix",rules:[{required:!0,message:"请输入账号前缀"}]},{default:n(()=>[t(c,{modelValue:s.prefix,"onUpdate:modelValue":e[17]||(e[17]=l=>s.prefix=l),modelModifiers:{trim:!0},placeholder:"例如 RR"},null,8,["modelValue"])]),_:1}),t(N,{label:"起始序号",prop:"start_sequence",rules:[{required:!0,message:"请输入起始序号"},{pattern:/^\d+$/,message:"起始序号必须为数字"}]},{default:n(()=>[t(c,{modelValue:s.start_sequence,"onUpdate:modelValue":e[18]||(e[18]=l=>s.start_sequence=l),modelModifiers:{trim:!0},placeholder:"例如 001"},null,8,["modelValue"])]),_:1}),t(N,{label:"终止序号",prop:"end_sequence",rules:[{required:!0,message:"请输入终止序号"},{pattern:/^\d+$/,message:"终止序号必须为数字"}]},{default:n(()=>[t(c,{modelValue:s.end_sequence,"onUpdate:modelValue":e[19]||(e[19]=l=>s.end_sequence=l),modelModifiers:{trim:!0},placeholder:"例如 050"},null,8,["modelValue"])]),_:1})]),t(fe,{class:"batch-preview",closable:!1,type:_.value.error?"error":"info",title:_.value.error?_.value.error:`将创建 ${_.value.count} 个账号:${_.value.first}${_.value.count>1?` 至 ${_.value.last}`:""}`},null,8,["type","title"]),e[46]||(e[46]=o("div",{class:"field-helper batch-helper"}," 账号之间使用短横线分隔;序号会保留输入位数,每次最多创建 50 个用户 ",-1))],64)),t(N,{label:"密码",prop:"password",rules:[{required:!0,min:8,message:"密码至少 8 个字符"}]},{default:n(()=>[t(c,{modelValue:s.password,"onUpdate:modelValue":e[20]||(e[20]=l=>s.password=l),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1}),t(N,{label:"每日限额"},{default:n(()=>[t(j,{modelValue:s.daily_limit,"onUpdate:modelValue":e[21]||(e[21]=l=>s.daily_limit=l),min:0,precision:2},null,8,["modelValue"]),e[47]||(e[47]=o("div",{class:"field-helper"},"0 表示当日禁止消耗,9999 表示不限制",-1))]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])])}}}),je=we(Le,[["__scopeId","data-v-7d96e9a9"]]);export{je as default};