睡眠优化

main
sjchen 5 months ago
parent 2a43fb43dc
commit 784a267d08

@ -76,13 +76,12 @@ Page({
// 遍历并连接符合条件的设备
targetDevices.forEach(device => {
console.log("找到符合规则的蓝牙设备:", device);
console.log("device.advertisData:",new Uint8Array(device.advertisData))
const hexStr = this.uint8ArrayToMac(new Uint8Array(device.advertisData))
const hexStr = this.uint8ArrayToMac(new Uint8Array(device.advertisData));
console.log("advertisData: ",hexStr)
// 连接指定设备
// if(device.deviceId=="03:02:02:07:65:98"){
if(device.deviceId=="03:02:02:07:5F:AF"){
// if(device.deviceId=="03:02:02:07:5E:BE"){
// if(device.deviceId=="03:02:02:07:5F:AF"){
if(device.deviceId=="03:02:02:07:5E:BE"){
this.connectToDevice(device.deviceId);
}
});
@ -299,27 +298,18 @@ Page({
let list = this.data.sleepList;
if(list.length > 0){
let arr = CommonUtil.assembleSleepData(list);
arr.forEach((item,index) =>{
// 排序算法
item.sleepList.sort((a, b) => {
// 先比较 yyyyMMdd
if (a.yyyyMMdd !== b.yyyyMMdd) {
return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
}
// 再比较 minute
return a.minute - b.minute;
});
item.sleepList[index].minute = item.sleepList[index].minute -1;
item.sleepList[index].status = 1
})
console.log("接口需要的睡眠数据:",arr);
// 更新缓存
HealthDataCache.updateSleepData(list[0].date);
console.log("list:",list)
// 补全数据
let completeList = CommonUtil.completeMissingData(list);
console.log("completeList:",completeList)
// 组装数据
let arr = CommonUtil.assembleSleepData(completeList);
// 组装后数据进行排序
let result = CommonUtil.sortSleep(arr);
console.log("接口需要的睡眠数据:",result);
// // 更新缓存
// HealthDataCache.updateSleepData(list[0].date);
// 调用接口传睡眠后,清空数据
this.setData({
sleepList: []

@ -179,7 +179,8 @@ const CommonUtil = {
* 组装睡眠数据
*/
assembleSleepData(sleepArray) {
let dateObj = sleepArray[0]; // 获取第一个数据作为比对的时间
console.log("sleepArray:",sleepArray)
let compareDate = sleepArray[0].yyyyMMdd; // 获取第一个数据的时间作为比对时间
let res = []; // 存放最终结果
let resItem = { // 每天的睡眠数据对象
date: '',
@ -192,12 +193,11 @@ const CommonUtil = {
resItem.sleepList.push(firstSleepData); // 将第一个数据放入到 `sleepList`
sleepArray.forEach((item,index) => {
// 判断是否是同一天的数据
let isSameDay = this.timeComparison(dateObj.yyyyMMdd, item.yyyyMMdd, item.minute);
let isSameDay = this.timeComparison(compareDate, item.yyyyMMdd, item.minute);
// 如果状态发生变化,且日期不同,就表示开始新的睡眠数据
if (item.status !== firstSleepData.status) {
if (isSameDay) {
resItem.sleepList.push(item); // 如果是同一天,继续添加到当天的睡眠数据
resItem.sleepList.push(item);
} else {
// 取出数据
resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[index - 1];
@ -206,7 +206,7 @@ const CommonUtil = {
date: item.yyyyMMdd,
sleepList: [item] // 将当前项作为新的睡眠数据开始
};
dateObj = item; // 更新 `dateObj`,用于比对后续数据
compareDate = item.yyyyMMdd; // 更新对比日期,用于比对后续数据
}
}
firstSleepData = item; // 更新当前比对的睡眠数据
@ -214,6 +214,7 @@ const CommonUtil = {
// 最后一次的睡眠数据也需要被加入到 `res`
if (resItem.sleepList.length > 0) {
// 这里要把最后一条数据set作为起床时间否则起床时间会不对
resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[sleepArray.length - 1];
res.push(resItem);
}
@ -287,8 +288,64 @@ const CommonUtil = {
return true;
}
return false;
},
sortSleep(data){
data.forEach((item) =>{
// 排序算法
item.sleepList.sort((a, b) => {
// 先比较 yyyyMMdd
if (a.yyyyMMdd !== b.yyyyMMdd) {
return a.yyyyMMdd.localeCompare(b.yyyyMMdd);
}
// 再比较 minute
return a.minute - b.minute;
});
item.sleepList[0].status = 1
// 获取最后一个对象
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;
},
/**
*
* @param {补全数据} data
*/
completeMissingData(data){
let result = []; // 存放最终结果
for (let i = 0; i < data.length; i++) {
result.push(data[i]); // 先将当前数据加入结果集
// 如果当前数据不是最后一个,检查与下一个数据的 minute 是否连续
if (i < data.length - 1) {
let currentMinute = data[i].minute;
let nextMinute = data[i + 1].minute;
if(data[i].yyyyMMdd == data[i + 1].yyyyMMdd){
// 如果不连续,补全缺失的数据
if (nextMinute > currentMinute + 1) {
for (let j = currentMinute + 1; j < nextMinute; j++) {
result.push({
minute: j, // 补全的 minute
status: 3, // 沿用当前数据的 status
yyyyMMdd: data[i].yyyyMMdd // 沿用当前数据的日期
});
}
}
}
}
}
return result;
}
}

@ -35,14 +35,13 @@ const parseDataPacket = {
*/
mapSleepStatus(status) {
switch (status) {
case 1:
case 0:
return 1; // 浅睡
case 1:
return 2; // 深睡
case 2:
return 1; // 浅睡
case 3:
return 2; // 深睡
// case 3:
// return 4; // REM
return 4; // 快速眼动
case 4:
default:
return 3; // 清醒
@ -346,8 +345,8 @@ const parseDataPacket = {
// 获取当天00:00:00的时间戳
const midnight = this.dateFormat(year,month,day,0,0,0);
let startMinutesOfDay = Math.floor((time - midnight) / 60); // 计算从当天00:00:00开始到当前时间的分钟数
console.log("midnight:",midnight)
console.log("startMinutesOfDay:",startMinutesOfDay)
console.log("当天的0点0分0秒:",midnight)
console.log("几点几分的睡眠数据:",startMinutesOfDay)
// 1天最后1分钟是1440
let maxLastminute = 1440;
@ -365,7 +364,7 @@ const parseDataPacket = {
const status = firstPart[i];
// 处理每分钟的睡眠数据
result.push({
minute: currentMinute + 1, // 分钟递增
minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd
});
@ -379,7 +378,7 @@ const parseDataPacket = {
const status = secondPart[i];
// 处理每分钟的睡眠数据
result.push({
minute: currentMinute + 1, // 分钟递增
minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd
@ -393,17 +392,15 @@ const parseDataPacket = {
// 开始循环遍历 sleepData 数据
for (let i = 0; i < sleepData.length; i++) {
const status = sleepData[i];
let m = currentMinute + 1
let m = currentMinute;
if(m > 660 && m < 1200){
break;
}
// 处理每分钟的睡眠数据
result.push({
minute: currentMinute + 1, // 分钟递增
minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd
// dateTime: `${parseInt(year)}-${month}-${day} ${hour}:${minute}:${second}`, // 格式化为yyyyMMdd
// time: time
});
// 递增分钟数

Loading…
Cancel
Save