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.

360 lines
11 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">
10 months ago
import { ref, watch, computed } 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';
// import { editTreeConfig } from './config';
10 months ago
//搜索存储
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('');
selectOrgId.value = result;
//选择部门
const selectDeptId = ref('');
10 months ago
const onSearch = () => {
10 months ago
pagination.value.current = 1;
getList();
10 months ago
};
const onSelect = (selectedKeys: any, info: any) => {
10 months ago
selectedKeys.value = selectedKeys;
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) => {
tree.forEach((item) => {
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) => {
return http.post(department.queryDeptTree, params).then((res) => {
const result = res.data.map((item) => ({
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();
};
10 months ago
10 months ago
const onSelectChange = (selectedRowKeys: any, selectedRows: any) => {
10 months ago
selectedRowKey.value = selectedRowKeys;
// 使用 forEach 循环遍历 selectedRows 数组
let newSelectRows = [];
selectedRows.forEach((item, index) => {
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 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,
});
const columns = [
{
title: '序号',
10 months ago
dataIndex: 'index',
10 months ago
customRender: (text: any) => {
return text.index + 1;
},
},
{
title: '姓名',
10 months ago
dataIndex: 'realName',
10 months ago
},
{
title: '性别',
dataIndex: 'sex',
},
{
title: '组织关系',
10 months ago
dataIndex: 'orgName',
10 months ago
},
{
title: '部门 ',
dataIndex: 'address',
},
];
const handleOk = () => {
// 处理确定按钮的逻辑
10 months ago
emit('handleOk', { id: selectedRowKey.value, data: selectedRow.value });
show.value = false;
pagination.value.current = 1;
10 months ago
realName.value = null;
searchValue.value = '';
selectDeptId.value = '';
selectOrgId.value = orgId.value;
};
10 months ago
const getData = (data: any) => {
selectedRow.value = data.data;
selectedRowKey.value = data.id;
show.value = true;
10 months ago
//获取列表
getList();
//获取树
getTreeData();
};
const show = ref(false);
const handleCancel = () => {
// 处理取消按钮的逻辑
emit('handleCancel', null);
show.value = false;
pagination.value.current = 1;
realName.value = null;
searchValue.value = '';
selectDeptId.value = '';
selectOrgId.value = orgId.value;
};
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,
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>