diff --git a/src/api/crm/statistics/funnel.ts b/src/api/crm/statistics/funnel.ts index 0ba322b8..574a5f4f 100644 --- a/src/api/crm/statistics/funnel.ts +++ b/src/api/crm/statistics/funnel.ts @@ -3,13 +3,19 @@ import request from '@/config/axios' export interface CrmStatisticFunnelRespVO { customerCount: number // 客户数 businessCount: number // 商机数 - winCount: number // 赢单数 + businessWinCount: number // 赢单数 } export interface CrmStatisticsBusinessSummaryByDateRespVO { time: string // 时间 businessCreateCount: number // 商机数 - businessDealCount: number // 商机金额 + totalPrice: number | string // 商机金额 +} + +export interface CrmStatisticsBusinessInversionRateSummaryByDateRespVO { + time: string // 时间 + businessCount: number // 商机数量 + businessWinCount: number // 赢单商机数 } // 客户分析 API @@ -22,9 +28,9 @@ export const StatisticFunnelApi = { }) }, // 2. 获取商机结束状态统计 - getBusinessEndStatusSummary: (params: any) => { + getBusinessSummaryByEndStatus: (params: any) => { return request.get({ - url: '/crm/statistics-funnel/get-business-end-status-summary', + url: '/crm/statistics-funnel/get-business-summary-by-end-status', params }) }, @@ -35,7 +41,14 @@ export const StatisticFunnelApi = { params }) }, - // 4. 获取商机列表(按日期) + // 4. 获取商机转化率分析(按日期) + getBusinessInversionRateSummaryByDate: (params: any) => { + return request.get({ + url: '/crm/statistics-funnel/get-business-inversion-rate-summary-by-date', + params + }) + }, + // 5. 获取商机列表(按日期) getBusinessPageByDate: (params: any) => { return request.get({ url: '/crm/statistics-funnel/get-business-page-by-date', diff --git a/src/views/crm/statistics/funnel/components/BusinessInversionRateSummary.vue b/src/views/crm/statistics/funnel/components/BusinessInversionRateSummary.vue new file mode 100644 index 00000000..541d6fc4 --- /dev/null +++ b/src/views/crm/statistics/funnel/components/BusinessInversionRateSummary.vue @@ -0,0 +1,307 @@ + + + diff --git a/src/views/crm/statistics/funnel/components/BusinessSummary.vue b/src/views/crm/statistics/funnel/components/BusinessSummary.vue index 60dd8198..942a7128 100644 --- a/src/views/crm/statistics/funnel/components/BusinessSummary.vue +++ b/src/views/crm/statistics/funnel/components/BusinessSummary.vue @@ -118,7 +118,7 @@ const queryParams0 = reactive({ const loading = ref(false) // 加载中 const list = ref([]) // 列表的数据 const total = ref(0) -/** 将传进来的值赋值给 formData */ +/** 将传进来的值赋值给 queryParams0 */ watch( () => props.queryParams, (data) => { @@ -163,7 +163,7 @@ const echartsOption = reactive({ brush: { type: ['lineX', 'clear'] // 区域缩放按钮、还原按钮 }, - saveAsImage: { show: true, name: '客户总量分析' } // 保存为图片 + saveAsImage: { show: true, name: '新增商机分析' } // 保存为图片 } }, tooltip: { @@ -216,7 +216,7 @@ const fetchAndFill = async () => { } if (echartsOption.series && echartsOption.series[1] && echartsOption.series[1]['data']) { echartsOption.series[1]['data'] = businessSummaryByDate.map( - (s: CrmStatisticsBusinessSummaryByDateRespVO) => s.businessDealCount + (s: CrmStatisticsBusinessSummaryByDateRespVO) => s.totalPrice ) } diff --git a/src/views/crm/statistics/funnel/components/FunnelBusiness.vue b/src/views/crm/statistics/funnel/components/FunnelBusiness.vue index 2be24e8d..9b7b08ae 100644 --- a/src/views/crm/statistics/funnel/components/FunnelBusiness.vue +++ b/src/views/crm/statistics/funnel/components/FunnelBusiness.vue @@ -4,6 +4,10 @@ + + 客户视角 + 动态视角 + @@ -35,6 +39,7 @@ import { FunnelChart } from 'echarts/charts' defineOptions({ name: 'FunnelBusiness' }) const props = defineProps<{ queryParams: any }>() // 搜索参数 +const active = ref(true) const loading = ref(false) // 加载中 const list = ref([]) // 列表的数据 @@ -101,6 +106,11 @@ const echartsOption = reactive({ ] }) as EChartsOption +const handleActive = async (val: boolean) => { + active.value = val + await loadData() +} + /** 获取统计数据 */ const loadData = async () => { loading.value = true @@ -117,13 +127,20 @@ const loadData = async () => { ) { // tips:写死 value 值是为了保持漏斗顺序不变 const list: { value: number; name: string }[] = [] - list.push({ value: 60, name: `客户-${data.customerCount || 0}个` }) - list.push({ value: 40, name: `商机-${data.businessCount || 0}个` }) - list.push({ value: 20, name: `赢单-${data.winCount || 0}个` }) + if (active.value) { + list.push({ value: 60, name: `客户-${data.customerCount || 0}个` }) + list.push({ value: 40, name: `商机-${data.businessCount || 0}个` }) + list.push({ value: 20, name: `赢单-${data.businessWinCount || 0}个` }) + } else { + list.push({ value: data.customerCount || 0, name: `客户-${data.customerCount || 0}个` }) + list.push({ value: data.businessCount || 0, name: `商机-${data.businessCount || 0}个` }) + list.push({ value: data.businessWinCount || 0, name: `赢单-${data.businessWinCount || 0}个` }) + } + echartsOption.series[0]['data'] = list } // 2.2 获取商机结束状态统计 - list.value = await StatisticFunnelApi.getBusinessEndStatusSummary(props.queryParams) + list.value = await StatisticFunnelApi.getBusinessSummaryByEndStatus(props.queryParams) loading.value = false } defineExpose({ loadData }) diff --git a/src/views/crm/statistics/funnel/index.vue b/src/views/crm/statistics/funnel/index.vue index b8cddf8d..804cb49b 100644 --- a/src/views/crm/statistics/funnel/index.vue +++ b/src/views/crm/statistics/funnel/index.vue @@ -87,7 +87,12 @@ - + + + @@ -100,6 +105,7 @@ import { beginOfDay, defaultShortcuts, endOfDay, formatDate } from '@/utils/form import { defaultProps, handleTree } from '@/utils/tree' import FunnelBusiness from './components/FunnelBusiness.vue' import BusinessSummary from './components/BusinessSummary.vue' +import BusinessInversionRateSummary from './components/BusinessInversionRateSummary.vue' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' defineOptions({ name: 'CrmStatisticsFunnel' }) @@ -129,7 +135,7 @@ const userListByDeptId = computed(() => const activeTab = ref('funnelRef') // 活跃标签 const funnelRef = ref() // 销售漏斗 const businessSummaryRef = ref() // 新增商机分析 -const sourceRef = ref() // 客户来源 +const businessInversionRateSummaryRef = ref() // 商机转化率分析 /** 搜索按钮操作 */ const handleQuery = () => { @@ -140,8 +146,8 @@ const handleQuery = () => { case 'businessSummaryRef': businessSummaryRef.value?.loadData?.() break - case 'sourceRef': - sourceRef.value?.loadData?.() + case 'businessInversionRateSummaryRef': + businessInversionRateSummaryRef.value?.loadData?.() break } } diff --git a/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue b/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue index 8ccd52c8..112e6090 100644 --- a/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue +++ b/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue @@ -106,7 +106,7 @@ const loadData = async () => { areaStatisticsList.value = areaList.map((item: CrmStatisticCustomerAreaRespVO) => { return { ...item, - areaName: item.areaName // TODO @puhui999:这里最好注释下原因哈, 🤣 我从 mall copy 过来的 + areaName: item.areaName // .replace('维吾尔自治区', '') // .replace('壮族自治区', '') // .replace('回族自治区', '')