unis_crm/frontend1/dist/assets/index-BIyiLkcv.js

2 lines
15 KiB
JavaScript

import{G as Xe,r as t,j as e,B as y,I as Ze,M as W,a5 as Ye,H as pe,a6 as me,T as es,a7 as ss,z as N,Q as as,U as ts,V as he,J as P,X as xe,C as rs,a8 as ls,A as os,R as ns,a9 as is,x as cs,K as ds,aa as us,ab as ps,ac as ms,ad as hs,ae as xs,s as g,af as fs,ag as js,ah as ys,ai as Is,aj as gs,_ as Ss,ak as vs,al as bs}from"./index-BGI3tmtB.js";import{u as Ns}from"./useDict-BeEL9edl.js";import{P as Ts}from"./index-xsV5o4zp.js";import{F as b}from"./index-BuOmEnKg.js";import{R as Cs,C as fe}from"./row-C3H8lbGw.js";import{C as je,T as U}from"./index-DxgbQv5l.js";import{I as R}from"./index-FqFqpoYX.js";import{L as ws}from"./index-DJZv12eX.js";import{T as z}from"./index-bzjak6Z4.js";import{P as ye}from"./index-D6NeKG5r.js";import{P as Es}from"./Pagination-COOq01L8.js";import{T as Ie,F as ge}from"./Table-BewG91sh.js";import{R as Se}from"./iconUtil-IZQuqZwd.js";import{M as Ps}from"./index-wm5R4Axa.js";import{l as Rs}from"./tenant-BBP5rCYY.js";import{l as _s}from"./org-BBh6xzlz.js";import"./useForm-BpWJqkw6.js";import"./index-DJxTfCUX.js";import"./index-DUXqiKOh.js";const{Text:X,Title:ks}=es,Ds=1,Os=10,As="按钮",Us=[{label:"全部",value:"ALL"},{label:"个人",value:"SELF"},{label:"本部门",value:"DEPT"},{label:"本部门及下级部门",value:"DEPT_AND_CHILD"},{label:"自定义部门",value:"CUSTOM"}];function Z(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 Z(l.value)}function zs(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 ve(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(z,{color:"cyan",style:{fontSize:10},children:i}):null]}),children:(m=c.children)!=null&&m.length?ve(c.children,i):void 0}})}function Ls(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 be(l){return l.map(i=>{var c;return{key:i.id,title:i.orgName,children:(c=i.children)!=null&&c.length?be(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 oa(){const{can:l}=Xe(),{items:i}=Ns("sys_common_status"),[c,m]=t.useState(!1),[d,o]=t.useState(!1),[h,_]=t.useState([]),[L,Y]=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),[G,Pe]=t.useState([]),[S,Re]=t.useState("permissions"),[I,V]=t.useState("SELF"),[q,J]=t.useState([]),[_e,ce]=t.useState([]),[E]=b.useForm(),v=t.useMemo(()=>{const s=sessionStorage.getItem("userProfile");return s?JSON.parse(s).isPlatformAdmin&&localStorage.getItem("activeTenantId")==="0":!1},[]),de=t.useMemo(()=>Z(localStorage.getItem("activeTenantId"))??0,[]),ke=t.useMemo(()=>ve(zs(L),As),[L]),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(()=>{v&&Rs({current:1,size:100}).then(s=>Pe(s.records||[])).catch(()=>{})},[v]);const Oe=async()=>{try{const s=await gs();return Y(s||[]),s||[]}catch{return Y([]),[]}},T=async(s,a=L)=>{k(s),ae(!0);try{const[n,f,u,A]=await Promise.all([us(s.roleId),ps(s.roleId),ms(s.roleId),_s(s.tenantId)]),Qe=(n||[]).map(j=>Number(j)).filter(j=>!Number.isNaN(j)).filter(j=>!a.some(We=>We.parentId===j));M(Qe),F([]),se(f||[]),V((u==null?void 0:u.scopeType)||s.dataScopeType||"SELF"),J(((u==null?void 0:u.orgIds)||[]).map(j=>Number(j)).filter(j=>!Number.isNaN(j))),ce(be(Ls(A||[])))}finally{ae(!1)}},Q=async(s=p.current,a=p.size)=>{m(!0);try{const n=await Oe(),f=await hs({current:s,size:a,tenantId:v?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([]),V("SELF"),J([]),ce([]);else if(!r)await T(u[0],n);else{const A=u.find(ue=>ue.roleId===r.roleId);A?await T(A,n):await T(u[0],n)}}finally{m(!1)}};t.useEffect(()=>{Q(p.current,p.size)},[H,p.current,p.size,K]);const Ae=async()=>{try{const s=await Ss();re(s||[])}catch{re([])}},Ue=()=>{Ae(),le([]),$(!0)},ze=async()=>{!r||B.length===0||(await xs(r.roleId,B),g.success("操作成功"),$(!1),await T(r))},Le=async s=>{if(r){if(r.roleCode==="TENANT_ADMIN"&&C.length<=1){g.warning("租户管理员角色至少需要保留一个绑定用户");return}await fs(r.roleId,s),g.success("操作成功"),await T(r)}},Me=()=>{ie(null),E.resetFields(),E.setFieldsValue({status:1,tenantId:v?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),g.success("操作成功"),(r==null?void 0:r.roleId)===a&&k(null),await Q(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),g.success("操作成功"),w(!1),await Q(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 vs(r.roleId,Array.from(new Set([...ee,...Ne]))),g.success("操作成功")}finally{o(!1)}}},Ge=async()=>{if(r){if(I==="CUSTOM"&&q.length===0){g.warning("请选择至少一个部门");return}o(!0);try{const s={roleId:r.roleId,scopeType:I,orgIds:I==="CUSTOM"?q:[]};await bs(r.roleId,s),g.success("操作成功"),k(a=>a&&{...a,dataScopeType:I}),_(a=>a.map(n=>n.roleId===r.roleId?{...n,dataScopeType:I}:n))}finally{o(!1)}}},Ve=()=>{if(S==="permissions"){He();return}S==="dataScope"&&Ge()},qe=!r||S==="users"||S==="permissions"&&!l("sys:role:permission:save")||S==="dataScope"&&!l("sys:role:update"),Je=S==="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(Ze,{}),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:"角色列表"})]}),variant:"borderless",className:"app-page__panel-card roles-side-card",children:[e.jsxs("div",{className:"role-search-panel",children:[v&&e.jsx(W,{placeholder:"按租户筛选",style:{width:"100%"},allowClear:!0,suffixIcon:e.jsx(Ye,{}),value:H,onChange:s=>{ne(Z(s)),O(a=>({...a,current:1}))},options:G.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(X,{strong:!0,className:"role-name",children:s.roleName}),v&&e.jsx(z,{color:"blue",style:{fontSize:10,scale:"0.8",margin:"0 0 0 4px",borderRadius:"10px"},children:s.tenantId===0?"平台租户":((a=G.find(n=>n.id===s.tenantId))==null?void 0:a.tenantName)||`租户:${s.tenantId}`}),s.status===0&&e.jsx(z,{color:"error",style:{fontSize:10,scale:"0.8",margin:0},children:"停用"})]}),e.jsx(X,{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",variant:"borderless",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(X,{type:"secondary",className:"role-detail-code",children:r.roleCode})]})]}),extra:e.jsx(y,{type:"primary",icon:e.jsx(cs,{}),loading:d,onClick:Ve,disabled:qe,style:{borderRadius:"6px"},children:Je}),children:e.jsxs(U,{activeKey:S,onChange:s=>Re(s),className:"role-detail-tabs",children:[e.jsx(U.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(U.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(Se.Group,{value:I,onChange:s=>V(s.target.value),optionType:"button",buttonStyle:"solid",children:Us.map(s=>e.jsx(Se.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;J(a.map(n=>Number(n)))},defaultExpandAll:!0})}):e.jsx(P,{image:P.PRESENTED_IMAGE_SIMPLE,description:"当前范围不需要选择部门"})]})},"dataScope"),e.jsx(U.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:Ue,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(z,{color:s===1?"green":"red",children:s===1?"启用":"停用"})},{title:"操作",key:"action",width:80,render:(s,a)=>e.jsx(ye,{title:"确定解除该用户绑定吗?",okText:"确定",cancelText:"取消",onConfirm:()=>void Le(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 ze(),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(b,{form:E,layout:"vertical",children:[e.jsx(b.Item,{label:"租户",name:"tenantId",rules:[{required:!0}],hidden:!v,children:e.jsx(W,{options:G.map(s=>({label:s.tenantName,value:s.id})),disabled:!!x})}),e.jsx(b.Item,{label:"角色名称",name:"roleName",rules:[{required:!0}],children:e.jsx(R,{placeholder:"请输入角色名称"})}),e.jsx(b.Item,{label:"角色编码",name:"roleCode",rules:[{required:!0}],children:e.jsx(R,{placeholder:"请输入角色编码",disabled:!!x})}),e.jsx(b.Item,{label:"状态",name:"status",initialValue:1,children:e.jsx(W,{options:i.map(s=>({label:s.itemLabel,value:Number(s.itemValue)}))})}),e.jsx(b.Item,{label:"备注",name:"remark",children:e.jsx(R.TextArea,{rows:4,placeholder:"请输入角色说明或适用范围"})})]})})]})}export{oa as default};