6 天以前 f1c41818393a2678d69852f0d65a5ff6018613ee
fix(financial): 修复财务数据处理中的数值转换和异常处理问题

- 添加 toNumber 工具函数确保数值转换安全
- 在数据获取方法中添加 try-catch 异常处理
- 使用 toNumber 替换 Number() 进行数值转换
- 修复应付应收统计数据访问的安全性问题
- 统一数据字段访问方式避免 undefined 错误
已修改3个文件
99 ■■■■■ 文件已修改
src/views/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/reportAnalysis/dataDashboard/index0.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/reportAnalysis/financialAnalysis/components/center-top.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue
@@ -1307,9 +1307,12 @@
const statisticsReceivable = async () => {
  const res = await statisticsReceivablePayable({ type: 1 });
  const data = res?.data || {};
  const payableMoney = Number(data.payableMoney ?? 0);
  const receivableMoney = Number(data.receivableMoney ?? 0);
  barSeries.value[0].data = [
    { value: res.data.payableMoney, itemStyle: { color: barColors2[0] } },
    { value: res.data.receivableMoney, itemStyle: { color: barColors2[1] } },
    { value: payableMoney, itemStyle: { color: barColors2[0] } },
    { value: receivableMoney, itemStyle: { color: barColors2[1] } },
  ];
};
src/views/reportAnalysis/dataDashboard/index0.vue
@@ -925,15 +925,18 @@
    })
}
// 应付应收统计
const statisticsReceivable = (type) => {
    statisticsReceivablePayable({type: radio1.value}).then((res) => {
const statisticsReceivable = (type = radio1.value) => {
    statisticsReceivablePayable({ type }).then((res) => {
        const data = res?.data || {}
        const payableMoney = Number(data.payableMoney ?? 0)
        const receivableMoney = Number(data.receivableMoney ?? 0)
        // 设置应付金额数据
        barSeries.value[0].data = [
            { value: res.data.payableMoney }
            { value: payableMoney }
        ]
        // 设置应收金额数据
        barSeries.value[1].data = [
            { value: res.data.receivableMoney }
            { value: receivableMoney }
        ]
    })
}
@@ -2031,4 +2034,4 @@
  color: #B8C8E0;
  font-size: 11px;
}
</style>
</style>
src/views/reportAnalysis/financialAnalysis/components/center-top.vue
@@ -112,50 +112,69 @@
  profitRate: { value: 0, trend: 0 },
})
const fetchMonthlyIncome = async () => {
  const res = await getMonthlyIncome()
  const data = res?.data || {}
const toNumber = (val) => {
  const num = Number(val)
  return Number.isFinite(num) ? num : 0
}
  income.value.amount = data.monthlyIncome ?? 0
  const collectionRate = Number(data.collectionRate ?? 0)
  const overdueRate = Number(data.overdueRate ?? 0)
  income.value.repayRate = {
    value: collectionRate,
    trend: collectionRate >= 0 ? 1 : -1,
  }
  income.value.overdueCount = data.overdueNum ?? 0
  income.value.overdueRate = {
    value: overdueRate,
    trend: overdueRate >= 0 ? 1 : -1,
const fetchMonthlyIncome = async () => {
  try {
    const res = await getMonthlyIncome()
    const data = res?.data || {}
    income.value.amount = toNumber(data.monthlyIncome)
    const collectionRate = toNumber(data.collectionRate)
    const overdueRate = toNumber(data.overdueRate)
    income.value.repayRate = {
      value: collectionRate,
      trend: collectionRate >= 0 ? 1 : -1,
    }
    income.value.overdueCount = toNumber(data.overdueNum)
    income.value.overdueRate = {
      value: overdueRate,
      trend: overdueRate >= 0 ? 1 : -1,
    }
  } catch {
    income.value.amount = 0
    income.value.repayRate = { value: 0, trend: 0 }
    income.value.overdueCount = 0
    income.value.overdueRate = { value: 0, trend: 0 }
  }
}
const fetchMonthlyExpenditure = async () => {
  const res = await getMonthlyExpenditure()
  const data = res?.data || {}
  try {
    const res = await getMonthlyExpenditure()
    const data = res?.data || {}
  expense.value.amount = data.monthlyExpenditure ?? 0
  const paymentRate = Number(data.paymentRate ?? 0)
  expense.value.netProfit = {
    value: paymentRate,
    trend: paymentRate >= 0 ? 1 : -1,
  }
  expense.value.grossProfit = data.grossProfit ?? 0
    expense.value.amount = toNumber(data.monthlyExpenditure)
    const paymentRate = toNumber(data.paymentRate)
    expense.value.netProfit = {
      value: paymentRate,
      trend: paymentRate >= 0 ? 1 : -1,
    }
    expense.value.grossProfit = toNumber(data.grossProfit)
  const profitMarginRate = Number(data.profitMarginRate ?? 0)
  expense.value.profitRate = {
    value: profitMarginRate,
    trend: profitMarginRate >= 0 ? 1 : -1,
    const profitMarginRate = toNumber(data.profitMarginRate)
    expense.value.profitRate = {
      value: profitMarginRate,
      trend: profitMarginRate >= 0 ? 1 : -1,
    }
  } catch {
    expense.value.amount = 0
    expense.value.netProfit = { value: 0, trend: 0 }
    expense.value.grossProfit = 0
    expense.value.profitRate = { value: 0, trend: 0 }
  }
}
const isWanAmount = (val) => {
  const num = Number(val) || 0
  const num = toNumber(val)
  return Math.abs(num) >= 10000
}
const formatAmountWanNumber = (val) => {
  const num = Number(val) || 0
  const num = toNumber(val)
  if (Math.abs(num) >= 10000) {
    return (num / 10000).toFixed(2)
  }
@@ -163,7 +182,7 @@
}
const formatPercent = (val) => {
  const num = Number(val) || 0
  const num = toNumber(val)
  // 百分比展示始终用绝对值,小数保留两位
  return `${Math.abs(num).toFixed(2)}%`
}