235 lines
8.7 KiB
TypeScript
235 lines
8.7 KiB
TypeScript
// src/hooks/useCustomerTotalIncome.ts
|
||
import { useState, useEffect } from 'react';
|
||
|
||
const useCustomerTotalIncome = (phone: string | null) => {
|
||
const [totalIncome, setTotalIncome] = useState<number>(0);
|
||
const [loading, setLoading] = useState<boolean>(false);
|
||
const [storeAccounts, setStoreAccounts] = useState<string[]>([]); // 用于存储店铺的账号编号
|
||
|
||
useEffect(() => {
|
||
if (!phone) return; // 如果没有提供手机号,直接返回
|
||
|
||
const fetchCustomerIncomeData = async () => {
|
||
setLoading(true);
|
||
|
||
try {
|
||
const response = await fetch(`/api/backstage/customers/sales/${phone}`);
|
||
|
||
if (!response.ok) {
|
||
throw new Error(`HTTP error! status: ${response.status}`);
|
||
}
|
||
|
||
const data = await response.json();
|
||
|
||
/*
|
||
API返回数据结构如下:
|
||
{
|
||
"message": "查询成功",
|
||
"salesRecords": [
|
||
{
|
||
"_id": "670f76fe3da0e5c5809b46c7",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"客户": "670f767a3da0e5c5809b46bc",
|
||
"产品": [
|
||
{
|
||
"成本": {
|
||
"成本价": 100,
|
||
"包装费": 20,
|
||
"运费": 30
|
||
},
|
||
"_id": "670f76e73da0e5c5809b46c4",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"供应商": "670f75ff3da0e5c5809b45ab",
|
||
"品牌": "670f75d43da0e5c5809b459f",
|
||
"品类": "670f75e43da0e5c5809b45a4",
|
||
"名称": "测试产品1",
|
||
"描述": "测试产品1",
|
||
"编码": "测试产品1",
|
||
"货号": "测试产品1",
|
||
"别名": [
|
||
"测试产品1"
|
||
],
|
||
"售价": 500,
|
||
"createdAt": "2024-10-16T08:18:47.363Z",
|
||
"updatedAt": "2024-10-16T08:18:47.363Z",
|
||
"__v": 0
|
||
}
|
||
],
|
||
"订单来源": {
|
||
"_id": "670f763c3da0e5c5809b45ba",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"账号负责人": "670f75043da0e5c5809b457d",
|
||
"前端引流人员": "670f75043da0e5c5809b457d",
|
||
"账号类型": [
|
||
"670f75e43da0e5c5809b45a4"
|
||
],
|
||
"账号编号": "1",
|
||
"微信号": "1",
|
||
"微信昵称": "1",
|
||
"手机编号": "1",
|
||
"账号状态": 1,
|
||
"备注": "1",
|
||
"日增长数据": [],
|
||
"createdAt": "2024-10-16T08:15:56.632Z",
|
||
"updatedAt": "2024-10-16T08:15:56.632Z",
|
||
"__v": 0
|
||
},
|
||
"导购": {
|
||
"_id": "670f75043da0e5c5809b457d",
|
||
"姓名": "999",
|
||
"电话": "999",
|
||
"邮箱": "999@qq.com",
|
||
"密码": "$2b$10$BucUsXpf4rVYgjU.IGVfju2d2OijFBA74EQCSenL5ftsERcSd7uyC",
|
||
"角色": "66b99afa3324caa6bd2b57ae",
|
||
"createdAt": "2024-10-16T08:10:44.743Z",
|
||
"updatedAt": "2024-10-16T08:10:49.908Z",
|
||
"__v": 0,
|
||
"团队": "670f75093da0e5c5809b4584"
|
||
},
|
||
"成交日期": "2024-10-16T08:18:53.700Z",
|
||
"应收金额": 500,
|
||
"收款金额": 500,
|
||
"待收款": 0,
|
||
"收款平台": "670f762d3da0e5c5809b45b2",
|
||
"订单状态": [
|
||
"正常"
|
||
],
|
||
"收款状态": "全款",
|
||
"货款状态": "待结算",
|
||
"余额抵用": null,
|
||
"备注": "备注",
|
||
"优惠券": [],
|
||
"售后记录": [],
|
||
"createdAt": "2024-10-16T08:19:10.775Z",
|
||
"updatedAt": "2024-10-16T08:19:10.775Z",
|
||
"__v": 0
|
||
},
|
||
{
|
||
"_id": "6711cb3694e24dea3c362daf",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"客户": "670f767a3da0e5c5809b46bc",
|
||
"产品": [
|
||
{
|
||
"成本": {
|
||
"成本价": 100,
|
||
"包装费": 20,
|
||
"运费": 30
|
||
},
|
||
"_id": "670f76e73da0e5c5809b46c4",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"供应商": "670f75ff3da0e5c5809b45ab",
|
||
"品牌": "670f75d43da0e5c5809b459f",
|
||
"品类": "670f75e43da0e5c5809b45a4",
|
||
"名称": "测试产品1",
|
||
"描述": "测试产品1",
|
||
"编码": "测试产品1",
|
||
"货号": "测试产品1",
|
||
"别名": [
|
||
"测试产品1"
|
||
],
|
||
"售价": 500,
|
||
"createdAt": "2024-10-16T08:18:47.363Z",
|
||
"updatedAt": "2024-10-16T08:18:47.363Z",
|
||
"__v": 0
|
||
}
|
||
],
|
||
"订单来源": {
|
||
"_id": "6711cac194e24dea3c362d8a",
|
||
"团队": "670f75093da0e5c5809b4584",
|
||
"账号负责人": "670f75043da0e5c5809b457d",
|
||
"前端引流人员": "670f75043da0e5c5809b457d",
|
||
"账号类型": [
|
||
"670f75e43da0e5c5809b45a4"
|
||
],
|
||
"账号编号": "2",
|
||
"微信号": "2",
|
||
"微信昵称": "2",
|
||
"手机编号": "2",
|
||
"账号状态": 1,
|
||
"备注": "2",
|
||
"日增长数据": [],
|
||
"createdAt": "2024-10-18T02:41:05.092Z",
|
||
"updatedAt": "2024-10-18T02:41:05.092Z",
|
||
"__v": 0
|
||
},
|
||
"导购": {
|
||
"_id": "670f75043da0e5c5809b457d",
|
||
"姓名": "999",
|
||
"电话": "999",
|
||
"邮箱": "999@qq.com",
|
||
"密码": "$2b$10$BucUsXpf4rVYgjU.IGVfju2d2OijFBA74EQCSenL5ftsERcSd7uyC",
|
||
"角色": "66b99afa3324caa6bd2b57ae",
|
||
"createdAt": "2024-10-16T08:10:44.743Z",
|
||
"updatedAt": "2024-10-16T08:10:49.908Z",
|
||
"__v": 0,
|
||
"团队": "670f75093da0e5c5809b4584"
|
||
},
|
||
"成交日期": "2024-10-18T02:42:26.500Z",
|
||
"应收金额": 500,
|
||
"收款金额": 100,
|
||
"待收款": 300,
|
||
"收款平台": "670f762d3da0e5c5809b45b2",
|
||
"订单状态": [
|
||
"正常"
|
||
],
|
||
"收款状态": "定金",
|
||
"货款状态": "待结算",
|
||
"余额抵用": null,
|
||
"备注": "测试2",
|
||
"优惠券": [],
|
||
"售后记录": [],
|
||
"createdAt": "2024-10-18T02:43:02.441Z",
|
||
"updatedAt": "2024-10-18T02:43:02.441Z",
|
||
"__v": 0
|
||
}
|
||
],
|
||
"afterSalesRecords": []
|
||
}
|
||
*/
|
||
|
||
let totalSalesIncome = 0; // 收款金额总和
|
||
let totalPendingIncome = 0; // 待收款总和
|
||
let totalAfterSalesIncome = 0; // 售后收入总和
|
||
let totalAfterSalesExpenditure = 0; // 售后支出总和
|
||
const accountsSet = new Set<string>(); // 用于去重保存账号编号
|
||
|
||
// 计算销售记录中的收款金额和待收款
|
||
data.salesRecords.forEach((record: any) => {
|
||
totalSalesIncome += record.收款金额 || 0;
|
||
totalPendingIncome += record.待收款 || 0;
|
||
|
||
if (record.订单来源?.账号编号) {
|
||
accountsSet.add(record.订单来源.账号编号); // 保存账号编号
|
||
}
|
||
|
||
});
|
||
|
||
// 计算售后记录中的收入和支出
|
||
data.afterSalesRecords.forEach((record: any) => {
|
||
if (record.收支类型 === '收入') {
|
||
totalAfterSalesIncome += record.收支金额 || 0;
|
||
} else if (record.收支类型 === '支出') {
|
||
totalAfterSalesExpenditure += record.收支金额 || 0;
|
||
}
|
||
});
|
||
|
||
// 本单收入 = 收款金额总和 + 待收款总和 + 售后收入 - 售后支出
|
||
const calculatedIncome = totalSalesIncome + totalPendingIncome + totalAfterSalesIncome - totalAfterSalesExpenditure;
|
||
setTotalIncome(calculatedIncome);
|
||
setStoreAccounts(Array.from(accountsSet)); // 转换 Set 为数组并保存
|
||
} catch (error) {
|
||
console.error('获取客户消费总额时出错:', error);
|
||
} finally {
|
||
setLoading(false);
|
||
}
|
||
};
|
||
|
||
fetchCustomerIncomeData();
|
||
}, [phone]);
|
||
|
||
//return { totalIncome, loading };
|
||
return { totalIncome, storeAccounts, loading };
|
||
};
|
||
|
||
export default useCustomerTotalIncome;
|