睡眠优化

main
sjchen 5 months ago
parent 2a43fb43dc
commit 784a267d08

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

@ -179,7 +179,8 @@ const CommonUtil = {
* 组装睡眠数据 * 组装睡眠数据
*/ */
assembleSleepData(sleepArray) { assembleSleepData(sleepArray) {
let dateObj = sleepArray[0]; // 获取第一个数据作为比对的时间 console.log("sleepArray:",sleepArray)
let compareDate = sleepArray[0].yyyyMMdd; // 获取第一个数据的时间作为比对时间
let res = []; // 存放最终结果 let res = []; // 存放最终结果
let resItem = { // 每天的睡眠数据对象 let resItem = { // 每天的睡眠数据对象
date: '', date: '',
@ -192,12 +193,11 @@ const CommonUtil = {
resItem.sleepList.push(firstSleepData); // 将第一个数据放入到 `sleepList` resItem.sleepList.push(firstSleepData); // 将第一个数据放入到 `sleepList`
sleepArray.forEach((item,index) => { 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 (item.status !== firstSleepData.status) {
if (isSameDay) { if (isSameDay) {
resItem.sleepList.push(item); // 如果是同一天,继续添加到当天的睡眠数据 resItem.sleepList.push(item);
} else { } else {
// 取出数据 // 取出数据
resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[index - 1]; resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[index - 1];
@ -206,7 +206,7 @@ const CommonUtil = {
date: item.yyyyMMdd, date: item.yyyyMMdd,
sleepList: [item] // 将当前项作为新的睡眠数据开始 sleepList: [item] // 将当前项作为新的睡眠数据开始
}; };
dateObj = item; // 更新 `dateObj`,用于比对后续数据 compareDate = item.yyyyMMdd; // 更新对比日期,用于比对后续数据
} }
} }
firstSleepData = item; // 更新当前比对的睡眠数据 firstSleepData = item; // 更新当前比对的睡眠数据
@ -214,6 +214,7 @@ const CommonUtil = {
// 最后一次的睡眠数据也需要被加入到 `res` // 最后一次的睡眠数据也需要被加入到 `res`
if (resItem.sleepList.length > 0) { if (resItem.sleepList.length > 0) {
// 这里要把最后一条数据set作为起床时间否则起床时间会不对
resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[sleepArray.length - 1]; resItem.sleepList[resItem.sleepList.length - 1] = sleepArray[sleepArray.length - 1];
res.push(resItem); res.push(resItem);
} }
@ -287,8 +288,64 @@ const CommonUtil = {
return true; return true;
} }
return false; 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) { mapSleepStatus(status) {
switch (status) { switch (status) {
case 1:
case 0: case 0:
return 1; // 浅睡 case 1:
return 2; // 深睡
case 2: case 2:
return 1; // 浅睡
case 3: case 3:
return 2; // 深睡 return 4; // 快速眼动
// case 3:
// return 4; // REM
case 4: case 4:
default: default:
return 3; // 清醒 return 3; // 清醒
@ -346,8 +345,8 @@ const parseDataPacket = {
// 获取当天00:00:00的时间戳 // 获取当天00:00:00的时间戳
const midnight = this.dateFormat(year,month,day,0,0,0); const midnight = this.dateFormat(year,month,day,0,0,0);
let startMinutesOfDay = Math.floor((time - midnight) / 60); // 计算从当天00:00:00开始到当前时间的分钟数 let startMinutesOfDay = Math.floor((time - midnight) / 60); // 计算从当天00:00:00开始到当前时间的分钟数
console.log("midnight:",midnight) console.log("当天的0点0分0秒:",midnight)
console.log("startMinutesOfDay:",startMinutesOfDay) console.log("几点几分的睡眠数据:",startMinutesOfDay)
// 1天最后1分钟是1440 // 1天最后1分钟是1440
let maxLastminute = 1440; let maxLastminute = 1440;
@ -365,7 +364,7 @@ const parseDataPacket = {
const status = firstPart[i]; const status = firstPart[i];
// 处理每分钟的睡眠数据 // 处理每分钟的睡眠数据
result.push({ result.push({
minute: currentMinute + 1, // 分钟递增 minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态 status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd
}); });
@ -379,7 +378,7 @@ const parseDataPacket = {
const status = secondPart[i]; const status = secondPart[i];
// 处理每分钟的睡眠数据 // 处理每分钟的睡眠数据
result.push({ result.push({
minute: currentMinute + 1, // 分钟递增 minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态 status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd
@ -393,17 +392,15 @@ const parseDataPacket = {
// 开始循环遍历 sleepData 数据 // 开始循环遍历 sleepData 数据
for (let i = 0; i < sleepData.length; i++) { for (let i = 0; i < sleepData.length; i++) {
const status = sleepData[i]; const status = sleepData[i];
let m = currentMinute + 1 let m = currentMinute;
if(m > 660 && m < 1200){ if(m > 660 && m < 1200){
break; break;
} }
// 处理每分钟的睡眠数据 // 处理每分钟的睡眠数据
result.push({ result.push({
minute: currentMinute + 1, // 分钟递增 minute: currentMinute, // 分钟递增
status: this.mapSleepStatus(status), // 映射睡眠状态 status: this.mapSleepStatus(status), // 映射睡眠状态
yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd yyyyMMdd: `${parseInt(year) + 2000}${month}${day}`, // 格式化为yyyyMMdd
// dateTime: `${parseInt(year)}-${month}-${day} ${hour}:${minute}:${second}`, // 格式化为yyyyMMdd
// time: time
}); });
// 递增分钟数 // 递增分钟数

Loading…
Cancel
Save