Skip to content

Commit 6369b33

Browse files
committed
feat: CRM 客户限制
1 parent b63e2a9 commit 6369b33

File tree

7 files changed

+427
-2
lines changed

7 files changed

+427
-2
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import request from '@/config/axios'
2+
3+
export interface CustomerLimitConfigVO {
4+
id?: number
5+
type?: number
6+
userIds?: string
7+
deptIds?: string
8+
maxCount?: number
9+
dealCountEnabled?: boolean
10+
}
11+
12+
// 查询客户限制配置列表
13+
export const getCustomerLimitConfigPage = async (params) => {
14+
return await request.get({ url: `/crm/customer-limit-config/page`, params })
15+
}
16+
17+
// 查询客户限制配置详情
18+
export const getCustomerLimitConfig = async (id: number) => {
19+
return await request.get({ url: `/crm/customer-limit-config/get?id=` + id })
20+
}
21+
22+
// 新增客户限制配置
23+
export const createCustomerLimitConfig = async (data: CustomerLimitConfigVO) => {
24+
return await request.post({ url: `/crm/customer-limit-config/create`, data })
25+
}
26+
27+
// 修改客户限制配置
28+
export const updateCustomerLimitConfig = async (data: CustomerLimitConfigVO) => {
29+
return await request.put({ url: `/crm/customer-limit-config/update`, data })
30+
}
31+
32+
// 删除客户限制配置
33+
export const deleteCustomerLimitConfig = async (id: number) => {
34+
return await request.delete({ url: `/crm/customer-limit-config/delete?id=` + id })
35+
}

src/api/system/user/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ export const getUserPage = (params: PageParam) => {
2222
return request.get({ url: '/system/user/page', params })
2323
}
2424

25+
// 查询所有用户列表
26+
export const getAllUser = () => {
27+
return request.get({ url: '/system/user/all' })
28+
}
29+
2530
// 查询用户详情
2631
export const getUser = (id: number) => {
2732
return request.get({ url: '/system/user/get?id=' + id })
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
<template>
2+
<Dialog :title="dialogTitle" v-model="dialogVisible">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="200px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="规则适用人群" prop="userIds">
11+
<el-tree-select
12+
v-model="formData.userIds"
13+
:data="userTree"
14+
:props="defaultProps"
15+
check-on-click-node
16+
multiple
17+
filterable
18+
node-key="id"
19+
placeholder="请选择规则适用人群"
20+
/>
21+
</el-form-item>
22+
<el-form-item label="规则适用部门" prop="deptIds">
23+
<el-tree-select
24+
v-model="formData.deptIds"
25+
:data="deptTree"
26+
:props="defaultProps"
27+
multiple
28+
check-strictly
29+
filterable
30+
node-key="id"
31+
placeholder="请选择规则适用部门"
32+
/>
33+
</el-form-item>
34+
<el-form-item
35+
:label="
36+
formData.type === LimitConfType.CUSTOMER_QUANTITY_LIMIT
37+
? '拥有客户数上限'
38+
: '锁定客户数上限'
39+
"
40+
prop="maxCount"
41+
>
42+
<el-input-number v-model="formData.maxCount" placeholder="请输入数量上限" />
43+
</el-form-item>
44+
<el-form-item
45+
label="成交客户是否占用拥有客户数"
46+
v-if="formData.type === LimitConfType.CUSTOMER_QUANTITY_LIMIT"
47+
prop="dealCountEnabled"
48+
>
49+
<el-switch v-model="formData.dealCountEnabled" />
50+
</el-form-item>
51+
</el-form>
52+
<template #footer>
53+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
54+
<el-button @click="dialogVisible = false">取 消</el-button>
55+
</template>
56+
</Dialog>
57+
</template>
58+
<script setup lang="ts">
59+
import * as CustomerLimitConfigApi from '@/api/crm/customerLimitConfig'
60+
import { LimitConfType } from '@/views/crm/customerLimitConfig/customerLimitConf'
61+
import * as DeptApi from '@/api/system/dept'
62+
import { defaultProps, handleTree } from '@/utils/tree'
63+
import * as UserApi from '@/api/system/user'
64+
import { cloneDeep } from 'lodash-es'
65+
66+
const { t } = useI18n() // 国际化
67+
const message = useMessage() // 消息弹窗
68+
69+
const dialogVisible = ref(false) // 弹窗的是否展示
70+
const dialogTitle = ref('') // 弹窗的标题
71+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
72+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
73+
const formData = ref({
74+
id: undefined,
75+
type: undefined,
76+
userIds: undefined,
77+
deptIds: undefined,
78+
maxCount: undefined,
79+
dealCountEnabled: false
80+
})
81+
const formRules = reactive({
82+
type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }],
83+
maxCount: [{ required: true, message: '数量上限不能为空', trigger: 'blur' }]
84+
})
85+
const formRef = ref() // 表单 Ref
86+
const deptTree = ref() // 部门树形结构
87+
const userTree = ref() // 用户树形结构
88+
89+
/** 打开弹窗 */
90+
const open = async (type: string, id?: number, limitConfType?: LimitConfType) => {
91+
dialogVisible.value = true
92+
dialogTitle.value = t('action.' + type)
93+
formType.value = type
94+
resetForm()
95+
// 获得部门树
96+
await getDeptTree()
97+
// 获得用户
98+
await getUserTree()
99+
// 修改时,设置数据
100+
if (id) {
101+
formLoading.value = true
102+
try {
103+
formData.value = await CustomerLimitConfigApi.getCustomerLimitConfig(id)
104+
} finally {
105+
formLoading.value = false
106+
}
107+
} else {
108+
formData.value.type = limitConfType
109+
}
110+
}
111+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
112+
113+
/** 提交表单 */
114+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
115+
const submitForm = async () => {
116+
// 校验表单
117+
if (!formRef) return
118+
const valid = await formRef.value.validate()
119+
if (!valid) return
120+
// 提交请求
121+
formLoading.value = true
122+
try {
123+
const data = formData.value as unknown as CustomerLimitConfigApi.CustomerLimitConfigVO
124+
if (formType.value === 'create') {
125+
await CustomerLimitConfigApi.createCustomerLimitConfig(data)
126+
message.success(t('common.createSuccess'))
127+
} else {
128+
await CustomerLimitConfigApi.updateCustomerLimitConfig(data)
129+
message.success(t('common.updateSuccess'))
130+
}
131+
dialogVisible.value = false
132+
// 发送操作成功的事件
133+
emit('success')
134+
} finally {
135+
formLoading.value = false
136+
}
137+
}
138+
139+
/** 重置表单 */
140+
const resetForm = () => {
141+
formData.value = {
142+
id: undefined,
143+
type: undefined,
144+
userIds: undefined,
145+
deptIds: undefined,
146+
maxCount: undefined,
147+
dealCountEnabled: false
148+
}
149+
formRef.value?.resetFields()
150+
}
151+
152+
/**
153+
* 获取部门树
154+
*/
155+
const getDeptTree = async () => {
156+
const res = await DeptApi.getSimpleDeptList()
157+
deptTree.value = []
158+
deptTree.value.push(...handleTree(res))
159+
}
160+
161+
/**
162+
* 获取用户树
163+
*/
164+
const getUserTree = async () => {
165+
const res = await UserApi.getAllUser()
166+
userTree.value = []
167+
userTree.value = cloneDeep(unref(deptTree))
168+
169+
const deptUserMap = {}
170+
res.forEach((user) => {
171+
if (user.dept) {
172+
if (!deptUserMap[user.deptId]) {
173+
deptUserMap[user.deptId] = []
174+
}
175+
deptUserMap[user.deptId].push(user)
176+
}
177+
})
178+
179+
handleUserData(userTree.value, deptUserMap)
180+
}
181+
182+
/**
183+
* 处理用户树
184+
*
185+
* @param deptTree
186+
* @param deptUserMap
187+
*/
188+
const handleUserData = (deptTree, deptUserMap) => {
189+
for (let i = 0; i < deptTree.length; i++) {
190+
// 如果是用户,就不用继续找部门下的用户
191+
if (deptTree[i].isUser) {
192+
continue
193+
}
194+
const users = deptUserMap[deptTree[i].id]
195+
if (users) {
196+
if (!deptTree[i].children) {
197+
deptTree[i].children = []
198+
}
199+
deptTree[i].children.push(
200+
...users.map((user) => {
201+
return {
202+
id: user.id,
203+
name: user.username + '-' + user.nickname,
204+
isUser: true,
205+
// 用户状态为关闭
206+
disabled: user.status === 1
207+
}
208+
})
209+
)
210+
}
211+
212+
if (deptTree[i].children && deptTree[i].children.length !== 0) {
213+
handleUserData(deptTree[i].children, deptUserMap)
214+
}
215+
216+
// 非人员选项禁用
217+
deptTree[i].disabled = true
218+
// 将非人员的 id 置为空
219+
deptTree[i].id = 'null'
220+
}
221+
}
222+
</script>

0 commit comments

Comments
 (0)