import{d as we,o as Re,b as r,c as _,e as s,f as t,T as S,U as F,w as l,r as g,S as Ve,i as c,a3 as Q,a0 as he,n as R,j as V,a4 as Ce,k as xe,z as Te,t as n,g as i,h as x,a5 as W,v as G,E as k,Y as ze}from"./index-BCt9h3P8.js";import{j as X,k as Z,l as ee,s as Ue,m as Se,n as De,o as Ee,p as $e}from"./admin-yH4tDL3a.js";import{R as ae,M as te}from"./index-CQ6vhAxl.js";import{_ as Ae}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./index-CTvVpU0T.js";const Me={class:"roles-page"},Ie={key:0,class:"loading-state"},Le={class:"role-cards"},Be={class:"role-card-header"},Fe={class:"role-card-info"},Ne={class:"role-card-name"},qe={class:"role-card-id"},He={class:"role-card-stats"},Pe={class:"stat-item"},je={class:"stat-value"},Oe={class:"stat-item"},Ye={class:"stat-value"},Ge={key:0,class:"role-card-desc"},Je={class:"role-card-perms"},Ke={class:"section-header"},Qe={class:"data-table-wrapper"},We={class:"employee-name"},Xe={key:0},Ze={key:1,class:"text-muted"},ea={class:"section-header"},aa={class:"data-table-wrapper"},ta={class:"emp-option"},la={class:"emp-name"},sa={class:"emp-id"},oa={key:0,class:"emp-dept"},na={key:0,class:"revoke-info"},ia={class:"revoke-detail"},ra={key:0},ua={class:"form-hint"},da=we({__name:"Roles",setup(ma){const N=g(!1),h=g([]),q=g([]),D=g([]),T=g(!1),E=g(!1),p=G({target:"",role_name:"agent",reason:""}),z=g(!1),$=g(!1),f=g(null),A=G({reason:""}),U=g(!1),M=g(!1),u=G({role_name:"agent",source_type:"wecom_tag",source_value:"",priority:10});Re(async()=>{N.value=!0;try{const[o,e,m]=await Promise.all([X(),Z(),ee()]);h.value=C(o),D.value=C(e),q.value=C(m)}catch(o){console.error("[Roles] 加载角色管理数据失败:",o),h.value=le(),D.value=se()}finally{N.value=!1}});function le(){return[{id:"1",name:"user",display_name:"用户",description:"普通用户,通过企微 H5 端提交问题",permissions:["ticket.create","ticket.view_own","message.send"],is_default:!0,user_count:120,created_at:"2026-06-12T00:00:00",updated_at:"2026-06-12T00:00:00"},{id:"2",name:"agent",display_name:"坐席",description:"IT 支持坐席,处理用户问题",permissions:["ticket.create","ticket.view_all","ticket.assign","ticket.resolve","conversation.manage","quick_reply.use"],is_default:!1,user_count:8,created_at:"2026-06-12T00:00:00",updated_at:"2026-06-12T00:00:00"},{id:"3",name:"admin",display_name:"管理员",description:"系统管理员,拥有全部管理权限",permissions:["ticket.create","ticket.view_all","ticket.assign","ticket.resolve","conversation.manage","quick_reply.manage","system.config","agent.manage","role.manage"],is_default:!1,user_count:2,created_at:"2026-06-12T00:00:00",updated_at:"2026-06-12T00:00:00"}]}function se(){return[{id:"1",role_id:"2",role_name:"agent",source_type:"wecom_tag",source_value:"IT坐席",priority:10,is_active:!0,created_at:"2026-06-12T00:00:00"},{id:"2",role_id:"2",role_name:"agent",source_type:"ehr_position",source_value:"IT支持",priority:5,is_active:!0,created_at:"2026-06-12T00:00:00"},{id:"3",role_id:"2",role_name:"agent",source_type:"ehr_position",source_value:"IT运维",priority:5,is_active:!0,created_at:"2026-06-12T00:00:00"},{id:"4",role_id:"2",role_name:"agent",source_type:"ehr_position",source_value:"技术支持",priority:3,is_active:!0,created_at:"2026-06-12T00:00:00"}]}const oe=Ve(()=>q.value);function H(o){if(!o)return"-";const e=new Date(o),m=b=>String(b).padStart(2,"0");return`${e.getFullYear()}-${m(e.getMonth()+1)}-${m(e.getDate())} ${m(e.getHours())}:${m(e.getMinutes())}`}function J(o){return{user:"info",agent:"success",admin:"danger"}[o]||"info"}function ne(o){return{user:"var(--bg-tertiary)",agent:"var(--success-bg)",admin:"var(--danger-bg)"}[o]||"var(--bg-tertiary)"}function ie(o){return{user:"var(--text-muted)",agent:"var(--success)",admin:"var(--danger)"}[o]||"var(--text-muted)"}function re(o){return h.value.some(e=>e.name===o&&e.is_default)}function C(o){if(Array.isArray(o))return o;const e=o;return e&&Array.isArray(e.data)?e.data:e&&e.data&&typeof e.data=="object"&&Array.isArray(e.data.data)?e.data.data:[]}function ue(){p.target="",p.role_name="agent",p.reason="",T.value=!0}async function de(o,e){const m=(o||"").trim();if(!m){e([]);return}try{const v=(await Ue(m)).data,y=(v==null?void 0:v.items)||[];e(y.map(d=>({...d,value:d.employee_id})))}catch{e([])}}function me(o){p.target=String(o.employee_id||"")}function pe(o,e){if(!o)return!0;const m=o.toLowerCase(),b=String(e.employee_id||"").toLowerCase(),v=String(e.name||"").toLowerCase();return b.includes(m)||v.includes(m)}async function _e(){if(!p.target.trim()){k.warning("请输入员工账号或姓名");return}if(!p.role_name){k.warning("请选择目标角色");return}E.value=!0;try{await Se({target:p.target.trim(),role_name:p.role_name,reason:p.reason||void 0}),k.success("角色分配成功"),T.value=!1,await I()}catch{k.error("分配失败,请检查员工账号或姓名是否正确")}finally{E.value=!1}}function ce(o){f.value=o,A.reason="",z.value=!0}async function fe(){if(f.value){$.value=!0;try{await De({employee_id:f.value.employee_id,role_name:f.value.role_name,reason:A.reason||void 0}),k.success("角色撤销成功"),z.value=!1,await I()}catch{k.error("撤销失败")}finally{$.value=!1}}}function ve(){u.role_name="agent",u.source_type="wecom_tag",u.source_value="",u.priority=10,U.value=!0}async function ye(){if(!u.source_value.trim()){k.warning("请输入匹配值");return}M.value=!0;try{await Ee({role_name:u.role_name,source_type:u.source_type,source_value:u.source_value.trim(),priority:u.priority}),k.success("映射规则创建成功"),U.value=!1,await I()}catch{k.error("创建失败,可能已存在相同规则")}finally{M.value=!1}}async function ge(o){try{await ze.confirm(`确认删除映射规则:${te[o.source_type]} = "${o.source_value}" → ${o.role_name}?`,"删除确认",{type:"warning"})}catch{return}try{await $e(o.id),k.success("映射规则已删除"),await I()}catch{k.error("删除失败")}}async function I(){try{const[o,e,m]=await Promise.all([X(),Z(),ee()]);h.value=C(o),D.value=C(e),q.value=C(m)}catch(o){console.error("[Roles] 刷新角色管理数据失败:",o)}}return(o,e)=>{const m=c("el-skeleton"),b=c("el-icon"),v=c("el-tag"),y=c("el-button"),d=c("el-table-column"),K=c("el-table"),ke=c("el-autocomplete"),w=c("el-form-item"),L=c("el-option"),P=c("el-select"),j=c("el-input"),O=c("el-form"),Y=c("el-dialog"),be=c("el-input-number");return r(),_("div",Me,[e[33]||(e[33]=s("div",{class:"page-header"},[s("div",null,[s("div",{class:"page-title"},"角色管理"),s("div",{class:"page-desc"},"管理系统角色定义、用户角色分配和自动映射规则")])],-1)),N.value?(r(),_("div",Ie,[t(m,{rows:8,animated:""})])):(r(),_(S,{key:1},[e[23]||(e[23]=s("div",{class:"section-title"},"角色概览",-1)),s("div",Le,[(r(!0),_(S,null,F(h.value,a=>(r(),_("div",{key:a.id,class:Q(["role-card",{"role-card--default":a.is_default}])},[s("div",Be,[s("div",{class:"role-card-icon",style:he({background:ne(a.name),color:ie(a.name)})},[t(b,{size:20},{default:l(()=>[a.name==="user"?(r(),R(V(Ce),{key:0})):a.name==="agent"?(r(),R(V(xe),{key:1})):(r(),R(V(Te),{key:2}))]),_:2},1024)],4),s("div",Fe,[s("div",Ne,n(a.display_name),1),s("div",qe,n(a.name),1)]),a.is_default?(r(),R(v,{key:0,type:"info",size:"small"},{default:l(()=>[...e[14]||(e[14]=[i("默认",-1)])]),_:1})):x("",!0)]),s("div",He,[s("div",Pe,[s("span",je,n(a.user_count??0),1),e[15]||(e[15]=s("span",{class:"stat-label"},"关联用户",-1))]),s("div",Oe,[s("span",Ye,n(a.permissions.length),1),e[16]||(e[16]=s("span",{class:"stat-label"},"权限数",-1))])]),a.description?(r(),_("div",Ge,n(a.description),1)):x("",!0),s("div",Je,[(r(!0),_(S,null,F(a.permissions.slice(0,6),B=>(r(),R(v,{key:B,size:"small",type:"info",class:"perm-tag"},{default:l(()=>[i(n(B),1)]),_:2},1024))),128)),a.permissions.length>6?(r(),R(v,{key:0,size:"small",type:"info",class:"perm-tag"},{default:l(()=>[i(" +"+n(a.permissions.length-6),1)]),_:2},1024)):x("",!0)])],2))),128))]),s("div",Ke,[e[18]||(e[18]=s("div",{class:"section-title"},"用户角色分配",-1)),t(y,{type:"primary",size:"small",onClick:ue},{default:l(()=>[t(b,null,{default:l(()=>[t(V(W))]),_:1}),e[17]||(e[17]=i(" 分配角色 ",-1))]),_:1})]),s("div",Qe,[t(K,{data:oe.value,stripe:"",size:"small","empty-text":"暂无用户角色记录",class:"user-roles-table"},{default:l(()=>[t(d,{prop:"employee_id",label:"员工账号","min-width":"120"}),t(d,{prop:"employee_name",label:"姓名","min-width":"100"},{default:l(({row:a})=>[s("span",We,n(a.employee_name||"-"),1)]),_:1}),t(d,{prop:"role_display_name",label:"角色","min-width":"100"},{default:l(({row:a})=>[t(v,{type:J(a.role_name),size:"small"},{default:l(()=>[i(n(a.role_display_name),1)]),_:2},1032,["type"])]),_:1}),t(d,{prop:"source",label:"来源","min-width":"100"},{default:l(({row:a})=>[s("span",{class:Q(["source-badge","source-"+a.source])},n(V(ae)[a.source]||a.source),3)]),_:1}),t(d,{prop:"assigned_by",label:"分配者","min-width":"100"},{default:l(({row:a})=>[i(n(a.assigned_by||"-"),1)]),_:1}),t(d,{prop:"assigned_at",label:"分配时间","min-width":"160"},{default:l(({row:a})=>[i(n(H(a.assigned_at)),1)]),_:1}),t(d,{prop:"expires_at",label:"过期时间","min-width":"160"},{default:l(({row:a})=>[a.expires_at?(r(),_("span",Xe,n(H(a.expires_at)),1)):(r(),_("span",Ze,"永不过期"))]),_:1}),t(d,{label:"操作",width:"100",fixed:"right"},{default:l(({row:a})=>[t(y,{type:"danger",size:"small",link:"",disabled:re(a.role_name),onClick:B=>ce(a)},{default:l(()=>[...e[19]||(e[19]=[i(" 撤销 ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})]),_:1},8,["data"])]),s("div",ea,[e[21]||(e[21]=s("div",{class:"section-title"},"自动映射规则",-1)),t(y,{type:"primary",size:"small",onClick:ve},{default:l(()=>[t(b,null,{default:l(()=>[t(V(W))]),_:1}),e[20]||(e[20]=i(" 新建规则 ",-1))]),_:1})]),s("div",aa,[t(K,{data:D.value,stripe:"",size:"small","empty-text":"暂无映射规则"},{default:l(()=>[t(d,{prop:"role_name",label:"目标角色","min-width":"100"},{default:l(({row:a})=>[t(v,{type:J(a.role_name),size:"small"},{default:l(()=>[i(n(a.role_name),1)]),_:2},1032,["type"])]),_:1}),t(d,{prop:"source_type",label:"来源类型","min-width":"120"},{default:l(({row:a})=>[i(n(V(te)[a.source_type]||a.source_type),1)]),_:1}),t(d,{prop:"source_value",label:"匹配值","min-width":"160"}),t(d,{prop:"priority",label:"优先级","min-width":"80"}),t(d,{prop:"is_active",label:"状态","min-width":"80"},{default:l(({row:a})=>[t(v,{type:a.is_active?"success":"info",size:"small"},{default:l(()=>[i(n(a.is_active?"启用":"禁用"),1)]),_:2},1032,["type"])]),_:1}),t(d,{prop:"created_at",label:"创建时间","min-width":"160"},{default:l(({row:a})=>[i(n(H(a.created_at)),1)]),_:1}),t(d,{label:"操作",width:"100",fixed:"right"},{default:l(({row:a})=>[t(y,{type:"danger",size:"small",link:"",onClick:B=>ge(a)},{default:l(()=>[...e[22]||(e[22]=[i(" 删除 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])])],64)),t(Y,{modelValue:T.value,"onUpdate:modelValue":e[4]||(e[4]=a=>T.value=a),title:"分配角色",width:"440px","destroy-on-close":""},{footer:l(()=>[t(y,{onClick:e[3]||(e[3]=a=>T.value=!1)},{default:l(()=>[...e[25]||(e[25]=[i("取消",-1)])]),_:1}),t(y,{type:"primary",loading:E.value,onClick:_e},{default:l(()=>[i(n(E.value?"分配中...":"确认分配"),1)]),_:1},8,["loading"])]),default:l(()=>[t(O,{"label-position":"top"},{default:l(()=>[t(w,{label:"员工账号或姓名"},{default:l(()=>[t(ke,{modelValue:p.target,"onUpdate:modelValue":e[0]||(e[0]=a=>p.target=a),"fetch-suggestions":de,"filter-method":pe,placeholder:"输入员工账号或姓名,自动匹配",clearable:"",style:{width:"100%"},onSelect:me},{default:l(({item:a})=>[s("div",ta,[s("span",la,n(a.name||"—"),1),s("span",sa,n(a.employee_id),1),a.department?(r(),_("span",oa,n(a.department),1)):x("",!0)])]),_:1},8,["modelValue"]),e[24]||(e[24]=s("div",{class:"form-hint"},"支持直接输入员工账号(如 tangzhenzhen),或输入姓名自动转换;系统会实时校验该员工是否在企微组织架构内。",-1))]),_:1}),t(w,{label:"目标角色"},{default:l(()=>[t(P,{modelValue:p.role_name,"onUpdate:modelValue":e[1]||(e[1]=a=>p.role_name=a),placeholder:"选择角色",style:{width:"100%"}},{default:l(()=>[(r(!0),_(S,null,F(h.value,a=>(r(),R(L,{key:a.name,label:a.display_name+" ("+a.name+")",value:a.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(w,{label:"分配原因(可选)"},{default:l(()=>[t(j,{modelValue:p.reason,"onUpdate:modelValue":e[2]||(e[2]=a=>p.reason=a),type:"textarea",rows:2,placeholder:"说明分配原因"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(Y,{modelValue:z.value,"onUpdate:modelValue":e[7]||(e[7]=a=>z.value=a),title:"撤销角色",width:"440px","destroy-on-close":""},{footer:l(()=>[t(y,{onClick:e[6]||(e[6]=a=>z.value=!1)},{default:l(()=>[...e[30]||(e[30]=[i("取消",-1)])]),_:1}),t(y,{type:"danger",loading:$.value,onClick:fe},{default:l(()=>[i(n($.value?"撤销中...":"确认撤销"),1)]),_:1},8,["loading"])]),default:l(()=>[f.value?(r(),_("div",na,[e[29]||(e[29]=s("p",null,"确认撤销以下角色分配?",-1)),s("div",ia,[s("div",null,[e[26]||(e[26]=s("strong",null,"员工:",-1)),i(n(f.value.employee_id)+" ",1),f.value.employee_name?(r(),_("span",ra,"("+n(f.value.employee_name)+")",1)):x("",!0)]),s("div",null,[e[27]||(e[27]=s("strong",null,"角色:",-1)),i(n(f.value.role_display_name)+" ("+n(f.value.role_name)+")",1)]),s("div",null,[e[28]||(e[28]=s("strong",null,"来源:",-1)),i(n(V(ae)[f.value.source]||f.value.source),1)])])])):x("",!0),t(O,{"label-position":"top",style:{"margin-top":"16px"}},{default:l(()=>[t(w,{label:"撤销原因(可选)"},{default:l(()=>[t(j,{modelValue:A.reason,"onUpdate:modelValue":e[5]||(e[5]=a=>A.reason=a),type:"textarea",rows:2,placeholder:"说明撤销原因"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(Y,{modelValue:U.value,"onUpdate:modelValue":e[13]||(e[13]=a=>U.value=a),title:"新建映射规则",width:"480px","destroy-on-close":""},{footer:l(()=>[t(y,{onClick:e[12]||(e[12]=a=>U.value=!1)},{default:l(()=>[...e[32]||(e[32]=[i("取消",-1)])]),_:1}),t(y,{type:"primary",loading:M.value,onClick:ye},{default:l(()=>[i(n(M.value?"创建中...":"创建规则"),1)]),_:1},8,["loading"])]),default:l(()=>[t(O,{"label-position":"top"},{default:l(()=>[t(w,{label:"目标角色"},{default:l(()=>[t(P,{modelValue:u.role_name,"onUpdate:modelValue":e[8]||(e[8]=a=>u.role_name=a),placeholder:"选择角色",style:{width:"100%"}},{default:l(()=>[(r(!0),_(S,null,F(h.value,a=>(r(),R(L,{key:a.name,label:a.display_name+" ("+a.name+")",value:a.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(w,{label:"来源类型"},{default:l(()=>[t(P,{modelValue:u.source_type,"onUpdate:modelValue":e[9]||(e[9]=a=>u.source_type=a),placeholder:"选择来源类型",style:{width:"100%"}},{default:l(()=>[t(L,{label:"企微标签",value:"wecom_tag"}),t(L,{label:"eHR 岗位",value:"ehr_position"})]),_:1},8,["modelValue"])]),_:1}),t(w,{label:"匹配值"},{default:l(()=>[t(j,{modelValue:u.source_value,"onUpdate:modelValue":e[10]||(e[10]=a=>u.source_value=a),placeholder:u.source_type==="wecom_tag"?"企微标签名,如 IT坐席":"岗位关键词,如 IT支持"},null,8,["modelValue","placeholder"]),s("div",ua,n(u.source_type==="wecom_tag"?"用户拥有此企微标签时,自动获得目标角色":"用户 eHR 岗位包含此关键词时,自动获得目标角色"),1)]),_:1}),t(w,{label:"优先级(0-100)"},{default:l(()=>[t(be,{modelValue:u.priority,"onUpdate:modelValue":e[11]||(e[11]=a=>u.priority=a),min:0,max:100,step:10},null,8,["modelValue"]),e[31]||(e[31]=s("div",{class:"form-hint"},"数值越大优先级越高,同一来源取最高优先级角色",-1))]),_:1})]),_:1})]),_:1},8,["modelValue"])])}}}),ya=Ae(da,[["__scopeId","data-v-dad2ae6f"]]);export{ya as default};