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.
 
 
 
 
 
 

873 lines
25 KiB

<!-- @format -->
<template>
<div class="main">
<div class="left">
<div class="ns-table-title ns-title-extra-box">部门管理</div>
<a-row>
<a-col :span="8" class="tree">
<a-tree
ref="treeRef"
:showLine="{ showLeafIcon: false }"
v-if="deptTreeData?.length"
:tree-data="deptTreeData"
:selectedKeys="deptTreeSelectedKeys"
blockNode
defaultExpandAll
@select="SelectApartmentTree">
<template #title="data">
<div style="display: flex; justify-content: space-between; align-items: center">
<span class="treeContent">{{ data.deptInfo?.deptName }}</span>
<a-dropdown>
<ns-icon name="actionMore" size="14" class="actionMore" />
<template #overlay>
<a-menu>
<a-menu-item
v-for="(action, index) in filterAction(data, dropActions)"
:key="index"
@click="action.func(data)">
<span>{{ action.title }}</span>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
</template>
</a-tree>
<a-empty style="margin-top: 120px" v-else />
</a-col>
<a-col :span="16" class="list">
<div class="pane">
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane :key="1" tab="部门信息">
<ns-form
ref="formRef"
:schemas="formSchema"
:wrapperCol="{ span: 19 }"
:labelCol="{ span: 5 }"
:model="formData"
formLayout="vertical"
class="form" />
</a-tab-pane>
<a-tab-pane :key="2" :disabled="selectRef?.hasOwnProperty('orgInfo')" tab="部门权限">
<a-tree
v-if="deptPermissionTreeData?.length"
:tree-data="deptPermissionTreeData"
:fieldNames="{ children: 'menus', title: 'label', key: 'permissionId' }"
v-model:checkedKeys="deptcheckedKeys"
checkable
:selectable="false"
defaultExpandAll
@check="deptCheck">
<template #title="data"> {{ data.label }}</template>
</a-tree>
<a-empty style="margin-top: 120px" v-else />
</a-tab-pane>
</a-tabs>
<a-space v-if="activeKey === 1 || deptPermissionTreeData?.length">
<ns-button type="primary" @click="CancelApartment">取消 </ns-button>
<ns-button v-if="disabled" type="primary" @click="pipe(deptEdit, true, false)">
编辑
</ns-button>
<ns-button v-else type="primary" @click="deptSure">确定</ns-button>
</a-space>
</div>
</a-col>
</a-row>
</div>
<div class="right">
<div class="ns-table-title ns-title-extra-box">角色管理</div>
<a-row>
<a-col :span="8" class="tree">
<a-space wrap style="margin-bottom: 16px; justify-content: flex-start">
<!-- <ns-button v-auth="'userAdd'" type="primary" @click="rolePipe(addUser, true)">
新增角色
</ns-button>
<ns-button type="primary" @click="rolePipe(addUserSon)">新增子角色</ns-button>
<ns-button type="primary" @click="rolePipe(deleteUser)"> 删除 </ns-button> -->
</a-space>
<a-tree
v-if="roleTreeData.length"
:showLine="{ showLeafIcon: false }"
:tree-data="roleTreeData"
:selectedKeys="roleTreeSelectedKeys"
blockNode
defaultExpandAll
@select="SelectUserTree">
<template #title="data">
<div style="display: flex; justify-content: space-between; align-items: center">
<span class="treeContent"> {{ data.zhName }}</span>
<a-dropdown>
<ns-icon name="actionMore" size="14" class="actionMore" />
<template #overlay>
<a-menu>
<a-menu-item
v-for="(action, index) in filterAction(data, dropRoleActions, 'addUser')"
:key="index"
@click="action.func(data)">
<span>{{ action.title }}</span>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
</template>
</a-tree>
<a-empty style="margin-top: 120px" v-else />
</a-col>
<a-col :span="16" class="list">
<div class="pane">
<a-tabs v-model:activeKey="roleActiveKey">
<a-tab-pane :key="1" tab="角色信息">
<ns-form
ref="formRoleRef"
:schemas="formSchema2"
:model="roleFormData"
:labelCol="{ span: 5 }"
:wrapperCol="{ span: 19 }"
formLayout="vertical"
class="form" />
</a-tab-pane>
<a-tab-pane :key="2" tab="角色权限">
<a-tree
v-if="rolePermissionTreeData?.length"
:tree-data="rolePermissionTreeData"
v-model:checkedKeys="roleCheckedKeys"
defaultExpandAll
:fieldNames="{ children: 'menus', title: 'label', key: 'permissionId' }"
:selectable="false"
checkable
@check="roleCheck" />
<a-empty style="margin-top: 120px" v-else />
</a-tab-pane>
</a-tabs>
<a-space v-if="roleActiveKey === 1 || rolePermissionTreeData?.length">
<ns-button type="primary" @click="CancelUser">取消</ns-button>
<ns-button
v-if="roleDisabled"
:disabled="!roleTreeData?.length"
type="primary"
@click="rolePipe(roleEdit, false, false)">
编辑
</ns-button>
<ns-button v-else :disabled="!roleTreeData?.length" type="primary" @click="roleSure">
确定
</ns-button>
</a-space>
</div>
</a-col>
</a-row>
</div>
</div>
</template>
<script lang="ts" setup>
import { createVNode, ref, watchEffect } from 'vue';
import { Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { http } from '/nerv-lib/util/http';
import { cloneDeep, get, isEmpty } from 'lodash-es';
import { formConfig, formConfig2 } from './config';
import { department } from '/@/api/origanizemanage';
import { permission } from '/@/api/origanizemanage';
import { NsMessage } from '/nerv-lib/component';
defineOptions({
name: 'AuthorityManageIndex',
});
const formRef = ref();
const formRoleRef = ref();
let formData = ref({});
let roleFormData = ref({ isLeader: 1 });
const activeKey = ref(1);
const roleActiveKey = ref(1);
const disabled = ref(true);
const roleDisabled = ref(true);
const deptTreeSelectedKeys = ref([]);
const roleTreeSelectedKeys = ref([]);
const deptcheckedKeys = ref<string[]>([]);
const roleCheckedKeys = ref<string[]>([]);
const currentOrgRef = ref();
const selectKey = ref();
const selectRef = ref();
const selectRoleKey = ref();
const selectRoleRef = ref();
const formSchema = formConfig(disabled as any);
const formSchema2 = formConfig2(roleDisabled as any);
const { orgName, projectId, orgId } = JSON.parse(
sessionStorage.getItem(import.meta.env.VITE_PUBLIC_PATH),
);
// const orgId = JSON.parse(sessionStorage.getItem('ORGID'));
const roleTreeData = ref([]);
const rolePermissionTreeData = ref([]);
const deptTreeData = ref([]);
const deptPermissionTreeData = ref([]);
// 包含半选状态的权限数据
const deptTotalCheckedKeys = ref([]);
const roleTotalCheckedKeys = ref([]);
// 禁用权限树
const disabledTree = (data, disabled = true) => {
data.map((item) => {
item['disabled'] = disabled;
if (item.menus) {
disabledTree(item.menus, disabled);
}
});
};
watchEffect(() => {
disabledTree(deptPermissionTreeData.value, disabled.value);
disabledTree(rolePermissionTreeData.value, roleDisabled.value);
});
/**操作拦截 */
const pipe = (func: Function, flag = false, toggle = true) => {
// if (toggle) activeKey.value = 1;
if (flag) {
// 只有部门的操作
if (selectRef.value?.hasOwnProperty('orgInfo') || !selectRef.value?.deptInfo) {
NsMessage.error('请先选择相关部门');
return;
}
} else {
if (!selectRef.value?.hasOwnProperty('orgInfo')) {
NsMessage.error('请先选择相关企业');
return;
}
}
func && func();
};
const rolePipe = (func: Function, linkDept = false, toggle = true) => {
console.log(selectRoleRef.value);
// if (toggle) roleActiveKey.value = 1;
// 需要先选择部门
if ((linkDept && !selectRef.value?.deptInfo) || selectRef.value?.hasOwnProperty('own')) {
NsMessage.error('请先选择相关部门');
return;
}
console.log(123);
if (!linkDept && isEmpty(selectRoleRef.value)) {
NsMessage.error('请先选择相关角色');
return;
}
func && func();
};
/**操作拦截 */
// 部门权限树
const getPermissionTree = (params) => {
return http.post(permission.queryOrgPermission, params).then((res) => {
deptPermissionTreeData.value = get(res, 'data');
});
};
// 子级部门权限树
const getDeptsonPermissionTree = (params) => {
return http.post(permission.queryDeptPermissionFilter, params).then((res) => {
deptPermissionTreeData.value = get(res, 'data');
});
};
// 角色权限树
const getRolePermissionTree = (params) => {
return http.post(permission.queryFilterDeptPermission, params).then((res) => {
rolePermissionTreeData.value = get(res, 'data');
});
};
// 子级角色权限树
const getRolesonPermissionTree = (params) => {
return http.post(permission.queryRolePermissionFilter, params).then((res) => {
rolePermissionTreeData.value = get(res, 'data');
});
};
getPermissionTree({ projectId, orgId });
// 选中自己的第一个部门
const initDept = () => {
if (!deptTreeData.value?.length || !deptTreeData.value[0]?.children?.length) return;
const info = {
node: { key: '0-0-0', dataRef: { deptInfo: deptTreeData.value[0]?.children[0].deptInfo } },
};
SelectApartmentTree(['0-0-0'], info);
};
// 部门树
const getDepartList = (params) => {
return http.post(department.queryDeptTree, params).then((res) => {
const result = res.data.map((item, index) => {
item['deptInfo'] = item.orgInfo;
item['deptInfo'] = item.orgInfo;
item['deptInfo']['deptName'] = item?.orgInfo?.orgName;
item['own'] = !index;
item['selectable'] = false;
item['children'] = item.deptTrees;
return item;
});
return result;
});
};
getDepartList({ orgId }).then((res) => {
deptTreeData.value = res;
initDept();
});
// 获取部门树
const getTree = () => {
getDepartList({ orgId }).then((res) => {
deptTreeData.value = res;
NsMessage.success('操作成功');
});
};
// 获取角色树
const getUserTree = (params = { deptId: selectRef.value?.deptInfo?.deptId }) => {
return http.post(department.queryRoleTree, params).then((res) => {
roleTreeData.value = [{ zhName: '全部', selectable: false, orgInfo: {}, children: res.data }];
});
};
// 根据依赖刷新角色树
watchEffect(() => {
if (selectRef.value) {
getUserTree().then(() => {
if (!roleTreeData.value?.length) {
selectRoleRef.value = {};
roleFormData.value = { isLeader: 1 };
}
const info = {
node: { key: '0-0-0', dataRef: { ...roleTreeData.value[0].children[0] } },
};
// SelectUserTree([''], info);
});
}
});
const opMap: any = {
type: 'add',
fuc: () => {},
record: {},
callback: null,
};
// 添加部门
const addApartment = (data) => {
const { deptInfo } = data;
activeKey.value = 1;
disabled.value = false;
opMap.type = 'addDept';
formData.value = {};
let sourceOrgId = '';
if (deptInfo.orgId !== orgId) {
// 此处为给关联企业加部门
sourceOrgId = orgId;
}
opMap.fuc = (params) => {
return formRef.value.triggerSubmit().then(() => {
return http.post(department.deptSave, {
...params,
orgId: deptInfo?.orgId,
sourceOrgId,
projectId,
pdeptId: deptInfo.pdeptId || '',
orgName,
});
});
};
};
// 添加子部门
const addApartmentSon = (data) => {
const { deptInfo } = data;
activeKey.value = 1;
disabled.value = false;
opMap.type = 'addson';
formData.value = {};
let sourceOrgId = '';
if (deptInfo.orgId !== orgId) {
sourceOrgId = orgId;
}
opMap.fuc = (params) => {
return formRef.value.triggerSubmit().then(() => {
return http.post(department.deptSave, {
...params,
orgId,
projectId,
pdeptId: deptInfo.deptId,
sourceOrgId,
// deptName: selectRef.value.deptInfo.deptName,
});
});
};
};
const addUser = (data) => {
roleDisabled.value = false;
opMap.type = 'addUser';
roleFormData.value = { isLeader: 1 };
roleActiveKey.value = 1;
opMap.fuc = (params) => {
delete params.roleId;
return formRoleRef.value.triggerSubmit().then(() => {
return http.post(department.addRole, {
...params,
orgId,
projectId,
proleId: data.proleId || '',
deptId: selectRef.value.deptInfo.deptId,
deptName: selectRef.value.deptInfo.deptName,
});
});
};
};
const addUserSon = (data) => {
roleDisabled.value = false;
opMap.type = 'addUserSon';
roleActiveKey.value = 1;
roleFormData.value = { isLeader: 1 };
opMap.fuc = (params) => {
delete params.roleId;
return formRoleRef.value.triggerSubmit().then(() => {
return http.post(department.addRole, {
...params,
orgId,
projectId,
proleId: data.roleId,
deptId: selectRef.value.deptInfo.deptId,
deptName: selectRef.value.deptInfo.deptName,
});
});
};
};
const deleteDept = (data) => {
// 删除逻辑
Modal.confirm({
title: '是否确认删除',
onOk() {
http.post(department.deptDel, { deptId: data.deptInfo.deptId }).then(() => {
getTree();
clearDeptData();
// 清空select树
if (data.selected) {
// 删除选中的数据需要清空
deptTreeSelectedKeys.value = [];
selectRef.value = '';
roleTreeData.value = [{ zhName: '全部', selectable: false, orgInfo: {}, children: [] }];
}
});
},
onCancel() {
console.log('Cancel');
},
});
};
const deleteUser = (data) => {
Modal.confirm({
title: '是否确认删除',
onOk() {
http.post(department.delRole, { roleId: data.roleId }).then(() => {
getUserTree({ deptId: selectRef.value.deptInfo.deptId });
clearRoleData();
// 清空select树
if (data.selected) {
// 删除选中的数据需要清空
roleTreeSelectedKeys.value = [];
selectRoleRef.value = '';
}
NsMessage.success('操作成功');
});
},
});
};
watchEffect(() => {
console.log(deptTreeSelectedKeys.value, 'deptTreeData.value');
});
const clearDeptData = () => {
formData.value = {};
opMap.type = '';
opMap.fuc = '';
};
const clearRoleData = () => {
roleFormData.value = {};
opMap.type = '';
opMap.fuc = '';
};
// 部门权限选择
const deptCheck = (checked, { halfCheckedKeys }) => {
console.log(checked, halfCheckedKeys);
const result = checked.map((item) => {
return {
halfCheck: false,
permissionId: item,
};
});
const finalResult = halfCheckedKeys
.map((item) => {
return {
halfCheck: true,
permissionId: item,
};
})
.concat(result);
deptTotalCheckedKeys.value = finalResult;
};
// 角色权限选择
const roleCheck = (checked, { halfCheckedKeys }) => {
console.log(checked, halfCheckedKeys);
const result = checked.map((item) => {
return {
halfCheck: false,
permissionId: item,
};
});
const finalResult = halfCheckedKeys
.map((item) => {
return {
halfCheck: true,
permissionId: item,
};
})
.concat(result);
roleTotalCheckedKeys.value = finalResult;
};
// 保存部门权限
const deptPermission = () => {
return http
.post(department.addPermission, {
deptId: selectRef.value?.deptInfo.deptId,
projectId,
permissionVoList: deptTotalCheckedKeys.value,
})
.then(() => {
NsMessage.success('保存成功');
});
};
// 保存角色权限
const rolePermission = () => {
if (!roleTotalCheckedKeys.value?.length) return;
http
.post(department.addRolePermission, {
// deptId: selectRef.value?.deptInfo.deptId,
roleId: selectRoleRef.value?.roleId,
projectId,
permissionVoList: roleTotalCheckedKeys.value,
})
.then(() => {
NsMessage.success('保存成功');
});
};
// 获取部门拥有的权限
const getDeptPermission = () => {
http
.post(permission.queryDeptPermission, { deptId: selectRef.value?.deptInfo.deptId })
.then((res) => {
deptcheckedKeys.value = res.data
?.filter((item) => !item.halfCheck)
.map((item) => {
return item.permissionId;
});
deptTotalCheckedKeys.value = res.data;
});
};
// 获取角色拥有的权限
const getRolePermission = () => {
http
.post(permission.queryRolePermission, { roleId: selectRoleRef.value?.roleId })
.then((res) => {
roleCheckedKeys.value = res.data
?.filter((item) => !item.halfCheck)
.map((item) => {
return item.permissionId;
});
roleTotalCheckedKeys.value = res.data;
});
};
/**
* 默认选中视为编辑部门
* type editDpet
*/
const apartmentChoose = () => {
opMap.type = 'editDpet';
opMap.fuc = (params) => {
return http.post(department.deptEdit, params);
};
};
// 部门编辑
const deptEdit = () => {
disabled.value = false;
apartmentChoose();
};
// 部门选择
const SelectApartmentTree = (selectedKeys: any, info: any) => {
console.log(info, 'SelectApartmentTree');
// 部门切换需要调整角色tab
roleActiveKey.value = 1;
const { selected } = info;
if (!selectedKeys?.length) return;
deptTreeSelectedKeys.value = [info.node.key];
selectRef.value = info.node.dataRef;
// 确定是否是企业
if (!selectRef.value.hasOwnProperty('own') && !selectRef.value.hasOwnProperty('orgInfo')) {
// 部门
formData.value = cloneDeep(info.node.dataRef.deptInfo);
} else {
activeKey.value = 1;
currentOrgRef.value = selectRef.value;
formData.value = {};
}
if (selectRef.value.deptInfo?.pdeptId) {
// 查询子部门
getDeptsonPermissionTree({ deptId: selectRef.value.deptInfo?.pdeptId });
} else {
getPermissionTree({ projectId, orgId });
}
getDeptPermission();
// 切换部门重置逻辑
deptcheckedKeys.value = [];
rolePermissionTreeData.value = [];
roleCheckedKeys.value = [];
roleTreeSelectedKeys.value = [];
roleDisabled.value = true;
};
/**
* 默认选中视为编辑角色
* type editDpet
*/
const roleChoose = () => {
opMap.type = 'editRole';
opMap.fuc = (params) => {
return http.post(department.editRole, params);
};
};
const roleEdit = () => {
roleDisabled.value = false;
roleChoose();
};
// 角色选择
const SelectUserTree = (selectedKeys: any, info: any) => {
const { selected } = info;
// roleDisabled.value = !selected;
if (!selectedKeys?.length) return;
roleTreeSelectedKeys.value = [info.node.key];
selectRoleRef.value = info.node.dataRef;
roleFormData.value = cloneDeep(info.node.dataRef);
roleCheckedKeys.value = [];
if (selectRoleRef.value?.proleId) {
// 查询子部门
getRolesonPermissionTree({ roleId: selectRoleRef.value?.proleId });
} else {
getRolePermissionTree({ deptId: selectRef.value.deptInfo.deptId });
}
getRolePermission();
};
const CancelApartment = () => {
disabled.value = true;
// 清楚校验错误信息
formRef.value.formElRef.clearValidate();
};
const CancelUser = () => {
roleDisabled.value = true;
// 清楚校验错误信息
formRoleRef.value.formElRef.clearValidate();
};
// 部门确定
const deptSure = () => {
const opArr = ['addDept', 'editDpet', 'addson'];
if (activeKey.value === 1) {
if (opArr.includes(opMap.type)) {
console.log(formRef.value, formData);
opMap.fuc &&
opMap.fuc(formData.value).then(() => {
getTree();
opMap.type !== 'editDpet' && clearDeptData();
disabled.value = true;
});
}
} else {
deptPermission().then(() => {
clearDeptData();
disabled.value = true;
});
}
};
// 角色确定
const roleSure = () => {
const typeArr = ['addUserSon', 'addUser', 'editRole'];
if (roleActiveKey.value === 1) {
if (typeArr.includes(opMap.type)) {
opMap.fuc &&
opMap.fuc(roleFormData.value).then(() => {
getUserTree();
opMap.type !== 'editRole' && clearRoleData();
roleDisabled.value = !roleDisabled.value;
NsMessage.success('操作成功');
});
}
} else {
rolePermission();
}
};
// 部门区域的dropdown
const dropActions = ref([
{ title: '新增部门', func: addApartment, key: 'addDept' },
{ title: '新增子部门', func: addApartmentSon, key: 'addDeptSon' },
{ title: '删除', func: deleteDept, key: 'deleteDept' },
// { title: '新增角色', func: addUser, key: 'addUser' },
]);
const filterAction = (data, actions, keyV = 'addDept') => {
if (data.hasOwnProperty('orgInfo')) {
// 企业节点
return actions.filter(({ key }) => key === keyV);
}
return actions;
};
// 角色区域的dropdown
const dropRoleActions = ref([
{ title: '新增角色', func: addUser, key: 'addUser' },
{ title: '新增子角色', func: addUserSon, key: 'addUserSon' },
{ title: '删除', func: deleteUser, key: 'deleteUser' },
]);
const treeRef = ref();
console.log(treeRef);
</script>
<style lang="less" scoped>
:deep(.ns-form::after) {
display: none;
}
.actionMore {
display: none;
}
:deep(.ant-row) {
height: calc(100% - 44px);
}
:deep(.ant-tree-node-content-wrapper) {
&:hover {
.actionMore {
display: block;
}
}
}
:deep(.ant-tabs-nav-wrap) {
padding: 0;
}
:deep(.ant-tabs-tabpane) {
padding-top: @ns-gap;
.form {
margin: 0 !important;
}
}
:deep(.ant-space) {
justify-content: flex-end;
}
.main {
display: flex;
height: 100%;
background-color: @ns-content-bg;
> div:first-child {
margin-right: @ns-gap;
}
}
.left,
.right {
width: 50%;
height: 100%;
padding: @ns-gap;
background-color: @white;
border-radius: @ns-border-radius;
// box-shadow: @ns-content-box-shadow;
}
.tree {
height: 100%;
overflow: hidden;
overflow-y: auto;
border-radius: @ns-border-radius;
border: 1px solid #ebeef5;
padding: 16px;
min-width: 100px;
}
.list {
padding-left: @ns-gap;
height: 100%;
.pane {
padding-left: @ns-gap;
border-left: 1px solid #ebeef5;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
:deep(.ant-tabs-content) {
height: 100%;
.ant-tree {
height: 100%;
overflow-y: scroll;
}
}
}
}
.ns-table-title {
text-align: left;
font-size: 16px;
font-weight: bold;
user-select: text;
width: 100%;
margin-bottom: @ns-gap;
}
.admin {
text-align: left;
height: 42px;
line-height: 42px;
font-size: 16px;
font-weight: bold;
user-select: text;
padding-left: 16px;
width: calc(100% + 32px);
}
.form {
margin: 20px;
}
.treeContent {
overflow: hidden;
text-overflow: ellipsis;
text-wrap: nowrap;
}
</style>