Skip to content

Commit c06223d

Browse files
YunaiVgitee-org
authored andcommitted
!316 feat: CRM 客户公海配置 + CRM 客户限制 + review 修改
Merge pull request !316 from wanwan/dev
2 parents 85e953b + 22206b2 commit c06223d

File tree

10 files changed

+684
-83
lines changed

10 files changed

+684
-83
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/crm/customerPoolConf/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import request from '@/config/axios'
2+
3+
export interface CustomerPoolConfigVO {
4+
enabled?: boolean
5+
contactExpireDays?: number
6+
dealExpireDays?: number
7+
notifyEnabled?: boolean
8+
notifyDays: number
9+
}
10+
11+
// 获取客户公海规则设置
12+
export const getCustomerPoolConfig = async () => {
13+
return await request.get({ url: `/crm/customer-pool-config/get` })
14+
}
15+
16+
// 更新客户公海规则设置
17+
export const updateCustomerPoolConfig = async (data: ConfigVO) => {
18+
return await request.put({ url: `/crm/customer-pool-config/update`, data })
19+
}

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 })

src/views/crm/customer/detail/CustomerDetails.vue

Lines changed: 82 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,86 @@
11
<template>
2-
<el-collapse v-model="activeNames">
3-
<el-collapse-item name="basicInfo">
4-
<template #title>
5-
<span class="text-base font-bold">基本信息</span>
6-
</template>
7-
<el-descriptions :column="4">
8-
<el-descriptions-item label="客户名称">
9-
{{ customer.name }}
10-
</el-descriptions-item>
11-
<el-descriptions-item label="所属行业">
12-
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="customer.industryId" />
13-
</el-descriptions-item>
14-
<el-descriptions-item label="客户来源">
15-
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="customer.source" />
16-
</el-descriptions-item>
17-
<el-descriptions-item label="客户等级">
18-
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="customer.level" />
19-
</el-descriptions-item>
20-
<el-descriptions-item label="手机">
21-
{{ customer.mobile }}
22-
</el-descriptions-item>
23-
<el-descriptions-item label="电话">
24-
{{ customer.telephone }}
25-
</el-descriptions-item>
26-
<el-descriptions-item label="邮箱">
27-
{{ customer.email }}
28-
</el-descriptions-item>
29-
<el-descriptions-item label="QQ">
30-
{{ customer.qq }}
31-
</el-descriptions-item>
32-
<el-descriptions-item label="微信">
33-
{{ customer.wechat }}
34-
</el-descriptions-item>
35-
<el-descriptions-item label="网址">
36-
{{ customer.website }}
37-
</el-descriptions-item>
38-
<el-descriptions-item label="所在地">
39-
{{ customer.areaName }}
40-
</el-descriptions-item>
41-
<el-descriptions-item label="详细地址">
42-
{{ customer.detailAddress }}
43-
</el-descriptions-item>
44-
<el-descriptions-item label="下次联系时间">
45-
{{ customer.contactNextTime ? formatDate(customer.contactNextTime, 'YYYY-MM-DD') : '空' }}
46-
</el-descriptions-item>
47-
</el-descriptions>
48-
<el-descriptions :column="1">
49-
<el-descriptions-item label="客户描述">
50-
{{ customer.description }}
51-
</el-descriptions-item>
52-
<el-descriptions-item label="备注">
53-
{{ customer.remark }}
54-
</el-descriptions-item>
55-
</el-descriptions>
56-
</el-collapse-item>
57-
<el-collapse-item name="systemInfo">
58-
<template #title>
59-
<span class="text-base font-bold">系统信息</span>
60-
</template>
61-
<el-descriptions :column="2">
62-
<el-descriptions-item label="负责人">
63-
{{ customer.ownerUserName }}
64-
</el-descriptions-item>
65-
<el-descriptions-item label="创建人">
66-
{{ customer.creatorName }}
67-
</el-descriptions-item>
68-
<el-descriptions-item label="创建时间">
69-
{{ customer.createTime ? formatDate(customer.createTime) : '空' }}
70-
</el-descriptions-item>
71-
<el-descriptions-item label="更新时间">
72-
{{ customer.updateTime ? formatDate(customer.updateTime) : '空' }}
73-
</el-descriptions-item>
74-
<!-- TODO wanwan:要不把“最后跟进时间”放到“下次联系时间”后面 -->
75-
<el-descriptions-item label="最后跟进时间">
76-
{{ customer.contactLastTime ? formatDate(customer.contactLastTime) : '空' }}
77-
</el-descriptions-item>
78-
</el-descriptions>
79-
</el-collapse-item>
80-
</el-collapse>
2+
<ContentWrap>
3+
<el-collapse class="" v-model="activeNames">
4+
<el-collapse-item name="basicInfo">
5+
<template #title>
6+
<span class="text-base font-bold">基本信息</span>
7+
</template>
8+
<el-descriptions :column="4">
9+
<el-descriptions-item label="客户名称">
10+
{{ customer.name }}
11+
</el-descriptions-item>
12+
<el-descriptions-item label="所属行业">
13+
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="customer.industryId" />
14+
</el-descriptions-item>
15+
<el-descriptions-item label="客户来源">
16+
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="customer.source" />
17+
</el-descriptions-item>
18+
<el-descriptions-item label="客户等级">
19+
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="customer.level" />
20+
</el-descriptions-item>
21+
<el-descriptions-item label="手机">
22+
{{ customer.mobile }}
23+
</el-descriptions-item>
24+
<el-descriptions-item label="电话">
25+
{{ customer.telephone }}
26+
</el-descriptions-item>
27+
<el-descriptions-item label="邮箱">
28+
{{ customer.email }}
29+
</el-descriptions-item>
30+
<el-descriptions-item label="QQ">
31+
{{ customer.qq }}
32+
</el-descriptions-item>
33+
<el-descriptions-item label="微信">
34+
{{ customer.wechat }}
35+
</el-descriptions-item>
36+
<el-descriptions-item label="网址">
37+
{{ customer.website }}
38+
</el-descriptions-item>
39+
<el-descriptions-item label="所在地">
40+
{{ customer.areaName }}
41+
</el-descriptions-item>
42+
<el-descriptions-item label="详细地址">
43+
{{ customer.detailAddress }}
44+
</el-descriptions-item>
45+
<el-descriptions-item label="下次联系时间">
46+
{{
47+
customer.contactNextTime ? formatDate(customer.contactNextTime, 'YYYY-MM-DD') : '空'
48+
}}
49+
</el-descriptions-item>
50+
<el-descriptions-item label="最后跟进时间">
51+
{{ customer.contactLastTime ? formatDate(customer.contactLastTime) : '空' }}
52+
</el-descriptions-item>
53+
</el-descriptions>
54+
<el-descriptions :column="1">
55+
<el-descriptions-item label="客户描述">
56+
{{ customer.description }}
57+
</el-descriptions-item>
58+
<el-descriptions-item label="备注">
59+
{{ customer.remark }}
60+
</el-descriptions-item>
61+
</el-descriptions>
62+
</el-collapse-item>
63+
<el-collapse-item name="systemInfo">
64+
<template #title>
65+
<span class="text-base font-bold">系统信息</span>
66+
</template>
67+
<el-descriptions :column="2">
68+
<el-descriptions-item label="负责人">
69+
{{ customer.ownerUserName }}
70+
</el-descriptions-item>
71+
<el-descriptions-item label="创建人">
72+
{{ customer.creatorName }}
73+
</el-descriptions-item>
74+
<el-descriptions-item label="创建时间">
75+
{{ customer.createTime ? formatDate(customer.createTime) : '空' }}
76+
</el-descriptions-item>
77+
<el-descriptions-item label="更新时间">
78+
{{ customer.updateTime ? formatDate(customer.updateTime) : '空' }}
79+
</el-descriptions-item>
80+
</el-descriptions>
81+
</el-collapse-item>
82+
</el-collapse>
83+
</ContentWrap>
8184
</template>
8285
<script setup lang="ts">
8386
import * as CustomerApi from '@/api/crm/customer'

src/views/crm/customer/detail/index.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,10 @@
6363
</el-descriptions-item>
6464
</el-descriptions>
6565
</ContentWrap>
66-
<!-- TODO wanwan:这个 tab 拉满哈,可以更好看; -->
67-
<el-col :span="18">
66+
<el-col>
6867
<el-tabs>
6968
<el-tab-pane label="详细资料">
70-
<!-- TODO wanwan:这个 ml-2 是不是可以优化下,不要整个左移,而是里面的内容有个几 px 的偏移,不顶在框里 -->
71-
<CustomerDetails class="ml-2" :customer="customer" />
69+
<CustomerDetails :customer="customer" />
7270
</el-tab-pane>
7371
<el-tab-pane label="活动" lazy> 活动</el-tab-pane>
7472
<el-tab-pane label="邮件" lazy> 邮件</el-tab-pane>
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<template>
2+
<el-button type="primary" plain @click="handleQuery">
3+
<Icon icon="ep:refresh" class="mr-5px" /> 刷新
4+
</el-button>
5+
<el-button
6+
type="primary"
7+
plain
8+
@click="openForm('create')"
9+
v-hasPermi="['crm:customer-limit-config:create']"
10+
>
11+
<Icon icon="ep:plus" class="mr-5px" /> 新增
12+
</el-button>
13+
<el-table
14+
v-loading="loading"
15+
:data="list"
16+
:stripe="true"
17+
:show-overflow-tooltip="true"
18+
class="mt-4"
19+
>
20+
<el-table-column label="编号" align="center" prop="id" />
21+
<el-table-column label="规则类型" align="center" prop="type" />
22+
<el-table-column label="规则适用人群" align="center" prop="userNames" />
23+
<el-table-column label="规则适用部门" align="center" prop="deptNames" />
24+
<el-table-column
25+
:label="
26+
confType === LimitConfType.CUSTOMER_QUANTITY_LIMIT ? '拥有客户数上限' : '锁定客户数上限'
27+
"
28+
align="center"
29+
prop="maxCount"
30+
/>
31+
<el-table-column
32+
v-if="confType === LimitConfType.CUSTOMER_QUANTITY_LIMIT"
33+
label="成交客户是否占用拥有客户数"
34+
align="center"
35+
prop="dealCountEnabled"
36+
>
37+
<template #default="scope">
38+
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.dealCountEnabled" />
39+
</template>
40+
</el-table-column>
41+
<el-table-column
42+
label="创建时间"
43+
align="center"
44+
prop="createTime"
45+
:formatter="dateFormatter"
46+
width="180px"
47+
/>
48+
<el-table-column label="操作" align="center" min-width="110" fixed="right">
49+
<template #default="scope">
50+
<el-button
51+
link
52+
type="primary"
53+
@click="openForm('update', scope.row.id)"
54+
v-hasPermi="['crm:customer-limit-config:update']"
55+
>
56+
编辑
57+
</el-button>
58+
<el-button
59+
link
60+
type="danger"
61+
@click="handleDelete(scope.row.id)"
62+
v-hasPermi="['crm:customer-limit-config:delete']"
63+
>
64+
删除
65+
</el-button>
66+
</template>
67+
</el-table-column>
68+
</el-table>
69+
<!-- 分页 -->
70+
<Pagination
71+
:total="total"
72+
v-model:page="queryParams.pageNo"
73+
v-model:limit="queryParams.pageSize"
74+
@pagination="getList"
75+
/>
76+
77+
<!-- 表单弹窗:添加/修改 -->
78+
<CustomerLimitConfigForm ref="formRef" @success="getList" />
79+
</template>
80+
<script setup lang="ts">
81+
import { dateFormatter } from '@/utils/formatTime'
82+
import * as CustomerLimitConfigApi from '@/api/crm/customerLimitConfig'
83+
import CustomerLimitConfigForm from '@/views/crm/customerLimitConfig/CustomerLimitConfigForm.vue'
84+
import { LimitConfType } from '@/views/crm/customerLimitConfig/customerLimitConf'
85+
import { DICT_TYPE } from '@/utils/dict'
86+
87+
defineOptions({ name: 'CustomerLimitConfDetails' })
88+
89+
const message = useMessage() // 消息弹窗
90+
const { t } = useI18n() // 国际化
91+
92+
const { confType } = defineProps<{ confType: LimitConfType }>()
93+
94+
const loading = ref(true) // 列表的加载中
95+
const total = ref(0) // 列表的总页数
96+
const list = ref([]) // 列表的数据
97+
const queryParams = reactive({
98+
pageNo: 1,
99+
pageSize: 10,
100+
type: confType
101+
})
102+
const queryFormRef = ref() // 搜索的表单
103+
const exportLoading = ref(false) // 导出的加载中
104+
105+
/** 查询列表 */
106+
const getList = async () => {
107+
loading.value = true
108+
try {
109+
const data = await CustomerLimitConfigApi.getCustomerLimitConfigPage(queryParams)
110+
list.value = data.list
111+
total.value = data.total
112+
} finally {
113+
loading.value = false
114+
}
115+
}
116+
117+
/** 添加/修改操作 */
118+
const formRef = ref()
119+
const openForm = (type: string, id?: number) => {
120+
formRef.value.open(type, id, confType)
121+
}
122+
123+
/** 删除按钮操作 */
124+
const handleDelete = async (id: number) => {
125+
try {
126+
// 删除的二次确认
127+
await message.delConfirm()
128+
// 发起删除
129+
await CustomerLimitConfigApi.deleteCustomerLimitConfig(id)
130+
message.success(t('common.delSuccess'))
131+
// 刷新列表
132+
await getList()
133+
} catch {}
134+
}
135+
136+
/** 搜索按钮操作 */
137+
const handleQuery = () => {
138+
queryParams.pageNo = 1
139+
getList()
140+
}
141+
142+
/** 初始化 **/
143+
onMounted(() => {
144+
getList()
145+
})
146+
</script>
147+
<style scoped lang="scss"></style>

0 commit comments

Comments
 (0)