Files
mp-vue/docs/数据不一致问题修复说明.md

5.7 KiB
Raw Blame History

百色中学统计金额数据不一致问题修复说明

问题描述

用户发现 /bszx/ranking 页面的统计金额和 /bszx/dashboard 页面的统计金额不一致,需要确定哪个数据是正确的。

问题分析

数据来源差异

经过分析,发现两个页面使用了不同的数据源:

1. Dashboard 页面 (/bszx/dashboard)

  • API: bszxOrderTotal()
  • 接口: /bszx/bszx-order/total
  • 数据来源: 订单表 (bszx-order)
  • 数据类型: ShopOrder[] - 订单数组
  • 统计逻辑: 统计所有有效订单的实际支付金额
  • 字段: payPricetotalPrice

2. Ranking 页面 (/bszx/ranking)

  • API: ranking()
  • 接口: /bszx/bszx-pay-ranking/ranking
  • 数据来源: 捐款排行表 (bszx-pay-ranking)
  • 数据类型: BszxPayRanking[] - 排行榜记录数组
  • 统计逻辑: 统计排行榜中的汇总金额
  • 字段: totalPrice

数据性质差异

  1. 订单表数据 (Dashboard)

    • 真实的业务数据
    • 反映实际的支付情况
    • 只统计有效订单(已支付、未取消)
    • 实时更新
  2. 排行榜数据 (Ranking)

    • ⚠️ 展示用的汇总数据
    • ⚠️ 可能包含统计逻辑或过滤条件
    • ⚠️ 可能不是实时更新
    • ⚠️ 用于排行榜展示,不一定等于实际订单金额

结论

Dashboard 页面的数据是正确的,因为:

  1. 数据权威性:直接来自订单表,是真实的业务数据
  2. 统计准确性:只统计有效订单的实际支付金额
  3. 实时性:反映当前的真实订单状态
  4. 业务意义:代表实际的收入情况

Ranking 页面的数据是展示数据,可能:

  • 是为了排行榜展示而特别处理的数据
  • 包含不同的统计规则或过滤条件
  • 不代表实际的订单收入

修复方案

1. 修正数据处理逻辑

修复前的问题

// ❌ 错误ranking 页面覆盖了真实的订单统计数据
const datasource = ({where}) => {
  return ranking({...where}).then(data => {
    let totalPrice = 0;
    data.forEach((item) => {
      if(item.totalPrice) totalPrice += item.totalPrice;
    });
    bszxStatisticsStore.updateStatistics({ totalPrice }); // 错误地覆盖了真实数据
    return data;
  });
};

修复后

// ✅ 正确:分离两种数据,不相互覆盖
const datasource = ({where}) => {
  return ranking({...where}).then(data => {
    // 计算排行榜总金额(仅用于本页面显示)
    let total = 0;
    data.forEach((item) => {
      if(item.totalPrice) total += item.totalPrice;
    });
    rankingTotalPrice.value = total; // 本地变量,不影响全局 store
    
    // store 中的数据来自 bszxOrderTotal API代表真实的订单金额
    return data;
  });
};

2. 优化 Store 数据处理

修复 bszxOrderTotal 数据解析

// 修复前:不正确的数据处理
if (Array.isArray(result) && result.length > 0) {
  totalPrice = safeNumber(result[0]); // ❌ 只取第一个元素
}

// 修复后:正确累加所有订单金额
if (Array.isArray(result)) {
  result.forEach((order: any) => {
    if (order.payPrice) {
      totalPrice += safeNumber(order.payPrice); // ✅ 累加实际支付金额
    } else if (order.totalPrice) {
      totalPrice += safeNumber(order.totalPrice); // ✅ 备用字段
    }
  });
}

3. 用户界面优化

为了让用户清楚地了解两种数据的差异,在 Ranking 页面同时显示两个金额:

<!-- 实际订单总金额权威数据 -->
<a-tooltip title="实际订单总金额(来自订单表)">
  <span class="text-gray-400">实际订单总金额</span>
  <span class="text-gray-700 font-bold">{{ formatNumber(bszxTotalPrice) }}</span>
</a-tooltip>

<!-- 排行榜统计金额展示数据 -->
<a-tooltip title="排行榜统计金额(来自排行榜表)">
  <span class="text-gray-400">排行榜统计金额</span>
  <span class="text-gray-700 font-bold">{{ formatNumber(rankingTotalPrice) }}</span>
</a-tooltip>

修改的文件

1. Store 层面

  • src/store/modules/bszx-statistics.ts - 修正数据解析逻辑

2. Dashboard 页面

  • 无需修改,已经使用正确的数据源

3. Ranking 页面

  • src/views/bszx/bszxPayRanking/index.vue - 分离数据处理逻辑
  • src/views/bszx/bszxPayRanking/components/search.vue - 显示两种金额
  • src/views/bsyx/bsyxPayRanking/index.vue - 同样的修改
  • src/views/bsyx/bsyxPayRanking/components/search.vue - 同样的修改

验证方法

  1. 检查 Dashboard 页面:显示的是真实订单总金额
  2. 检查 Ranking 页面:同时显示两种金额,用户可以对比
  3. 数据一致性Dashboard 和 Ranking 页面的"实际订单总金额"应该一致
  4. 数据差异说明:两个金额可能不同,这是正常的,因为数据来源和统计逻辑不同

最佳实践

  1. 数据权威性:始终以订单表数据为准进行业务决策
  2. 数据透明性:向用户清楚说明不同数据的来源和含义
  3. 避免混淆:不同数据源的数据不应相互覆盖
  4. 文档说明:为不同的统计数据提供清晰的说明

总结

通过这次修复:

  1. 明确了数据权威性:订单表数据是权威数据源
  2. 分离了数据处理:不同数据源不再相互干扰
  3. 提高了透明度:用户可以看到两种数据的对比
  4. 保持了一致性:全局 store 中的数据始终来自权威数据源
  5. 改善了用户体验:清楚标注了数据来源和含义

现在用户可以清楚地看到两种数据,并理解它们的差异和用途。