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
相关产品推荐
相关产品推荐

