Skip to content

Commit 8926dd1

Browse files
YunaiVgitee-org
authored andcommitted
!415 CRM: 完善用户画像数据统计
Merge pull request !415 from puhui999/dev-crm
2 parents dcfad7a + 36385a7 commit 8926dd1

File tree

9 files changed

+339
-137
lines changed

9 files changed

+339
-137
lines changed

src/api/crm/statistics/customer.ts

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,6 @@ export interface CrmStatisticsCustomerDealCycleByDateRespVO {
4949
customerDealCycle: number
5050
}
5151

52-
export interface CrmStatisticCustomerBaseRespVO {
53-
customerCount: number
54-
dealCount: number
55-
dealPortion: number
56-
}
57-
58-
export interface CrmStatisticCustomerIndustryRespVO extends CrmStatisticCustomerBaseRespVO {
59-
industryId: number
60-
industryName: string
61-
industryPortion: number
62-
}
63-
64-
export interface CrmStatisticCustomerSourceRespVO extends CrmStatisticCustomerBaseRespVO {
65-
source: number
66-
sourceName: string
67-
sourcePortion: number
68-
}
69-
70-
export interface CrmStatisticCustomerLevelRespVO extends CrmStatisticCustomerBaseRespVO {
71-
level: number
72-
levelName: string
73-
levelPortion: number
74-
}
75-
76-
export interface CrmStatisticCustomerAreaRespVO extends CrmStatisticCustomerBaseRespVO {
77-
areaId: number
78-
areaName: string
79-
areaPortion: number
80-
}
81-
8252
export interface CrmStatisticsCustomerDealCycleByUserRespVO {
8353
ownerUserName: string
8454
customerDealCycle: number
@@ -142,34 +112,5 @@ export const StatisticsCustomerApi = {
142112
url: '/crm/statistics-customer/get-customer-deal-cycle-by-user',
143113
params
144114
})
145-
},
146-
// TODO @puhui999:下面这些拆出去哈;
147-
// 6.1 获取客户行业统计数据
148-
getCustomerIndustry: (params: any) => {
149-
return request.get({
150-
url: '/crm/statistics-portrait/get-customer-industry-summary',
151-
params
152-
})
153-
},
154-
// 6.1 获取客户来源统计数据
155-
getCustomerSource: (params: any) => {
156-
return request.get({
157-
url: '/crm/statistics-portrait/get-customer-source-summary',
158-
params
159-
})
160-
},
161-
// 6.1 获取客户行业统计数据
162-
getCustomerLevel: (params: any) => {
163-
return request.get({
164-
url: '/crm/statistics-portrait/get-customer-level-summary',
165-
params
166-
})
167-
},
168-
// 6.1 获取客户行业统计数据
169-
getCustomerArea: (params: any) => {
170-
return request.get({
171-
url: '/crm/statistics-portrait/get-customer-area-summary',
172-
params
173-
})
174115
}
175116
}

src/api/crm/statistics/portrait.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import request from '@/config/axios'
2+
3+
export interface CrmStatisticCustomerBaseRespVO {
4+
customerCount: number
5+
dealCount: number
6+
dealPortion: string | number
7+
}
8+
9+
export interface CrmStatisticCustomerIndustryRespVO extends CrmStatisticCustomerBaseRespVO {
10+
industryId: number
11+
industryPortion: string | number
12+
}
13+
14+
export interface CrmStatisticCustomerSourceRespVO extends CrmStatisticCustomerBaseRespVO {
15+
source: number
16+
sourcePortion: string | number
17+
}
18+
19+
export interface CrmStatisticCustomerLevelRespVO extends CrmStatisticCustomerBaseRespVO {
20+
level: number
21+
levelPortion: string | number
22+
}
23+
24+
export interface CrmStatisticCustomerAreaRespVO extends CrmStatisticCustomerBaseRespVO {
25+
areaId: number
26+
areaName: string
27+
areaPortion: string | number
28+
}
29+
30+
// 客户分析 API
31+
export const StatisticsPortraitApi = {
32+
// 1. 获取客户行业统计数据
33+
getCustomerIndustry: (params: any) => {
34+
return request.get({
35+
url: '/crm/statistics-portrait/get-customer-industry-summary',
36+
params
37+
})
38+
},
39+
// 2. 获取客户来源统计数据
40+
getCustomerSource: (params: any) => {
41+
return request.get({
42+
url: '/crm/statistics-portrait/get-customer-source-summary',
43+
params
44+
})
45+
},
46+
// 3. 获取客户级别统计数据
47+
getCustomerLevel: (params: any) => {
48+
return request.get({
49+
url: '/crm/statistics-portrait/get-customer-level-summary',
50+
params
51+
})
52+
},
53+
// 4. 获取客户地区统计数据
54+
getCustomerArea: (params: any) => {
55+
return request.get({
56+
url: '/crm/statistics-portrait/get-customer-area-summary',
57+
params
58+
})
59+
}
60+
}

src/utils/dict.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export enum DICT_TYPE {
137137
INFRA_FILE_STORAGE = 'infra_file_storage',
138138

139139
// ========== BPM 模块 ==========
140-
BPM_MODEL_FORM_TYPE = 'bpm_model_category',
140+
BPM_MODEL_FORM_TYPE = 'bpm_model_form_type',
141141
BPM_TASK_CANDIDATE_STRATEGY = 'bpm_task_candidate_strategy',
142142
BPM_PROCESS_INSTANCE_STATUS = 'bpm_process_instance_status',
143143
BPM_TASK_STATUS = 'bpm_task_status',

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

Lines changed: 22 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,22 @@
33
<ContentWrap>
44
<!-- 搜索工作栏 -->
55
<el-form
6-
class="-mb-15px"
7-
:model="queryParams"
86
ref="queryFormRef"
97
:inline="true"
8+
:model="queryParams"
9+
class="-mb-15px"
1010
label-width="68px"
1111
>
1212
<el-form-item label="时间范围" prop="orderDate">
1313
<el-date-picker
1414
v-model="queryParams.times"
15+
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
1516
:shortcuts="defaultShortcuts"
1617
class="!w-240px"
1718
end-placeholder="结束日期"
1819
start-placeholder="开始日期"
1920
type="daterange"
2021
value-format="YYYY-MM-DD HH:mm:ss"
21-
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
2222
/>
2323
</el-form-item>
2424
<el-form-item label="时间间隔" prop="interval">
@@ -34,28 +34,34 @@
3434
<el-form-item label="归属部门" prop="deptId">
3535
<el-tree-select
3636
v-model="queryParams.deptId"
37-
class="!w-240px"
3837
:data="deptList"
3938
:props="defaultProps"
4039
check-strictly
40+
class="!w-240px"
4141
node-key="id"
4242
placeholder="请选择归属部门"
4343
@change="queryParams.userId = undefined"
4444
/>
4545
</el-form-item>
4646
<el-form-item label="员工" prop="userId">
47-
<el-select v-model="queryParams.userId" class="!w-240px" placeholder="员工" clearable>
47+
<el-select v-model="queryParams.userId" class="!w-240px" clearable placeholder="员工">
4848
<el-option
4949
v-for="(user, index) in userListByDeptId"
50+
:key="index"
5051
:label="user.nickname"
5152
:value="user.id"
52-
:key="index"
5353
/>
5454
</el-select>
5555
</el-form-item>
5656
<el-form-item>
57-
<el-button @click="handleQuery"> <Icon icon="ep:search" class="mr-5px" /> 搜索 </el-button>
58-
<el-button @click="resetQuery"> <Icon icon="ep:refresh" class="mr-5px" /> 重置 </el-button>
57+
<el-button @click="handleQuery">
58+
<Icon class="mr-5px" icon="ep:search" />
59+
搜索
60+
</el-button>
61+
<el-button @click="resetQuery">
62+
<Icon class="mr-5px" icon="ep:refresh" />
63+
重置
64+
</el-button>
5965
</el-form-item>
6066
</el-form>
6167
</ContentWrap>
@@ -64,41 +70,25 @@
6470
<el-col>
6571
<el-tabs v-model="activeTab">
6672
<!-- 客户总量分析 -->
67-
<el-tab-pane label="客户总量分析" name="customerSummary" lazy>
68-
<CustomerSummary :query-params="queryParams" ref="customerSummaryRef" />
73+
<el-tab-pane label="客户总量分析" lazy name="customerSummary">
74+
<CustomerSummary ref="customerSummaryRef" :query-params="queryParams" />
6975
</el-tab-pane>
7076
<!-- 客户跟进次数分析 -->
71-
<el-tab-pane label="客户跟进次数分析" name="followUpSummary" lazy>
72-
<CustomerFollowUpSummary :query-params="queryParams" ref="followUpSummaryRef" />
77+
<el-tab-pane label="客户跟进次数分析" lazy name="followUpSummary">
78+
<CustomerFollowUpSummary ref="followUpSummaryRef" :query-params="queryParams" />
7379
</el-tab-pane>
7480
<!-- 客户跟进方式分析 -->
75-
<el-tab-pane label="客户跟进方式分析" name="followUpType" lazy>
76-
<CustomerFollowUpType :query-params="queryParams" ref="followUpTypeRef" />
81+
<el-tab-pane label="客户跟进方式分析" lazy name="followUpType">
82+
<CustomerFollowUpType ref="followUpTypeRef" :query-params="queryParams" />
7783
</el-tab-pane>
7884
<!-- 客户转化率分析 -->
79-
<el-tab-pane label="客户转化率分析" name="conversionStat" lazy>
80-
<CustomerConversionStat :query-params="queryParams" ref="conversionStatRef" />
85+
<el-tab-pane label="客户转化率分析" lazy name="conversionStat">
86+
<CustomerConversionStat ref="conversionStatRef" :query-params="queryParams" />
8187
</el-tab-pane>
8288
<!-- 成交周期分析 -->
8389
<el-tab-pane label="成交周期分析" lazy name="dealCycle">
8490
<CustomerDealCycle ref="dealCycleRef" :query-params="queryParams" />
8591
</el-tab-pane>
86-
<!-- 城市分布分析 -->
87-
<el-tab-pane label="城市分布分析" lazy name="addressRef">
88-
<CustomerAddress ref="addressRef" :query-params="queryParams" />
89-
</el-tab-pane>
90-
<!-- 客户级别分析 -->
91-
<el-tab-pane label="客户级别分析" lazy name="levelRef">
92-
<CustomerLevel ref="levelRef" :query-params="queryParams" />
93-
</el-tab-pane>
94-
<!-- 客户来源分析 -->
95-
<el-tab-pane label="客户来源分析" lazy name="sourceRef">
96-
<CustomerSource ref="sourceRef" :query-params="queryParams" />
97-
</el-tab-pane>
98-
<!-- 客户行业分析 -->
99-
<el-tab-pane label="客户行业分析" lazy name="industryRef">
100-
<CustomerIndustry ref="industryRef" :query-params="queryParams" />
101-
</el-tab-pane>
10292
</el-tabs>
10393
</el-col>
10494
</template>
@@ -115,10 +105,6 @@ import CustomerFollowUpType from './components/CustomerFollowUpType.vue'
115105
import CustomerConversionStat from './components/CustomerConversionStat.vue'
116106
import CustomerDealCycle from './components/CustomerDealCycle.vue'
117107
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
118-
import CustomerAddress from './components/CustomerAddress.vue'
119-
import CustomerIndustry from './components/CustomerIndustry.vue'
120-
import CustomerSource from './components/CustomerSource.vue'
121-
import CustomerLevel from './components/CustomerLevel.vue'
122108
123109
defineOptions({ name: 'CrmStatisticsCustomer' })
124110
@@ -152,13 +138,6 @@ const conversionStatRef = ref() // 4. 客户转化率分析
152138
// 5. TODO 公海客户分析
153139
// 缺 crm_owner_record 表 TODO @dhb52:可以先做界面 + 接口,接口数据直接写死返回,相当于 mock 出来
154140
const dealCycleRef = ref() // 6. 成交周期分析
155-
const addressRef = ref()
156-
// 客户级别
157-
const levelRef = ref()
158-
// 客户来源
159-
const sourceRef = ref()
160-
// 客户行业
161-
const industryRef = ref()
162141
163142
/** 搜索按钮操作 */
164143
const handleQuery = () => {
@@ -178,19 +157,6 @@ const handleQuery = () => {
178157
case 'dealCycle': // 成交周期分析
179158
dealCycleRef.value?.loadData?.()
180159
break
181-
// TODO @puhui999:这 4 个拆出去哈;独立一个【客户画像】菜单
182-
case 'addressRef':
183-
addressRef.value?.loadData?.()
184-
break
185-
case 'levelRef':
186-
levelRef.value?.loadData?.()
187-
break
188-
case 'sourceRef':
189-
sourceRef.value?.loadData?.()
190-
break
191-
case 'industryRef':
192-
industryRef.value?.loadData?.()
193-
break
194160
}
195161
}
196162

src/views/crm/statistics/customer/components/CustomerAddress.vue renamed to src/views/crm/statistics/portrait/components/CustomerAddress.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import china from '@/assets/map/json/china.json'
2222
import echarts from '@/plugins/echarts'
2323
import {
2424
CrmStatisticCustomerAreaRespVO,
25-
StatisticsCustomerApi
26-
} from '@/api/crm/statistics/customer'
25+
StatisticsPortraitApi
26+
} from '@/api/crm/statistics/portrait'
2727
2828
defineOptions({ name: 'CustomerAddress' })
2929
const props = defineProps<{ queryParams: any }>() // 搜索参数
@@ -102,7 +102,7 @@ const echartsOption2 = reactive<EChartsOption>({
102102
const loadData = async () => {
103103
// 1. 加载统计数据
104104
loading.value = true
105-
const areaList = await StatisticsCustomerApi.getCustomerArea(props.queryParams)
105+
const areaList = await StatisticsPortraitApi.getCustomerArea(props.queryParams)
106106
areaStatisticsList.value = areaList.map((item: CrmStatisticCustomerAreaRespVO) => {
107107
return {
108108
...item,

0 commit comments

Comments
 (0)