Skip to content

Commit 1047c5b

Browse files
committed
📖 CRM:线索 clue 新增/修改的完善
1 parent e7bb17d commit 1047c5b

File tree

11 files changed

+201
-80
lines changed

11 files changed

+201
-80
lines changed

src/api/crm/clue/index.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,33 @@ import request from '@/config/axios'
22
import { TransferReqVO } from '@/api/crm/customer'
33

44
export interface ClueVO {
5-
id: number
6-
transformStatus: boolean
7-
followUpStatus: boolean
8-
name: string
9-
customerId: number
10-
contactNextTime: Date
11-
telephone: string
12-
mobile: string
13-
address: string
14-
ownerUserId: number
15-
contactLastTime: Date
16-
remark: string
5+
id: number // 编号
6+
name: string // 线索名称
7+
followUpStatus: boolean // 跟进状态
8+
contactLastTime: Date // 最后跟进时间
9+
contactLastContent: string // 最后跟进内容
10+
contactNextTime: Date // 下次联系时间
11+
ownerUserId: number // 负责人的用户编号
12+
ownerUserName?: string // 负责人的用户名称
13+
ownerUserDept?: string // 负责人的部门名称
14+
transformStatus: boolean // 转化状态
15+
customerId: number // 客户编号
16+
customerName?: string // 客户名称
17+
mobile: string // 手机号
18+
telephone: string // 电话
19+
qq: string // QQ
20+
wechat: string // wechat
21+
email: string // email
22+
areaId: number // 所在地
23+
detailAddress: string // 详细地址
24+
industryId: number // 所属行业
25+
level: number // 客户等级
26+
source: number // 客户来源
27+
remark: string // 备注
1728
}
1829

1930
// 查询线索列表
20-
export const getCluePage = async (params) => {
31+
export const getCluePage = async (params: any) => {
2132
return await request.get({ url: `/crm/clue/page`, params })
2233
}
2334

src/views/crm/backlog/tables/FollowCustomer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
5252
</template>
5353
</el-table-column>
54-
<el-table-column align="center" label="客户等级" prop="level" width="120">
54+
<el-table-column align="center" label="客户级别" prop="level" width="120">
5555
<template #default="scope">
5656
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
5757
</template>

src/views/crm/backlog/tables/PutInPoolRemind.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
5050
</template>
5151
</el-table-column>
52-
<el-table-column align="center" label="客户等级" prop="level" width="120">
52+
<el-table-column align="center" label="客户级别" prop="level" width="120">
5353
<template #default="scope">
5454
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
5555
</template>

src/views/crm/backlog/tables/TodayCustomer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
6464
</template>
6565
</el-table-column>
66-
<el-table-column align="center" label="客户等级" prop="level" width="120">
66+
<el-table-column align="center" label="客户级别" prop="level" width="120">
6767
<template #default="scope">
6868
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
6969
</template>

src/views/crm/business/BusinessForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="scope.row.source" />
3737
</template>
3838
</el-table-column>
39-
<el-table-column label="客户等级" align="center" prop="level" width="120">
39+
<el-table-column label="客户级别" align="center" prop="level" width="120">
4040
<template #default="scope">
4141
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
4242
</template>

src/views/crm/clue/ClueForm.vue

Lines changed: 162 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,178 @@
11
<template>
2-
<Dialog :title="dialogTitle" v-model="dialogVisible">
2+
<Dialog v-model="dialogVisible" :title="dialogTitle">
33
<el-form
44
ref="formRef"
5+
v-loading="formLoading"
56
:model="formData"
67
:rules="formRules"
78
label-width="100px"
8-
v-loading="formLoading"
99
>
10-
<el-form-item label="线索名称" prop="name">
11-
<el-input v-model="formData.name" placeholder="请输入线索名称" />
12-
</el-form-item>
13-
<el-form-item label="下次联系时间" prop="contactNextTime">
14-
<el-date-picker
15-
v-model="formData.contactNextTime"
16-
type="date"
17-
value-format="x"
18-
placeholder="选择下次联系时间"
19-
/>
20-
</el-form-item>
21-
<el-form-item label="电话" prop="telephone">
22-
<el-input v-model="formData.telephone" placeholder="请输入电话" />
23-
</el-form-item>
24-
<el-form-item label="手机号" prop="mobile">
25-
<el-input v-model="formData.mobile" placeholder="请输入手机号" />
26-
</el-form-item>
27-
<el-form-item label="地址" prop="address">
28-
<el-input v-model="formData.address" placeholder="请输入地址" />
29-
</el-form-item>
30-
<el-form-item v-if="formType === 'create'" label="负责人" prop="userIds" span="24">
31-
<el-select v-model="formData.ownerUserId">
32-
<el-option
33-
v-for="item in userOptions"
34-
:key="item.id"
35-
:label="item.nickname"
36-
:value="item.id"
37-
/>
38-
</el-select>
39-
</el-form-item>
40-
<el-form-item label="备注" prop="remark">
41-
<el-input v-model="formData.remark" placeholder="请输入备注" />
42-
</el-form-item>
10+
<el-row>
11+
<el-col :span="12">
12+
<el-form-item label="线索名称" prop="name">
13+
<el-input v-model="formData.name" placeholder="请输入线索名称" />
14+
</el-form-item>
15+
</el-col>
16+
<el-col :span="12">
17+
<el-form-item label="客户来源" prop="source">
18+
<el-select v-model="formData.source" placeholder="请选择客户来源" class="w-1/1">
19+
<el-option
20+
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_SOURCE)"
21+
:key="dict.value"
22+
:label="dict.label"
23+
:value="dict.value"
24+
/>
25+
</el-select>
26+
</el-form-item>
27+
</el-col>
28+
</el-row>
29+
<el-row>
30+
<el-col :span="12">
31+
<el-form-item label="手机" prop="mobile">
32+
<el-input v-model="formData.mobile" placeholder="请输入手机" />
33+
</el-form-item>
34+
</el-col>
35+
<el-col :span="12">
36+
<el-form-item label="负责人" prop="ownerUserId">
37+
<el-select
38+
v-model="formData.ownerUserId"
39+
:disabled="formType !== 'create'"
40+
class="w-1/1"
41+
>
42+
<el-option
43+
v-for="item in userOptions"
44+
:key="item.id"
45+
:label="item.nickname"
46+
:value="item.id"
47+
/>
48+
</el-select>
49+
</el-form-item>
50+
</el-col>
51+
</el-row>
52+
<el-row>
53+
<el-col :span="12">
54+
<el-form-item label="电话" prop="telephone">
55+
<el-input v-model="formData.telephone" placeholder="请输入电话" />
56+
</el-form-item>
57+
</el-col>
58+
<el-col :span="12">
59+
<el-form-item label="邮箱" prop="email">
60+
<el-input v-model="formData.email" placeholder="请输入邮箱" />
61+
</el-form-item>
62+
</el-col>
63+
</el-row>
64+
<el-row>
65+
<el-col :span="12">
66+
<el-form-item label="微信" prop="wechat">
67+
<el-input v-model="formData.wechat" placeholder="请输入微信" />
68+
</el-form-item>
69+
</el-col>
70+
<el-col :span="12">
71+
<el-form-item label="QQ" prop="qq">
72+
<el-input v-model="formData.qq" placeholder="请输入 QQ" />
73+
</el-form-item>
74+
</el-col>
75+
</el-row>
76+
<el-row>
77+
<el-col :span="12">
78+
<el-form-item label="客户行业" prop="industryId">
79+
<el-select v-model="formData.industryId" placeholder="请选择客户行业" class="w-1/1">
80+
<el-option
81+
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_INDUSTRY)"
82+
:key="dict.value"
83+
:label="dict.label"
84+
:value="dict.value"
85+
/>
86+
</el-select>
87+
</el-form-item>
88+
</el-col>
89+
<el-col :span="12">
90+
<el-form-item label="客户级别" prop="level">
91+
<el-select v-model="formData.level" placeholder="请选择客户级别" class="w-1/1">
92+
<el-option
93+
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_LEVEL)"
94+
:key="dict.value"
95+
:label="dict.label"
96+
:value="dict.value"
97+
/>
98+
</el-select>
99+
</el-form-item>
100+
</el-col>
101+
</el-row>
102+
<el-row>
103+
<el-col :span="12">
104+
<el-form-item label="地址" prop="areaId">
105+
<el-tree-select
106+
v-model="formData.areaId"
107+
:data="areaList"
108+
:props="defaultProps"
109+
:render-after-expand="true"
110+
class="w-1/1"
111+
/>
112+
</el-form-item>
113+
</el-col>
114+
<el-col :span="12">
115+
<el-form-item label="详细地址" prop="detailAddress">
116+
<el-input v-model="formData.detailAddress" placeholder="请输入详细地址" />
117+
</el-form-item>
118+
</el-col>
119+
</el-row>
120+
<el-row>
121+
<el-col :span="12">
122+
<el-form-item label="下次联系时间" prop="contactNextTime">
123+
<el-date-picker
124+
v-model="formData.contactNextTime"
125+
placeholder="选择下次联系时间"
126+
type="datetime"
127+
value-format="x"
128+
/>
129+
</el-form-item>
130+
</el-col>
131+
</el-row>
132+
<el-col :span="24">
133+
<el-form-item label="备注" prop="remark">
134+
<el-input v-model="formData.remark" placeholder="请输入备注" />
135+
</el-form-item>
136+
</el-col>
43137
</el-form>
44138
<template #footer>
45-
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
139+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
46140
<el-button @click="dialogVisible = false">取 消</el-button>
47141
</template>
48142
</Dialog>
49143
</template>
50-
<script setup lang="ts">
144+
<script lang="ts" setup>
145+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
51146
import * as ClueApi from '@/api/crm/clue'
52-
import {CACHE_KEY, useCache} from "@/hooks/web/useCache";
53-
import * as UserApi from "@/api/system/user";
147+
import * as AreaApi from '@/api/system/area'
148+
import { defaultProps } from '@/utils/tree'
149+
import * as UserApi from '@/api/system/user'
150+
import { useUserStore } from '@/store/modules/user'
54151
55152
const { t } = useI18n() // 国际化
56153
const message = useMessage() // 消息弹窗
57154
58155
const dialogVisible = ref(false) // 弹窗的是否展示
59156
const dialogTitle = ref('') // 弹窗的标题
60-
const formLoading = ref(false) // 表单加载中:1)修改时的数据加载;2)提交的按钮禁用
157+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
61158
const formType = ref('') // 表单的类型:create - 新增;update - 修改
159+
const areaList = ref([]) // 地区列表
62160
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
63161
const formData = ref({
64162
id: undefined,
65163
name: undefined,
66164
contactNextTime: undefined,
67-
telephone: undefined,
165+
ownerUserId: 0,
68166
mobile: undefined,
69-
address: undefined,
70-
ownerUserId: undefined,
71-
contactLastTime: undefined,
167+
telephone: undefined,
168+
qq: undefined,
169+
wechat: undefined,
170+
email: undefined,
171+
areaId: undefined,
172+
detailAddress: undefined,
173+
industryId: undefined,
174+
level: undefined,
175+
source: undefined,
72176
remark: undefined
73177
})
74178
const formRules = reactive({
@@ -92,13 +196,13 @@ const open = async (type: string, id?: number) => {
92196
formLoading.value = false
93197
}
94198
}
199+
// 获得地区列表
200+
areaList.value = await AreaApi.getAreaTree()
95201
// 获得用户列表
96202
userOptions.value = await UserApi.getSimpleUserList()
97-
// 新建时负责人默认为登录人
203+
// 默认新建时选中自己
98204
if (formType.value === 'create') {
99-
const { wsCache } = useCache()
100-
const user = wsCache.get(CACHE_KEY.USER).user
101-
formData.value.ownerUserId = user.id
205+
formData.value.ownerUserId = useUserStore().getUser.id
102206
}
103207
}
104208
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -135,11 +239,17 @@ const resetForm = () => {
135239
id: undefined,
136240
name: undefined,
137241
contactNextTime: undefined,
138-
telephone: undefined,
242+
ownerUserId: 0,
139243
mobile: undefined,
140-
address: undefined,
141-
ownerUserId: undefined,
142-
contactLastTime: undefined,
244+
telephone: undefined,
245+
qq: undefined,
246+
wechat: undefined,
247+
email: undefined,
248+
areaId: undefined,
249+
detailAddress: undefined,
250+
industryId: undefined,
251+
level: undefined,
252+
source: undefined,
143253
remark: undefined
144254
}
145255
formRef.value?.resetFields()

src/views/crm/clue/index.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@
6767
<el-table-column label="手机号" align="center" prop="mobile" width="120" />
6868
<el-table-column label="电话" align="center" prop="telephone" width="130" />
6969
<el-table-column label="邮箱" align="center" prop="email" width="180" />
70-
<el-table-column label="地址" align="center" prop="address" width="180" />
70+
<el-table-column label="地址" align="center" prop="detailAddress" width="180" />
7171
<el-table-column align="center" label="客户行业" prop="industryId" width="100">
7272
<template #default="scope">
7373
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" />
7474
</template>
7575
</el-table-column>
76-
<el-table-column align="center" label="客户等级" prop="level" width="130">
76+
<el-table-column align="center" label="客户级别" prop="level" width="135">
7777
<template #default="scope">
7878
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" />
7979
</template>

src/views/crm/customer/CustomerForm.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
</el-form-item>
4141
</el-col>
4242
<el-col :span="12">
43-
<el-form-item label="客户等级" prop="level">
44-
<el-select v-model="formData.level" placeholder="请选择客户等级">
43+
<el-form-item label="客户级别" prop="level">
44+
<el-select v-model="formData.level" placeholder="请选择客户级别">
4545
<el-option
4646
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_CUSTOMER_LEVEL)"
4747
:key="dict.value"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<el-descriptions-item label="客户来源">
1616
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="customer.source" />
1717
</el-descriptions-item>
18-
<el-descriptions-item label="客户等级">
18+
<el-descriptions-item label="客户级别">
1919
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="customer.level" />
2020
</el-descriptions-item>
2121
<el-descriptions-item label="手机">{{ customer.mobile }}</el-descriptions-item>

0 commit comments

Comments
 (0)