运维服务中台
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.
 
 
 
 
 

539 lines
28 KiB

import React, { useEffect, useState, useRef } from 'react';
import { connect } from 'react-redux';
import { Skeleton, Table, RadioGroup, Radio, Button, Pagination, Popconfirm, Tooltip } from '@douyinfe/semi-ui';
import { SkeletonScreen, } from "$components";
import AdminModal from '../components/adminModal';
import MemberModal from '../components/memberModal';
import '../style.less'
const Roles = (props) => {
const { dispatch, actions, user, loading, socket } = props
const { install } = actions;
const [roleAssignment, setRoleAssignment] = useState([])//角色分配
const [roleChoose, setRoleChoose] = useState('')//角色选择
const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息
const [adminModal, setAdminModal] = useState(false);//管理员弹框
const [adminEdit, setAdminEdit] = useState(false);//管理员弹框是否修改
const [editObj, setEditObj] = useState({});//管理员弹框修改内容
const [memberModal, setMemberModal] = useState(false);//成员弹框
const [memberEdit, setMemberEdit] = useState(false);//成员弹框是否修改
const [columns, setColumns] = useState([//表格属性
{
title: '成员',
render: (_, row) => {
let departmentsArr = []
for (let i = 0; i < row.departments.length; i++) {
departmentsArr.push(row.departments[i].name)
}
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
<div>
{row.name}
</div>
<div style={{ padding: '2px 4px', background: '#E8F3FF', borderRadius: 2, fontSize: 12, color: '#005ABD', marginLeft: 4 }}>
{row.departments[0].name}
</div>
{
row.departments.length > 1 ? (
<Tooltip content={departmentsArr.join(',')} trigger="click">
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 8, cursor: "pointer", }}>
+{row.departments.length - 1}
</div>
</Tooltip>
) : ('')
}
</div>
)
}
},
{
title: '项目名称',
render: (_, row) => {
return (
<div>
{
row.correlationProject.map((item, index) => {
return (
<div key={index}>
{item}
</div>
)
})
}
</div>
)
}
},
{
title: (
<div style={{ display: 'flex', alignItems: 'center' }}>
数据分析师
<Tooltip content={'拥有分析、工单、资料的权限'}>
<img src="/assets/images/install/table_question.png" alt="" style={{ height: 14, width: 14, marginLeft: 4 }} />
</Tooltip>
</div>
),
render: (_, row) => {
let rolearr = row.role
return (
<div>
{
rolearr.indexOf('data_analyst') != -1 ? (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_haveAuthority.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div>有权限</div>
</div>
) : (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_noPermission.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div style={{ color: '#969799' }}>无权限</div>
</div>
)
}
</div>
);
}
}, {
title: (
<div style={{ display: 'flex', alignItems: 'center' }}>
售后运维
<Tooltip content={'拥有问题、设备、工单、资料、一期控制台的权限'}>
<img src="/assets/images/install/table_question.png" alt="" style={{ height: 14, width: 14, marginLeft: 4 }} />
</Tooltip>
</div>
),
render: (_, row) => {
let rolearr = row.role
return (
<div>
{
rolearr.indexOf('after_sale') != -1 ? (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_haveAuthority.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div>有权限</div>
</div>
) : (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_noPermission.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div style={{ color: '#969799' }}>无权限</div>
</div>
)
}
</div>
);
}
}, {
title: (
<div style={{ display: 'flex', alignItems: 'center' }}>
资源管理员
<Tooltip content={'拥有资料、工单的权限'}>
<img src="/assets/images/install/table_question.png" alt="" style={{ height: 14, width: 14, marginLeft: 4 }} />
</Tooltip>
</div>
),
render: (_, row) => {
let rolearr = row.role
return (
<div>
{
rolearr.indexOf('resource_manage') != -1 ? (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_haveAuthority.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div>有权限</div>
</div>
) : (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_noPermission.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div style={{ color: '#969799' }}>无权限</div>
</div>
)
}
</div>
);
}
}, {
title: (
<div style={{ display: 'flex', alignItems: 'center' }}>
客户服务
<Tooltip content={'拥有服务、工单的权限'}>
<img src="/assets/images/install/table_question.png" alt="" style={{ height: 14, width: 14, marginLeft: 4 }} />
</Tooltip>
</div>
),
render: (_, row) => {
let rolearr = row.role
return (
<div>
{
rolearr.indexOf('customer_service') != -1 ? (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_haveAuthority.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div>有权限</div>
</div>
) : (
<div style={{ display: 'flex' }}>
<div>
<img src="/assets/images/install/icon_noPermission.png" alt="" style={{ height: 18, width: 18 }} />
</div>
<div style={{ color: '#969799' }}>无权限</div>
</div>
)
}
</div>
);
}
},
{
title: "管理",
width: "20%",
dataIndex: "",
render: (_, row) => {
return (
<div style={{ display: "flex" }}>
{row?.disabled ? (
<Button
theme="borderless"
onClick={() => {
dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled })).then(() => getUserList())
}}
>
启用
</Button>
) : (
<Popconfirm
title="禁用后,成员暂时将无法登录。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled })).then(() => {
getUserList();
})
}}
>
<Button theme="borderless">禁用</Button>
</Popconfirm>
)}
<Button
theme="borderless"
onClick={() => {
setMemberModal(true);
setEditObj(row)
setMemberEdit(true)
}}
>
编辑
</Button>
<Popconfirm
title="删除后,成员将无法登录。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true })).then(() => {
if (page.current > 0 && limits.current < 2) {
setQuery({ limit: 10, page: page.current - 1 })
} else {
setQuery({ limit: 10, page: page.current })
}
})
}}
>
<Button theme="borderless">删除</Button>
</Popconfirm>
</div>
);
},
},
])
// const [data, setdata] = useState([])//表格数据
const tableData = useRef([]); //每页实际条数
const page = useRef(query.page);//哪一页
const limits = useRef(); //每页实际条数
const [pepList, setPepList] = useState([])//角色分配
useEffect(() => {
getUserList();
}, [query, roleChoose]);
useEffect(() => {
dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户
setPepList(res.payload.data)
})
getUserList()
}, [])
function getUserList () {
let searchData = { ...query, role: roleChoose }
dispatch(install.getOrganizationUser(searchData)).then((res) => {//获取成员列表
tableData.current = res.payload.data.users.rows;
let notCreatedArr = []
let notCreatedNum = 5 - res.payload.data.admin.length
for (let i = 0; i < notCreatedNum; i++) {
notCreatedArr.push('')
}
setRoleAssignment(res.payload.data.admin.concat(notCreatedArr))
limits.current = res.payload.data.users.count
})
}
function handleRow (record, index) {//斑马条纹
// 给偶数行设置斑马纹
if (index % 2 === 0) {
return {
style: {
background: '#FAFCFF',
}
};
} else {
return {};
}
}
function roleOnChange (e) {//角色选择
setRoleChoose(e.target.value);
}
return (
<>
<div style={{ background: '#FFFFFF', margin: '8px 12px', padding: '20px 20px 0px 20px' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #005ABD', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#101531', marginLeft: 8 }}>管理员设置</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>ADMINISTRATOR SETTING</div>
</div>
<div style={{ margintop: 15, overflow: 'auto' }}>
<div style={{ display: 'inline-flex' }}>
{
roleAssignment.map((item, index) => {
return (
<div key={index} style={{
width: 312, height: 127, boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)',
borderRadius: 2, background: "url(/assets/images/install/cardBackground0" + (index + 1) + '.png)',
backgroundSize: "100% 100%", marginRight: 20, marginBottom: 20,
}}>
{
item.id ? (
<div style={{ display: 'flex', marginLeft: 21, }}>
{
item.departments?.map((itm, idx) => {
let mydepartmentsArr=[]
for (let index = 0; index < item.departments.length; index++) {
mydepartmentsArr.push(item.departments[index].name)
}
return (
<div key={idx} style={{
background: '#52A4F6', borderRadius: 2, height: 18, padding: '2px 4px',
fontSize: 10, marginTop: 17, width: 'max-content', color: '#FFFFFF',
display: 'flex', alignItems: 'center', marginRight: 4,
}}>
{
idx > 2 ? (
<Tooltip content={mydepartmentsArr.join(',')}>
<div style={{ fontSize: 14, cursor: "pointer", }}>
...
</div>
</Tooltip>
) : (
itm.name
)
}
</div>
)
})
}
</div>
) : (
<div style={{
background: '#52A4F6', borderRadius: 2, height: 18, padding: '2px 4px',
fontSize: 10, marginTop: 17, marginLeft: 21, width: 'max-content', color: '#FFFFFF',
display: 'flex', alignItems: 'center',
}}>
部门
</div>
)
}
<div style={{ marginTop: 5, display: 'flex', justifyContent: 'space-between', padding: '0px 17px 0px 21px' }}>
<div style={{ marginTop: 9 }}>
<div style={{ display: 'flex' }}>
{
item.id ? (
<div style={{ fontSize: 14, color: '#4A4A4A', fontWeight: 600 }}>{item.name}</div>
) : (
<div style={{ fontSize: 14, color: '#4A4A4A', fontWeight: 600 }}>虚席以待</div>
)
}
<div style={{ marginLeft: 4, cursor: "pointer", }} onClick={() => {
if (item.id) {
setEditObj(item)
setAdminEdit(true)
}
else {
setEditObj({})
setAdminEdit(false)
}
setAdminModal(true)
}}>
<img src="/assets/images/install/icon_edit.png" alt="" style={{ height: 18, width: 18 }} />
</div>
{
item.id ? (
<Popconfirm
title="是否要移除管理员"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(install.deteleOrganizationAdmin(item?.id)).then(() => getUserList())
}}
>
<div style={{ marginLeft: 4, cursor: "pointer", }}>
<img src="/assets/images/install/icon_detele.png" alt="" style={{ height: 18, width: 18 }} />
</div>
</Popconfirm>
) : ('')
}
</div>
<div style={{ fontSize: 12, color: '#969799', marginTop: 28, marginLeft: 50 }}>角色说明拥有全平台的权限</div>
</div>
<div>
<img src="/assets/images/install/setPermissions.png" alt="" style={{ height: 63, width: 61 }} />
</div>
</div>
</div>
)
})
}
</div>
</div>
</div>
<div className='roleBottom' style={{ margin: '20px 12px 12px 12px', background: '#FFFFFF', padding: '20px 20px 40px 20px' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #005ABD', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#101531', marginLeft: 8 }}>成员管理</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>MANAGEMENT OF MEMBERS</div>
</div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 }}>
<div style={{ fontSize: 12, color: '#8B8B8B' }}>平台有4种类型的成员角色分别是数据分析师售后运维资源管理者和客户服务每名项目成员可拥有多种成员角色</div>
<div className='roleRadio' style={{ display: 'flex', alignItems: 'center' }}>
<div>
<RadioGroup onChange={roleOnChange} value={roleChoose} aria-label="单选组合示例" name="demo-radio-group">
<Radio value=''>全部</Radio>
<Radio value='data_analyst'>数据分析师</Radio>
<Radio value='after_sale'>售后运维</Radio>
<Radio value='resource_manage'>资源管理者</Radio>
<Radio value='customer_service'>客户服务</Radio>
</RadioGroup>
</div>
<div>
<Button
theme="solid"
type="primary"
style={{
width: 108,
height: 32,
borderRadius: 2,
marginLeft: 40
}}
onClick={() => {
setEditObj({})
setMemberEdit(false)
setMemberModal(true);
}}
>
添加成员
</Button>
</div>
</div>
</div>
<Skeleton
loading={false}
active={true}
placeholder={SkeletonScreen()}
>
<Table
columns={columns}
dataSource={tableData.current}
bordered={false}
onRow={handleRow}
empty="暂无数据"
pagination={false}
/>
</Skeleton>
<div
style={{
display: "flex",
justifyContent: "flex-end",
padding: "20px 20px",
}}
>
<span style={{ lineHeight: "30px", fontSize: 13, color: 'rgba(0,90,189,0.8)' }}>
{limits.current}条信息
</span>
<Pagination
className="22"
total={limits.current}
showSizeChanger
currentPage={query.page + 1}
pageSizeOpts={[10, 20, 30, 40]}
onChange={(currentPage, pageSize) => {
setQuery({ limit: pageSize, page: currentPage - 1 });
page.current = currentPage - 1
}}
/>
</div>
</div>
{//管理员弹框
adminModal ?
<AdminModal
visible={true}
pepList={pepList}
adminEdit={adminEdit}
editObj={editObj}
close={() => {
setAdminModal(false);
getUserList()
}} >
</AdminModal> : ''
}
{//成员弹框
memberModal ?
<MemberModal
visible={true}
pepList={pepList}
memberEdit={memberEdit}
editObj={editObj}
close={() => {
setMemberModal(false);
getUserList()
}} >
</MemberModal> : ''
}
</>
)
}
function mapStateToProps (state) {
const { auth, global, members } = state;
return {
// loading: members.isRequesting,
user: auth.user,
actions: global.actions,
// members: members.data,
};
}
export default connect(mapStateToProps)(Roles);