150 lines
6.4 KiB
JavaScript
150 lines
6.4 KiB
JavaScript
import request from '@/utils/request'
|
|
|
|
// ===== Mock 数据(后端无认证时兜底) =====
|
|
const mockSummary = {
|
|
totalOrderCount: 450,
|
|
totalSalesAmount: 98600000,
|
|
completedOrderCount: 320,
|
|
completedSalesAmount: 72300000,
|
|
totalUnpaidAmount: 26300000,
|
|
avgOrderAmount: 219000
|
|
}
|
|
|
|
const mockSalesmanStats = [
|
|
{ salesmanName: '张伟', totalAmount: 12560000 },
|
|
{ salesmanName: '李强', totalAmount: 9820000 },
|
|
{ salesmanName: '王芳', totalAmount: 8750000 },
|
|
{ salesmanName: '赵磊', totalAmount: 6540000 },
|
|
{ salesmanName: '刘洋', totalAmount: 5210000 },
|
|
{ salesmanName: '陈静', totalAmount: 3980000 },
|
|
{ salesmanName: '杨光', totalAmount: 2850000 }
|
|
]
|
|
|
|
const mockLevelStats = [
|
|
{ customerLevel: '高', count: 400 },
|
|
{ customerLevel: '中', count: 44 },
|
|
{ customerLevel: '低', count: 1 },
|
|
{ customerLevel: 'VIP', count: 1 }
|
|
]
|
|
|
|
const mockIndustryStats = [
|
|
{ industry: '制造业', count: 168 },
|
|
{ industry: '贸易', count: 165 },
|
|
{ industry: '加工业', count: 115 },
|
|
{ industry: '互联网', count: 1 }
|
|
]
|
|
|
|
const mockOrders = [
|
|
{ orderNo: 'ORD20260515001', customer: '周口钢铁', product: '冷轧卷', amount: 125000, status: '生产中', time: '10:30' },
|
|
{ orderNo: 'ORD20260515002', customer: '南阳重工', product: '镀锌板', amount: 89000, status: '已完成', time: '09:45' },
|
|
{ orderNo: 'ORD20260515003', customer: '洛阳机械', product: '酸洗板', amount: 156000, status: '待生产', time: '11:20' },
|
|
{ orderNo: 'ORD20260515004', customer: '开封汽配', product: '冷轧卷', amount: 67000, status: '生产中', time: '08:15' },
|
|
{ orderNo: 'ORD20260515005', customer: '商丘金属', product: '镀铬板', amount: 45000, status: '已完成', time: '07:30' },
|
|
{ orderNo: 'ORD20260515006', customer: '山东福安德', product: '镀锌板', amount: 234000, status: '生产中', time: '14:20' },
|
|
{ orderNo: 'ORD20260515007', customer: '临沂屹钢', product: '冷轧卷', amount: 187000, status: '待生产', time: '13:45' },
|
|
{ orderNo: 'ORD20260515008', customer: '江苏永腾', product: '酸洗板', amount: 92000, status: '已完成', time: '15:10' },
|
|
{ orderNo: 'ORD20260515009', customer: '武汉欣航晟', product: '镀锌板', amount: 76000, status: '生产中', time: '16:30' },
|
|
{ orderNo: 'ORD20260515010', customer: '天津盛盈', product: '冷轧卷', amount: 198000, status: '待生产', time: '17:00' },
|
|
{ orderNo: 'ORD20260515011', customer: '河南宏之澳', product: '镀铬板', amount: 54000, status: '生产中', time: '09:20' },
|
|
{ orderNo: 'ORD20260515012', customer: '上海圳洋', product: '镀锌板', amount: 312000, status: '已完成', time: '11:50' },
|
|
{ orderNo: 'ORD20260515013', customer: '许昌涵博', product: '酸洗板', amount: 43000, status: '待生产', time: '08:40' },
|
|
{ orderNo: 'ORD20260515014', customer: '济宁钰昌', product: '冷轧卷', amount: 88000, status: '生产中', time: '14:10' },
|
|
{ orderNo: 'ORD20260515015', customer: '无锡昌德', product: '镀锌板', amount: 165000, status: '已完成', time: '10:00' }
|
|
]
|
|
|
|
const withMock = (apiFn, mockData) => {
|
|
return async (params) => {
|
|
try {
|
|
const res = await apiFn(params)
|
|
// request.js 在 401 时返回 [],此时降级为 mock
|
|
if (Array.isArray(res) && res.length === 0) return { data: mockData }
|
|
return { data: (res && res.data !== undefined) ? res.data : res }
|
|
} catch {
|
|
return { data: mockData }
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 销售汇总指标
|
|
*/
|
|
export const getSalesSummary = withMock(
|
|
(params) => request({ url: '/crm/salesReport/summary', method: 'get', params }),
|
|
mockSummary
|
|
)
|
|
|
|
/**
|
|
* 销售员统计排行
|
|
*/
|
|
export const getSalesmanStats = withMock(
|
|
(params) => request({ url: '/crm/salesReport/salesmanStats', method: 'get', params }),
|
|
mockSalesmanStats
|
|
)
|
|
|
|
/**
|
|
* 客户等级分布
|
|
*/
|
|
export const getCustomerLevelStats = withMock(
|
|
(params) => request({ url: '/crm/salesReport/customerLevelStats', method: 'get', params }),
|
|
mockLevelStats
|
|
)
|
|
|
|
/**
|
|
* 行业分布统计
|
|
*/
|
|
export const getIndustryStats = withMock(
|
|
(params) => request({ url: '/crm/salesReport/industryStats', method: 'get', params }),
|
|
mockIndustryStats
|
|
)
|
|
|
|
/**
|
|
* 订单明细列表
|
|
*/
|
|
export const getOrderDetails = withMock(
|
|
(params) => request({ url: '/crm/salesReport/orderDetails', method: 'get', params }),
|
|
{ rows: mockOrders, total: mockOrders.length }
|
|
)
|
|
|
|
/**
|
|
* 完整销售报表(一次性返回所有数据)
|
|
*/
|
|
export function getFullSalesReport(params) {
|
|
return request({
|
|
url: '/crm/salesReport/fullReport',
|
|
method: 'get',
|
|
params
|
|
})
|
|
}
|
|
|
|
// ===== 省份热力地图数据 =====
|
|
const mockProvinceStats = [
|
|
{ name: '山东省', customerCount: 124, orderCount: 2800, salesAmount: 31000000 },
|
|
{ name: '河南省', customerCount: 103, orderCount: 2300, salesAmount: 25500000 },
|
|
{ name: '江苏省', customerCount: 35, orderCount: 850, salesAmount: 9500000 },
|
|
{ name: '天津市', customerCount: 17, orderCount: 420, salesAmount: 4800000 },
|
|
{ name: '河北省', customerCount: 12, orderCount: 310, salesAmount: 3600000 },
|
|
{ name: '上海市', customerCount: 10, orderCount: 260, salesAmount: 3200000 },
|
|
{ name: '湖北省', customerCount: 7, orderCount: 180, salesAmount: 2100000 },
|
|
{ name: '辽宁省', customerCount: 6, orderCount: 150, salesAmount: 1700000 },
|
|
{ name: '浙江省', customerCount: 5, orderCount: 130, salesAmount: 1500000 },
|
|
{ name: '安徽省', customerCount: 4, orderCount: 100, salesAmount: 1150000 },
|
|
{ name: '四川省', customerCount: 4, orderCount: 90, salesAmount: 1000000 },
|
|
{ name: '湖南省', customerCount: 3, orderCount: 75, salesAmount: 850000 },
|
|
{ name: '福建省', customerCount: 3, orderCount: 70, salesAmount: 800000 },
|
|
{ name: '山西省', customerCount: 2, orderCount: 50, salesAmount: 550000 },
|
|
{ name: '陕西省', customerCount: 2, orderCount: 45, salesAmount: 500000 },
|
|
{ name: '江西省', customerCount: 2, orderCount: 40, salesAmount: 450000 },
|
|
{ name: '北京市', customerCount: 1, orderCount: 25, salesAmount: 300000 },
|
|
{ name: '广东省', customerCount: 1, orderCount: 20, salesAmount: 250000 },
|
|
{ name: '海南省', customerCount: 1, orderCount: 15, salesAmount: 180000 },
|
|
{ name: '广西壮族自治区', customerCount: 1, orderCount: 10, salesAmount: 120000 }
|
|
]
|
|
|
|
/**
|
|
* 省份热力统计数据
|
|
*/
|
|
export const getProvinceStats = withMock(
|
|
(params) => request({ url: '/crm/salesReport/provinceStats', method: 'get', params }),
|
|
mockProvinceStats
|
|
)
|