|
|
@ -180,6 +180,7 @@ const CommonUtil = {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
assembleSleepData(sleepArray) {
|
|
|
|
assembleSleepData(sleepArray) {
|
|
|
|
let compareDate = sleepArray[0].yyyyMMdd; // 获取第一个数据的时间作为比对时间
|
|
|
|
let compareDate = sleepArray[0].yyyyMMdd; // 获取第一个数据的时间作为比对时间
|
|
|
|
|
|
|
|
let compareMinute = sleepArray[0].minute;
|
|
|
|
let res = []; // 存放最终结果
|
|
|
|
let res = []; // 存放最终结果
|
|
|
|
let resItem = { // 每天的睡眠数据对象
|
|
|
|
let resItem = { // 每天的睡眠数据对象
|
|
|
|
date: '',
|
|
|
|
date: '',
|
|
|
@ -192,7 +193,7 @@ const CommonUtil = {
|
|
|
|
resItem.sleepList.push(firstSleepData); // 将第一个数据放入到 `sleepList`
|
|
|
|
resItem.sleepList.push(firstSleepData); // 将第一个数据放入到 `sleepList`
|
|
|
|
sleepArray.forEach((item,index) => {
|
|
|
|
sleepArray.forEach((item,index) => {
|
|
|
|
// 判断是否是同一天的数据
|
|
|
|
// 判断是否是同一天的数据
|
|
|
|
let isSameDay = this.timeComparison(compareDate, item.yyyyMMdd, item.minute);
|
|
|
|
let isSameDay = this.timeComparison(compareDate,compareMinute, item.yyyyMMdd, item.minute);
|
|
|
|
|
|
|
|
|
|
|
|
// 如果状态发生变化,且日期不同,就表示开始新的睡眠数据
|
|
|
|
// 如果状态发生变化,且日期不同,就表示开始新的睡眠数据
|
|
|
|
if (item.status !== firstSleepData.status) {
|
|
|
|
if (item.status !== firstSleepData.status) {
|
|
|
@ -209,6 +210,7 @@ const CommonUtil = {
|
|
|
|
sleepList: [item] // 将当前项作为新的睡眠数据开始
|
|
|
|
sleepList: [item] // 将当前项作为新的睡眠数据开始
|
|
|
|
};
|
|
|
|
};
|
|
|
|
compareDate = item.yyyyMMdd; // 更新对比日期,用于比对后续数据
|
|
|
|
compareDate = item.yyyyMMdd; // 更新对比日期,用于比对后续数据
|
|
|
|
|
|
|
|
compareMinute = item.minute;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
firstSleepData = item; // 更新当前比对的睡眠数据
|
|
|
|
firstSleepData = item; // 更新当前比对的睡眠数据
|
|
|
@ -230,19 +232,38 @@ const CommonUtil = {
|
|
|
|
* 计算出一天的时间范围
|
|
|
|
* 计算出一天的时间范围
|
|
|
|
* @param {对比日期} compareDate
|
|
|
|
* @param {对比日期} compareDate
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
getDayTimeRange(compareDate) {
|
|
|
|
getDayTimeRange(compareDate,compareMinute) {
|
|
|
|
// 将 "YYYYMMDD" 格式的日期转换为 "YYYY-MM-DD" 格式,方便解析
|
|
|
|
// 将 "YYYYMMDD" 格式的日期转换为 "YYYY-MM-DD" 格式,方便解析
|
|
|
|
const formattedDateStr = compareDate.replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3');
|
|
|
|
const formattedDateStr = compareDate.replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3');
|
|
|
|
// 创建目标日期对象
|
|
|
|
// 创建目标日期对象
|
|
|
|
const date = new Date(formattedDateStr); // 例如:2024-12-12
|
|
|
|
// const date = new Date(formattedDateStr); // 例如:2024-12-12
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取对比日期的Date,前一天的20:00:00
|
|
|
|
|
|
|
|
// const prevDayStart = new Date(date);
|
|
|
|
|
|
|
|
// prevDayStart.setDate(date.getDate() - 1); //设置为前一天
|
|
|
|
|
|
|
|
// prevDayStart.setHours(20, 0, 0, 0); // 设置为20:00:00
|
|
|
|
|
|
|
|
// // 获取对比日期的Date,后一天的10:00:00
|
|
|
|
|
|
|
|
// const nextDayEnd = new Date(date);
|
|
|
|
|
|
|
|
// nextDayEnd.setDate(date.getDate()); // 设置为后一天
|
|
|
|
|
|
|
|
// nextDayEnd.setHours(10, 0, 0, 0); // 设置为10:00:00
|
|
|
|
|
|
|
|
|
|
|
|
// 获取对比日期的Date,前一天的20:00:00
|
|
|
|
// 获取对比日期的Date,前一天的20:00:00
|
|
|
|
const prevDayStart = new Date(date);
|
|
|
|
const date1 = new Date(formattedDateStr)
|
|
|
|
prevDayStart.setDate(date.getDate() - 1); //设置为前一天
|
|
|
|
const date2 = new Date(formattedDateStr)
|
|
|
|
|
|
|
|
const prevDayStart = new Date(date1);
|
|
|
|
|
|
|
|
if(this.isEveningTime(compareMinute)){
|
|
|
|
|
|
|
|
prevDayStart.setDate(date1.getDate());
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
prevDayStart.setDate(date1.getDate() - 1);
|
|
|
|
|
|
|
|
}
|
|
|
|
prevDayStart.setHours(20, 0, 0, 0); // 设置为20:00:00
|
|
|
|
prevDayStart.setHours(20, 0, 0, 0); // 设置为20:00:00
|
|
|
|
// 获取对比日期的Date,后一天的10:00:00
|
|
|
|
// 获取对比日期的Date,后一天的10:00:00
|
|
|
|
const nextDayEnd = new Date(date);
|
|
|
|
const nextDayEnd = new Date(date2);
|
|
|
|
nextDayEnd.setDate(date.getDate()); // 设置为后一天
|
|
|
|
if(this.isEveningTime(compareMinute)){
|
|
|
|
|
|
|
|
nextDayEnd.setDate(date2.getDate() + 1);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
nextDayEnd.setDate(date2.getDate());
|
|
|
|
|
|
|
|
}
|
|
|
|
nextDayEnd.setHours(10, 0, 0, 0); // 设置为10:00:00
|
|
|
|
nextDayEnd.setHours(10, 0, 0, 0); // 设置为10:00:00
|
|
|
|
|
|
|
|
|
|
|
|
// 返回时间戳
|
|
|
|
// 返回时间戳
|
|
|
@ -251,8 +272,13 @@ const CommonUtil = {
|
|
|
|
endTimestamp: nextDayEnd.getTime() // 转换为10位时间戳
|
|
|
|
endTimestamp: nextDayEnd.getTime() // 转换为10位时间戳
|
|
|
|
};
|
|
|
|
};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 判断是否是晚上的20:00~00:00点
|
|
|
|
|
|
|
|
* @param {*} minute
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
isEveningTime(minute){
|
|
|
|
|
|
|
|
return minute < 1440 && minute > 1200;
|
|
|
|
|
|
|
|
},
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param {日期} dateStr
|
|
|
|
* @param {日期} dateStr
|
|
|
@ -281,9 +307,9 @@ const CommonUtil = {
|
|
|
|
* @param {分钟} minute
|
|
|
|
* @param {分钟} minute
|
|
|
|
* @param {比较值} comparisonValue
|
|
|
|
* @param {比较值} comparisonValue
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
timeComparison(compareDate,comparisonValue,minute){
|
|
|
|
timeComparison(compareDate,compareMinute,comparisonValue,minute){
|
|
|
|
|
|
|
|
|
|
|
|
let dateRange = this.getDayTimeRange(compareDate);
|
|
|
|
let dateRange = this.getDayTimeRange(compareDate,compareMinute);
|
|
|
|
let time = this.getTimestampFromDateAndMinutes(comparisonValue,minute);
|
|
|
|
let time = this.getTimestampFromDateAndMinutes(comparisonValue,minute);
|
|
|
|
if(time >= dateRange.startTimestamp && time <= dateRange.endTimestamp){
|
|
|
|
if(time >= dateRange.startTimestamp && time <= dateRange.endTimestamp){
|
|
|
|
// 在范围内,是同一天睡眠
|
|
|
|
// 在范围内,是同一天睡眠
|
|
|
@ -295,26 +321,17 @@ const CommonUtil = {
|
|
|
|
sortSleep(data){
|
|
|
|
sortSleep(data){
|
|
|
|
data.forEach((item) =>{
|
|
|
|
data.forEach((item) =>{
|
|
|
|
// 排序算法
|
|
|
|
// 排序算法
|
|
|
|
item.sleepList.sort((a, b) => {
|
|
|
|
// item.sleepList.sort((a, b) => {
|
|
|
|
// 先比较 yyyyMMdd
|
|
|
|
// // 先比较 yyyyMMdd
|
|
|
|
if (a.yyyyMMdd !== b.yyyyMMdd) {
|
|
|
|
// if (a.yyyyMMdd !== b.yyyyMMdd) {
|
|
|
|
return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
|
|
|
|
// return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
// 再比较 minute
|
|
|
|
// // 再比较 minute
|
|
|
|
return a.minute - b.minute;
|
|
|
|
// return a.minute - b.minute;
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
// 因为后端的接口处理方式为如果第一个数据为清醒,不会作为睡眠时间,故将第一个数据作为浅睡
|
|
|
|
// 因为后端的接口处理方式为如果第一个数据为清醒,不会作为睡眠时间,故将第一个数据作为浅睡
|
|
|
|
item.sleepList[0].status = 1
|
|
|
|
item.sleepList[0].status = 1
|
|
|
|
// 获取最后一个对象
|
|
|
|
item.date = item.sleepList[item.sleepList.length - 1].yyyyMMdd
|
|
|
|
// const lastItem = item.sleepList[item.sleepList.length - 1];
|
|
|
|
|
|
|
|
// // 创建新对象并插入到最后
|
|
|
|
|
|
|
|
// if (lastItem) {
|
|
|
|
|
|
|
|
// const newObject = {
|
|
|
|
|
|
|
|
// ...lastItem, // 复制最后一个对象的内容
|
|
|
|
|
|
|
|
// minute: lastItem.minute + 1 // minute 加 1
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
// item.sleepList.push(newObject); // 插入到最后
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
})
|
|
|
|
})
|
|
|
|
return data;
|
|
|
|
return data;
|
|
|
|
},
|
|
|
|
},
|
|
|
@ -324,6 +341,16 @@ const CommonUtil = {
|
|
|
|
* @param {补全数据} data
|
|
|
|
* @param {补全数据} data
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
completeMissingData(data){
|
|
|
|
completeMissingData(data){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data.sort((a, b) => {
|
|
|
|
|
|
|
|
// 先比较 yyyyMMdd
|
|
|
|
|
|
|
|
if (a.yyyyMMdd !== b.yyyyMMdd) {
|
|
|
|
|
|
|
|
return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 再比较 minute
|
|
|
|
|
|
|
|
return a.minute - b.minute;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
let result = []; // 存放最终结果
|
|
|
|
let result = []; // 存放最终结果
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
@ -333,7 +360,7 @@ const CommonUtil = {
|
|
|
|
if (i < data.length - 1) {
|
|
|
|
if (i < data.length - 1) {
|
|
|
|
let currentMinute = data[i].minute;
|
|
|
|
let currentMinute = data[i].minute;
|
|
|
|
let nextMinute = data[i + 1].minute;
|
|
|
|
let nextMinute = data[i + 1].minute;
|
|
|
|
if(data[i].yyyyMMdd == data[i + 1].yyyyMMdd){
|
|
|
|
if(data[i].yyyyMMdd == data[i + 1].yyyyMMdd && nextMinute - currentMinute < 600){
|
|
|
|
// 如果不连续,补全缺失的数据
|
|
|
|
// 如果不连续,补全缺失的数据
|
|
|
|
if (nextMinute > currentMinute + 1) {
|
|
|
|
if (nextMinute > currentMinute + 1) {
|
|
|
|
for (let j = currentMinute + 1; j < nextMinute; j++) {
|
|
|
|
for (let j = currentMinute + 1; j < nextMinute; j++) {
|
|
|
@ -348,14 +375,7 @@ const CommonUtil = {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// result.sort((a, b) => {
|
|
|
|
|
|
|
|
// // 先比较 yyyyMMdd
|
|
|
|
|
|
|
|
// if (a.yyyyMMdd !== b.yyyyMMdd) {
|
|
|
|
|
|
|
|
// return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 再比较 minute
|
|
|
|
|
|
|
|
// return a.minute - b.minute;
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|