Skip to content

Commit 5d89eaa

Browse files
committed
feat(scrm): add createDepartment
1 parent a093b12 commit 5d89eaa

File tree

6 files changed

+171
-37
lines changed

6 files changed

+171
-37
lines changed

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

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ export interface DepartmentNode {
3434
children?: DepartmentNode[];
3535
}
3636

37+
export interface WeComDepartment {
38+
id: number;
39+
departmentLeader: null;
40+
name: string;
41+
nameEn: string;
42+
order: number;
43+
refDepartmentId: number;
44+
weComDepId: number;
45+
weComParentId: number;
46+
children: WeComDepartment[];
47+
}
48+
3749
export interface GetDepartmentTreeRequest {
3850
depId?: number;
3951
}
@@ -55,64 +67,56 @@ export function getDepartmentTree() {
5567
);
5668
}
5769

58-
export interface CreateDepartmentRequest {
59-
depName: string;
60-
leaderId: number;
61-
leaderIds: number[];
62-
pId: number;
63-
desc?: string;
64-
phoneNumber?: string;
65-
email?: string;
66-
remark?: string;
70+
export type CreateWeComDepartmentRequest = WeComDepartment;
71+
72+
export interface CreateWeComDepartmentReply {
73+
success: boolean;
6774
}
6875

69-
export interface CreateDepartmentReply {
76+
export function createWeComDepartment(request: CreateWeComDepartmentRequest) {
77+
return axios.post<CreateWeComDepartmentReply>(
78+
`${PrefixUriAdmin + UriWeComDepartment}`,
79+
request,
80+
);
81+
}
82+
83+
export type PatchWeComDepartmentRequest = WeComDepartment;
84+
85+
export interface PatchWeComDepartmentReply {
7086
id: number;
7187
}
7288

73-
export function createDepartment(request: CreateDepartmentRequest) {
74-
return axios.post<CreateDepartmentReply>(
75-
'/api/v1/admin/department/departments',
89+
export function patchWeComDepartment(request: PatchWeComDepartmentRequest) {
90+
return axios.patch<PatchWeComDepartmentReply>(
91+
`${PrefixUriAdmin + UriWeComDepartment}`,
7692
request,
7793
);
7894
}
7995

80-
export interface DeleteDepartmentRequest {
96+
export interface DeleteWeComDepartmentRequest {
8197
id: number;
8298
}
8399

84-
export interface DeleteDepartmentReply {
100+
export interface DeleteWeComDepartmentReply {
85101
id: number;
86102
}
87103

88-
export function deleteDepartment(request: DeleteDepartmentRequest) {
89-
return axios.delete<DeleteDepartmentReply>(
90-
`/api/v1/admin/department/departments/${request.id}`,
104+
export function deleteWeComDepartment(request: DeleteWeComDepartmentRequest) {
105+
return axios.delete<DeleteWeComDepartmentReply>(
106+
`${PrefixUriAdmin + UriWeComDepartment}/${request.id}`,
91107
);
92108
}
93109

94-
export interface WeComDepartment {
95-
id: number;
96-
departmentLeader: null;
97-
name: string;
98-
nameEn: string;
99-
order: number;
100-
refDepartmentId: number;
101-
weComDepId: number;
102-
weComParentId: number;
103-
children: WeComDepartment[];
104-
}
105-
106-
export interface GetDepartmentRequest {
110+
export interface GetWeComDepartmentRequest {
107111
departmentId: number;
108112
}
109113

110-
export interface GetDepartmentReply {
114+
export interface GetWeComDepartmentReply {
111115
department: WeComDepartment;
112116
}
113117

114-
export function getDepartment(request: GetDepartmentRequest) {
115-
return axios.post<GetDepartmentReply>(
118+
export function getWeComDepartment(request: GetWeComDepartmentRequest) {
119+
return axios.post<GetWeComDepartmentReply>(
116120
`${PrefixUriAdmin + UriWeComDepartment}/tree`,
117121
request,
118122
);

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { defineStore } from 'pinia';
2-
import { getDepartment, WeComDepartment } from '@/api/scrm/wecom/department';
2+
import {
3+
getWeComDepartment,
4+
WeComDepartment,
5+
} from '@/api/scrm/wecom/department';
36
import { Message } from '@arco-design/web-vue';
47
import { listUsersPage } from '@/api/scrm/wecom/user';
58

@@ -16,6 +19,7 @@ interface UserState {
1619
selectedDepartmentIds: number[];
1720
selectedTag: number | null;
1821
selectedViewType: ViewType;
22+
showCreateDepartmentModal: boolean;
1923
}
2024

2125
const useWeComUserStore = defineStore('weComUser', {
@@ -27,6 +31,7 @@ const useWeComUserStore = defineStore('weComUser', {
2731
selectedDepartmentIds: [],
2832
selectedTag: null,
2933
selectedViewType: 'department',
34+
showCreateDepartmentModal: false,
3035
}),
3136
actions: {
3237
setDepartmentTree(tree: WeComDepartment) {
@@ -70,7 +75,7 @@ const useWeComUserStore = defineStore('weComUser', {
7075
this.selectedViewType = type;
7176
},
7277
async loadDepartmentTree(departmentId: number) {
73-
const res = await getDepartment({ departmentId });
78+
const res = await getWeComDepartment({ departmentId });
7479
if (res.data) {
7580
this.departmentTree = [res.data.department];
7681
} else {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.container{
2+
3+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<script setup lang="ts">
2+
import useWeComUserStore from '@/store/modules/scrm/wecom/user';
3+
import { reactive, ref } from 'vue';
4+
import { Message } from '@arco-design/web-vue';
5+
import {
6+
createWeComDepartment,
7+
CreateWeComDepartmentRequest,
8+
} from '@/api/scrm/wecom/department';
9+
import useLoadingStore from '@/store/modules/loading';
10+
import styles from './index.module.less';
11+
12+
const useWeComUser = useWeComUserStore();
13+
const loadingStore = useLoadingStore();
14+
15+
const formRef = ref();
16+
const form = reactive<{
17+
name: string;
18+
departmentId: number | null;
19+
}>({
20+
name: '',
21+
departmentId: null,
22+
});
23+
24+
const resetForm = () => {
25+
form.name = '';
26+
form.departmentId = null;
27+
};
28+
29+
const handleBeforeOk = async (done: any) => {
30+
const err = await formRef.value.validate();
31+
if (err !== undefined) {
32+
Message.warning({
33+
content: '请检查表单输入',
34+
duration: 5000,
35+
});
36+
done(false);
37+
return;
38+
}
39+
40+
loadingStore.setLoading(true);
41+
try {
42+
await createWeComDepartment({
43+
name: form.name,
44+
weComParentId: form.departmentId,
45+
// order: 99990000,
46+
} as CreateWeComDepartmentRequest);
47+
useWeComUser.setSelectedDepartment(1);
48+
Message.success(`${form.name} 部门已经创建成功`);
49+
done(true);
50+
} catch (e: any) {
51+
Message.error(e.message);
52+
done(false);
53+
} finally {
54+
loadingStore.setLoading(false);
55+
}
56+
};
57+
const handleCancel = () => {
58+
useWeComUser.showCreateDepartmentModal = false;
59+
};
60+
61+
const handleDepartmentChange = (val: number) => {
62+
form.departmentId = val;
63+
formRef.value?.validateField?.('departmentId'); // 手动触发该字段的校验
64+
};
65+
66+
const rules = {
67+
name: [
68+
{
69+
required: true,
70+
message: '部门名称是必填的',
71+
},
72+
],
73+
departmentId: [{ required: true, message: '请选择所属部门' }],
74+
};
75+
76+
defineExpose({
77+
resetForm,
78+
});
79+
</script>
80+
81+
<template>
82+
<div :class="styles.container">
83+
<a-modal
84+
v-model:visible="useWeComUser.showCreateDepartmentModal"
85+
title="新建部门"
86+
@cancel="handleCancel"
87+
@before-ok="handleBeforeOk"
88+
>
89+
<a-form ref="formRef" :rules="rules" :model="form">
90+
<a-form-item field="name" label="部门名称" validate-trigger="blur">
91+
<a-input v-model="form.name" />
92+
</a-form-item>
93+
<a-form-item
94+
field="departmentId"
95+
label="所属部门"
96+
validate-trigger="blur"
97+
>
98+
<a-tree-select
99+
v-model="form.departmentId"
100+
:data="useWeComUser.departmentTree"
101+
placeholder="选择所属部门"
102+
:field-names="{
103+
key: 'weComDepId',
104+
title: 'name',
105+
children: 'children',
106+
}"
107+
style="width: 300px"
108+
@change="handleDepartmentChange"
109+
></a-tree-select>
110+
</a-form-item>
111+
</a-form>
112+
</a-modal>
113+
</div>
114+
</template>
115+
116+
<style scoped></style>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
:loading="state.tableLoading"
117117
:row-selection="rowSelection"
118118
column-resizable
119+
row-key="userId"
119120
scrollbar
120121
:class="styles.userTable"
121122
:pagination="pagination"

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
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 AddDepartment from '@/views/scrm/wecom/organization/user/components/add-department/index.vue';
1011
import { consola } from 'consola';
1112
import styles from './index.module.less';
1213
1314
const useWeComUser = useWeComUserStore();
1415
const loadingStore = useLoadingStore();
16+
const addDepartmentRef = ref<InstanceType<typeof AddDepartment> | null>(null);
1517
1618
const checkedViewType = ref('department');
1719
const handleDepartmentChange = (data: number) => {
@@ -26,8 +28,10 @@
2628
};
2729
2830
const onAddDepartment = () => {
29-
console.log('add department');
31+
addDepartmentRef.value?.resetForm();
32+
useWeComUser.showCreateDepartmentModal = true;
3033
};
34+
3135
const onSyncWeComDepartments = async () => {
3236
loadingStore.setLoading(true);
3337
try {
@@ -113,6 +117,7 @@
113117
<UserList v-if="useWeComUser.selectedViewType === 'department'" />
114118
<TagUserList v-if="useWeComUser.selectedViewType === 'tag'" />
115119
</div>
120+
<AddDepartment ref="addDepartmentRef" />
116121
</div>
117122
</template>
118123

0 commit comments

Comments
 (0)