Skip to content

Commit 56829ff

Browse files
YunaiVgitee-org
authored andcommitted
!426 CRM: 完善销售漏斗分析
Merge pull request !426 from puhui999/dev-crm
2 parents 6037ac4 + bc95dc2 commit 56829ff

File tree

14 files changed

+694
-83
lines changed

14 files changed

+694
-83
lines changed
File renamed without changes.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"private": false,
77
"scripts": {
88
"i": "pnpm install",
9-
"dev": "vite --mode local-dev",
9+
"local-server": "vite --mode local-dev",
1010
"dev-server": "vite --mode dev",
1111
"ts:check": "vue-tsc --noEmit",
12-
"build:local-dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev",
13-
"build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev",
12+
"build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev",
13+
"build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev",
1414
"build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test",
1515
"build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage",
1616
"build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod",

src/api/crm/statistics/funnel.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import request from '@/config/axios'
2+
3+
export interface CrmStatisticFunnelRespVO {
4+
customerCount: number // 客户数
5+
businessCount: number // 商机数
6+
winCount: number // 赢单数
7+
}
8+
9+
export interface CrmStatisticsBusinessSummaryByDateRespVO {
10+
time: string // 时间
11+
businessCreateCount: number // 商机数
12+
businessDealCount: number // 商机金额
13+
}
14+
15+
// 客户分析 API
16+
export const StatisticFunnelApi = {
17+
// 1. 获取销售漏斗统计数据
18+
getFunnelSummary: (params: any) => {
19+
return request.get({
20+
url: '/crm/statistics-funnel/get-funnel-summary',
21+
params
22+
})
23+
},
24+
// 2. 获取商机结束状态统计
25+
getBusinessEndStatusSummary: (params: any) => {
26+
return request.get({
27+
url: '/crm/statistics-funnel/get-business-end-status-summary',
28+
params
29+
})
30+
},
31+
// 3. 获取新增商机分析(按日期)
32+
getBusinessSummaryByDate: (params: any) => {
33+
return request.get({
34+
url: '/crm/statistics-funnel/get-business-summary-by-date',
35+
params
36+
})
37+
},
38+
// 4. 获取商机列表(按日期)
39+
getBusinessPageByDate: (params: any) => {
40+
return request.get({
41+
url: '/crm/statistics-funnel/get-business-page-by-date',
42+
params
43+
})
44+
}
45+
}

src/components/DictSelect/src/DictSelect.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import { getBoolDictOptions, getIntDictOptions, getStrDictOptions } from '@/util
3333
3434
// 接受父组件参数
3535
interface Props {
36-
modelValue?: any //
3736
dictType: string // 字典类型
3837
valueType: string // 字典值类型
3938
}

src/utils/dict.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,15 @@ export enum DICT_TYPE {
197197
// ========== CRM - 客户管理模块 ==========
198198
CRM_AUDIT_STATUS = 'crm_audit_status', // CRM 审批状态
199199
CRM_BIZ_TYPE = 'crm_biz_type', // CRM 业务类型
200+
CRM_BUSINESS_END_STATUS_TYPE = 'crm_business_end_status_type', // CRM 商机结束状态类型
200201
CRM_RECEIVABLE_RETURN_TYPE = 'crm_receivable_return_type', // CRM 回款的还款方式
201-
CRM_CUSTOMER_INDUSTRY = 'crm_customer_industry',
202-
CRM_CUSTOMER_LEVEL = 'crm_customer_level',
203-
CRM_CUSTOMER_SOURCE = 'crm_customer_source',
204-
CRM_PRODUCT_STATUS = 'crm_product_status',
202+
CRM_CUSTOMER_INDUSTRY = 'crm_customer_industry', // CRM 客户所属行业
203+
CRM_CUSTOMER_LEVEL = 'crm_customer_level', // CRM 客户级别
204+
CRM_CUSTOMER_SOURCE = 'crm_customer_source', // CRM 客户来源
205+
CRM_PRODUCT_STATUS = 'crm_product_status', // CRM 商品状态
205206
CRM_PERMISSION_LEVEL = 'crm_permission_level', // CRM 数据权限的级别
206-
CRM_PRODUCT_UNIT = 'crm_product_unit', // 产品单位
207-
CRM_FOLLOW_UP_TYPE = 'crm_follow_up_type', // 跟进方式
207+
CRM_PRODUCT_UNIT = 'crm_product_unit', // CRM 产品单位
208+
CRM_FOLLOW_UP_TYPE = 'crm_follow_up_type', // CRM 跟进方式
208209

209210
// ========== ERP - 企业资源计划模块 ==========
210211
ERP_AUDIT_STATUS = 'erp_audit_status', // ERP 审批状态

src/views/crm/business/index.vue

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,43 @@
55
<ContentWrap>
66
<!-- 搜索工作栏 -->
77
<el-form
8-
class="-mb-15px"
9-
:model="queryParams"
108
ref="queryFormRef"
119
:inline="true"
10+
:model="queryParams"
11+
class="-mb-15px"
1212
label-width="68px"
1313
>
1414
<el-form-item label="商机名称" prop="name">
1515
<el-input
1616
v-model="queryParams.name"
17-
placeholder="请输入商机名称"
17+
class="!w-240px"
1818
clearable
19+
placeholder="请输入商机名称"
1920
@keyup.enter="handleQuery"
20-
class="!w-240px"
2121
/>
2222
</el-form-item>
2323
<el-form-item>
24-
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
25-
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
26-
<el-button type="primary" @click="openForm('create')" v-hasPermi="['crm:business:create']">
27-
<Icon icon="ep:plus" class="mr-5px" /> 新增
24+
<el-button @click="handleQuery">
25+
<Icon class="mr-5px" icon="ep:search" />
26+
搜索
27+
</el-button>
28+
<el-button @click="resetQuery">
29+
<Icon class="mr-5px" icon="ep:refresh" />
30+
重置
31+
</el-button>
32+
<el-button v-hasPermi="['crm:business:create']" type="primary" @click="openForm('create')">
33+
<Icon class="mr-5px" icon="ep:plus" />
34+
新增
2835
</el-button>
2936
<el-button
30-
type="success"
37+
v-hasPermi="['crm:business:export']"
38+
:loading="exportLoading"
3139
plain
40+
type="success"
3241
@click="handleExport"
33-
:loading="exportLoading"
34-
v-hasPermi="['crm:business:export']"
3542
>
36-
<Icon icon="ep:download" class="mr-5px" /> 导出
43+
<Icon class="mr-5px" icon="ep:download" />
44+
导出
3745
</el-button>
3846
</el-form-item>
3947
</el-form>
@@ -46,8 +54,8 @@
4654
<el-tab-pane label="我参与的" name="2" />
4755
<el-tab-pane label="下属负责的" name="3" />
4856
</el-tabs>
49-
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
50-
<el-table-column align="center" label="商机名称" fixed="left" prop="name" width="160">
57+
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
58+
<el-table-column align="center" fixed="left" label="商机名称" prop="name" width="160">
5159
<template #default="scope">
5260
<el-link :underline="false" type="primary" @click="openDetail(scope.row.id)">
5361
{{ scope.row.name }}
@@ -66,17 +74,17 @@
6674
</template>
6775
</el-table-column>
6876
<el-table-column
69-
label="商机金额(元)"
77+
:formatter="erpPriceTableColumnFormatter"
7078
align="center"
79+
label="商机金额(元)"
7180
prop="totalPrice"
7281
width="140"
73-
:formatter="erpPriceTableColumnFormatter"
7482
/>
7583
<el-table-column
76-
label="预计成交日期"
84+
:formatter="dateFormatter"
7785
align="center"
86+
label="预计成交日期"
7887
prop="dealTime"
79-
:formatter="dateFormatter"
8088
width="180px"
8189
/>
8290
<el-table-column align="center" label="备注" prop="remark" width="200" />
@@ -97,49 +105,49 @@
97105
width="180px"
98106
/>
99107
<el-table-column
100-
label="更新时间"
108+
:formatter="dateFormatter"
101109
align="center"
110+
label="更新时间"
102111
prop="updateTime"
103-
:formatter="dateFormatter"
104112
width="180px"
105113
/>
106114
<el-table-column
107-
label="创建时间"
115+
:formatter="dateFormatter"
108116
align="center"
117+
label="创建时间"
109118
prop="createTime"
110-
:formatter="dateFormatter"
111119
width="180px"
112120
/>
113121
<el-table-column align="center" label="创建人" prop="creatorName" width="100px" />
114122
<el-table-column
115-
label="商机状态组"
116123
align="center"
117-
prop="statusTypeName"
118124
fixed="right"
125+
label="商机状态组"
126+
prop="statusTypeName"
119127
width="140"
120128
/>
121129
<el-table-column
122-
label="商机阶段"
123130
align="center"
124-
prop="statusName"
125131
fixed="right"
132+
label="商机阶段"
133+
prop="statusName"
126134
width="120"
127135
/>
128-
<el-table-column label="操作" align="center" fixed="right" width="130px">
136+
<el-table-column align="center" fixed="right" label="操作" width="130px">
129137
<template #default="scope">
130138
<el-button
139+
v-hasPermi="['crm:business:update']"
131140
link
132141
type="primary"
133142
@click="openForm('update', scope.row.id)"
134-
v-hasPermi="['crm:business:update']"
135143
>
136144
编辑
137145
</el-button>
138146
<el-button
147+
v-hasPermi="['crm:business:delete']"
139148
link
140149
type="danger"
141150
@click="handleDelete(scope.row.id)"
142-
v-hasPermi="['crm:business:delete']"
143151
>
144152
删除
145153
</el-button>
@@ -148,9 +156,9 @@
148156
</el-table>
149157
<!-- 分页 -->
150158
<Pagination
151-
:total="total"
152-
v-model:page="queryParams.pageNo"
153159
v-model:limit="queryParams.pageSize"
160+
v-model:page="queryParams.pageNo"
161+
:total="total"
154162
@pagination="getList"
155163
/>
156164
</ContentWrap>
@@ -159,7 +167,7 @@
159167
<BusinessForm ref="formRef" @success="getList" />
160168
</template>
161169

162-
<script setup lang="ts">
170+
<script lang="ts" setup>
163171
import { dateFormatter } from '@/utils/formatTime'
164172
import download from '@/utils/download'
165173
import * as BusinessApi from '@/api/crm/business'
@@ -216,7 +224,7 @@ const handleTabClick = (tab: TabsPaneContext) => {
216224
}
217225
218226
/** 打开客户详情 */
219-
const { currentRoute, push } = useRouter()
227+
const { push } = useRouter()
220228
const openDetail = (id: number) => {
221229
push({ name: 'CrmBusinessDetail', params: { id } })
222230
}

0 commit comments

Comments
 (0)