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.

368 lines
12 KiB

<template>
<ns-modal
v-model:visible="show"
width="1100px"
style="overflow-y: hidden"
title="添加联系人"
@ok="handleOk"
@cancel="handleCancel">
10 months ago
<div class="box">
<div class="box-left">
<div style="width: 100%; display: flex; position: relative" class="ns-title-extra-box">
<span style="margin-left: 12px; color: #333333">联系人名单</span>
</div>
<img
10 months ago
style="width: 100%; height: 2px"
src="https://files.axshare.com/gsc/4T0UQR/7e/5d/a2/7e5da2a277344db8af30521cefeb70cc/images/告警设置/u150.svg?pageId=1f58c1ba-b461-4fe8-a2b3-295f1e7b0aa0" />
<a-input-search
v-model:value="searchValue"
style="margin-bottom: 8px"
placeholder="请输入关键字" />
<img
10 months ago
style="width: 100%; height: 2px"
src="https://files.axshare.com/gsc/4T0UQR/7e/5d/a2/7e5da2a277344db8af30521cefeb70cc/images/告警设置/u150.svg?pageId=1f58c1ba-b461-4fe8-a2b3-295f1e7b0aa0" />
10 months ago
<div style="width: 100%; height: 370px; overflow-y: auto">
<a-tree
10 months ago
v-model:selectedKeys="selectedKeys"
v-model:expandedKeys="expandedKeys"
:tree-data="deptTreeData"
10 months ago
@select="onSelect"
/></div>
</div>
10 months ago
<div class="box-right">
<div style="width: 100%; display: flex; position: relative" class="ns-title-extra-box">
<span style="margin-left: 12px; color: #333333">人员列表 </span>
10 months ago
<a-input-search
10 months ago
v-model:value="realName"
10 months ago
style="margin-bottom: 8px; width: 280px; position: absolute; right: 20px"
placeholder="请输入"
allowClear="true"
@search="onSearch" />
</div>
<img
style="width: 100%; height: 2px"
src="https://files.axshare.com/gsc/4T0UQR/7e/5d/a2/7e5da2a277344db8af30521cefeb70cc/images/告警设置/u150.svg?pageId=1f58c1ba-b461-4fe8-a2b3-295f1e7b0aa0" />
<div style="width: 100%; height: 450px; overflow-y: auto; padding: 12px 0">
<a-table
:row-selection="{
selectedRowKeys: selectedRowKey,
preserveSelectedRowKeys: true,
onChange: onSelectChange,
}"
:columns="columns"
10 months ago
:loading="loading"
10 months ago
:data-source="dataSource"
10 months ago
:rowKey="(record: any) => record.userId"
10 months ago
:pagination="pagination"
:bordered="true"
10 months ago
:size="'middle'">
<template #bodyCell="{ record, column }">
<template v-if="column.dataIndex === 'address'">
{{ record.userRoleInfos?.[0].deptRoleInfoList }}
</template>
</template>
</a-table>
10 months ago
</div>
</div>
</div>
</ns-modal>
</template>
<script lang="ts">
import { ref, watch } from 'vue';
import { defineComponent } from 'vue';
10 months ago
import type { TreeProps } from 'ant-design-vue';
10 months ago
import { origanizemanage } from '/@/api/origanizemanage';
import { department } from '/@/api/origanizemanage';
10 months ago
import { http } from '/nerv-lib/util';
//搜索存储 拼凑树的搜索类型
10 months ago
const dataList: TreeProps['treeData'] = [];
const generateList = (data: TreeProps['treeData']) => {
for (let i = 0; i < data.length; i++) {
const node = data[i];
const key = node.key;
10 months ago
dataList.push({ key, title: node.title });
10 months ago
if (node.children) {
generateList(node.children);
}
}
};
const getParentKey = (
key: string | number,
tree: TreeProps['treeData'],
): string | number | undefined => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some((item) => item.key === key)) {
parentKey = node.key;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
export default defineComponent({
setup(props, { emit }) {
10 months ago
//组织数
const orgId = ref('');
const result = JSON.parse(sessionStorage.getItem('ORGID')!);
orgId.value = result;
const dataSource = ref([]);
10 months ago
const loading = ref(false);
10 months ago
const selectedRowKey = ref([]);
const selectedRow = ref([]);
10 months ago
const realName = ref(null);
// 树方法
const expandedKeys = ref<(string | number)[]>([]);
const selectedKeys = ref([]);
const searchValue = ref<string>('');
const deviceName = ref<string>('');
const autoExpandParent = ref<boolean>(true);
const deptTreeData = ref([]);
//选择 组织
const selectOrgId = ref('');
//默认当前缓存的组织
10 months ago
selectOrgId.value = result;
//选择部门
const selectDeptId = ref('');
const show = ref(false);
//人员搜索
10 months ago
const onSearch = () => {
10 months ago
pagination.value.current = 1;
getList();
10 months ago
};
//点击树 搜索人员
10 months ago
const onSelect = (selectedKeys: any, info: any) => {
10 months ago
selectedKeys.value = selectedKeys;
//判断选择的部门 还是 组织
10 months ago
if (info.node.dataRef.deptInfo) {
selectDeptId.value = info.node.dataRef.deptInfo.deptId;
selectOrgId.value = info.node.dataRef.deptInfo.orgId;
}
if (info.node.dataRef.orgInfo) {
selectOrgId.value = info.node.dataRef.orgInfo.orgId;
selectDeptId.value = '';
}
10 months ago
pagination.value.current = 1;
10 months ago
getList();
};
// 递归处理部门树数据
const processDepartmentTree = (tree: any) => {
tree.forEach((item: any) => {
10 months ago
item.deptInfo = item.deptInfo;
item.key = item.deptInfo.deptId;
item.title = item.deptInfo.deptName;
item.children = processDepartmentTree(item.children); // 递归处理子节点
});
return tree;
10 months ago
};
10 months ago
// 获取部门树
const getDepartList = (params: any) => {
10 months ago
return http.post(department.queryDeptTree, params).then((res) => {
const result = res.data.map((item: any) => ({
10 months ago
key: item.orgInfo.orgId,
orgInfo: item.orgInfo,
title: item.orgInfo.orgName,
children: processDepartmentTree(item.deptTrees),
}));
return result;
});
};
//获取树
const getTreeData = () => {
getDepartList({ orgId: orgId.value }).then((res) => {
deptTreeData.value = res;
selectedKeys.value = [orgId.value];
generateList(deptTreeData.value);
});
};
//获取列表
const getList = () => {
loading.value = true;
10 months ago
http
10 months ago
.post(origanizemanage.userList, {
10 months ago
pageNum: pagination.value.current,
pageSize: pagination.value.pageSize,
10 months ago
orgId: selectOrgId.value,
deptId: selectDeptId.value,
realName: realName.value,
userStatus: 0, // 写死 没有被冻结的用户
10 months ago
})
.then((res) => {
dataSource.value = res.data.records;
pagination.value.total = res.data.total;
10 months ago
loading.value = false;
10 months ago
});
};
// 改变页码
10 months ago
const handleChangePage = (current: number, pageSize: number) => {
pagination.value.current = current;
pagination.value.pageSize = pageSize;
getList();
};
const pagination = ref({
total: 0,
size: 'small',
current: 1,
pageSize: 10,
showQuickJumper: true,
showLessItems: true,
// showSizeChanger: true,
showTotal: (total: number, range: any) =>
total && range ? `显示第${range[0]}${range[1]}条记录,共 ${total} 条记录` : '',
onChange: handleChangePage,
});
10 months ago
const onSelectChange = (selectedRowKeys: any, selectedRows: any) => {
10 months ago
selectedRowKey.value = selectedRowKeys;
// 使用 forEach 循环遍历 selectedRows 数组
let newSelectRows: any = [];
selectedRows.forEach((item: any) => {
if (item) {
newSelectRows.push(item);
}
});
// 添加新选中的行的 userId 到 selectedRow.value
selectedRow.value = [
...selectedRow.value,
...newSelectRows.filter(
(newRow: any) =>
!selectedRow.value.some((existingRow) => existingRow.userId === newRow.userId),
),
];
// 移除取消选中的行的 userId
selectedRow.value = selectedRow.value.filter((existingRow: any) =>
selectedRowKeys.includes(existingRow.userId),
);
10 months ago
};
const columns = [
{
title: '序号',
10 months ago
dataIndex: 'index',
width: 80,
10 months ago
customRender: (text: any) => {
return text.index + 1;
},
},
{
title: '姓名',
10 months ago
dataIndex: 'realName',
width: 100,
ellipsis: true,
10 months ago
},
{
title: '性别',
dataIndex: 'sex',
},
{
title: '组织关系',
10 months ago
dataIndex: 'orgName',
10 months ago
},
{
title: '部门 ',
dataIndex: 'address',
},
];
const reback = () => {
10 months ago
show.value = false;
pagination.value.current = 1;
10 months ago
realName.value = null;
searchValue.value = '';
selectDeptId.value = '';
selectOrgId.value = orgId.value;
selectedRow.value = [];
selectedRowKey.value = [];
};
const handleOk = () => {
// 处理确定按钮的逻辑
emit('handleOk', { id: selectedRowKey.value, data: selectedRow.value });
//恢复数据
reback();
};
10 months ago
const getData = (data: any) => {
selectedRow.value = data.data;
selectedRowKey.value = data.id;
show.value = true;
10 months ago
//获取列表
getList();
//获取树
getTreeData();
};
const handleCancel = () => {
// 处理取消按钮的逻辑
emit('handleCancel', null);
reback();
};
// 监听树的搜索
10 months ago
watch(searchValue, (value) => {
const expanded = dataList
.map((item: TreeProps['treeData'][number]) => {
if (item.title.indexOf(value) > -1) {
10 months ago
return getParentKey(item.key, deptTreeData.value);
10 months ago
}
return null;
})
.filter((item, i, self) => item && self.indexOf(item) === i);
expandedKeys.value = expanded;
searchValue.value = value;
autoExpandParent.value = true;
});
return {
10 months ago
columns,
10 months ago
realName,
10 months ago
orgId,
10 months ago
processDepartmentTree,
10 months ago
onSearch,
10 months ago
getList,
loading,
10 months ago
dataSource,
onSelect,
10 months ago
deptTreeData,
10 months ago
selectedRow,
selectedRowKey,
autoExpandParent,
expandedKeys,
10 months ago
selectedKeys,
10 months ago
onSelectChange,
pagination,
handleOk,
reback,
show,
getData,
10 months ago
getTreeData,
getDepartList,
searchValue,
10 months ago
deviceName,
handleCancel,
10 months ago
selectDeptId,
selectOrgId,
};
},
});
</script>
10 months ago
<style scoped lang="less">
.box {
width: 100%;
height: 500px;
display: flex;
.box-left {
width: 300px;
height: 100%;
overflow-y: auto;
padding: 0, 12px;
gap: 5px;
}
.box-right {
width: calc(100% - 200px);
height: 100%;
padding: 0 12px;
overflow-y: auto;
}
}
</style>