Skip to content

Commit bf58260

Browse files
committed
feat(scrm): organization query wecom users with selected department
1 parent 6771347 commit bf58260

File tree

8 files changed

+118
-76
lines changed

8 files changed

+118
-76
lines changed

src/api/scrm/wecom/department/index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,14 @@ export function deleteDepartment(request: DeleteDepartmentRequest) {
9393

9494
export interface WeComDepartment {
9595
id: number;
96-
depName: string;
97-
leader: DepartmentLeader;
98-
phoneNumber: string;
99-
email: string;
100-
remark: string;
96+
departmentLeader: null;
97+
name: string;
98+
nameEn: string;
99+
order: number;
100+
refDepartmentId: number;
101+
weComDepId: number;
102+
weComParentId: number;
103+
children: WeComDepartment[];
101104
}
102105

103106
export interface GetDepartmentRequest {

src/api/scrm/wecom/user/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,20 @@ export interface listUsersPageRequest {
5050
alias?: number[];
5151
status?: string[];
5252
WeComUserId?: string | number | null;
53-
WeComMainDepartmentId?: any;
5453
roleCodes?: string[];
5554
isEnable?: any;
5655
pageIndex?: number;
5756
pageSize?: number;
5857
likeName?: string;
58+
departmentId?: number;
59+
departmentIds?: number[];
5960
}
6061

6162
export interface listUsersPageReply {
6263
list: WeComUser[];
6364
pageIndex: number;
6465
pageSize: number;
6566
total: number;
66-
children?: any[];
6767
}
6868

6969
export function listUsersPage(request: listUsersPageRequest) {

src/store/modules/scrm/wecom/user.ts

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,66 @@
11
import { defineStore } from 'pinia';
22
import { getDepartment, WeComDepartment } from '@/api/scrm/wecom/department';
33
import { Message } from '@arco-design/web-vue';
4+
import { listUsersPage } from '@/api/scrm/wecom/user';
45

56
type TagTree = any;
67
type UserList = any;
78

89
export type ViewType = 'department' | 'tag';
910

1011
interface UserState {
11-
departmentTree: WeComDepartment | null;
12+
departmentTree: WeComDepartment[];
1213
tagTree: TagTree | null;
1314
userList: UserList | null;
14-
selectedDepartment: number | null;
15+
selectedDepartmentId: number;
16+
selectedDepartmentIds: number[];
1517
selectedTag: number | null;
1618
selectedViewType: ViewType;
1719
}
1820

1921
const useWeComUserStore = defineStore('weComUser', {
2022
state: (): UserState => ({
21-
departmentTree: null,
23+
departmentTree: [],
2224
tagTree: null,
2325
userList: null,
24-
selectedDepartment: null,
26+
selectedDepartmentId: 0,
27+
selectedDepartmentIds: [0],
2528
selectedTag: null,
2629
selectedViewType: 'department',
2730
}),
2831
actions: {
2932
setDepartmentTree(tree: WeComDepartment) {
30-
this.departmentTree = tree;
33+
this.departmentTree = [tree];
3134
},
3235
setTagTree(tree: TagTree) {
3336
this.tagTree = tree;
3437
},
3538
setUserList(list: UserList) {
3639
this.userList = list;
3740
},
38-
setSelectedDepartment(id: number) {
39-
this.selectedDepartment = id;
41+
setSelectedDepartment(departmentId: number) {
42+
this.selectedDepartmentId = departmentId;
43+
// 清空 selectedDepartmentIds 数组,只保留当前选中的部门 ID
44+
this.selectedDepartmentIds = [departmentId];
45+
46+
// 遍历 departmentTree 中的所有部门
47+
const findDepartments = (departments: WeComDepartment[]) => {
48+
departments.forEach((department) => {
49+
// 检查当前部门的 weComParentId 是否与 selectedDepartmentId 匹配
50+
if (department.weComParentId === this.selectedDepartmentId) {
51+
// 如果匹配,将部门的 ID 添加到 selectedDepartmentIds 中
52+
this.selectedDepartmentIds.push(department.weComDepId);
53+
}
54+
55+
// 如果有子部门,递归调用 findDepartments 处理子部门
56+
if (department.children && department.children.length > 0) {
57+
findDepartments(department.children);
58+
}
59+
});
60+
};
61+
62+
// 启动查找
63+
findDepartments(this.departmentTree);
4064
},
4165
setSelectedTag(id: number) {
4266
this.selectedTag = id;
@@ -48,13 +72,26 @@ const useWeComUserStore = defineStore('weComUser', {
4872
async loadDepartmentTree(departmentId: number) {
4973
const res = await getDepartment({ departmentId });
5074
if (res.data) {
51-
this.departmentTree = res.data.department;
75+
this.departmentTree = [res.data.department];
5276
} else {
5377
Message.error('获取部门信息失败');
5478
}
5579
},
56-
async loadCurrentUserByDepartmentId(departmentId: number) {
57-
const res = await getDepartment({ departmentId });
80+
async loadUsersByDepartmentId(departmentId: number) {
81+
const res = await listUsersPage({ departmentId });
82+
if (res.data) {
83+
this.userList = [res.data.list];
84+
} else {
85+
Message.error('获取部门用户列表失败');
86+
}
87+
},
88+
async loadUsersByDepartmentIds(departmentIds: number[]) {
89+
const res = await listUsersPage({ departmentIds });
90+
if (res.data) {
91+
this.userList = [res.data.list];
92+
} else {
93+
Message.error('获取部门用户列表失败');
94+
}
5895
},
5996
},
6097
});
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
.container{
2-
//@apply flex flex-row justify-center items-center min-w-[768px] border border-red-500 m-20 rounded-6 bg-white gap-120;
3-
//border: 1px solid green;
2+
display: flex;
3+
flex-direction: column;
4+
justify-content: start;
5+
align-items: start;
46
max-width: 320px;
57
width: 100%;
68
height: 100%;
9+
//border:1px solid red;
710
}

src/views/scrm/wecom/organization/user/components/department-side/index.vue

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
<script lang="ts" setup>
22
import { computed, onMounted, PropType, ref } from 'vue';
3-
import {
4-
DepartmentNode,
5-
getDepartmentTree,
6-
GetDepartmentTreeReply,
7-
} from '@/api/scrm/wecom/department';
83
import useWeComUserStore from '@/store/modules/scrm/wecom/user';
4+
import { consola } from 'consola';
95
import styles from './index.module.less';
106
117
const prop = defineProps({
@@ -26,55 +22,44 @@
2622
},
2723
});
2824
29-
const departmentTree = ref<GetDepartmentTreeReply>({
30-
total: 0,
31-
pageIndex: 0,
32-
pageSize: 10,
33-
list: [],
34-
});
35-
36-
const onSelect = (selectedKeys: any) => {
37-
depId.value = selectedKeys[0] === 1 ? 0 : selectedKeys[0];
25+
const onSelect = (selectedKeys: number[]) => {
26+
depId.value = selectedKeys[0] === 1 ? 1 : selectedKeys[0];
3827
};
39-
const departNodes = (data: DepartmentNode[], parentId = 0) => {
40-
const departNodesList: DepartmentNode[] = [];
41-
data.forEach((item) => {
42-
if (item.WeComParentId === parentId) {
43-
const children = departNodes(data, item.WeComDepId);
44-
if (children.length > 0) {
45-
item.children = children;
28+
29+
const expandedKeys = ref<number[]>([]);
30+
31+
const getAllKeys = (tree: any[]) => {
32+
const keys: number[] = [];
33+
const traverse = (nodes: any[]) => {
34+
nodes.forEach((node) => {
35+
keys.push(node.weComDepId);
36+
if (Array.isArray(node.children)) {
37+
traverse(node.children);
4638
}
47-
departNodesList.push(item);
48-
}
49-
});
50-
return departNodesList;
39+
});
40+
};
41+
traverse(tree);
42+
return keys;
5143
};
52-
// function fetchDepartmentTree() {
53-
// getDepartmentTree().then((res: any) => {
54-
// const list: DepartmentNode | any = res.data.list || [];
55-
// const departNodesList = departNodes(list);
56-
// res.data.list = departNodesList;
57-
// departmentTree.value = res.data;
58-
// });
59-
// }
6044
6145
onMounted(async () => {
62-
// fetchDepartmentTree();
63-
await useWeComUser.loadDepartmentTree(0);
46+
// 默认拉取根目录的部门树
47+
await useWeComUser.loadDepartmentTree(1);
48+
// consola.log(useWeComUser.departmentTree);
49+
expandedKeys.value = getAllKeys(useWeComUser.departmentTree);
6450
});
6551
</script>
6652

6753
<template>
6854
<div :class="styles.container">
6955
<a-tree
70-
v-if="
71-
departmentTree && departmentTree.list && departmentTree.list.length > 0
72-
"
73-
:data="departmentTree.list"
56+
:data="useWeComUser.departmentTree"
57+
:expanded-keys="expandedKeys"
7458
:show-line="true"
59+
:default-expand-all="true"
7560
:field-names="{
7661
title: 'name',
77-
key: 'WeComDepId',
62+
key: 'weComDepId',
7863
children: 'children',
7964
}"
8065
checked-strategy="child"
@@ -83,8 +68,13 @@
8368
<template #title="nodeData">
8469
<span>{{ nodeData.name }}</span>
8570
</template>
86-
<template #switcher-icon>
87-
<icon-user-group />
71+
<template #switcher-icon="{ children }">
72+
<icon-caret-down
73+
v-if="Array.isArray(children) && children.length > 0"
74+
/>
75+
</template>
76+
<template #icon>
77+
<icon-folder />
8878
</template>
8979
</a-tree>
9080
</div>

src/views/scrm/wecom/organization/user/components/user-list/index.vue

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
<script setup lang="ts">
2-
import { onMounted, reactive, ref } from 'vue';
2+
import { onMounted, reactive, ref, watch } from 'vue';
33
import {
44
listUsersPage,
55
listUsersPageReply,
66
listUsersPageRequest,
77
} from '@/api/scrm/wecom/user';
8+
import useWeComUserStore from '@/store/modules/scrm/wecom/user';
9+
import { consola } from 'consola';
810
import styles from './index.module.less';
911
10-
const queryForm = reactive({
11-
WeComMainDepartmentId: null,
12-
} as listUsersPageRequest);
12+
const useWeComUser = useWeComUserStore();
13+
1314
const state = reactive({
1415
tableLoading: false,
1516
deleteUserLoading: false,
@@ -27,7 +28,9 @@
2728
return;
2829
}
2930
state.tableLoading = true;
30-
listUsersPage(queryForm)
31+
listUsersPage({
32+
departmentIds: useWeComUser.selectedDepartmentIds,
33+
} as listUsersPageRequest)
3134
.then((res) => {
3235
pageData.value = res.data;
3336
})
@@ -42,6 +45,14 @@
4245
onlyCurrent: false,
4346
});
4447
48+
watch(
49+
() => useWeComUser.selectedDepartmentIds,
50+
() => {
51+
// consola.log('changed:', useWeComUser.selectedDepartmentIds);
52+
queryChange();
53+
},
54+
);
55+
4556
const onAddUser = () => {
4657
console.log('add user');
4758
};

src/views/scrm/wecom/organization/user/index.module.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
margin: 2px 6px;
66
//background: #fff;
77
border-radius: 4px;
8+
height: 100%;
89

910
.departmentList {
1011
display: flex;

src/views/scrm/wecom/organization/user/index.vue

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@
77
import { pullSyncWeComDepartmentsAndUsers } from '@/api/scrm/wecom/user';
88
import { Message } from '@arco-design/web-vue';
99
import useLoadingStore from '@/store/modules/loading';
10+
import { consola } from 'consola';
1011
import styles from './index.module.less';
1112
1213
const useWeComUser = useWeComUserStore();
1314
const loadingStore = useLoadingStore();
1415
1516
const checkedViewType = ref('department');
16-
const handleDepartmentChange = (data: number | undefined) => {
17-
useWeComUser.setSelectedDepartment(data!);
17+
const handleDepartmentChange = (data: number) => {
18+
useWeComUser.setSelectedDepartment(data);
19+
// consola.log(data, useWeComUser.selectedDepartmentId);
1820
// queryChange();
1921
};
2022
@@ -34,8 +36,8 @@
3436
});
3537
if (res) {
3638
Message.success('同步成功');
37-
// await useWeComUser.loadDepartmentTree(0);
38-
// await useWeComUser.loadCurrentUserByDepartmentId(0);
39+
await useWeComUser.loadDepartmentTree(1);
40+
// await useWeComUser.loadUsersByDepartmentId(0);
3941
}
4042
} catch (err: any) {
4143
Message.error(err.message);
@@ -105,12 +107,7 @@
105107
>
106108
</a-radio-group>
107109
<a-divider :margin="8" />
108-
<a-scrollbar>
109-
<DepartmentSide
110-
style="min-height: 65vh"
111-
@update:model-value="handleDepartmentChange"
112-
/>
113-
</a-scrollbar>
110+
<DepartmentSide @update:model-value="handleDepartmentChange" />
114111
</div>
115112
<div :class="styles.userTable">
116113
<UserList v-if="useWeComUser.selectedViewType === 'department'" />

0 commit comments

Comments
 (0)