fix: 优化围度数据计算逻辑

This commit is contained in:
richarjiang
2025-09-24 18:03:32 +08:00
parent c9eda4577f
commit 21b00cee0d

View File

@@ -2436,13 +2436,14 @@ export class UsersService {
break; break;
} }
// 获取时间范围内的所有围度数据 // 获取从开始日期到数据点最大时间的所有围度数据
const maxDataPointDate = dataPoints.reduce((max, date) => date > max ? date : max, startDate);
const measurements = await this.userBodyMeasurementHistoryModel.findAll({ const measurements = await this.userBodyMeasurementHistoryModel.findAll({
where: { where: {
userId, userId,
createdAt: { createdAt: {
[Op.gte]: startDate, [Op.gte]: startDate,
[Op.lte]: now, [Op.lte]: maxDataPointDate,
}, },
}, },
order: [['createdAt', 'ASC']], order: [['createdAt', 'ASC']],
@@ -2462,11 +2463,11 @@ export class UsersService {
}; };
}); });
// 为每个数据点找到最接近的围度数据 // 为每个数据点找到最的围度数据
analysisData.forEach((point, index) => { analysisData.forEach((point, index) => {
const targetDate = dataPoints[index]; const targetDate = dataPoints[index];
// 为每种围度类型找到最接近目标日期 // 为每种围度类型找到目标日期为止的最新
Object.values(BodyMeasurementType).forEach(measurementType => { Object.values(BodyMeasurementType).forEach(measurementType => {
const relevantMeasurements = measurements.filter(m => const relevantMeasurements = measurements.filter(m =>
m.measurementType === measurementType && m.measurementType === measurementType &&
@@ -2474,8 +2475,8 @@ export class UsersService {
); );
if (relevantMeasurements.length > 0) { if (relevantMeasurements.length > 0) {
// 取最接近目标日期的最新记录 // 取时间最新的记录(离目标日期最近且不超过目标日期的最新记录
const closestMeasurement = relevantMeasurements const latestMeasurement = relevantMeasurements
.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())[0]; .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())[0];
// 将数据库字段映射到响应字段 // 将数据库字段映射到响应字段
@@ -2490,7 +2491,7 @@ export class UsersService {
const fieldName = fieldMapping[measurementType]; const fieldName = fieldMapping[measurementType];
if (fieldName) { if (fieldName) {
point[fieldName] = closestMeasurement.value; point[fieldName] = latestMeasurement.value;
} }
} }
}); });