人力资源
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.
 
 
 
 

419 lines
17 KiB

import React, { useEffect, useState, useRef } from 'react';
import { connect } from 'react-redux';
import { Col, Row, Button, Tree, ButtonGroup, RadioGroup, Radio, Checkbox, CheckboxGroup, Popconfirm, Toast } from '@douyinfe/semi-ui';
import EmployeeAuthModal from './employeeAuthModal'
import EmployeeAuthUserModal from './employeeAuthUserModal'
import '../style.less'
const EmployeeAuth = (props) => {
const form = useRef();
const { dispatch, actions, roleList, userRoleList, resourceList } = props
const [dataRange, setDataRange] = useState(1);
const [checkedList, setCheckedList] = useState([]);
const [roleId, setRoleId] = useState();
const [two, setTwo] = useState({});
const [visible, setVisible] = useState(false);
const [eidtRole, setEidtRole] = useState(null);
const [eidtTit, setEidtTit] = useState(null);
const [visibleUser, setVisibleUser] = useState(false);
const [allChecked, setAllChecked] = useState(false);
let Alltwo = null;
let AllCheckedList = null;
const getRoleList = () => {
dispatch(actions.humanAffairs.getRoleList())
dispatch(actions.humanAffairs.getUserRoleList())
}
useEffect(() => {
getRoleList()
dispatch(actions.humanAffairs.getResource())
}, [])
let hrUser = JSON.parse(sessionStorage.getItem('hrUser'))
const button = (
<ButtonGroup
size="small"
theme="borderless"
>
<Button>编辑</Button>
<Button>删除</Button>
</ButtonGroup>
);
const style = {
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center'
};
let roleAndUser = []
roleList && roleList.rows.forEach(e => {
let children = []
userRoleList && userRoleList.rows.forEach(i => {
if (e.id == i.roleId) {
let user = hrUser.userListArr.find(s => s.id == i.userId)
children.push(user)
}
})
roleAndUser.push({
id: e.id,
name: e.name,
children: children
})
})
let roleLists = []
if (roleAndUser.length) {
roleAndUser.forEach(e => {
let children = []
if (e.children) {
e.children.forEach(i => {
children.push({
label: (
<div style={style}>
<span>{i.name}</span>
<ButtonGroup
size="small"
theme="borderless"
>
{/* <Button>删除</Button> */}
</ButtonGroup>
</div>
),
value: i.id,
key: i.id + new Date(),
name: i.name
})
})
}
roleLists.push({
label: (
<div style={style} onClick={() => { roleListBtn(e.id) }}>
<span>{e.name}</span>
<ButtonGroup
size="small"
theme="borderless"
>
<Button onClick={() => { showModal(e, '编辑角色') }}>编辑</Button>
<Popconfirm
title="是否确定删除?"
onConfirm={() => { deletRole(e.id) }}
>
<Button>删除</Button>
</Popconfirm>
</ButtonGroup>
</div>
),
value: e.id,
key: e.id,
children: children,
name: e.name
})
})
}
const dataRangeChange = (e) => {
setDataRange(e.target.value);
};
const treeList = []
if (resourceList && resourceList.rows) {
resourceList.rows.forEach((item) => {
item.child = resourceList.rows.filter((sec) => {
return sec.parentId === item.id
})
if (item.parentId === null) {
treeList.push(item)
}
})
}
const getValues = () => {
let two = {}
let checkedList = [];
treeList.map(r => {
if (r.child && r.child.length) {
two[r.id] = true;
r.child.map(c => {
if (c.child && c.child.length) {
two[c.id] = true;
c.child.map(cc => {
if (cc.child && cc.child.length) {
two[cc.id] = true;
} else {
checkedList.push(cc.id)
}
})
} else {
two[c.id] = true;
}
})
}
})
return { two, checkedList };
}
const onChangeAll = (value) => {
// if (value.target.checked) {
// setAllChecked(true);
// let values = getValues();
// if (!Alltwo)
// Alltwo = values.two;
// if (!AllCheckedList)
// AllCheckedList = values.checkedList;
// setTwo(values.two);
// setCheckedList(values.checkedList);
// } else {
// setAllChecked(false);
// setTwo({})
// setCheckedList([]);
// }
}
const onChangeOne = (value, recod) => {
let twos = two
let selList = []
recod.child.forEach(e => {
if (value.target.checked) {
twos[e.id] = true
} else {
twos[e.id] = false
}
if (e.child.length) {
e.child.forEach(i => {
selList.push(i.id)
})
}
})
if (value.target.checked) {
twos[value.target.value] = true
setTwo(twos)
setCheckedList([...checkedList, ...selList])
} else {
twos[value.target.value] = false
setCheckedList(getDiffer(checkedList, selList));
setTwo(twos)
}
}
const onCheckAllChange = (value, recod) => {
let selList = []
recod.child.forEach(i => {
if (i.id == value.target.value) {
if (i.child.length) {
i.child.forEach(s => {
selList.push(s.id)
})
}
}
})
let twos = two
if (value.target.checked) {
setCheckedList([...checkedList, ...selList])
twos[value.target.value] = true
twos[recod.id] = true
setTwo(two)
} else {
setCheckedList(getDiffer(checkedList, selList));
twos[value.target.value] = false
setTwo(two)
}
};
const checkItem = (e, recod) => {
let check = [e.target.value]
let twos = two
let twosid
if (e.target.checked) {
setCheckedList([...checkedList, ...check])
resourceList.rows.forEach(e => {
if (e.id == check[0]) {
twosid = e.parentId
}
})
twos[twosid] = true
twos[recod.id] = true
setTwo(twos)
} else {
setCheckedList(getDiffer(checkedList, check));
}
}
const getDiffer = (arr1, arr2) => {
let arr = arr1.filter(e => {
return !arr2.includes(e)
})
return arr
}
const handleCancel = () => {
setVisible(false);
};
const showModal = (eidtRole, tit) => {
setEidtRole(eidtRole)
setEidtTit(tit)
setVisible(true);
};
const deletRole = (id) => {
let data = { id }
dispatch(actions.humanAffairs.delRole(data)).then(e => {
if (e.success) {
getRoleList()
}
})
}
const showUserMolad = () => {
setVisibleUser(true);
}
const handleCancelUser = () => {
setVisibleUser(false);
};
const roleListBtn = (id) => {
setRoleId(id)
dispatch(actions.humanAffairs.getRoleResource({ id })).then(res => {
if (res.success) {
let two = {}
let checkList = []
if (res.payload.data && res.payload.data.rows.length) {
checkList = res.payload.data.rows.map(e => {
two[e.resId] = true
return e.resId
})
// let resourceIdAll = [];
// if (!Alltwo) {
// const values = getValues();
// resourceIdAll = Object.values(values.two);
// resourceIdAll = [...values.checkedList, ...resourceIdAll];
// resourceIdAll.sort();
// } else {
// resourceIdAll = [...AllCheckedList, ...Alltwo];
// resourceIdAll.sort();
// }
// let resourceIds = []
setCheckedList(checkList)
setTwo(two)
// resourceIdAll = [...checkList, ...two];
// resourceIds.sort();
// if (resourceIds.toString() === resourceIdAll.toString()) {
// setAllChecked(true);
// } else {
// setAllChecked(false);
// }
} else {
// setAllChecked(false);
setCheckedList([])
setTwo(two)
}
}
})
}
const handlOk = () => {
let resourceId = [];
for (let item in two) {
if (two[item]) {
resourceId.push(parseInt(item));
}
}
resourceId = [...resourceId]
if (roleId == undefined || resourceId.length == 0) {
Toast.error('请选择角色和权限!')
} else {
dispatch(actions.humanAffairs.addRoleResource({ roleId, resourceId, dataRange }))
}
}
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>权限中心</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>员工权限</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>员工权限</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>EMPLOYEE AUTHORITY</div>
</div>
</div>
<div className='authorityBox'>
<div className='authorityTit'>
<h2><b></b></h2>
<span>平台管理员由项企统一认证平台授权拥有对本系统所有功能进行设置和管理</span>
</div>
<div className='authorityAdminList'>
{
hrUser && hrUser.adminHr && hrUser.adminHr.filter(admin => admin.id != 1).map(e => {
return (
<div >
<span>人力资源部</span>
<h2>{e.name}</h2>
<h4>角色说明拥有全平台的权限</h4>
</div>
)
})
}
</div>
<div className='authorityTit'>
<h2><b></b></h2>
</div>
<div className='roleAuthori'>
<Row>
<Col span={4}>
<div>
<Button theme='solid' style={{ marginLeft: 15, background: '#0099FF' }} onClick={() => { showModal(null, '新增角色') }}>新建角色</Button>
<Button theme='solid' onClick={showUserMolad} style={{ marginLeft: 15, background: '#0099FF' }}>添加修改用户绑定</Button>
</div>
<Tree
treeData={roleLists}
style={{ marginTop: 20 }}
/>
</Col>
<Col span={19} style={{ float: 'right' }}>
<div className='dataRange'>
<h2>数据范围:</h2>
<RadioGroup onChange={dataRangeChange} value={dataRange} style={{ float: 'left', marginTop: 17, }}>
<Radio value={2}>本部门</Radio>
<Radio value={1}>全公司</Radio>
</RadioGroup>
</div>
<div className='dataRange'>
<h2>权限范围:</h2>
<Checkbox style={{ float: 'left', marginTop: 17, }} checked={allChecked} onChange={(value) => { onChangeAll(value) }}>全部权限</Checkbox>
</div>
{treeList.map(e => {
return <div className='codeList'>
<Checkbox onChange={(value) => { onChangeOne(value, e) }} style={{ borderBottom: '1px solid #f2f2f2', padding: '10px 10px' }} checked={two[e.id]} key={e.id} value={e.id}>{e.name}</Checkbox>
{e.child.map(i => {
return <div>
<Checkbox value={i.id} style={{ borderBottom: '1px solid #f2f2f2', padding: '10px 10px' }} key={i.id} checked={two[i.id]} onChange={(value) => { onCheckAllChange(value, e) }}>{i.name}</Checkbox>
<CheckboxGroup style={{ width: '100%', borderBottom: '1px solid #f2f2f2', padding: '10px 10px' }} direction='horizontal' value={checkedList}>
{
i.child.map(s => (<Checkbox onChange={(value) => { checkItem(value, e) }} key={s.id} value={s.id} >{s.name}</Checkbox>))
}
</CheckboxGroup>
</div>
})}
</div>
})}
<Button onClick={handlOk} theme='solid' style={{ background: '#0099FF', marginTop: 10 }}>保存</Button>
</Col>
</Row>
</div>
</div>
</div>
</div>
{
visible ? <EmployeeAuthModal eidtTit={eidtTit} visible={visible} handleCancel={handleCancel} getRoleList={getRoleList} eidtRole={eidtRole} /> : ''
}
{
visibleUser ? <EmployeeAuthUserModal userRoleList={userRoleList} visibleUser={visibleUser} handleCancelUser={handleCancelUser} getRoleList={getRoleList} roleList={roleList} /> : ''
}
</>
)
}
function mapStateToProps(state) {
const { auth, global, roleList, userRoleList, resourceList } = state;
return {
user: auth.user,
actions: global.actions,
roleList: roleList.data,
userRoleList: userRoleList.data,
resourceList: resourceList.data
};
}
export default connect(mapStateToProps)(EmployeeAuth);