2 lines
15 KiB
JavaScript
2 lines
15 KiB
JavaScript
import{a2 as Ye,r as t,j as e,B as y,a4 as Qe,a7 as J,a$ as Xe,a3 as pe,b0 as me,T as es,b1 as ss,Y as N,ab as as,ac as ts,ad as he,a5 as P,af as xe,Z as rs,b2 as ls,V as os,R as ns,b3 as is,W as cs,a6 as ds,b4 as us,b5 as ps,b6 as ms,b7 as hs,b8 as xs,s as b,b9 as fs,ba as js,bb as ys,bc as Is,bd as bs,aU as gs,be as Ss,bf as vs}from"./index-Dv-rJwbZ.js";import{u as Ns}from"./useDict-ClxJHHDi.js";import{P as Ts}from"./index-D4i8Uis-.js";import{F as v}from"./index-DmVlNV9v.js";import{R as Cs,C as fe}from"./row-NVxLItiq.js";import{C as je,T as A}from"./index-EoMRal4G.js";import{I as R}from"./index-DFGcC-dW.js";import{L as ws}from"./index-C5ML-75v.js";import{T as L}from"./index-BymHESMU.js";import{P as ye}from"./index-5rm_zQK_.js";import{P as Es}from"./Pagination-xbf267Yj.js";import{b as Ie,R as be,F as ge}from"./Table-BD43FaLh.js";import{M as Ps}from"./index-SIbETrtX.js";import{l as Rs}from"./tenant-BVDt1_Dd.js";import{l as _s}from"./org-D_FY0KEu.js";import"./useForm-43P2UNGc.js";import"./index-58fJYkx8.js";import"./fade-B5Faccku.js";const{Text:Y,Title:ks}=es,Ds=1,Os=10,Us="按钮",As=[{label:"全部",value:"ALL"},{label:"个人",value:"SELF"},{label:"本部门",value:"DEPT"},{label:"本部门及下级部门",value:"DEPT_AND_CHILD"},{label:"自定义部门",value:"CUSTOM"}];function Q(l){if(typeof l=="number")return Number.isFinite(l)?l:void 0;if(typeof l=="string"&&l.trim()!==""){const i=Number(l);return Number.isFinite(i)?i:void 0}if(l&&typeof l=="object"&&"value"in l)return Q(l.value)}function Ls(l){const i=(l||[]).filter(o=>o.status!==0),c=new Map,m=[];i.forEach(o=>{c.set(o.permId,{...o,key:o.permId,children:[]})}),c.forEach(o=>{if(o.parentId&&o.parentId!==0){const h=c.get(o.parentId);h&&h.children.push(o)}else m.push(o)});const d=o=>{o.sort((h,_)=>(h.sortOrder||0)-(_.sortOrder||0)),o.forEach(h=>h.children&&d(h.children))};return d(m),m}function Se(l,i){return l.map(c=>{var m;return{key:c.permId,title:e.jsxs(N,{children:[e.jsx("span",{children:c.name}),c.permType==="button"?e.jsx(L,{color:"cyan",style:{fontSize:10},children:i}):null]}),children:(m=c.children)!=null&&m.length?Se(c.children,i):void 0}})}function zs(l){const i=new Map,c=[];l.forEach(d=>{i.set(d.id,{...d,key:d.id,children:[]})}),i.forEach(d=>{d.parentId&&i.has(d.parentId)?i.get(d.parentId).children.push(d):c.push(d)});const m=d=>{d.sort((o,h)=>(o.sortOrder||0)-(h.sortOrder||0)),d.forEach(o=>o.children&&m(o.children))};return m(c),c}function ve(l){return l.map(i=>{var c;return{key:i.id,title:i.orgName,children:(c=i.children)!=null&&c.length?ve(i.children):void 0}})}function Ms(l){switch(l){case"ALL":return"当前角色可访问当前租户全部数据。";case"SELF":return"当前角色仅可访问本人数据。";case"DEPT":return"当前角色可访问本人所在部门的数据。";case"DEPT_AND_CHILD":return"当前角色可访问本人所在部门及所有下级部门的数据。";case"CUSTOM":return"当前角色可访问选中部门的数据。";default:return""}}const Fs=()=>`ROLE_${Date.now().toString(36).toUpperCase()}`;function la(){const{can:l}=Ye(),{items:i}=Ns("sys_common_status"),[c,m]=t.useState(!1),[d,o]=t.useState(!1),[h,_]=t.useState([]),[z,X]=t.useState([]),[r,k]=t.useState(null),[ee,M]=t.useState([]),[Ne,F]=t.useState([]),[C,se]=t.useState([]),[Te,ae]=t.useState(!1),[te,re]=t.useState([]),[Ce,$]=t.useState(!1),[B,le]=t.useState([]),[D,we]=t.useState(""),[K,oe]=t.useState(""),[p,O]=t.useState({current:1,size:Os,total:0}),[H,ne]=t.useState(void 0),[Ee,w]=t.useState(!1),[x,ie]=t.useState(null),[V,Pe]=t.useState([]),[g,Re]=t.useState("permissions"),[I,G]=t.useState("SELF"),[q,W]=t.useState([]),[_e,ce]=t.useState([]),[E]=v.useForm(),S=t.useMemo(()=>{const s=sessionStorage.getItem("userProfile");return s?JSON.parse(s).isPlatformAdmin&&localStorage.getItem("activeTenantId")==="0":!1},[]),de=t.useMemo(()=>Q(localStorage.getItem("activeTenantId"))??0,[]),ke=t.useMemo(()=>Se(Ls(z),Us),[z]),De=t.useMemo(()=>{const s=new Set(C.map(a=>a.userId));return te.filter(a=>!s.has(a.userId)&&(a.username.toLowerCase().includes(D.toLowerCase())||a.displayName.toLowerCase().includes(D.toLowerCase())))},[te,C,D]);t.useEffect(()=>{S&&Rs({current:1,size:100}).then(s=>Pe(s.records||[])).catch(()=>{})},[S]);const Oe=async()=>{try{const s=await bs();return X(s||[]),s||[]}catch{return X([]),[]}},T=async(s,a=z)=>{k(s),ae(!0);try{const[n,f,u,U]=await Promise.all([us(s.roleId),ps(s.roleId),ms(s.roleId),_s(s.tenantId)]),Ze=(n||[]).map(j=>Number(j)).filter(j=>!Number.isNaN(j)).filter(j=>!a.some(Je=>Je.parentId===j));M(Ze),F([]),se(f||[]),G((u==null?void 0:u.scopeType)||s.dataScopeType||"SELF"),W(((u==null?void 0:u.orgIds)||[]).map(j=>Number(j)).filter(j=>!Number.isNaN(j))),ce(ve(zs(U||[])))}finally{ae(!1)}},Z=async(s=p.current,a=p.size)=>{m(!0);try{const n=await Oe(),f=await hs({current:s,size:a,tenantId:S?H:de,keyword:K||void 0}),u=(f==null?void 0:f.records)||[];if(O({current:s,size:a,total:(f==null?void 0:f.total)||0}),_(u),u.length===0)k(null),se([]),M([]),F([]),G("SELF"),W([]),ce([]);else if(!r)await T(u[0],n);else{const U=u.find(ue=>ue.roleId===r.roleId);U?await T(U,n):await T(u[0],n)}}finally{m(!1)}};t.useEffect(()=>{Z(p.current,p.size)},[H,p.current,p.size,K]);const Ue=async()=>{try{const s=await gs();re(s||[])}catch{re([])}},Ae=()=>{Ue(),le([]),$(!0)},Le=async()=>{!r||B.length===0||(await xs(r.roleId,B),b.success("操作成功"),$(!1),await T(r))},ze=async s=>{if(r){if(r.roleCode==="TENANT_ADMIN"&&C.length<=1){b.warning("租户管理员角色至少需要保留一个绑定用户");return}await fs(r.roleId,s),b.success("操作成功"),await T(r)}},Me=()=>{ie(null),E.resetFields(),E.setFieldsValue({status:1,tenantId:S?void 0:de}),w(!0)},Fe=(s,a)=>{s.stopPropagation(),ie(a),E.setFieldsValue(a),w(!0)},$e=async(s,a)=>{s.stopPropagation(),await js(a),b.success("操作成功"),(r==null?void 0:r.roleId)===a&&k(null),await Z(p.current,p.size)},Be=async()=>{const s=await E.validateFields();o(!0);try{const a={roleCode:(x==null?void 0:x.roleCode)||s.roleCode||Fs(),roleName:s.roleName,remark:s.remark,status:s.status??Ds,tenantId:s.tenantId,dataScopeType:(x==null?void 0:x.dataScopeType)||"SELF"};x?await ys(x.roleId,a):await Is(a),b.success("操作成功"),w(!1),await Z(p.current,p.size)}finally{o(!1)}},Ke=(s,a)=>{O(n=>({...n,current:s,size:a}))},He=async()=>{if(r){o(!0);try{await Ss(r.roleId,Array.from(new Set([...ee,...Ne]))),b.success("操作成功")}finally{o(!1)}}},Ve=async()=>{if(r){if(I==="CUSTOM"&&q.length===0){b.warning("请选择至少一个部门");return}o(!0);try{const s={roleId:r.roleId,scopeType:I,orgIds:I==="CUSTOM"?q:[]};await vs(r.roleId,s),b.success("操作成功"),k(a=>a&&{...a,dataScopeType:I}),_(a=>a.map(n=>n.roleId===r.roleId?{...n,dataScopeType:I}:n))}finally{o(!1)}}},Ge=()=>{if(g==="permissions"){He();return}g==="dataScope"&&Ve()},qe=!r||g==="users"||g==="permissions"&&!l("sys:role:permission:save")||g==="dataScope"&&!l("sys:role:update"),We=g==="dataScope"?"保存数据权限":"保存";return e.jsxs("div",{className:"app-page roles-page-v2",children:[e.jsx(Ts,{title:"角色管理",subtitle:"维护角色基础信息、功能权限、数据权限与成员绑定"}),e.jsx("div",{className:"app-page__page-actions",children:l("sys:role:create")&&e.jsx(y,{type:"primary",icon:e.jsx(Qe,{}),onClick:Me,children:"新增角色"})}),e.jsx("div",{className:"roles-layout",children:e.jsxs(Cs,{gutter:24,className:"roles-layout__row",children:[e.jsx(fe,{span:7,className:"roles-layout__side",children:e.jsxs(je,{title:e.jsxs(N,{children:[e.jsx(xe,{}),e.jsx("span",{children:"角色列表"})]}),bordered:!1,className:"app-page__panel-card roles-side-card",children:[e.jsxs("div",{className:"role-search-panel",children:[S&&e.jsx(J,{placeholder:"按租户筛选",style:{width:"100%"},allowClear:!0,suffixIcon:e.jsx(Xe,{}),value:H,onChange:s=>{ne(Q(s)),O(a=>({...a,current:1}))},options:V.map(s=>({label:s.tenantName,value:s.id}))}),e.jsxs("div",{className:"role-search-bar",children:[e.jsx(R,{placeholder:"输入角色名称或编码搜索",prefix:e.jsx(pe,{style:{color:"#94a3b8"}}),value:K,onChange:s=>oe(s.target.value),allowClear:!0}),e.jsx(y,{type:"default",onClick:()=>{oe(""),ne(void 0),O(s=>({...s,current:1}))},children:"重置"})]})]}),e.jsx("div",{className:"role-list-container-v3",children:e.jsx(ws,{loading:c,dataSource:h,pagination:!1,locale:{emptyText:e.jsx(P,{description:"暂无角色数据",image:P.PRESENTED_IMAGE_SIMPLE})},renderItem:s=>{var a;return e.jsxs("div",{className:`role-item-card-v3 ${(r==null?void 0:r.roleId)===s.roleId?"active":""}`,onClick:()=>void T(s),children:[e.jsx("div",{className:"role-item-symbol","aria-hidden":"true",children:e.jsx(me,{})}),e.jsxs("div",{className:"role-item-main",children:[e.jsxs("div",{className:"role-item-name-row",children:[e.jsx(Y,{strong:!0,className:"role-name",children:s.roleName}),S&&e.jsx(L,{color:"blue",style:{fontSize:10,scale:"0.8",margin:"0 0 0 4px",borderRadius:"10px"},children:s.tenantId===0?"平台租户":((a=V.find(n=>n.id===s.tenantId))==null?void 0:a.tenantName)||`租户:${s.tenantId}`}),s.status===0&&e.jsx(L,{color:"error",style:{fontSize:10,scale:"0.8",margin:0},children:"停用"})]}),e.jsx(Y,{type:"secondary",className:"role-code",children:s.roleCode})]}),(r==null?void 0:r.roleId)===s.roleId?e.jsx("div",{className:"role-item-selected-mark","aria-hidden":"true",children:e.jsx(ss,{})}):null,e.jsx("div",{className:"role-item-actions",children:e.jsxs(N,{size:4,children:[e.jsx(as,{title:"编辑",children:e.jsx(y,{type:"text",size:"small",icon:e.jsx(ts,{}),onClick:n=>Fe(n,s)})}),s.roleCode!=="ADMIN"&&e.jsx(ye,{title:"确定删除该角色吗?",okText:"确定",cancelText:"取消",onConfirm:n=>void $e(n,s.roleId),children:e.jsx(y,{type:"text",size:"small",danger:!0,icon:e.jsx(he,{}),onClick:n=>n.stopPropagation()})})]})})]},s.roleId)}})}),e.jsx("div",{className:"role-list-pagination",children:e.jsx(Es,{current:p.current,pageSize:p.size,total:p.total,size:"small",onChange:Ke,showSizeChanger:!0,pageSizeOptions:["10","20","50"]})})]})}),e.jsx(fe,{span:17,className:"roles-layout__detail",children:r?e.jsx(je,{className:"app-page__panel-card roles-detail-card",bordered:!1,title:e.jsxs("div",{className:"role-detail-header",children:[e.jsx("div",{className:"role-detail-icon",children:e.jsx(me,{})}),e.jsxs("div",{className:"role-detail-heading",children:[e.jsx("div",{className:"role-detail-title",children:r.roleName}),e.jsx(Y,{type:"secondary",className:"role-detail-code",children:r.roleCode})]})]}),extra:e.jsx(y,{type:"primary",icon:e.jsx(cs,{}),loading:d,onClick:Ge,disabled:qe,style:{borderRadius:"6px"},children:We}),children:e.jsxs(A,{activeKey:g,onChange:s=>Re(s),className:"role-detail-tabs",children:[e.jsx(A.TabPane,{tab:e.jsxs(N,{children:[e.jsx(rs,{}),"功能权限"]}),children:e.jsx("div",{className:"role-detail-pane",children:e.jsx("div",{className:"permission-tree-wrapper",children:e.jsx(Ie,{checkable:!0,selectable:!1,checkStrictly:!1,treeData:ke,checkedKeys:ee,onCheck:(s,a)=>{const n=Array.isArray(s)?s:s.checked,f=a.halfCheckedKeys||[];M(n.map(u=>Number(u))),F(f.map(u=>Number(u)))},defaultExpandAll:!0})})})},"permissions"),e.jsx(A.TabPane,{tab:e.jsxs(N,{children:[e.jsx(xe,{}),"数据权限"]}),children:e.jsxs("div",{className:"role-detail-pane",children:[e.jsx("div",{style:{marginBottom:16},children:e.jsx(be.Group,{value:I,onChange:s=>G(s.target.value),optionType:"button",buttonStyle:"solid",children:As.map(s=>e.jsx(be.Button,{value:s.value,children:s.label},s.value))})}),e.jsx("div",{style:{marginBottom:16,color:"#64748b"},children:Ms(I)}),I==="CUSTOM"?e.jsx("div",{className:"permission-tree-wrapper",children:e.jsx(Ie,{checkable:!0,selectable:!1,treeData:_e,checkedKeys:q,onCheck:s=>{const a=Array.isArray(s)?s:s.checked;W(a.map(n=>Number(n)))},defaultExpandAll:!0})}):e.jsx(P,{image:P.PRESENTED_IMAGE_SIMPLE,description:"当前范围不需要选择部门"})]})},"dataScope"),e.jsx(A.TabPane,{tab:e.jsxs(N,{children:[e.jsx(is,{}),`成员管理 (${C.length})`]}),children:e.jsxs("div",{className:"role-detail-pane",children:[e.jsxs("div",{className:"role-members-toolbar",children:[e.jsx(ks,{level:5,style:{margin:0},children:"已绑定用户"}),e.jsx(y,{type:"primary",ghost:!0,icon:e.jsx(ls,{}),onClick:Ae,disabled:!l("sys:role:update"),children:"绑定用户"})]}),e.jsx(ge,{rowKey:"userId",size:"small",loading:Te,dataSource:C,pagination:{pageSize:10,size:"small"},columns:[{title:"用户信息",render:(s,a)=>e.jsxs(N,{children:[e.jsx(os,{size:"small",icon:e.jsx(ns,{}),style:{backgroundColor:"#f0f2f5",color:"#8c8c8c"}}),e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:500},children:a.displayName}),e.jsxs("div",{style:{fontSize:11,color:"#bfbfbf"},children:["@",a.username]})]})]})},{title:"手机号",dataIndex:"phone",className:"tabular-nums"},{title:"状态",dataIndex:"status",width:80,render:s=>e.jsx(L,{color:s===1?"green":"red",children:s===1?"启用":"停用"})},{title:"操作",key:"action",width:80,render:(s,a)=>e.jsx(ye,{title:"确定解除该用户绑定吗?",okText:"确定",cancelText:"取消",onConfirm:()=>void ze(a.userId),disabled:!l("sys:role:update"),children:e.jsx(y,{type:"text",danger:!0,size:"small",icon:e.jsx(he,{}),disabled:!l("sys:role:update")})})}]})]})},"users")]})}):e.jsx("div",{className:"app-page__empty-state",children:e.jsx(P,{description:"请选择左侧角色查看详情"})})})]})}),e.jsxs(Ps,{title:"绑定用户到角色",open:Ce,onCancel:()=>$(!1),onOk:()=>void Le(),okText:"确定",cancelText:"取消",width:650,destroyOnClose:!0,children:[e.jsx("div",{style:{marginBottom:16},children:e.jsx(R,{placeholder:"搜索用户名或显示名称",prefix:e.jsx(pe,{}),value:D,onChange:s=>we(s.target.value),allowClear:!0})}),e.jsx(ge,{rowKey:"userId",size:"small",dataSource:De,pagination:{pageSize:6},rowSelection:{selectedRowKeys:B,onChange:s=>le(s)},columns:[{title:"显示名称",dataIndex:"displayName"},{title:"用户名",dataIndex:"username"},{title:"手机号",dataIndex:"phone"}]})]}),e.jsx(ds,{title:x?"编辑角色":"新增角色",open:Ee,onClose:()=>w(!1),width:420,destroyOnClose:!0,footer:e.jsxs("div",{className:"app-page__drawer-footer",children:[e.jsx(y,{onClick:()=>w(!1),children:"取消"}),e.jsx(y,{type:"primary",loading:d,onClick:()=>void Be(),children:"保存"})]}),children:e.jsxs(v,{form:E,layout:"vertical",children:[e.jsx(v.Item,{label:"租户",name:"tenantId",rules:[{required:!0}],hidden:!S,children:e.jsx(J,{options:V.map(s=>({label:s.tenantName,value:s.id})),disabled:!!x})}),e.jsx(v.Item,{label:"角色名称",name:"roleName",rules:[{required:!0}],children:e.jsx(R,{placeholder:"请输入角色名称"})}),e.jsx(v.Item,{label:"角色编码",name:"roleCode",rules:[{required:!0}],children:e.jsx(R,{placeholder:"请输入角色编码",disabled:!!x})}),e.jsx(v.Item,{label:"状态",name:"status",initialValue:1,children:e.jsx(J,{options:i.map(s=>({label:s.itemLabel,value:Number(s.itemValue)}))})}),e.jsx(v.Item,{label:"备注",name:"remark",children:e.jsx(R.TextArea,{rows:4,placeholder:"请输入角色说明或适用范围"})})]})})]})}export{la as default};
|