data.js 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027
  1. import * as echarts from '../../ec-canvas/echarts';
  2. // 渐变圆环
  3. let chartCircularProgressBar;//圈圈
  4. let chartOutOfBed;//离床
  5. let chartBodyMovementsLine;//体动
  6. let chartCardiacSystemLine;//心脏系统
  7. let chartRespiratoryLine;//平均呼吸率
  8. let chartSnoringLine;//打鼾
  9. let chartApneaLine;//呼吸暂停
  10. let chartTimeWaterfall;//深浅睡眠
  11. // 圈圈>90分极好(绿色)
  12. // > 75分,(浅绿色)良好
  13. // 各项睡眠监测数据统计 > 60分,较差(黄色)
  14. // < 60分,很差(红色)
  15. function setChartCircularProgressBarOption(chart, data = {}) {
  16. var rscore_value = data?.rscore_value || 0;
  17. var checkList = [{
  18. title: "极好",
  19. titleColor: "#0BC3AA",
  20. startColor: "#0AB1C3",
  21. centerColor: "#0BC3AA",
  22. endColor: "#36E1CA",
  23. }, {
  24. title: "良好",
  25. titleColor: "#9C43FF",
  26. startColor: "#8D25FF",
  27. centerColor: "#A631FF",
  28. endColor: "#FF8FF0",
  29. }, {
  30. title: "较差",
  31. titleColor: "#FF8F4E",
  32. startColor: "#EE8B52",
  33. centerColor: "#FAA472",
  34. endColor: "#FAA472",
  35. }, {
  36. title: "很差",
  37. titleColor: "#FB717B",
  38. startColor: "#FB717B",
  39. centerColor: "#FB717B",
  40. endColor: "#FF98A0",
  41. }];
  42. var checkData = checkList[0];
  43. if (rscore_value >= 90 && rscore_value <= 100) {
  44. checkData = checkList[0];
  45. } else if (rscore_value >= 75 && rscore_value < 90) {
  46. checkData = checkList[1];
  47. } else if (rscore_value >= 60 && rscore_value < 75) {
  48. checkData = checkList[2];
  49. } else {
  50. checkData = checkList[3];
  51. }
  52. var option = {
  53. series: [
  54. {
  55. type: 'gauge',
  56. startAngle: -270,
  57. endAngle: 90,
  58. legendHoverLink: true,
  59. min: 0,
  60. max: 100,
  61. itemStyle: {
  62. color: '#58D9F9',
  63. shadowColor: 'rgba(0,138,255,0.45)',
  64. shadowBlur: 5,
  65. shadowOffsetX: 1,
  66. shadowOffsetY: 1
  67. },
  68. progress: {
  69. show: true,
  70. roundCap: true,
  71. width: 10,
  72. itemStyle: {
  73. // 进度条样式
  74. color: {
  75. // 自定义渐变色
  76. type: 'linear',
  77. x: 0.75,
  78. y: 0.75,
  79. x2: 0,
  80. y2: 0.75,
  81. colorStops: [
  82. {
  83. offset: 0,
  84. color: checkData.startColor // 0% 处的颜色
  85. },
  86. {
  87. offset: 0.5,
  88. color: checkData.centerColor // 100% 处的颜色
  89. },
  90. {
  91. offset: 1,
  92. color: checkData.endColor // 100% 处的颜色
  93. }
  94. ],
  95. global: false // 缺省为 false
  96. }
  97. }
  98. },
  99. pointer: {
  100. show: false,
  101. },
  102. axisLine: {
  103. roundCap: true,
  104. lineStyle: {
  105. width: 10,
  106. }
  107. },
  108. axisTick: {
  109. show: false // 是否显示分隔线
  110. },
  111. splitLine: {
  112. show: false // 是否显示分隔线
  113. },
  114. axisLabel: {
  115. show: false,
  116. },
  117. title: {
  118. color: checkData.titleColor,
  119. offsetCenter: [0, '-36%'],
  120. lineHeight: 15,
  121. fontSize: 15,
  122. },
  123. detail: {
  124. backgroundColor: '#fff',
  125. width: '60%',
  126. lineHeight: 40,
  127. height: 40,
  128. color: '#333333',
  129. offsetCenter: [0, "24%"],
  130. valueAnimation: true,
  131. formatter: function (value) {
  132. return '{value|' + value.toFixed(0) + '}';
  133. },
  134. rich: {
  135. value: {
  136. fontSize: 30,
  137. fontWeight: 'bolder',
  138. color: checkData.titleColor
  139. },
  140. }
  141. },
  142. data: [
  143. {
  144. name: data?.rscore_desc || checkData.title || '无',
  145. value: data?.rscore_value || 0
  146. }
  147. ]
  148. }
  149. ]
  150. };
  151. chart.setOption(option, true);
  152. }
  153. function initChartHumidifier(canvas, width, height, dpr) {
  154. // this.selectComponent('#mychart-dom-bar00').init((canvas, width, height, dpr) => {
  155. // 获取组件的 canvas、width、height 后的回调函数
  156. // 在这里初始化图表
  157. const chart = echarts.init(canvas, null, {
  158. width: width,
  159. height: height,
  160. devicePixelRatio: dpr // new
  161. });
  162. canvas.setChart(chart);
  163. setChartCircularProgressBarOption(chart);
  164. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  165. chartCircularProgressBar = chart;
  166. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  167. return chart;
  168. // });
  169. };
  170. function updateChartCircularProgressBarOption(rscore_desc, rscore_value, that) {
  171. if (chartCircularProgressBar) {
  172. setChartCircularProgressBarOption(chartCircularProgressBar, { rscore_desc, rscore_value });
  173. } else {
  174. that.selectComponent('#mychart-dom-CircularProgressBar').init((canvas, width, height, dpr) => {
  175. const chart = echarts.init(canvas, null, {
  176. width: width,
  177. height: height,
  178. devicePixelRatio: dpr // new
  179. });
  180. canvas.setChart(chart);
  181. setChartCircularProgressBarOption(chart, { rscore_desc, rscore_value });
  182. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  183. chartCircularProgressBar = chart;
  184. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  185. return chart;
  186. });
  187. }
  188. }
  189. //离床
  190. function initChartOutOfBed(canvas, width, height, dpr) {
  191. // this.selectComponent('#mychart-dom-bar00').init((canvas, width, height, dpr) => {
  192. // 获取组件的 canvas、width、height 后的回调函数
  193. // 在这里初始化图表
  194. const chart = echarts.init(canvas, null, {
  195. width: width,
  196. height: height,
  197. devicePixelRatio: dpr // new
  198. });
  199. canvas.setChart(chart);
  200. setChartOutOfBedOption(chart);
  201. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  202. chartOutOfBed = chart;
  203. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  204. return chart;
  205. // });
  206. };
  207. function setChartOutOfBedOption(chart, data1 = [], data2 = [],) {
  208. var option = option = {
  209. tooltip: {
  210. show: true,
  211. trigger: 'axis',
  212. formatter: function (param) {
  213. return `${param[0] && param[0].value == 1 ? '在床' : '离床'}`
  214. }
  215. },
  216. dataZoom: [
  217. { // 第一个 dataZoom 组件
  218. type: 'inside',
  219. },
  220. ],
  221. grid: {
  222. top: '40rpx',
  223. left: 0,
  224. right: '20rpx',
  225. bottom: 0,
  226. containLabel: true
  227. },
  228. xAxis: {
  229. type: 'category',
  230. axisLabel: {
  231. color: '#6C6970',// 设置 x 轴标签颜色为白色
  232. fontSize: 10
  233. },
  234. boundaryGap: false,
  235. splitLine: {
  236. show: false, // 是否显示刻度线
  237. },
  238. axisTick: {
  239. // 不显示Y轴刻度线
  240. show: false
  241. },
  242. data: data1,
  243. axisLine: {
  244. // 不显示X轴轴线
  245. show: false
  246. }
  247. },
  248. yAxis: {
  249. // Y 轴配置
  250. type: 'value',
  251. show: false
  252. },
  253. series: [{
  254. type: 'line',
  255. name: '睡眠状态',
  256. smooth: true,
  257. lineStyle: {
  258. width: 2,
  259. color: '#54C68B'
  260. },
  261. showSymbol: false,
  262. areaStyle: {
  263. opacity: 0.8,
  264. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  265. {
  266. offset: 0,
  267. color: '#B8EBD0'
  268. },
  269. {
  270. offset: 1,
  271. color: 'rgba(255, 255, 255, 0)'
  272. }
  273. ])
  274. },
  275. data: data2,
  276. }]
  277. };
  278. chart.setOption(option, true);
  279. }
  280. function updateOutOfBed(data1, data2, startSleepTime, endSleepTime, that) {
  281. if (chartOutOfBed) {
  282. setChartOutOfBedOption(chartOutOfBed, data1, data2);
  283. } else {
  284. that.selectComponent('#chartOutOfBed-dom').init((canvas, width, height, dpr) => {
  285. const chart = echarts.init(canvas, null, {
  286. width: width,
  287. height: height,
  288. devicePixelRatio: dpr // new
  289. });
  290. canvas.setChart(chart);
  291. setChartOutOfBedOption(chart, data1, data2);
  292. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  293. chartOutOfBed = chart;
  294. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  295. return chart;
  296. });
  297. }
  298. }
  299. //体动
  300. function initChartBodyMovementsLine(canvas, width, height, dpr) {
  301. // 在这里初始化图表
  302. const chart = echarts.init(canvas, null, {
  303. width: width,
  304. height: height,
  305. devicePixelRatio: dpr // new
  306. });
  307. canvas.setChart(chart);
  308. setBodyMovementsOption(chart);
  309. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  310. chartBodyMovementsLine = chart;
  311. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  312. return chart;
  313. };
  314. function setBodyMovementsOption(chart, data1 = [], data2 = [],) {
  315. var option = option = {
  316. tooltip: {
  317. show: true,
  318. trigger: 'axis',
  319. formatter: function (param) {
  320. return `${param[0] && param[0].value == 1 ? '体动' : '否'}`
  321. }
  322. },
  323. dataZoom: [
  324. { // 第一个 dataZoom 组件
  325. type: 'inside',
  326. },
  327. ],
  328. grid: {
  329. top: '40rpx',
  330. left: 0,
  331. right: '20rpx',
  332. bottom: 0,
  333. containLabel: true
  334. },
  335. xAxis: {
  336. type: 'category',
  337. axisLabel: {
  338. color: '#6C6970',// 设置 x 轴标签颜色为白色
  339. fontSize: 10
  340. },
  341. boundaryGap: false,
  342. splitLine: {
  343. show: false, // 是否显示刻度线
  344. },
  345. axisTick: {
  346. // 不显示Y轴刻度线
  347. show: false
  348. },
  349. data: data1,
  350. axisLine: {
  351. // 不显示X轴轴线
  352. show: false
  353. }
  354. },
  355. yAxis: {
  356. // Y 轴配置
  357. type: 'value',
  358. show: false
  359. },
  360. series: [{
  361. name: '睡眠状态',
  362. type: 'line',
  363. smooth: true,
  364. lineStyle: {
  365. width: 2,
  366. color: '#5582FF'
  367. },
  368. showSymbol: false,
  369. areaStyle: {
  370. opacity: 0.8,
  371. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  372. {
  373. offset: 0,
  374. color: 'rgba(85, 130, 255, 0.5)'
  375. },
  376. {
  377. offset: 1,
  378. color: 'rgba(149, 177, 255, 0.3)'
  379. }
  380. ])
  381. },
  382. data: data2,
  383. }]
  384. };
  385. chart.setOption(option, true);
  386. }
  387. function updateBodyMovements(data1, data2, startSleepTime, endSleepTime, that) {
  388. if (chartBodyMovementsLine) {
  389. setBodyMovementsOption(chartBodyMovementsLine, data1, data2);
  390. } else {
  391. that.selectComponent('#chartBodyMovementsLine-dom').init((canvas, width, height, dpr) => {
  392. const chart = echarts.init(canvas, null, {
  393. width: width,
  394. height: height,
  395. devicePixelRatio: dpr // new
  396. });
  397. canvas.setChart(chart);
  398. setBodyMovementsOption(chart, data1, data2);
  399. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  400. chartBodyMovementsLine = chart;
  401. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  402. return chart;
  403. });
  404. }
  405. }
  406. //心脏系统
  407. function initChartCardiacSystemLine(canvas, width, height, dpr) {
  408. // 在这里初始化图表
  409. const chart = echarts.init(canvas, null, {
  410. width: width,
  411. height: height,
  412. devicePixelRatio: dpr // new
  413. });
  414. canvas.setChart(chart);
  415. setCardiacSystemOption(chart);
  416. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  417. chartCardiacSystemLine = chart;
  418. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  419. return chart;
  420. };
  421. function setCardiacSystemOption(chart, data1 = [], data2 = [],) {
  422. var option = option = {
  423. tooltip: {
  424. show: true,
  425. trigger: 'axis',
  426. formatter: function (param) {
  427. return `${(param[0].value || 0) + '次'}`
  428. }
  429. },
  430. dataZoom: [
  431. { // 第一个 dataZoom 组件
  432. type: 'inside',
  433. },
  434. ],
  435. grid: {
  436. top: '20rpx',
  437. left: '20rpx',
  438. right: '20rpx',
  439. bottom: '10rpx',
  440. containLabel: true
  441. },
  442. xAxis: {
  443. type: 'category',
  444. axisLabel: {
  445. color: '#6C6970',// 设置 x 轴标签颜色为白色
  446. fontSize: 10
  447. },
  448. boundaryGap: false,
  449. splitLine: {
  450. show: false, // 是否显示刻度线
  451. },
  452. axisTick: {
  453. // 不显示Y轴刻度线
  454. show: false
  455. },
  456. data: data1,
  457. axisLine: {
  458. // 不显示X轴轴线
  459. show: false
  460. }
  461. },
  462. yAxis: {
  463. type: 'value',
  464. max: 100,
  465. min: 0,
  466. show: true,
  467. offset: 10,
  468. splitLine: {
  469. show: false
  470. },
  471. axisLabel: {
  472. hideOverlap: true,
  473. fontSize: 10,
  474. }
  475. },
  476. series: [{
  477. type: 'line',
  478. smooth: true,
  479. lineStyle: {
  480. width: 2,
  481. color: '#F47893'
  482. },
  483. showSymbol: false,
  484. areaStyle: {
  485. opacity: 0.8,
  486. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  487. {
  488. offset: 0,
  489. color: 'rgba(244, 120, 147, 0.5)'
  490. },
  491. {
  492. offset: 1,
  493. color: 'rgba(250, 140, 164, 0.3)'
  494. }
  495. ])
  496. },
  497. data: data2,
  498. }]
  499. };
  500. chart.setOption(option, true);
  501. }
  502. function updateCardiacSystem(data1, data2, that) {
  503. if (chartCardiacSystemLine) {
  504. setCardiacSystemOption(chartCardiacSystemLine, data1, data2);
  505. } else {
  506. that.selectComponent('#chartCardiacSystemLine-dom').init((canvas, width, height, dpr) => {
  507. const chart = echarts.init(canvas, null, {
  508. width: width,
  509. height: height,
  510. devicePixelRatio: dpr // new
  511. });
  512. canvas.setChart(chart);
  513. setCardiacSystemOption(chart, data1, data2);
  514. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  515. chartBodyMovementsLine = chart;
  516. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  517. return chart;
  518. });
  519. }
  520. }
  521. //平均呼吸率
  522. function initChartRespiratoryLine(canvas, width, height, dpr) {
  523. // 在这里初始化图表
  524. const chart = echarts.init(canvas, null, {
  525. width: width,
  526. height: height,
  527. devicePixelRatio: dpr // new
  528. });
  529. canvas.setChart(chart);
  530. setRespiratoryOption(chart);
  531. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  532. chartRespiratoryLine = chart;
  533. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  534. return chart;
  535. };
  536. function setRespiratoryOption(chart, data1 = [], data2 = [],) {
  537. var option = option = {
  538. tooltip: {
  539. show: true,
  540. trigger: 'axis',
  541. formatter: function (param) {
  542. return `${(param[0].value || 0) + '次'}`
  543. }
  544. },
  545. dataZoom: [
  546. { // 第一个 dataZoom 组件
  547. type: 'inside',
  548. },
  549. ],
  550. grid: {
  551. top: '20rpx',
  552. left: '20rpx',
  553. right: '20rpx',
  554. bottom: '10rpx',
  555. containLabel: true
  556. },
  557. xAxis: {
  558. type: 'category',
  559. axisLabel: {
  560. color: '#6C6970',// 设置 x 轴标签颜色为白色
  561. fontSize: 10
  562. },
  563. boundaryGap: false,
  564. splitLine: {
  565. show: false, // 是否显示刻度线
  566. },
  567. axisTick: {
  568. // 不显示Y轴刻度线
  569. show: false
  570. },
  571. data: data1,
  572. axisLine: {
  573. // 不显示X轴轴线
  574. show: false
  575. }
  576. },
  577. yAxis: {
  578. type: 'value',
  579. max: 24,
  580. min: 0,
  581. show: true,
  582. offset: 10,
  583. splitLine: {
  584. show: false
  585. },
  586. axisLabel: {
  587. hideOverlap: true,
  588. fontSize: 10,
  589. }
  590. },
  591. series: [{
  592. type: 'line',
  593. smooth: true,
  594. lineStyle: {
  595. width: 2,
  596. color: '#06A9AD'
  597. },
  598. showSymbol: false,
  599. areaStyle: {
  600. opacity: 0.8,
  601. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  602. {
  603. offset: 0,
  604. color: 'rgba(186, 246, 231, 1)'
  605. },
  606. {
  607. offset: 1,
  608. color: 'rgba(255, 255, 255, 0)'
  609. }
  610. ])
  611. },
  612. data: data2,
  613. }]
  614. };
  615. chart.setOption(option, true);
  616. }
  617. function updateRespiratory(data1, data2, startSleepTime, endSleepTime, that) {
  618. if (chartRespiratoryLine) {
  619. setRespiratoryOption(chartRespiratoryLine, data1, data2);
  620. } else {
  621. that.selectComponent('#chartRespiratoryLine-dom').init((canvas, width, height, dpr) => {
  622. const chart = echarts.init(canvas, null, {
  623. width: width,
  624. height: height,
  625. devicePixelRatio: dpr // new
  626. });
  627. canvas.setChart(chart);
  628. setRespiratoryOption(chart, data1, data2);
  629. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  630. chartRespiratoryLine = chart;
  631. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  632. return chart;
  633. });
  634. }
  635. }
  636. //打鼾
  637. function initSnoringLine(canvas, width, height, dpr) {
  638. // 在这里初始化图表
  639. const chart = echarts.init(canvas, null, {
  640. width: width,
  641. height: height,
  642. devicePixelRatio: dpr // new
  643. });
  644. canvas.setChart(chart);
  645. setSnoringOption(chart);
  646. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  647. chartSnoringLine = chart;
  648. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  649. return chart;
  650. };
  651. function setSnoringOption(chart, data1 = [], data2 = [],) {
  652. var option = option = {
  653. tooltip: {
  654. show: true,
  655. trigger: 'axis',
  656. formatter: function (param) {
  657. return `${param[0] && param[0].value == 1 ? '打鼾' : '否'}`
  658. }
  659. },
  660. dataZoom: [
  661. { // 第一个 dataZoom 组件
  662. type: 'inside',
  663. },
  664. ],
  665. grid: {
  666. top: '40rpx',
  667. left: 0,
  668. right: '20rpx',
  669. bottom: 0,
  670. containLabel: true
  671. },
  672. xAxis: {
  673. type: 'category',
  674. axisLabel: {
  675. color: '#6C6970',// 设置 x 轴标签颜色为白色
  676. fontSize: 10
  677. },
  678. boundaryGap: false,
  679. splitLine: {
  680. show: false, // 是否显示刻度线
  681. },
  682. axisTick: {
  683. // 不显示Y轴刻度线
  684. show: false
  685. },
  686. data: data1,
  687. axisLine: {
  688. // 不显示X轴轴线
  689. show: false
  690. }
  691. },
  692. yAxis: {
  693. type: 'value',
  694. show: false,
  695. },
  696. series: [{
  697. type: 'line',
  698. smooth: true,
  699. lineStyle: {
  700. width: 2,
  701. color: '#EE8B52'
  702. },
  703. showSymbol: false,
  704. areaStyle: {
  705. opacity: 0.8,
  706. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  707. {
  708. offset: 0,
  709. color: 'rgba(249, 211, 189, 1)'
  710. },
  711. {
  712. offset: 1,
  713. color: 'rgba(255, 255, 255, 0)'
  714. }
  715. ])
  716. },
  717. data: data2,
  718. }]
  719. };
  720. chart.setOption(option, true);
  721. }
  722. function updateSnoring(data1, data2, startSleepTime, endSleepTime, that) {
  723. if (chartSnoringLine) {
  724. setSnoringOption(chartSnoringLine, data1, data2);
  725. } else {
  726. that.selectComponent('#chartSnoringLine-dom').init((canvas, width, height, dpr) => {
  727. const chart = echarts.init(canvas, null, {
  728. width: width,
  729. height: height,
  730. devicePixelRatio: dpr // new
  731. });
  732. canvas.setChart(chart);
  733. setSnoringOption(chart, data1, data2);
  734. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  735. chartSnoringLine = chart;
  736. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  737. return chart;
  738. });
  739. }
  740. }
  741. //呼吸暂停
  742. function initApneaLine(canvas, width, height, dpr) {
  743. // 在这里初始化图表
  744. const chart = echarts.init(canvas, null, {
  745. width: width,
  746. height: height,
  747. devicePixelRatio: dpr // new
  748. });
  749. canvas.setChart(chart);
  750. setApneaOption(chart);
  751. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  752. chartApneaLine = chart;
  753. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  754. return chart;
  755. };
  756. function setApneaOption(chart, data1 = [], data2 = [],) {
  757. var option = option = {
  758. tooltip: {
  759. show: true,
  760. trigger: 'axis',
  761. formatter: function (param) {
  762. return `${param[0] && param[0].value == 1 ? '停止' : '否'}`
  763. }
  764. },
  765. dataZoom: [
  766. { // 第一个 dataZoom 组件
  767. type: 'inside',
  768. },
  769. ],
  770. grid: {
  771. top: '40rpx',
  772. left: 0,
  773. right: '20rpx',
  774. bottom: 0,
  775. containLabel: true
  776. },
  777. xAxis: {
  778. type: 'category',
  779. axisLabel: {
  780. color: '#6C6970',// 设置 x 轴标签颜色为白色
  781. fontSize: 10
  782. },
  783. boundaryGap: false,
  784. splitLine: {
  785. show: false, // 是否显示刻度线
  786. },
  787. axisTick: {
  788. // 不显示Y轴刻度线
  789. show: false
  790. },
  791. data: data1,
  792. axisLine: {
  793. // 不显示X轴轴线
  794. show: false
  795. }
  796. },
  797. yAxis: {
  798. type: 'value',
  799. show: false,
  800. },
  801. series: [{
  802. type: 'line',
  803. smooth: true,
  804. lineStyle: {
  805. width: 2,
  806. color: '#6086EF'
  807. },
  808. showSymbol: false,
  809. areaStyle: {
  810. opacity: 0.8,
  811. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  812. {
  813. offset: 0,
  814. color: 'rgba(96, 134, 239, 1)'
  815. },
  816. {
  817. offset: 1,
  818. color: 'rgba(255, 255, 255, 0)'
  819. }
  820. ])
  821. },
  822. data: data2,
  823. }]
  824. };
  825. chart.setOption(option, true);
  826. }
  827. function updateApnea(data1, data2, startSleepTime, endSleepTime, that) {
  828. if (chartApneaLine) {
  829. setApneaOption(chartApneaLine, data1, data2);
  830. } else {
  831. that.selectComponent('#chartApneaLine-dom').init((canvas, width, height, dpr) => {
  832. const chart = echarts.init(canvas, null, {
  833. width: width,
  834. height: height,
  835. devicePixelRatio: dpr // new
  836. });
  837. canvas.setChart(chart);
  838. setApneaOption(chart, data1, data2);
  839. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  840. chartApneaLine = chart;
  841. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  842. return chart;
  843. });
  844. }
  845. }
  846. //深浅睡眠
  847. function timestampToHHMM(timestamp) {
  848. let date = new Date(timestamp); // 注意:JavaScript中的Date是以毫秒为单位的
  849. let hours = date.getHours().toString().padStart(2, '0'); // 获取小时数,并补零
  850. let minutes = date.getMinutes().toString().padStart(2, '0'); // 获取分钟数,并补零
  851. return hours + ':' + minutes;
  852. }
  853. // 自定义图形
  854. function renderItem(params, api) {
  855. var categoryIndex = api.value(0);
  856. var startX = api.coord([api.value(1), categoryIndex])[0];
  857. var endX = api.coord([api.value(2), categoryIndex])[0];
  858. var centerY = api.coord([
  859. api.value(1) + (api.value(2) - api.value(1)) / 2,
  860. categoryIndex
  861. ])[1]; // 取中间点的y坐标
  862. var height = api.size([0, 1])[1] * 1;
  863. var width = endX - startX;
  864. // 创建一个矩形
  865. var rect = {
  866. x: startX,
  867. y: centerY - height / 2,
  868. r: 2,
  869. width: width,
  870. height: height
  871. };
  872. // 返回的图形对象
  873. return {
  874. type: 'rect',
  875. shape: rect,
  876. style: api.style()
  877. };
  878. }
  879. function initChartTimeWaterfall(canvas, width, height, dpr) {
  880. // 在这里初始化图表
  881. const chart = echarts.init(canvas, null, {
  882. width: width,
  883. height: height,
  884. devicePixelRatio: dpr // new
  885. });
  886. canvas.setChart(chart);
  887. setTimeWaterfallOption(chart, null, [{ "name": "清醒", "value": [2, 0, 0, 0], "itemStyle": { "normal": { "color": { "colorStops": [{ "offset": 0, "color": "#AAD09F" }, { "offset": 1, "color": "#AAD09F" }], "x": 0, "y": 0, "x2": 0, "y2": 1, "type": "linear", "global": false } } } }]);
  888. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  889. chartTimeWaterfall = chart;
  890. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  891. return chart;
  892. };
  893. function setTimeWaterfallOption(chart, startTime = new Date().getTime(), data = [], categories = ['深睡', '中睡', '浅睡', '清醒']) {
  894. var option =
  895. option = {
  896. tooltip: {
  897. show: true,
  898. formatter: function (params) {
  899. return params.marker + params.name + ': ' + params.value[3] + ' m';
  900. }
  901. },
  902. dataZoom: [
  903. {
  904. type: 'inside',
  905. filterMode: 'weakFilter'
  906. }
  907. ],
  908. grid: {
  909. top: 0,
  910. bottom: 0,
  911. height: 160,
  912. containLabel: false
  913. },
  914. xAxis: {
  915. type: 'value',
  916. scale: true,
  917. min: startTime,
  918. splitLine: {
  919. show: false // 是否显示刻度线
  920. },
  921. axisLabel: {
  922. color: '#6C6970',// 设置 x 轴标签颜色为白色
  923. fontSize: 10,
  924. formatter: function (val) {
  925. return timestampToHHMM(val || startTime);
  926. }
  927. }
  928. },
  929. yAxis: {
  930. show: false,
  931. data: categories
  932. },
  933. series: [
  934. {
  935. type: 'custom',
  936. renderItem: renderItem,
  937. itemStyle: {
  938. opacity: 1
  939. },
  940. encode: {
  941. x: [1, 2],
  942. y: 0
  943. },
  944. data: data
  945. }
  946. ]
  947. };
  948. chart.setOption(option, true);
  949. }
  950. function updateTimeWaterfall(startTime = new Date().getTime(), data, that) {
  951. console.log("updateTimeWaterfall========>", data);
  952. if (chartTimeWaterfall) {
  953. setTimeWaterfallOption(chartTimeWaterfall, startTime, data);
  954. } else {
  955. that.selectComponent('#chartTimeWaterfall-dom').init((canvas, width, height, dpr) => {
  956. const chart = echarts.init(canvas, null, {
  957. width: width,
  958. height: height,
  959. devicePixelRatio: dpr // new
  960. });
  961. canvas.setChart(chart);
  962. setTimeWaterfallOption(chart, startTime, data);
  963. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  964. chartTimeWaterfall = chart;
  965. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  966. return chart;
  967. });
  968. }
  969. }
  970. function addZero(str) {
  971. if (String(str).length == 1) {
  972. return "0" + String(str);
  973. } else {
  974. return String(str);
  975. }
  976. }
  977. const aipushApi = "https://aipush.aidsleep.cn";
  978. const token_push = "b74fd5754c5ef24cf600c39194abdaeb";
  979. const token_today_push = "89835e65993fee4a6a6cbbe4c271da51e5521822934e13769e61cadabaed72c3";
  980. Page({
  981. /**
  982. * 页面的初始数据
  983. */
  984. data: {
  985. ecCircularProgressBar: {
  986. // lazyLoad: true, // 懒加载
  987. onInit: initChartHumidifier
  988. },
  989. ecOutOfBed: {
  990. // lazyLoad: true, // 懒加载
  991. onInit: initChartOutOfBed
  992. },
  993. ecBodyMovements: {
  994. // lazyLoad: true, // 懒加载
  995. onInit: initChartBodyMovementsLine
  996. },
  997. ecCardiacSystemLine: {
  998. // lazyLoad: true, // 懒加载
  999. onInit: initChartCardiacSystemLine
  1000. },
  1001. ecChartRespiratoryLine: {
  1002. // lazyLoad: true, // 懒加载
  1003. onInit: initChartRespiratoryLine
  1004. },
  1005. ecSnoringLine: {
  1006. // lazyLoad: true, // 懒加载
  1007. onInit: initSnoringLine
  1008. },
  1009. ecApneaLine: {
  1010. // lazyLoad: true, // 懒加载
  1011. onInit: initApneaLine
  1012. },
  1013. ecTimeWaterfall: {
  1014. // lazyLoad: true, // 懒加载
  1015. onInit: initChartTimeWaterfall
  1016. },
  1017. showAuthorizedDialog: false,
  1018. status: "",
  1019. isToDay: false,
  1020. year: addZero(new Date().getFullYear()),
  1021. month: addZero(new Date().getMonth()),
  1022. date: addZero(new Date().getDate()),
  1023. hours: addZero(new Date().getHours()),
  1024. rdt_arr: [],
  1025. rrh_arr: [],
  1026. rhx_arr: [],
  1027. rsnoring_arr: [],
  1028. routbed_arr: [],
  1029. rmove_arr: [],
  1030. rhxstop_arr: [],
  1031. rsleep_arr: [],
  1032. rdt_arrNew: [],//睡眠时间轴数据集合
  1033. rrh_arrNew: [],//睡眠心率数据集合
  1034. rhx_arrNew: [],//睡眠呼吸数据集合
  1035. rmove_arrNew: [],//体动状态数据集合,0-否,1-体动状态
  1036. rsleep_arrNew: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1037. rsleep_arr_all_New: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1038. durationData: [], //睡眠时长
  1039. sleep_duration: [], //睡眠和清醒对比
  1040. rdeep_durationFormatA: {},
  1041. rdeep_duration: 0,
  1042. rlight_duration: 0,
  1043. rin_duration: 0,
  1044. rawake_duration: 0,
  1045. rrs_duration: 0,//入睡时长
  1046. routbed_count_value: 0,//离床次数
  1047. rsleep_eff_value: '',//睡眠效率
  1048. rdeep_durationFormat: '',
  1049. rlight_durationFormat: '',
  1050. rin_durationFormat: '',
  1051. rawake_durationFormat: '',
  1052. ravg_hx_value: 0,
  1053. ravg_hx_desc: '',
  1054. ravg_rh_value: 0,
  1055. ravg_rh_desc: '',
  1056. rscore_value: 0,
  1057. rscore_desc: '',
  1058. sleep_efficiency: '',//睡眠效率
  1059. zdPoint: [],
  1060. rsn: '',
  1061. rdate: '',
  1062. total_duration: 0,
  1063. rtotal_duration: 0,
  1064. rinbed_duration: 0,
  1065. rgobed_time: 0,
  1066. routbed_time: 0,
  1067. rgobed_routbed: 0,
  1068. sleepHourSub: 0,
  1069. routbed_count_value: 0,
  1070. reportDate: '',
  1071. currentDate: '',
  1072. currentTime: '',
  1073. rmove_arrFrequency: 0,//体动次数
  1074. routbed_arrFrequency: 0,//离床次数
  1075. rsnoring_arrFrequency: 0,//打鼾次数
  1076. rhxstop_arrFrequency: 0,//呼吸暂停次数
  1077. sleep_durationCountA: 0,//睡眠时间
  1078. sns: [],
  1079. tvEntityIds: [],
  1080. ifOneMoreTV: false,//数据推送是否有多于一台电视
  1081. hotelcode: '',//酒店编码
  1082. roomcode: '',//房间编码
  1083. rdeep_duration_efficiency: '',//深睡比例
  1084. rlight_duration_efficiency: '',//浅睡比例
  1085. rin_duration_efficiency: '',//中睡比例
  1086. rawake_duration_efficiency: '',//清醒比例
  1087. isLoading: false,
  1088. reportId: '',
  1089. hotelname: '',
  1090. roomname: '',
  1091. bedname:'',
  1092. pushReportId: '',//推送用:reportId
  1093. },
  1094. toWarmReminder(e) {
  1095. const tabName = e.currentTarget.dataset.index || 1;
  1096. wx.navigateTo({
  1097. url: '/subpages/warmReminder/warmReminder?id=' + tabName
  1098. })
  1099. },
  1100. getRsleep_arr(list) {
  1101. if (list) {
  1102. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1103. for (let i = 0; i < list.length; i++) {
  1104. if (list[i] == '0') {
  1105. list[i] = '清醒';
  1106. } else if (list[i] == '10') {
  1107. list[i] = '浅睡';
  1108. } else if (list[i] == '20') {
  1109. list[i] = '中睡';
  1110. } else if (list[i] == '30') {
  1111. list[i] = '深睡';
  1112. } else {
  1113. list[i] = '其他';
  1114. }
  1115. }
  1116. }
  1117. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1118. },
  1119. getFrequency(list) {//获取
  1120. if (list) {
  1121. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1122. for (let i = 0; i < list.length; i++) {
  1123. if (list[i] == '0') {
  1124. list[i] = '清醒';
  1125. } else if (list[i] == '10') {
  1126. list[i] = '浅睡';
  1127. } else if (list[i] == '20') {
  1128. list[i] = '中睡';
  1129. } else if (list[i] == '30') {
  1130. list[i] = '深睡';
  1131. } else {
  1132. list[i] = '其他';
  1133. }
  1134. }
  1135. }
  1136. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1137. },
  1138. splitN(originalArray, n) {
  1139. if (!originalArray) return [];
  1140. // 计算每份的大小
  1141. let chunkSize = Math.ceil(originalArray.length / n);
  1142. // 分割数组并获取每份的最后一个元素
  1143. let lastElements = [];
  1144. for (let i = 0; i < originalArray.length; i += chunkSize) {
  1145. let chunk = originalArray.slice(i, i + chunkSize);
  1146. lastElements.push(chunk[chunk.length - 1]);
  1147. }
  1148. // 输出每份的最后一个元素
  1149. console.log('lastElements=' + lastElements);
  1150. return lastElements;
  1151. },
  1152. //获取次数
  1153. getFrequency(list, o) {
  1154. if (!list) return 0;
  1155. let frequency = 0;
  1156. for (let i = 0; i < list.length; i++) {
  1157. if (list[i] == o) frequency++;
  1158. }
  1159. console.log('frequency=' + frequency);
  1160. return frequency;
  1161. },
  1162. getTimeDiffInHours: function (startTimeStr, endTimeStr) {
  1163. // 假设两个时间都是同一天的,这里我们使用当前日期作为基准
  1164. if (!startTimeStr || !endTimeStr) return null;
  1165. const now = new Date();
  1166. const startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...startTimeStr.split(':').map(Number));
  1167. const endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...endTimeStr.split(':').map(Number));
  1168. // 处理跨天的情况
  1169. if (endDate < startDate) {
  1170. endDate.setDate(endDate.getDate() + 1); // 将结束时间设置为第二天的同一时间
  1171. }
  1172. // 计算时间差(毫秒)
  1173. const diffInMs = endDate - startDate;
  1174. // 转换为小时
  1175. const diffInHours = diffInMs / (1000 * 60 * 60);
  1176. return diffInHours;
  1177. },
  1178. // 时间格式化
  1179. convertTimeToHoursAndMinutes: function (timeWithText, flag = 0) {
  1180. if (!timeWithText) return;
  1181. // 移除'分钟'两个字
  1182. var minutesStr = timeWithText.replace('分钟', '');
  1183. var minutes = parseInt(minutesStr); // 将字符串转换为整数
  1184. if (isNaN(minutes)) {
  1185. // 如果转换失败,则可能是输入的不是有效的数字
  1186. console.error('Invalid minutes format');
  1187. return;
  1188. }
  1189. var hours = Math.floor(minutes / 60); // 整除60得到小时数
  1190. var remainingMinutes = minutes % 60; // 取余得到剩余的分钟数
  1191. // 如果小时数或分钟数小于10,前面补0
  1192. // var formattedHours = hours < 10 ? '0' + hours : hours;
  1193. var formattedHours = hours;
  1194. // var formattedMinutes = remainingMinutes < 10 ? '0' + remainingMinutes : remainingMinutes;
  1195. var formattedMinutes = remainingMinutes;
  1196. // 拼接小时和分钟,形成HH:mm格式
  1197. var formattedTime = '';
  1198. if (flag == 1) {
  1199. formattedTime = formattedHours + 'H ' + formattedMinutes + 'M';
  1200. } else if (flag == 2) {
  1201. formattedTime = formattedHours + '{units|小时}' + formattedMinutes + '{units|分钟}';
  1202. } else {
  1203. formattedTime = {
  1204. formattedHours,
  1205. formattedMinutes
  1206. };
  1207. }
  1208. // 更新数据
  1209. // this.setData({
  1210. // formattedTime: formattedTime
  1211. // });
  1212. return formattedTime;
  1213. },
  1214. // 组装深度睡眠数据
  1215. calculateTheDurationOfDeepSleep() {
  1216. var that = this;
  1217. // var totalDuration = this.data.total_duration;
  1218. // var timePeriod = this.data.rdt_arrNew;
  1219. var sleepData = this.data.rsleep_arr;//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1220. // console.log("睡眠总时长=>", totalDuration);
  1221. // console.log("睡眠时间片段=>", timePeriod);
  1222. // console.log("睡眠时间片段=>", timePeriod.length);
  1223. // console.log("睡眠数据=>", sleepData);
  1224. // console.log("睡眠数据=>", sleepData.length);
  1225. var awakeColor = [{ offset: 0, color: '#F7E3BA' }, { offset: 1, color: '#F7E3BA' }];;
  1226. var lightSleepColor = [{ offset: 0, color: '#AAD09F' }, { offset: 1, color: '#AAD09F' }];
  1227. var sleptInColor = [{ offset: 0, color: '#75BDE0' }, { offset: 1, color: '#75BDE0' }];
  1228. var deepSleepColor = [{ offset: 0, color: '#3D7299' }, { offset: 1, color: '#3D7299' }];
  1229. // var linearGradient = new echarts.graphic.LinearGradient(
  1230. // 0, 0, 0, 1, // 方向从左到右
  1231. // [
  1232. // { offset: 0, color: '#FDBE25' }, // 渐变开始的颜色
  1233. // { offset: 1, color: '#FD7778' } // 渐变结束的颜色
  1234. // ]
  1235. // );
  1236. // var item = {
  1237. // name: { name: '清醒', color: '#7b9ce1' },
  1238. // value: [index, baseTime, (baseTime += duration), duration],
  1239. // itemStyle: {
  1240. // normal: {
  1241. // color: linearGradient,
  1242. // }
  1243. // }
  1244. // };
  1245. // var sleepData = ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10", "0", "0", "0", "0", "0", "0", "0", "0", "0", "10", "10", "10", "10", "10", "10", "10", "20", "20", "20", "20", "20", "20", "20", "20", "30", "30", "30", "30", "30", "30", "30", "30", "30"];//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1246. // 状态映射
  1247. const statusMap = {
  1248. "0": "清醒",
  1249. "10": "浅睡",
  1250. "20": "中睡",
  1251. "30": "深睡"
  1252. };
  1253. // 状态映射
  1254. const statusColorMap = {
  1255. "20": awakeColor,
  1256. "0": lightSleepColor,
  1257. "10": sleptInColor,
  1258. "30": deepSleepColor
  1259. };
  1260. // 状态映射
  1261. const statusIndexMap = {
  1262. "20": 3,
  1263. "0": 2,
  1264. "10": 1,
  1265. "30": 0
  1266. };
  1267. // 初始化变量 reportDate
  1268. // let dateString = '2024/09/14 23:20:00';
  1269. let dateString = `${that.data.reportDate.replaceAll("-", "/")} ${that.data.rgobed_time + ":00"}`;
  1270. let date = new Date(dateString);
  1271. let startTime = date.getTime(); // 基准时间,这里设为午夜开始
  1272. console.log("时间=》", timestampToHHMM(startTime));
  1273. let oldTime = startTime;
  1274. let currentTime = startTime;
  1275. let currentState = sleepData[0];
  1276. let timePeriods = [];
  1277. // 遍历睡眠数据数组
  1278. for (let i = 0; i < sleepData.length; i++) {
  1279. // 如果当前状态与前一个状态不同,则记录前一个时间段
  1280. if (i > 0 && sleepData[i] !== sleepData[i - 1]) {
  1281. // 计算前一个时间段的结束时间(注意这里不需要减去一分钟,因为 currentTime 还未递增)
  1282. let endTime = currentTime;
  1283. // 计算前一个时间段的持续时间(分钟)
  1284. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1285. // 记录时间段
  1286. if (duration > 0) {
  1287. var linearGradient = new echarts.graphic.LinearGradient(
  1288. 0, 0, 0, 1, // 方向从左到右
  1289. statusColorMap[sleepData[i - 1]]
  1290. );
  1291. timePeriods.push({
  1292. name: statusMap[sleepData[i - 1]],// 使用前一个状态
  1293. value: [statusIndexMap[sleepData[i - 1]], startTime, endTime, duration],
  1294. itemStyle: {
  1295. normal: {
  1296. color: linearGradient,
  1297. }
  1298. },
  1299. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1300. // endTime: new Date(endTime),
  1301. // durationMinutes: duration
  1302. });
  1303. }
  1304. // 更新当前状态和开始时间
  1305. currentState = sleepData[i];
  1306. startTime = currentTime;
  1307. }
  1308. // 递增时间(每分钟)
  1309. currentTime += 1000 * 60;
  1310. // 处理最后一个时间段(如果数组不是以状态变化结束的话)
  1311. if (i === sleepData.length - 1) {
  1312. let endTime = currentTime;
  1313. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1314. if (duration > 0) {
  1315. var linearGradient = new echarts.graphic.LinearGradient(
  1316. 0, 0, 0, 1, // 方向从左到右
  1317. statusColorMap[currentState]
  1318. );
  1319. timePeriods.push({
  1320. name: statusMap[currentState],// 使用前一个状态
  1321. value: [statusIndexMap[currentState], startTime, endTime, duration],
  1322. itemStyle: {
  1323. normal: {
  1324. color: linearGradient,
  1325. }
  1326. },
  1327. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1328. // endTime: new Date(endTime),
  1329. // durationMinutes: duration
  1330. });
  1331. }
  1332. }
  1333. }
  1334. wx.nextTick(() => {
  1335. setTimeout(() => {
  1336. updateTimeWaterfall(oldTime, timePeriods, that)
  1337. }, 1000);
  1338. });
  1339. // console.log("睡眠数据最终=>", dateString);
  1340. // console.log("睡眠数据最终=>", startTime);
  1341. console.log("睡眠数据最终=>", JSON.stringify(timePeriods));
  1342. },
  1343. // 授权成功
  1344. authorizationSuccessful() {
  1345. console.log("授权成功");
  1346. this.setData({ showAuthorizedDialog: false })
  1347. this.showData();
  1348. },
  1349. onReady() {
  1350. },
  1351. showData() {
  1352. let hotelcodeTemp = wx.getStorageSync("hotelEmpower");
  1353. let roomcodeTemp = wx.getStorageSync("roomEmpower");
  1354. // hotelcodeTemp = wx.getStorageSync('res').result.split('|')[0];
  1355. // roomcodeTemp = wx.getStorageSync('res').result.split('|')[1];
  1356. // 设置canvas的宽高
  1357. this.setData({
  1358. hotelcode: hotelcodeTemp,
  1359. roomcode: roomcodeTemp,
  1360. });
  1361. if (this.data.isToDay) {
  1362. this.getToDayReportData();
  1363. } else {
  1364. this.getReportData();
  1365. }
  1366. },
  1367. /**
  1368. * 生命周期函数--监听页面加载
  1369. */
  1370. onShow: function () {
  1371. if (!wx.getStorageSync('hasAuth')) {
  1372. this.setData({ showAuthorizedDialog: true })
  1373. } else {
  1374. this.showData();
  1375. }
  1376. },
  1377. onLoad(options) {
  1378. var that = this;
  1379. if (options.rpids) {
  1380. that.setData({
  1381. reportId: options.rpids,
  1382. isToDay: false
  1383. })
  1384. wx.setNavigationBarTitle({
  1385. title: "历史睡眠报告"
  1386. })
  1387. } else {
  1388. wx.setNavigationBarTitle({
  1389. title: "今日睡眠报告"
  1390. })
  1391. that.setData({
  1392. isToDay: true
  1393. })
  1394. }
  1395. },
  1396. // 新版
  1397. getReportData() {
  1398. const that = this;
  1399. wx.request({
  1400. url: `${aipushApi}` + '/getsingle',
  1401. data: {
  1402. "token": token_push,
  1403. "rpids": this.data.reportId
  1404. },
  1405. method: 'POST',
  1406. success(ress) {
  1407. try {
  1408. if (ress && ress.data) {
  1409. console.log('ress.data-getsingle=' + JSON.stringify(ress.data.results));
  1410. if (!ress.data.results || ress.data.results == '') {
  1411. wx.showModal({
  1412. title: '提示',
  1413. content: '无数据',
  1414. showCancel: false
  1415. });
  1416. return;
  1417. }
  1418. wx.nextTick(() => {
  1419. setTimeout(() => {
  1420. //初始化数据
  1421. that.initReportData(ress.data.results);
  1422. that.initChartCircle(ress.data.results);
  1423. that.initOutOfBed(ress.data.results);
  1424. that.initBodyMovements(ress.data.results);
  1425. that.initCardiacSystem(ress.data.results);
  1426. that.initChartRespiratory(ress.data.results);
  1427. that.initChartSnoring(ress.data.results);
  1428. that.initChartApnea(ress.data.results);
  1429. that.initTimeWaterfall(ress.data.results);
  1430. }, 1000);
  1431. });
  1432. } else {
  1433. wx.showModal({
  1434. title: '提示',
  1435. content: '无数据',
  1436. showCancel: false
  1437. });
  1438. }
  1439. } catch (error) {
  1440. console.error(error);
  1441. }
  1442. },
  1443. fail: function (error) {
  1444. wx.showToast({
  1445. title: "无数据",
  1446. icon: "error",
  1447. mask: true,
  1448. });
  1449. }
  1450. });
  1451. },
  1452. // 新版
  1453. getToDayReportData() {
  1454. const that = this;
  1455. wx.request({
  1456. url: `${aipushApi}` + '/getunionsingle',
  1457. data: {
  1458. "token": token_today_push,
  1459. "udi": wx.getStorageSync("unionid")
  1460. },
  1461. method: 'POST',
  1462. success(ress) {
  1463. try {
  1464. if (ress && ress.data) {
  1465. console.log('ress.data-getunionsingle=' + JSON.stringify(ress.data));
  1466. if (ress.data == {} || ress.data.data == []) {
  1467. wx.showModal({
  1468. title: '提示',
  1469. content: '无数据',
  1470. showCancel: false
  1471. });
  1472. return;
  1473. }
  1474. //初始化数据
  1475. wx.nextTick(() => {
  1476. setTimeout(() => {
  1477. that.initReportData(ress.data.data);
  1478. that.initChartCircle(ress.data.data);
  1479. that.initOutOfBed(ress.data.data);
  1480. that.initBodyMovements(ress.data.data);
  1481. that.initCardiacSystem(ress.data.data);
  1482. that.initChartRespiratory(ress.data.data);
  1483. that.initChartSnoring(ress.data.data);
  1484. that.initChartApnea(ress.data.data);
  1485. that.initTimeWaterfall(ress.data.data);
  1486. }, 1000);
  1487. });
  1488. } else {
  1489. wx.showModal({
  1490. title: '提示',
  1491. content: '无数据',
  1492. showCancel: false
  1493. });
  1494. }
  1495. } catch (error) {
  1496. console.error(error);
  1497. }
  1498. },
  1499. fail: function (error) {
  1500. wx.showToast({
  1501. title: "无数据",
  1502. icon: "error",
  1503. mask: true,
  1504. });
  1505. }
  1506. });
  1507. },
  1508. // 初始化的数据
  1509. initReportData(ress) {
  1510. const that = this;
  1511. let durationDataTemp = [];
  1512. let obj = {};
  1513. obj.name = '深睡';
  1514. obj.value = ress.rdeep_duration;
  1515. durationDataTemp.push(obj);
  1516. obj = {};
  1517. obj.name = '浅睡';
  1518. obj.value = ress.rlight_duration;
  1519. durationDataTemp.push(obj);
  1520. obj = {};
  1521. obj.name = '中睡';
  1522. obj.value = ress.rin_duration;
  1523. durationDataTemp.push(obj);
  1524. obj = {};
  1525. obj.name = '清醒';
  1526. obj.value = ress.rawake_duration;
  1527. durationDataTemp.push(obj);
  1528. let sleep_durationCount = 0;
  1529. if (ress.rdeep_duration) {
  1530. sleep_durationCount += parseFloat(ress.rdeep_duration)
  1531. }
  1532. if (ress.rlight_duration) {
  1533. sleep_durationCount += parseFloat(ress.rlight_duration)
  1534. }
  1535. if (ress.rin_duration) {
  1536. sleep_durationCount += parseFloat(ress.rin_duration)
  1537. }
  1538. let sleep_efficiency_temp = ress.rtotal_duration ? (Math.ceil((sleep_durationCount / ress.rtotal_duration) * 100) + '%') : '%'
  1539. let rdeep_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rdeep_duration ? parseFloat(ress.rdeep_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1540. let rlight_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rlight_duration ? parseFloat(ress.rlight_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1541. let rin_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rin_duration ? parseFloat(ress.rin_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1542. let rawake_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rawake_duration ? parseFloat(ress.rawake_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1543. let sleep_durationTemp = [];
  1544. let obj1 = {};
  1545. obj1.name = '睡眠时间';
  1546. obj1.value = Math.ceil(sleep_durationCount / 60);
  1547. sleep_durationTemp.push(obj1);
  1548. obj1 = {};
  1549. obj1.name = '清醒时间';
  1550. obj1.value = Math.ceil(parseFloat(ress.rawake_duration) / 60);
  1551. sleep_durationTemp.push(obj1);
  1552. let zdPointTemp = [];
  1553. let rdt_arrTemp = [];
  1554. let rrh_arrTemp = [];
  1555. let rhx_arrTemp = [];
  1556. let rmove_arrTemp = [];
  1557. let rsleep_arrTemp = [];
  1558. let rsleep_arr_all_Temp = [];
  1559. if (ress.rrh_arr) {
  1560. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1561. }
  1562. if (ress.rrh_arr) {
  1563. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1564. }
  1565. if (ress.rhx_arr) {
  1566. rhx_arrTemp = that.splitN(ress.rhx_arr.split(","), 100);
  1567. }
  1568. if (ress.rmove_arr) {
  1569. rmove_arrTemp = that.splitN(ress.rmove_arr.split(","), 100);
  1570. }
  1571. if (ress.rsleep_arr) {
  1572. rsleep_arrTemp = that.splitN(ress.rsleep_arr.split(","), 100);
  1573. }
  1574. if (ress.rsleep_arr) {
  1575. rsleep_arr_all_Temp = ress.rsleep_arr.split(",");
  1576. }
  1577. that.setData({
  1578. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1579. rrh_arr: ress.rrh_arr ? ress.rrh_arr.split(',') : [],
  1580. rhx_arr: ress.rhx_arr ? ress.rhx_arr.split(',') : [],
  1581. rsnoring_arr: ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [],
  1582. routbed_arr: ress.routbed_arr ? ress.routbed_arr.split(',') : [],
  1583. rmove_arr: ress.rmove_arr ? ress.rmove_arr.split(',') : [],
  1584. rhxstop_arr: ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [],
  1585. rsleep_arr: ress.rsleep_arr ? ress.rsleep_arr.split(',') : [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1586. rsnoring_arrFrequency: that.getFrequency(ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [], 1),
  1587. routbed_arrFrequency: that.getFrequency(ress.routbed_arr ? ress.routbed_arr.split(',') : [], 0),
  1588. rmove_arrFrequency: that.getFrequency(ress.rmove_arr ? ress.rmove_arr.split(',') : [], 1),
  1589. rhxstop_arrFrequency: that.getFrequency(ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [], 1),
  1590. rdeep_durationFormatA: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1591. rlight_duration: ress.rlight_duration,
  1592. rin_duration: ress.rin_duration,
  1593. rawake_duration: ress.rawake_duration,
  1594. ravg_hx_value: ress.ravg_hx_value,
  1595. ravg_hx_desc: ress.ravg_hx_desc,
  1596. ravg_rh_value: ress.ravg_rh_value,
  1597. ravg_rh_desc: ress.ravg_rh_desc,
  1598. rscore_value: ress.rscore_value,
  1599. rscore_desc: ress.rscore_desc,
  1600. rsn: ress.rsn,
  1601. rdate: ress.rdate,
  1602. total_duration: ress.rtotal_duration,
  1603. rtotal_duration: that.convertTimeToHoursAndMinutes(ress.rtotal_duration),//睡眠总时长,单位小时分钟
  1604. rinbed_duration: that.convertTimeToHoursAndMinutes(ress.rinbed_duration),//在床时长,单位小时分钟
  1605. rgobed_time: ress.rgobed_time,//上床时间
  1606. routbed_time: ress.routbed_time,//离床时间
  1607. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1608. sleepHourSub: that.getTimeDiffInHours(ress.rgobed_time, ress.routbed_time),
  1609. routbed_count_value: ress.routbed_count_value,//离床次数
  1610. rsn: ress.rsn,
  1611. zdPointT: zdPointTemp,
  1612. rdt_arrNew: rdt_arrTemp,
  1613. rrh_arrNew: rrh_arrTemp,
  1614. rhx_arrNew: rhx_arrTemp,
  1615. rmove_arrNew: rmove_arrTemp,
  1616. rsleep_arrNew: rsleep_arrTemp,
  1617. rsleep_arr_all_New: rsleep_arr_all_Temp,
  1618. durationData: durationDataTemp,
  1619. sleep_duration: sleep_durationTemp,
  1620. sleep_efficiency: sleep_efficiency_temp,
  1621. sleep_durationCountA: that.convertTimeToHoursAndMinutes(sleep_durationCount ? sleep_durationCount.toString() : '0'),
  1622. tvEntityIds: wx.getStorageSync('tvEntityIds'),
  1623. ifOneMoreTV: (wx.getStorageSync('tvEntityIds') && wx.getStorageSync('tvEntityIds').length > 1),
  1624. rdeep_duration_efficiency: rdeep_duration_efficiency_temp,
  1625. rlight_duration_efficiency: rlight_duration_efficiency_temp,
  1626. rin_duration_efficiency: rin_duration_efficiency_temp,
  1627. rawake_duration_efficiency: rawake_duration_efficiency_temp,
  1628. pushReportId: ress.rdid,
  1629. rrs_duration: that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0'),
  1630. routbed_count_value: ress.routbed_count_value,
  1631. rsleep_eff_value: ress.rsleep_eff_value,
  1632. hotelname: ress.hotelname,
  1633. roomname: ress.roomname,
  1634. bedname: ress.bedname,
  1635. });
  1636. },
  1637. // 香睡指数
  1638. initChartCircle(ress) {
  1639. var that = this;
  1640. try {
  1641. let rscore_descTemp = [];
  1642. if (ress.rscore_desc) {
  1643. rscore_descTemp = ress.rscore_desc;
  1644. }
  1645. let rscore_valueTemp = [];
  1646. if (ress.rscore_value) {
  1647. rscore_valueTemp = ress.rscore_value;
  1648. }
  1649. that.setData({
  1650. rscore_desc: rscore_descTemp,
  1651. rscore_value: rscore_valueTemp,
  1652. });
  1653. updateChartCircularProgressBarOption(rscore_descTemp, rscore_valueTemp, that);
  1654. } catch (error) {
  1655. console.error(error);
  1656. }
  1657. },
  1658. // 心脏 系统
  1659. initCardiacSystem(ress) {
  1660. var that = this;
  1661. try {
  1662. let rdt_arrTemp = [];
  1663. if (ress.rrh_arr) {
  1664. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1665. }
  1666. if (ress.rdate) {
  1667. that.setData({
  1668. reportDate: ress.rdate
  1669. });
  1670. }
  1671. let rrh_arrTemp = [];
  1672. if (ress.rrh_arr) {
  1673. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1674. }
  1675. that.setData({
  1676. rdt_arrNew: rdt_arrTemp,
  1677. rrh_arrNew: rrh_arrTemp,
  1678. });
  1679. console.log("that.data.rdt_arrNew,that.data.rrh_arrNew=" + that.data.rdt_arrNew + "," + that.data.rrh_arrNew);
  1680. updateCardiacSystem(that.data.rdt_arrNew, that.data.rrh_arrNew, that);
  1681. } catch (error) {
  1682. console.error(error);
  1683. }
  1684. },
  1685. initTimeWaterfall(ress) {//深浅睡眠
  1686. var that = this;
  1687. try {
  1688. let rdt_arrTemp = [];
  1689. if (ress.rrh_arr) {
  1690. // rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1691. rdt_arrTemp = ress.rdt_arr.split(",");
  1692. }
  1693. // console.log('深浅睡眠11111=======' + JSON.stringify(rdt_arrTemp));
  1694. let rsleep_arr_Temp = [];
  1695. if (ress.rsleep_arr) {
  1696. // rsleep_arr_Temp = that.splitN(ress.rsleep_arr.split(","), 100);
  1697. rsleep_arr_Temp = ress.rsleep_arr.split(",");
  1698. }
  1699. // console.log('深浅睡眠222222=======' + JSON.stringify(rsleep_arr_Temp));
  1700. that.setData({
  1701. rdt_arrNew: rdt_arrTemp,
  1702. rsleep_arr: rsleep_arr_Temp,
  1703. rdeep_duration: ress.rdeep_duration,
  1704. rlight_duration: ress.rlight_duration,
  1705. rin_duration: ress.rin_duration,
  1706. rawake_duration: ress.rawake_duration,
  1707. rdeep_durationFormat: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1708. rlight_durationFormat: that.convertTimeToHoursAndMinutes(ress.rlight_duration),
  1709. rin_durationFormat: that.convertTimeToHoursAndMinutes(ress.rin_duration),
  1710. rawake_durationFormat: that.convertTimeToHoursAndMinutes(ress.rawake_duration),
  1711. });
  1712. that.calculateTheDurationOfDeepSleep();
  1713. } catch (error) {
  1714. console.error(error);
  1715. }
  1716. console.log("that.data.rsleep_arr=" + that.data.rsleep_arr);
  1717. },
  1718. initOutOfBed(ress) {//离床次数
  1719. var that = this;
  1720. try {
  1721. var routbed_arr_Temp = [];
  1722. if (ress.routbed_arr) {
  1723. routbed_arr_Temp = ress.routbed_arr.split(",");
  1724. }
  1725. that.setData({
  1726. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1727. routbed_arr: routbed_arr_Temp,
  1728. rgobed_time: ress.rgobed_time,
  1729. routbed_time: ress.routbed_time,
  1730. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1731. });
  1732. updateOutOfBed(that.data.rdt_arr, that.data.routbed_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1733. } catch (error) {
  1734. console.error(error);
  1735. }
  1736. console.log("that.data.routbed_arr=" + that.data.routbed_arr);
  1737. },
  1738. initBodyMovements(ress) {//体动次数
  1739. var that = this;
  1740. try {
  1741. var rmove_arr_Temp = [];
  1742. if (ress.rmove_arr) {
  1743. rmove_arr_Temp = ress.rmove_arr.split(",");
  1744. }
  1745. that.setData({
  1746. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1747. rmove_arr: that.splitN(rmove_arr_Temp, 100),
  1748. rgobed_time: ress.rgobed_time,
  1749. routbed_time: ress.routbed_time,
  1750. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1751. });
  1752. updateBodyMovements(that.data.rdt_arr, that.data.rmove_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1753. } catch (error) {
  1754. console.error(error);
  1755. }
  1756. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  1757. },
  1758. initChartRespiratory(ress) {//平均呼吸率
  1759. var that = this;
  1760. try {
  1761. var rhx_arr_Temp = [];
  1762. if (ress.rhx_arr) {
  1763. rhx_arr_Temp = ress.rhx_arr.split(",");
  1764. }
  1765. that.setData({
  1766. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1767. rhx_arr: that.splitN(rhx_arr_Temp, 100),
  1768. rgobed_time: ress.rgobed_time,
  1769. routbed_time: ress.routbed_time,
  1770. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1771. });
  1772. updateRespiratory(that.data.rdt_arr, that.data.rhx_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1773. } catch (error) {
  1774. console.error(error);
  1775. }
  1776. console.log("c81_that.data.ravg_hx_value=" + that.data.ravg_hx_value);
  1777. },
  1778. initChartSnoring(ress) {//打鼾
  1779. var that = this;
  1780. try {
  1781. var rsnoring_arr_Temp = [];
  1782. if (ress.rsnoring_arr) {
  1783. rsnoring_arr_Temp = ress.rsnoring_arr.split(",");
  1784. }
  1785. that.setData({
  1786. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1787. rsnoring_arr: that.splitN(rsnoring_arr_Temp, 100),
  1788. rgobed_time: ress.rgobed_time,
  1789. routbed_time: ress.routbed_time,
  1790. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1791. });
  1792. updateSnoring(that.data.rdt_arr, that.data.rsnoring_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1793. } catch (error) {
  1794. console.error(error);
  1795. }
  1796. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  1797. },
  1798. initChartApnea(ress) {//呼吸暂停
  1799. var that = this;
  1800. try {
  1801. var rhxstop_arr_Temp = [];
  1802. if (ress.rhxstop_arr) {
  1803. rhxstop_arr_Temp = ress.rhxstop_arr.split(",");
  1804. }
  1805. that.setData({
  1806. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1807. rhxstop_arr: that.splitN(rhxstop_arr_Temp, 100),
  1808. rgobed_time: ress.rgobed_time,
  1809. routbed_time: ress.routbed_time,
  1810. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1811. });
  1812. updateApnea(that.data.rdt_arr, that.data.rhxstop_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1813. } catch (error) {
  1814. console.error(error);
  1815. }
  1816. console.log("c8_that.data.rhxstop_arr=" + that.data.rhxstop_arr);
  1817. },
  1818. mounted() {
  1819. },
  1820. /**
  1821. * 生命周期函数--监听页面隐藏
  1822. */
  1823. onHide: function () {
  1824. },
  1825. /**
  1826. * 生命周期函数--监听页面卸载
  1827. */
  1828. onUnload: function () {
  1829. },
  1830. /**
  1831. * 页面相关事件处理函数--监听用户下拉动作
  1832. */
  1833. onPullDownRefresh: function () {
  1834. },
  1835. /**
  1836. * 页面上拉触底事件的处理函数
  1837. */
  1838. onReachBottom: function () {
  1839. },
  1840. /**
  1841. * 用户点击右上角分享
  1842. */
  1843. onShareAppMessage: function () {
  1844. }
  1845. })