diff --git a/index/index.js b/index/index.js index c8d73df..2fed51c 100644 --- a/index/index.js +++ b/index/index.js @@ -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: [] diff --git a/utils/CommonUtil.js b/utils/CommonUtil.js index 43d90a9..8f51028 100644 --- a/utils/CommonUtil.js +++ b/utils/CommonUtil.js @@ -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; + } } diff --git a/utils/ParseDataPacket.js b/utils/ParseDataPacket.js index cb39597..81273a5 100644 --- a/utils/ParseDataPacket.js +++ b/utils/ParseDataPacket.js @@ -35,14 +35,13 @@ const parseDataPacket = { */ mapSleepStatus(status) { switch (status) { - case 1: - case 0: - return 1; // 浅睡 - case 2: + case 0: + 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 }); // 递增分钟数