Files
SaaS2/src/hooks/useCustomerTotalIncome.ts
RUI 9b9adb5143
Some checks failed
Next.js CI/CD 流水线 / deploy (push) Failing after 20s
0607.2
2025-06-07 00:40:53 +08:00

235 lines
8.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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;