You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js计算司机月度报酬时未服务月份数值重复问题如何解决

问题原因分析

你的代码存在4个可导致统计异常的问题,核心问题是报酬累计变量未按月重置:

  • 核心问题:payout变量在月份循环外层初始化,每个月计算完成后没有清零,上一个有订单月份的报酬值会被直接继承到后续所有无订单月份,出现你描述的错误赋值现象
  • 次要问题1:内外层循环都使用index作为变量名,存在变量污染风险
  • 次要问题2:months数组中Oct、Nov的字符串末尾多了空格,可能和InternalServices.getMonthName返回的标准月份名匹配失败
  • 次要问题3:订单查询的OrderAcceptTime范围过滤条件被注释,会拉到时间范围外的历史订单,导致统计结果不符合输入的起止时间要求
  • 额外优化点:4.3为浮点数,多次累加会出现精度问题(如你输出里的55.899999999999984),可以用精度处理方法修正金额显示
修复后代码
parameters: toDate=2020-10-21&fromDate=2021-11-21

const resturantOrders = await DelivigoOrder.findAll({
  attributes: [
    "Id",
    "OrderNumber",
    "OrderStatusId",
    "TotalPrice",
    "OrderAcceptTime",
    "DriverId",
    "ResturentId"
  ],
  where: {
    DriverId: driverId,
    IsActive: true,
    // 恢复时间范围过滤
    OrderAcceptTime: { [Op.between]: [fromDate, toDate] },
    $or: [
      { OrderStatusId: 50 },
      { OrderStatusId: 55 },
      { OrderStatusId: 60 },
      { OrderStatusId: 70 },
      { OrderStatusId: 80 },
    ],
  },
});

// 去掉月份名末尾的多余空格
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

var orderPayouts = [];
for (let monthIndex = 0; monthIndex < months.length; monthIndex++) {
  const currentMonth = months[monthIndex];
  // 每个月计算前重置报酬为0
  let payout = 0;

  // 内层循环改名避免变量冲突
  for (let orderIndex = 0; orderIndex < resturantOrders.length; orderIndex++) {
    const order = resturantOrders[orderIndex];
    if (currentMonth === InternalServices.getMonthName(order.OrderAcceptTime)) {
      console.log(currentMonth, orderIndex, "in");
      payout = payout + 4.3;
    }
  }

  orderPayouts.push({
    month: currentMonth,
    // 处理浮点数精度问题,保留2位小数
    payout: Number(payout.toFixed(2))
  });
};

内容的提问来源于stack exchange,提问作者ADEEL FAROOQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:54:04