Files
SaaS-lib/hx-ai-intelligent/src/view/organizationManage/usermanage/index.vue

604 lines
17 KiB
Vue
Raw Normal View History

2024-05-22 16:31:55 +08:00
<!-- @format -->
<template>
2024-05-23 14:34:26 +08:00
<div class="main">
<div class="left">
<div class="top">
<div class="ns-table-title">关联企业</div>
2024-06-04 10:54:02 +08:00
<div style="height: 100%; overflow-y: auto">
2024-05-23 14:34:26 +08:00
<a-input-search
v-model:value="searchValue"
style="margin-bottom: 8px"
placeholder="请输入关联企业"
@search="onSearch" />
2024-06-04 10:54:02 +08:00
<a-tree
v-if="treeData?.length"
:tree-data="treeData"
defaultExpandAll
@select="handleSelect">
<template #title="data">
{{ data.orgInfo?.orgName }}
2024-05-23 14:34:26 +08:00
</template>
</a-tree>
</div>
</div>
<div>
2024-06-04 10:54:02 +08:00
<div class="ns-table-title">关联部门</div>
2024-05-23 14:34:26 +08:00
<a-input-search
v-model:value="searchValue2"
style="margin-bottom: 8px"
placeholder="请输入关联部门"
@search="onSearch2" />
2024-06-04 10:54:02 +08:00
<a-tree
v-if="treeData2?.length"
:tree-data="treeData2"
defaultExpandAll
@select="handleSelect2">
<template #title="data">
{{ data.deptInfo?.deptName }}
2024-05-23 14:34:26 +08:00
</template>
</a-tree>
</div>
</div>
<div class="right">
2024-05-24 09:44:08 +08:00
<ns-view-list-table v-bind="tableConfig" :model="data" ref="mainRef" />
2024-05-23 14:34:26 +08:00
</div>
2024-05-23 16:17:12 +08:00
<a-drawer
2024-06-04 10:54:02 +08:00
:width="500"
2024-05-23 16:17:12 +08:00
:visible="visible"
:body-style="{ paddingBottom: '80px' }"
:footer-style="{ textAlign: 'right' }"
2024-05-28 11:08:57 +08:00
destroyOnClose
2024-05-23 16:17:12 +08:00
@close="onClose">
2024-06-04 10:54:02 +08:00
<ns-form
ref="formRef"
:schemas="formSchema"
:model="formData"
class="form"
:wrapperCol="{ span: 20 }"
formLayout="vertical" />
2024-05-23 16:17:12 +08:00
<span class="admin">用户权限</span>
2024-06-04 10:54:02 +08:00
<ns-view-list-table
v-bind="tableConfig2"
class="drawerTable"
:model="data"
:pagination="false"
rowKey="uuid" />
<template #footer>
<a-button style="margin-right: 8px" @click="onClose">取消</a-button>
2024-06-04 19:22:11 +08:00
<a-button :disabled="!dynamicDisabled" type="primary" @click="onEdit">确定</a-button>
2024-06-04 10:54:02 +08:00
</template>
2024-05-23 16:17:12 +08:00
</a-drawer>
2024-05-23 14:34:26 +08:00
2024-05-23 16:17:12 +08:00
<a-modal
title="用户信息"
:width="600"
:visible="addformvisible"
cancelText="取消"
@ok="handleOk"
@cancel="handleClose">
2024-06-04 19:22:11 +08:00
<ns-form ref="modalFormRef" :schemas="formSchema2" :model="formData2" formLayout="vertical" />
2024-05-23 16:17:12 +08:00
</a-modal>
</div>
2024-05-22 16:31:55 +08:00
</template>
<script lang="ts">
2024-06-04 19:22:11 +08:00
import { computed, createVNode, defineComponent, nextTick, reactive, ref } from 'vue';
2024-05-22 16:31:55 +08:00
import { http } from '/nerv-lib/util/http';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
2024-05-23 14:34:26 +08:00
import { cloneDeep } from 'lodash-es';
2024-06-04 10:54:02 +08:00
import { NsMessage, NsModal } from '/nerv-lib/component';
2024-05-28 11:08:57 +08:00
import { formConfig, formConfig2 } from './config';
2024-06-04 10:54:02 +08:00
import { origanizemanage, department } from '/@/api/origanizemanage';
2024-05-28 18:00:25 +08:00
2024-05-22 16:31:55 +08:00
export default defineComponent({
name: 'OrderListIndex',
setup() {
const mainRef = ref();
const data = reactive({});
2024-05-23 14:34:26 +08:00
let formData = ref({});
2024-06-04 10:54:02 +08:00
let formData2 = ref({ userRoleList: [1, 1, 3] });
2024-05-28 11:08:57 +08:00
const formRef = ref();
2024-06-04 19:22:11 +08:00
const modalFormRef = ref();
2024-05-22 16:31:55 +08:00
const visible = ref(false);
2024-05-23 14:34:26 +08:00
const addformvisible = ref(false);
2024-05-22 16:31:55 +08:00
const searchValue = ref<string>('');
const searchValue2 = ref<string>('');
2024-05-28 11:08:57 +08:00
const formSchema = formConfig;
const casData = ref([]);
const formSchema2 = formConfig2(casData);
2024-06-04 10:54:02 +08:00
const treeData = ref([]);
const treeData2 = ref([]);
const userAuthList = ref([]);
const orgId = JSON.parse(sessionStorage.getItem('userInfo')).orgId;
2024-06-04 19:22:11 +08:00
const dynamicDisabled = computed(() => {
return formRef.value?.validateResult && userAuthList.value?.length;
});
2024-06-04 10:54:02 +08:00
const fetch = (api, params = { orgId }) => {
return http.post(api, params);
};
// 企业树
fetch(origanizemanage.queryOrgTree).then((res) => {
2024-06-06 11:05:43 +08:00
const otherOrg = res.data[0].listOrg;
// 特殊处理
2024-06-04 10:54:02 +08:00
treeData.value = res.data;
2024-06-06 11:05:43 +08:00
otherOrg?.map((item) => {
treeData.value.push({ orgInfo: item } as never);
});
2024-06-04 10:54:02 +08:00
});
2024-05-28 11:08:57 +08:00
2024-06-04 10:54:02 +08:00
// 部门树
fetch(origanizemanage.queryDeptTree).then((res) => {
treeData2.value = res.data;
});
2024-05-23 14:34:26 +08:00
const opMap: any = {
type: 'add',
fuc: () => {},
record: {},
};
2024-05-22 16:31:55 +08:00
const onSearch = () => {
console.log(searchValue.value);
2024-06-04 10:54:02 +08:00
fetch(origanizemanage.queryOrgTree, { orgName: searchValue.value, orgId }).then((res) => {
treeData.value = res.data;
});
2024-05-22 16:31:55 +08:00
};
const onSearch2 = () => {
console.log(searchValue2.value);
2024-06-04 10:54:02 +08:00
fetch(origanizemanage.queryDeptTree, { deptName: searchValue2.value, orgId }).then(
(res) => {
treeData2.value = res.data;
},
);
};
const tableFetch = (params) => {
2024-06-04 19:22:11 +08:00
console.log(mainRef.value);
2024-06-04 10:54:02 +08:00
tableConfig.value.params = {
2024-06-04 19:22:11 +08:00
...mainRef.value.params,
2024-06-04 10:54:02 +08:00
...params,
};
mainRef.value?.nsTableRef.reload();
2024-05-22 16:31:55 +08:00
};
const handleSelect = (selectedKeys: any, info: any) => {
2024-06-04 10:54:02 +08:00
fetch(origanizemanage.queryDeptTree, { orgId: info.node?.orgInfo.orgId }).then((res) => {
treeData2.value = res.data;
});
tableFetch({ orgId: info.node?.orgInfo.orgId });
2024-05-22 16:31:55 +08:00
};
2024-06-04 10:54:02 +08:00
2024-05-22 16:31:55 +08:00
const handleSelect2 = (selectedKeys: any, info: any) => {
2024-06-04 10:54:02 +08:00
tableFetch({ deptId: info.node?.deptInfo.deptId });
2024-05-22 16:31:55 +08:00
};
const onClose = () => {
visible.value = false;
2024-06-04 19:22:11 +08:00
formData.value = {};
userAuthList.value.splice(0);
2024-05-22 16:31:55 +08:00
};
2024-05-23 14:34:26 +08:00
2024-05-22 16:31:55 +08:00
const onEdit = () => {
2024-05-28 11:08:57 +08:00
formRef.value?.triggerSubmit().then(() => {
console.log(formData.value, 'formData.value');
2024-06-04 10:54:02 +08:00
if (!userAuthList.value.length) {
NsMessage.error('请添加用户权限');
return;
}
opMap.fuc && opMap.fuc({ ...formData.value, userRoleList: userAuthList.value, orgId });
2024-05-28 11:08:57 +08:00
visible.value = false;
});
2024-05-22 16:31:55 +08:00
};
const handleOk = () => {
2024-06-04 19:22:11 +08:00
console.log(casData.value, 'formData2.value');
2024-06-04 10:54:02 +08:00
if (casData.value?.length !== 3) {
NsMessage.error('未选择角色');
2024-05-24 13:13:24 +08:00
}
2024-06-04 19:22:11 +08:00
const str = casData.value.map((item) => item?.label).join('/');
2024-06-04 10:54:02 +08:00
userAuthList.value.push({
2024-06-04 19:22:11 +08:00
deptRoleInfoList: str,
2024-06-04 10:54:02 +08:00
roleId: casData.value[2].value,
roleName: casData.value[2].label,
2024-06-04 19:22:11 +08:00
} as never);
handleClose();
2024-05-22 16:31:55 +08:00
};
const handleClose = () => {
addformvisible.value = false;
2024-06-04 19:22:11 +08:00
modalFormRef.value.reset();
2024-05-22 16:31:55 +08:00
};
2024-06-04 10:54:02 +08:00
const tableConfig = ref({
2024-05-28 18:00:25 +08:00
title: '用户管理',
api: origanizemanage.userList,
params: {
2024-06-04 10:54:02 +08:00
orgId,
2024-05-28 18:00:25 +08:00
},
2024-05-22 16:31:55 +08:00
headerActions: [
{
label: '新增',
name: 'RoleTypeAdd',
type: 'primary',
handle: () => {
2024-05-23 14:34:26 +08:00
opMap.type = 'add';
opMap.fuc = (formData: any) => {
2024-06-04 10:54:02 +08:00
http.post(origanizemanage.addUser, formData).then(() => {
2024-06-04 19:22:11 +08:00
mainRef.value?.nsTableRef.reload();
2024-06-04 10:54:02 +08:00
visible.value = false;
2024-06-04 19:22:11 +08:00
NsMessage.success('操作成功');
2024-06-04 10:54:02 +08:00
});
2024-05-23 14:34:26 +08:00
};
2024-05-22 16:31:55 +08:00
visible.value = true;
},
},
{
label: '导入',
type: 'primary',
name: 'RoleTypeAdd',
handle: () => {},
},
{
label: '模板下载',
type: 'primary',
name: 'RoleTypeAdd',
handle: () => {},
},
{
label: '导出',
type: 'primary',
2024-05-23 14:34:26 +08:00
name: 'exports',
2024-05-22 16:31:55 +08:00
},
{
label: '批量删除',
type: 'primary',
2024-06-04 10:54:02 +08:00
name: 'userBatchDel',
2024-05-22 16:31:55 +08:00
dynamicDisabled: (data: any) => {
return data.list.length === 0;
},
confirm: true,
isReload: true,
2024-06-04 10:54:02 +08:00
api: origanizemanage.batchDel,
dynamicParams: { userIds: 'userId[]' },
2024-05-22 16:31:55 +08:00
},
],
columns: [
{
title: '序号',
dataIndex: 'address',
customRender: (text: any) => {
return text.index + 1;
},
sorter: {
compare: (a, b) => a.address - b.address,
},
},
{
title: '账号',
2024-05-28 18:00:25 +08:00
dataIndex: 'accountNo',
2024-05-22 16:31:55 +08:00
sorter: {
2024-05-28 18:00:25 +08:00
compare: (a, b) => a.accountNo - b.accountNo,
2024-05-22 16:31:55 +08:00
},
},
{
title: '姓名',
2024-05-28 18:00:25 +08:00
dataIndex: 'realName',
2024-05-22 16:31:55 +08:00
sorter: {
2024-05-28 18:00:25 +08:00
compare: (a, b) => a.realName - b.realName,
2024-05-22 16:31:55 +08:00
},
},
{
title: '性别',
dataIndex: 'sex',
sorter: {
compare: (a, b) => a.name - b.name,
},
},
{
title: '手机号',
2024-05-28 18:00:25 +08:00
dataIndex: 'telephone',
2024-05-22 16:31:55 +08:00
},
{
title: '邮箱',
dataIndex: 'email',
},
{
title: '组织关系',
2024-06-04 10:54:02 +08:00
dataIndex: 'orgName',
2024-05-22 16:31:55 +08:00
},
{
2024-05-28 18:00:25 +08:00
title: '部门/角色',
2024-06-04 19:22:11 +08:00
dataIndex: 'userRoleInfos',
2024-06-04 10:54:02 +08:00
customRender: ({ value }) => {
if (!value) return '-';
return createVNode('div', {}, [
2024-06-04 19:22:11 +08:00
createVNode('span', {}, value[0]?.deptRoleInfoList),
2024-06-04 10:54:02 +08:00
value.length > 1 &&
createVNode(
'a',
{
onClick: () =>
NsModal.info({
icon: null,
2024-06-04 19:22:11 +08:00
content: createVNode('div', {
innerHTML: value.map((item) => item?.deptRoleInfoList).join('<br>'),
}),
2024-06-04 10:54:02 +08:00
}),
},
`+${value.length}`,
),
]);
2024-05-28 18:00:25 +08:00
},
2024-05-22 16:31:55 +08:00
},
{
title: '状态',
2024-05-28 18:00:25 +08:00
dataIndex: 'userStatus',
2024-06-04 10:54:02 +08:00
customRender: ({ value }) => ['正常', '冻结'][value],
2024-05-22 16:31:55 +08:00
},
],
columnActions: {
title: '操作',
actions: [
{
label: '编辑',
name: 'RoleTypeEdit',
// dynamicParams: 'uuid',
handle: (record: any) => {
2024-06-04 19:22:11 +08:00
userAuthList.value.splice(0);
setTimeout(() => {
formData.value = record;
userAuthList.value.push(...record.userRoleInfos);
}, 10);
2024-05-23 14:34:26 +08:00
opMap.type = 'edit';
opMap.fuc = (formData: any) => {
2024-06-04 19:22:11 +08:00
http.post(origanizemanage.editUser, formData).then(() => {
mainRef.value?.nsTableRef.reload();
visible.value = false;
NsMessage.success('操作成功');
});
2024-05-23 14:34:26 +08:00
};
2024-05-22 16:31:55 +08:00
visible.value = true;
},
},
{
label: '冻结',
2024-06-04 10:54:02 +08:00
name: 'userFrozen',
confirm: true,
defaultParams: { userStatus: 1 },
dynamicParams: 'userId',
isReload: true,
api: origanizemanage.frozen,
2024-05-22 16:31:55 +08:00
},
{
label: '重置密码',
2024-06-04 10:54:02 +08:00
name: 'userCodeReset',
confirm: true,
handle: ({ userId }: any) => {
http
.post(origanizemanage.resetPwd, { userId })
.then(() => NsModal.success({ content: '密码重置成功,初始密码123456' }));
2024-05-22 16:31:55 +08:00
},
},
{
label: '删除',
2024-06-04 10:54:02 +08:00
name: 'userDelete',
dynamicParams: 'userId',
2024-05-23 14:34:26 +08:00
confirm: true,
2024-06-04 10:54:02 +08:00
isReload: true,
api: origanizemanage.del,
2024-05-22 16:31:55 +08:00
},
],
},
formConfig: {
schemas: [
{
2024-05-28 18:00:25 +08:00
field: 'accountNo',
2024-05-22 16:31:55 +08:00
label: '账号名',
component: 'NsInput',
componentProps: {
placeholder: '请输入账号名',
2024-05-28 11:08:57 +08:00
maxLength: 30,
2024-05-22 16:31:55 +08:00
},
},
{
2024-05-28 18:00:25 +08:00
field: 'realName',
2024-05-22 16:31:55 +08:00
label: '姓名',
component: 'NsInput',
componentProps: {
placeholder: '请输入姓名',
2024-05-28 11:08:57 +08:00
maxLength: 30,
2024-05-22 16:31:55 +08:00
},
},
{
2024-05-28 18:00:25 +08:00
field: 'telephone',
2024-05-22 16:31:55 +08:00
label: '手机号',
component: 'NsInput',
componentProps: {
placeholder: '请输入手机号',
2024-05-28 11:08:57 +08:00
maxLength: 11,
2024-05-22 16:31:55 +08:00
},
},
{
field: 'email',
label: '邮箱',
component: 'NsInput',
componentProps: {
placeholder: '请输入邮箱',
2024-05-28 11:08:57 +08:00
maxLength: 30,
2024-05-22 16:31:55 +08:00
},
},
{
2024-05-28 18:00:25 +08:00
field: 'userStatus',
2024-05-22 16:31:55 +08:00
label: '用户状态',
component: 'NsSelect',
componentProps: {
placeholder: '请选择',
2024-06-04 10:54:02 +08:00
allowClear: true,
2024-05-22 16:31:55 +08:00
options: [
{
label: '正常',
2024-06-04 10:54:02 +08:00
value: 0,
2024-05-22 16:31:55 +08:00
},
{
label: '冻结',
2024-06-04 10:54:02 +08:00
value: 1,
2024-05-22 16:31:55 +08:00
},
],
},
},
],
params: {},
},
// pagination: { defaultPageSize: 10 },
2024-05-23 14:34:26 +08:00
rowKey: 'id',
2024-06-04 10:54:02 +08:00
});
2024-05-22 16:31:55 +08:00
const tableConfig2 = {
2024-05-23 14:34:26 +08:00
// api: {
// url: '/carbon_emission/device/getGatewayList',
// method: 'post',
// },
2024-06-04 10:54:02 +08:00
value: userAuthList.value,
2024-05-22 16:31:55 +08:00
rowSelection: null,
headerActions: [
{
label: '新增',
name: 'RoleTypeAdd',
type: 'primary',
handle: () => {
addformvisible.value = true;
},
},
],
columns: [
{
title: '角色信息',
2024-06-04 10:54:02 +08:00
dataIndex: 'userRoleList',
customRender: ({ record }) => {
if (record) {
2024-06-04 19:22:11 +08:00
// const res = record.userAuthList.reduce((pre, cur) => {
// pre.push(cur.label);
// return pre;
// }, []);
return record.deptRoleInfoList;
2024-06-04 10:54:02 +08:00
}
return '-';
},
2024-05-22 16:31:55 +08:00
},
],
columnActions: {
title: '操作',
actions: [
2024-06-04 10:54:02 +08:00
// {
// label: '编辑',
// name: 'RoleTypeEdit',
// // dynamicParams: 'uuid',
// handle: (record: any) => {
// console.log(record, 'record');
// formData2.value = record;
// opMap.type = 'edit';
// opMap.fuc = (formData2: any) => {
// Object.assign(
// mockData.value.filter((item) => item.id === record.id)[0],
// formData2,
// );
// };
// addformvisible.value = true;
// },
// },
2024-05-22 16:31:55 +08:00
{
label: '删除',
name: 'RoleTypeEdit',
2024-05-23 14:34:26 +08:00
confirm: true,
2024-05-24 13:13:24 +08:00
handle: (record: any, name: any, reload: any) => {
2024-06-04 10:54:02 +08:00
const id = record.roleId;
console.log(userAuthList.value, id);
let idx = 0;
userAuthList.value?.some((item, index) => {
idx = index;
if (item.roleId === id) return true;
});
userAuthList.value.splice(idx, 1);
2024-05-22 16:31:55 +08:00
},
},
],
},
};
return {
2024-05-28 11:08:57 +08:00
formRef,
2024-05-22 16:31:55 +08:00
tableConfig,
tableConfig2,
data,
mainRef,
visible,
2024-05-23 14:34:26 +08:00
addformvisible,
2024-05-22 16:31:55 +08:00
formSchema,
2024-05-23 14:34:26 +08:00
formSchema2,
2024-05-22 16:31:55 +08:00
formData,
2024-05-23 14:34:26 +08:00
formData2,
2024-05-22 16:31:55 +08:00
treeData,
treeData2,
searchValue,
searchValue2,
2024-05-23 14:34:26 +08:00
handleSelect,
handleSelect2,
onClose,
onEdit,
2024-05-22 16:31:55 +08:00
onSearch,
onSearch2,
handleOk,
handleClose,
2024-06-04 19:22:11 +08:00
dynamicDisabled,
modalFormRef,
2024-05-22 16:31:55 +08:00
};
},
});
</script>
2024-05-23 15:50:47 +08:00
<style lang="less" scoped>
2024-05-22 16:31:55 +08:00
.main {
display: flex;
}
.left {
2024-06-04 10:54:02 +08:00
width: 350px;
2024-05-22 16:31:55 +08:00
border-right: 5px solid rgb(229, 235, 240);
2024-05-23 15:50:47 +08:00
min-width: fit-content;
2024-05-22 16:31:55 +08:00
}
2024-05-23 16:17:12 +08:00
.right {
flex: 1;
2024-06-04 10:54:02 +08:00
min-width: 0;
2024-05-23 16:17:12 +08:00
}
2024-05-22 16:31:55 +08:00
.top {
2024-06-04 10:54:02 +08:00
height: 50%;
2024-05-22 16:31:55 +08:00
border-bottom: 5px solid rgb(229, 235, 240);
}
2024-05-23 16:18:18 +08:00
.ns-table-title {
2024-05-22 16:31:55 +08:00
text-align: left;
2024-05-24 09:44:08 +08:00
// height: 46px;
2024-05-22 16:31:55 +08:00
line-height: 46px;
font-size: 18px;
font-weight: bold;
padding-left: 16px;
}
.admin {
text-align: left;
height: 42px;
line-height: 42px;
font-size: 16px;
font-weight: bold;
user-select: text;
width: calc(100% + 32px);
}
2024-06-04 10:54:02 +08:00
.drawerTable {
:deep(.ns-table-container),
:deep(.ns-table-main) {
border-top: 0;
padding: 0;
}
2024-05-22 16:31:55 +08:00
}
</style>