diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js
index 1007c06..5f11e55 100644
--- a/api/app/lib/controllers/organization/index.js
+++ b/api/app/lib/controllers/organization/index.js
@@ -74,7 +74,7 @@ async function editUser (ctx) {
if (existUserRes) {
// 存在且传递id 或者 不传id也存在
// 修改 update
- storageData.deleted = false
+
if (
role.includes('admin')
) {
@@ -89,6 +89,8 @@ async function editUser (ctx) {
// 正在修改成员 但是此时还是管理员
storageData.disabled = true
storageData.role = [...role, 'admin']
+ }else{
+ storageData.deleted = false
}
await models.User.update(storageData, {
where: {
@@ -165,6 +167,9 @@ async function delAdmin (ctx) {
let adminIndex = updateValues.role.findIndex(r => r == 'admin')
if (adminIndex > -1) {
updateValues.role.splice(adminIndex, 1)
+ if (updateValues.role.length < 1) {
+ updateValues.deleted = true
+ }
}
await models.User.update(updateValues, {
where: {
diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx
index 95a0f86..fff1b65 100644
--- a/web/client/src/sections/install/containers/roles.jsx
+++ b/web/client/src/sections/install/containers/roles.jsx
@@ -8,630 +8,633 @@ 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 [anxincloudArr, setAnxincloudArr] = useState([]) //修改时已经选择的安心云列表
- const [anxinDelete, setAnxinDelete] = useState([]) //修改时安心云项目有删除,显示提示信息
+ 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 [anxincloudArr, setAnxincloudArr] = useState([]) //修改时已经选择的安心云列表
+ const [anxinDelete, setAnxinDelete] = useState([]) //修改时安心云项目有删除,显示提示信息
- 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 (
-
-
- {row.name}
-
-
- {row?.departments[0]?.name || ''}
-
- {
- row.departments.length > 1 ? (
-
-
- +{row.departments.length - 1}
-
-
- ) : ('')
- }
-
- )
- }
- },
- {
- title: '项目名称',
- render: (_, row) => {
- let anxinerror = false
- let anxinerrorArr = []
- for (let i = 0; i < row.correlationProject.length; i++) {
- if (row.correlationProject[i].del == true) {
- anxinerror = true
- anxinerrorArr.push(row.correlationProject[i].pepProjectName)
- }
- }
- return (
-
- {
- anxinerror ? (
-
-
-

-
- ) : ('')
- }
- {
- row.correlationProject.map((item, index) => {
- return (
-
- {
- row?.correlationProject?.length >= 3 ? (
-
- 7 || item?.name?.length > 7 ? '112px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', display: index > 2 ? 'none' : '', color: item.del ? '#F93920' : '' }}>
- {item.pepProjectName || item.name}
-
-
- ) : row?.correlationProject?.length == 2 ? (
-
- 12 || item?.name?.length > 12 ? '173.5px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}>
- {item.pepProjectName || item.name}
-
-
- ) : (
-
- 25 || item?.name?.length > 25 ? '358px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}>
- {item.pepProjectName || item.name}
-
-
- )
- }
-
1 ? 'none' : '' }}>
-
- )
- })
- }
- {
- row?.correlationProject?.length > 3 ? (
-
- {
- row.correlationProject.map((item, index) => {
- return (
-
- {item.pepProjectName || item.name},
-
- )
- })
- }
-
- } trigger="click" style={{ lineHeight: 2 }}>
-
- +{row?.correlationProject?.length - 3}
-
-
- ) : ('')
- }
-
- )
- }
- },
- {
- title: (
-
- 数据分析师
-
-
-
-
- ),
- render: (_, row) => {
- let rolearr = row.role
- return (
-
- {
- rolearr.indexOf('data_analyst') != -1 ? (
-
-
-

-
-
有权限
-
- ) : (
-
-
-

-
-
无权限
-
- )
- }
-
- );
- }
- }, {
- title: (
-
- 售后运维
-
-
-
-
- ),
- render: (_, row) => {
- let rolearr = row.role
- return (
-
- {
- rolearr.indexOf('after_sale') != -1 ? (
-
-
-

-
-
有权限
-
- ) : (
-
-
-

-
-
无权限
-
- )
- }
-
- );
+ const [columns, setColumns] = useState([//表格属性
+ {
+ title: '成员',
+ render: (_, row) => {
+ let departmentsArr = []
+ for (let i = 0; i < row.departments.length; i++) {
+ departmentsArr.push(row.departments[i].name)
}
- }, {
- title: (
-
- 资源管理者
-
-
-
-
- ),
- render: (_, row) => {
- let rolearr = row.role
- return (
-
- {
- rolearr.indexOf('resource_manage') != -1 ? (
-
-
-

-
-
有权限
-
- ) : (
-
-
-

-
-
无权限
-
- )
- }
-
- );
+ return (
+
+
+ {row.name}
+
+
+ {row?.departments[0]?.name || ''}
+
+ {
+ row.departments.length > 1 ? (
+
+
+ +{row.departments.length - 1}
+
+
+ ) : ('')
+ }
+
+ )
+ }
+ },
+ {
+ title: '项目名称',
+ render: (_, row) => {
+ let anxinerror = false
+ let anxinerrorArr = []
+ for (let i = 0; i < row.correlationProject.length; i++) {
+ if (row.correlationProject[i].del == true) {
+ anxinerror = true
+ anxinerrorArr.push(row.correlationProject[i].pepProjectName)
+ }
}
- }, {
- title: (
-
- 客户服务
-
-
-
-
- ),
- render: (_, row) => {
- let rolearr = row.role
- return (
-
- {
- rolearr.indexOf('customer_service') != -1 ? (
-
-
-

-
-
有权限
-
- ) : (
-
-
-

-
-
无权限
-
- )
+ return (
+
+ {
+ anxinerror ? (
+
+
+

+
+ ) : ('')
+ }
+ {
+ row.correlationProject.map((item, index) => {
+ return (
+
+ {
+ row?.correlationProject?.length >= 3 ? (
+
+ 7 || item?.name?.length > 7 ? '112px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', display: index > 2 ? 'none' : '', color: item.del ? '#F93920' : '' }}>
+ {item.pepProjectName || item.name}
+
+
+ ) : row?.correlationProject?.length == 2 ? (
+
+ 12 || item?.name?.length > 12 ? '173.5px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}>
+ {item.pepProjectName || item.name}
+
+
+ ) : (
+
+ 25 || item?.name?.length > 25 ? '358px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}>
+ {item.pepProjectName || item.name}
+
+
+ )
+ }
+
1 ? 'none' : '' }}>
+
+ )
+ })
+ }
+ {
+ row?.correlationProject?.length > 3 ? (
+
+ {
+ row.correlationProject.map((item, index) => {
+ return (
+
+ {item.pepProjectName || item.name},
+
+ )
+ })
+ }
+
+ } trigger="click" style={{ lineHeight: 2 }}>
+
+ +{row?.correlationProject?.length - 3}
+
+
+ ) : ('')
+ }
+
+ )
+ }
+ },
+ {
+ title: (
+
+ 数据分析师
+
+
+
+
+ ),
+ render: (_, row) => {
+ let rolearr = row.role
+ return (
+
+ {
+ rolearr.indexOf('data_analyst') != -1 ? (
+
+
+

+
+
有权限
+
+ ) : (
+
+
+

+
+
无权限
+
+ )
+ }
+
+ );
+ }
+ }, {
+ title: (
+
+ 售后运维
+
+
+
+
+ ),
+ render: (_, row) => {
+ let rolearr = row.role
+ return (
+
+ {
+ rolearr.indexOf('after_sale') != -1 ? (
+
+
+

+
+
有权限
+
+ ) : (
+
+
+

+
+
无权限
+
+ )
+ }
+
+ );
+ }
+ }, {
+ title: (
+
+ 资源管理者
+
+
+
+
+ ),
+ render: (_, row) => {
+ let rolearr = row.role
+ return (
+
+ {
+ rolearr.indexOf('resource_manage') != -1 ? (
+
+
+

+
+
有权限
+
+ ) : (
+
+
+

+
+
无权限
+
+ )
+ }
+
+ );
+ }
+ }, {
+ title: (
+
+ 客户服务
+
+
+
+
+ ),
+ render: (_, row) => {
+ let rolearr = row.role
+ return (
+
+ {
+ rolearr.indexOf('customer_service') != -1 ? (
+
+
+

+
+
有权限
+
+ ) : (
+
+
+

+
+
无权限
+
+ )
+ }
+
+ );
+ }
+ },
+ {
+ title: "管理",
+ width: "20%",
+ dataIndex: "",
+ render: (_, row) => {
+ return (
+
+ {row?.disabled ? (
+
+ ) : (
+
{
+ dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled, msg: '更新成员状态' })).then(() => {
+ setQuery({ limit: 10, page: page.current })
+ })
+ }}
+ >
+
+
+ )}
+
- );
- }
- },
- {
- title: "管理",
- width: "20%",
- dataIndex: "",
- render: (_, row) => {
- return (
-
- {row?.disabled ? (
-
- ) : (
-
{
- dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled, msg: '更新成员状态' })).then(() => {
- setQuery({ limit: 10, page: page.current })
- })
- }}
- >
-
-
- )}
-
-
{
- dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true, msg: '删除成员' })).then(() => {
- if (page.current > 0 && mylimits.current < 2) {
- setQuery({ limit: 10, page: page.current - 1 })
- } else {
- setQuery({ limit: 10, page: page.current })
- }
- })
- }}
- >
-
-
-
- );
- },
- },
- ])
- // const [data, setdata] = useState([])//表格数据
- const tableData = useRef([]); //表格数据
- const page = useRef(query.page);//哪一页
- const [limits, setLimits] = useState()//每页实际条数
- const mylimits = useRef(); //每页实际条数
- const [pepList, setPepList] = useState([])//角色分配
- const [pomsList, setPomsList] = useState([])//已绑定项目列表
- useEffect(() => {
- getUserList();
- }, [query, roleChoose]);
- useEffect(() => {
- dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户
- setPepList(res.payload.data)
- })
- dispatch(install.getProjectPoms()).then((res) => {//获取已绑定项目
- if (res.success) {
- setPomsList(res.payload.data.rows)
+ setAnxinDelete(anxinErrorList)
+ setAnxincloudArr(myanxinArr)
+ setMemberModal(true);
+ setEditObj(row)
+ setMemberEdit(true)
+ }}
+ >
+ 编辑
+
+ {
+ dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true, msg: '删除成员' })).then(() => {
+ if (page.current > 0 && mylimits.current < 2) {
+ setQuery({ limit: 10, page: page.current - 1 })
+ } else {
+ setQuery({ limit: 10, page: page.current })
+ }
+ })
+ }}
+ >
+
+
+
+ );
+ },
+ },
+ ])
+ // const [data, setdata] = useState([])//表格数据
+ const tableData = useRef([]); //表格数据
+ const page = useRef(query.page);//哪一页
+ const [limits, setLimits] = useState()//每页实际条数
+ const mylimits = useRef(); //每页实际条数
+ const [pepList, setPepList] = useState([])//角色分配
+ const [pomsList, setPomsList] = useState([])//已绑定项目列表
+
+ const userAdmin = user?.pomsUserInfo?.role.includes('admin') //判断当前用户是否为管理员
+ useEffect(() => {
+ getUserList();
+ }, [query, roleChoose]);
+ useEffect(() => {
+ dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户
+ setPepList(res.payload.data)
+ })
+ dispatch(install.getProjectPoms()).then((res) => {//获取已绑定项目
+ if (res.success) {
+ setPomsList(res.payload.data.rows)
+ }
+ })
+ }, [])
+ function getUserList () {
+ let searchData = { ...query, role: roleChoose }
+ dispatch(install.getOrganizationUser(searchData)).then((res) => {//获取成员列表
+ if (res.success) {
+ 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('')
}
- })
- }, [])
- function getUserList () {
- let searchData = { ...query, role: roleChoose }
- dispatch(install.getOrganizationUser(searchData)).then((res) => {//获取成员列表
- if (res.success) {
- 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))
- setLimits(res.payload.data.users.count)
- mylimits.current = res.payload.data.users.rows.length
+ if (userAdmin) notCreatedArr = []
+ setRoleAssignment(res.payload.data.admin.concat(notCreatedArr))
+ setLimits(res.payload.data.users.count)
+ mylimits.current = res.payload.data.users.rows.length
+ }
+ })
+ }
+ function handleRow (record, index) {//斑马条纹
+ // 给偶数行设置斑马纹
+ if (index % 2 === 0) {
+ return {
+ style: {
+ background: '#FAFCFF',
}
- })
- }
- function handleRow (record, index) {//斑马条纹
- // 给偶数行设置斑马纹
- if (index % 2 === 0) {
- return {
- style: {
- background: '#FAFCFF',
- }
- };
- } else {
- return {};
- }
- }
- function roleOnChange (e) {//角色选择
- setRoleChoose(e.target.value);
- }
- return (
- <>
-
-
-
-
管理员设置
-
ADMINISTRATOR SETTING
-
-
-
平台最多支持5个管理员权限的关系绑定,该权限可对系统所有功能和项目进行设置和管理,包括系统权限、映射关系、工单配置等敏感操作,请谨慎使用该权限。
-
-
-
- {
- roleAssignment.map((item, index) => {
- return (
-
- {
- item.id ? (
-
- {
- item.departments?.map((itm, idx) => {
- let mydepartmentsArr = []
- for (let index = 0; index < item.departments.length; index++) {
- mydepartmentsArr.push(item.departments[index].name)
- }
- return (
-
3 ? 'none' : 'flex'
- }}>
- {
- idx > 2 ? (
-
-
- ...
-
-
-
- ) : (
- itm.name
- )
- }
-
- )
- })
- }
-
- ) : (
-
+
+
+
+
管理员设置
+
ADMINISTRATOR SETTING
+
+
+
平台最多支持5个管理员权限的关系绑定,该权限可对系统所有功能和项目进行设置和管理,包括系统权限、映射关系、工单配置等敏感操作,请谨慎使用该权限。
+
+
+
+ {
+ roleAssignment.map((item, index) => {
+ return (
+
+ {
+ item.id ? (
+
+ {
+ item.departments?.map((itm, idx) => {
+ let mydepartmentsArr = []
+ for (let index = 0; index < item.departments.length; index++) {
+ mydepartmentsArr.push(item.departments[index].name)
+ }
+ return (
+
3 ? 'none' : 'flex'
}}>
- 部门
+ {
+ idx > 2 ? (
+
+
+ ...
+
+
+
+ ) : (
+ itm.name
+ )
+ }
- )
- }
-
-
-
- {
- item.id ? (
-
{item.name}
- ) : (
-
虚席以待
- )
- }
+ )
+ })
+ }
+
+ ) : (
+
+ 部门
+
+ )
+ }
+
+
+
+ {
+ item.id ? (
+
{item.name}
+ ) : (
+
虚席以待
+ )
+ }
-
{
- if (item.id) {
- setEditObj(item)
- setAdminEdit(true)
- }
- else {
- setEditObj({})
- setAdminEdit(false)
- }
- setAdminModal(true)
- }}>
-

-
- {
- item.id ? (
-
{
- dispatch(install.deteleOrganizationAdmin({ id: item.id, msg: '删除管理员' })).then(() => getUserList())
- }}
- >
-
-

-
-
+ {userAdmin ? "" : <>
{
+ if (item.id) {
+ setEditObj(item)
+ setAdminEdit(true)
+ }
+ else {
+ setEditObj({})
+ setAdminEdit(false)
+ }
+ setAdminModal(true)
+ }}>
+

+
+ {
+ item.id ? (
+
{
+ dispatch(install.deteleOrganizationAdmin({ id: item.id, msg: '删除管理员' })).then(() => getUserList())
+ }}
+ >
+
+

+
+
- ) : ('')
- }
+ ) : ('')
+ }>}
-
-
角色说明:拥有全平台的权限
-
-
-

-
-
- )
- })
- }
-
-
+
角色说明:拥有全平台的权限
+
+
+

+
+
+
+ )
+ })
+ }
+
-
-
-
-
成员管理
-
MANAGEMENT OF MEMBERS
-
-
-
平台有4种类型的成员角色,分别是数据分析师、售后运维、资源管理者和客户服务,每名项目成员可拥有多种成员角色;
-
-
-
- 全部
- 数据分析师
- 售后运维
- 资源管理者
- 客户服务
-
-
-
-
-
-
-
-
-
-
-
-
- 共{limits}条信息
-
-
{
- setQuery({ limit: pageSize, page: currentPage - 1 });
- page.current = currentPage - 1
- }}
- />
-
+
+
+
+
+
成员管理
+
MANAGEMENT OF MEMBERS
- {//管理员弹框
- adminModal ?
-
{
- setAdminModal(false);
+
+
平台有4种类型的成员角色,分别是数据分析师、售后运维、资源管理者和客户服务,每名项目成员可拥有多种成员角色;
+
+
+
+ 全部
+ 数据分析师
+ 售后运维
+ 资源管理者
+ 客户服务
+
+
+
+
+
+
+
+
+
+
+
+
+ 共{limits}条信息
+
+
{
+ setQuery({ limit: pageSize, page: currentPage - 1 });
+ page.current = currentPage - 1
+ }}
+ />
+
+
+ {//管理员弹框
+ adminModal ?
+
{
+ setAdminModal(false);
+ }}
+ close={() => {
+ setAdminModal(false);
+ getUserList()
+ }} >
+ : ''
+ }
+ {//成员弹框
+ memberModal ?
+
{
+ setMemberModal(false);
+ }}
+ close={() => {
+ setMemberModal(false);
+ getUserList()
+ }} >
+ : ''
+ }
+ >
+ )
}
function mapStateToProps (state) {
- const { auth, global, OrganizationDeps } = state;
- return {
- loading: OrganizationDeps.isRequesting,
- user: auth.user,
- actions: global.actions,
- // members: members.data,
- };
+ const { auth, global, OrganizationDeps } = state;
+ return {
+ loading: OrganizationDeps.isRequesting,
+ user: auth.user,
+ actions: global.actions,
+ // members: members.data,
+ };
}
export default connect(mapStateToProps)(Roles);