data.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025
  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. splitLine: {
  918. show: false // 是否显示刻度线
  919. },
  920. axisLabel: {
  921. color: '#6C6970',// 设置 x 轴标签颜色为白色
  922. fontSize: 10,
  923. formatter: function (val) {
  924. return timestampToHHMM(val || startTime);
  925. }
  926. }
  927. },
  928. yAxis: {
  929. show: false,
  930. data: categories
  931. },
  932. series: [
  933. {
  934. type: 'custom',
  935. renderItem: renderItem,
  936. itemStyle: {
  937. opacity: 1
  938. },
  939. encode: {
  940. x: [1, 2],
  941. y: 0
  942. },
  943. data: data
  944. }
  945. ]
  946. };
  947. chart.setOption(option, true);
  948. }
  949. function updateTimeWaterfall(startTime = new Date().getTime(), data, that) {
  950. console.log("updateTimeWaterfall========>", data);
  951. if (chartTimeWaterfall) {
  952. setTimeWaterfallOption(chartTimeWaterfall, startTime, data);
  953. } else {
  954. that.selectComponent('#chartTimeWaterfall-dom').init((canvas, width, height, dpr) => {
  955. const chart = echarts.init(canvas, null, {
  956. width: width,
  957. height: height,
  958. devicePixelRatio: dpr // new
  959. });
  960. canvas.setChart(chart);
  961. setTimeWaterfallOption(chart, startTime, data);
  962. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  963. chartTimeWaterfall = chart;
  964. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  965. return chart;
  966. });
  967. }
  968. }
  969. function addZero(str) {
  970. if (String(str).length == 1) {
  971. return "0" + String(str);
  972. } else {
  973. return String(str);
  974. }
  975. }
  976. const aipushApi = "https://aipush.aidsleep.cn";
  977. const token_push = "b74fd5754c5ef24cf600c39194abdaeb";
  978. const token_today_push = "89835e65993fee4a6a6cbbe4c271da51e5521822934e13769e61cadabaed72c3";
  979. Page({
  980. /**
  981. * 页面的初始数据
  982. */
  983. data: {
  984. ecCircularProgressBar: {
  985. // lazyLoad: true, // 懒加载
  986. onInit: initChartHumidifier
  987. },
  988. ecOutOfBed: {
  989. // lazyLoad: true, // 懒加载
  990. onInit: initChartOutOfBed
  991. },
  992. ecBodyMovements: {
  993. // lazyLoad: true, // 懒加载
  994. onInit: initChartBodyMovementsLine
  995. },
  996. ecCardiacSystemLine: {
  997. // lazyLoad: true, // 懒加载
  998. onInit: initChartCardiacSystemLine
  999. },
  1000. ecChartRespiratoryLine: {
  1001. // lazyLoad: true, // 懒加载
  1002. onInit: initChartRespiratoryLine
  1003. },
  1004. ecSnoringLine: {
  1005. // lazyLoad: true, // 懒加载
  1006. onInit: initSnoringLine
  1007. },
  1008. ecApneaLine: {
  1009. // lazyLoad: true, // 懒加载
  1010. onInit: initApneaLine
  1011. },
  1012. ecTimeWaterfall: {
  1013. // lazyLoad: true, // 懒加载
  1014. onInit: initChartTimeWaterfall
  1015. },
  1016. showAuthorizedDialog: false,
  1017. status: "",
  1018. isToDay: false,
  1019. year: addZero(new Date().getFullYear()),
  1020. month: addZero(new Date().getMonth()),
  1021. date: addZero(new Date().getDate()),
  1022. hours: addZero(new Date().getHours()),
  1023. rdt_arr: [],
  1024. rrh_arr: [],
  1025. rhx_arr: [],
  1026. rsnoring_arr: [],
  1027. routbed_arr: [],
  1028. rmove_arr: [],
  1029. rhxstop_arr: [],
  1030. rsleep_arr: [],
  1031. rdt_arrNew: [],//睡眠时间轴数据集合
  1032. rrh_arrNew: [],//睡眠心率数据集合
  1033. rhx_arrNew: [],//睡眠呼吸数据集合
  1034. rmove_arrNew: [],//体动状态数据集合,0-否,1-体动状态
  1035. rsleep_arrNew: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1036. rsleep_arr_all_New: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1037. durationData: [], //睡眠时长
  1038. sleep_duration: [], //睡眠和清醒对比
  1039. rdeep_durationFormatA: {},
  1040. rdeep_duration: 0,
  1041. rlight_duration: 0,
  1042. rin_duration: 0,
  1043. rawake_duration: 0,
  1044. rrs_duration: 0,//入睡时长
  1045. routbed_count_value: 0,//离床次数
  1046. rsleep_eff_value: '',//睡眠效率
  1047. rdeep_durationFormat: '',
  1048. rlight_durationFormat: '',
  1049. rin_durationFormat: '',
  1050. rawake_durationFormat: '',
  1051. ravg_hx_value: 0,
  1052. ravg_hx_desc: '',
  1053. ravg_rh_value: 0,
  1054. ravg_rh_desc: '',
  1055. rscore_value: 0,
  1056. rscore_desc: '',
  1057. sleep_efficiency: '',//睡眠效率
  1058. zdPoint: [],
  1059. rsn: '',
  1060. rdate: '',
  1061. total_duration: 0,
  1062. rtotal_duration: 0,
  1063. rinbed_duration: 0,
  1064. rgobed_time: 0,
  1065. routbed_time: 0,
  1066. rgobed_routbed: 0,
  1067. sleepHourSub: 0,
  1068. routbed_count_value: 0,
  1069. reportDate: '',
  1070. currentDate: '',
  1071. currentTime: '',
  1072. rmove_arrFrequency: 0,//体动次数
  1073. routbed_arrFrequency: 0,//离床次数
  1074. rsnoring_arrFrequency: 0,//打鼾次数
  1075. rhxstop_arrFrequency: 0,//呼吸暂停次数
  1076. sleep_durationCountA: 0,//睡眠时间
  1077. sns: [],
  1078. tvEntityIds: [],
  1079. ifOneMoreTV: false,//数据推送是否有多于一台电视
  1080. hotelcode: '',//酒店编码
  1081. roomcode: '',//房间编码
  1082. rdeep_duration_efficiency: '',//深睡比例
  1083. rlight_duration_efficiency: '',//浅睡比例
  1084. rin_duration_efficiency: '',//中睡比例
  1085. rawake_duration_efficiency: '',//清醒比例
  1086. isLoading: false,
  1087. reportId: '',
  1088. hotelname: '',
  1089. roomname: '',
  1090. bedname:'',
  1091. pushReportId: '',//推送用:reportId
  1092. },
  1093. toWarmReminder(e) {
  1094. const tabName = e.currentTarget.dataset.index || 1;
  1095. wx.navigateTo({
  1096. url: '/subpages/warmReminder/warmReminder?id=' + tabName
  1097. })
  1098. },
  1099. getRsleep_arr(list) {
  1100. if (list) {
  1101. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1102. for (let i = 0; i < list.length; i++) {
  1103. if (list[i] == '0') {
  1104. list[i] = '清醒';
  1105. } else if (list[i] == '10') {
  1106. list[i] = '浅睡';
  1107. } else if (list[i] == '20') {
  1108. list[i] = '中睡';
  1109. } else if (list[i] == '30') {
  1110. list[i] = '深睡';
  1111. } else {
  1112. list[i] = '其他';
  1113. }
  1114. }
  1115. }
  1116. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1117. },
  1118. getFrequency(list) {//获取
  1119. if (list) {
  1120. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1121. for (let i = 0; i < list.length; i++) {
  1122. if (list[i] == '0') {
  1123. list[i] = '清醒';
  1124. } else if (list[i] == '10') {
  1125. list[i] = '浅睡';
  1126. } else if (list[i] == '20') {
  1127. list[i] = '中睡';
  1128. } else if (list[i] == '30') {
  1129. list[i] = '深睡';
  1130. } else {
  1131. list[i] = '其他';
  1132. }
  1133. }
  1134. }
  1135. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1136. },
  1137. splitN(originalArray, n) {
  1138. if (!originalArray) return [];
  1139. // 计算每份的大小
  1140. let chunkSize = Math.ceil(originalArray.length / n);
  1141. // 分割数组并获取每份的最后一个元素
  1142. let lastElements = [];
  1143. for (let i = 0; i < originalArray.length; i += chunkSize) {
  1144. let chunk = originalArray.slice(i, i + chunkSize);
  1145. lastElements.push(chunk[chunk.length - 1]);
  1146. }
  1147. // 输出每份的最后一个元素
  1148. console.log('lastElements=' + lastElements);
  1149. return lastElements;
  1150. },
  1151. //获取次数
  1152. getFrequency(list, o) {
  1153. if (!list) return 0;
  1154. let frequency = 0;
  1155. for (let i = 0; i < list.length; i++) {
  1156. if (list[i] == o) frequency++;
  1157. }
  1158. console.log('frequency=' + frequency);
  1159. return frequency;
  1160. },
  1161. getTimeDiffInHours: function (startTimeStr, endTimeStr) {
  1162. // 假设两个时间都是同一天的,这里我们使用当前日期作为基准
  1163. if (!startTimeStr || !endTimeStr) return null;
  1164. const now = new Date();
  1165. const startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...startTimeStr.split(':').map(Number));
  1166. const endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...endTimeStr.split(':').map(Number));
  1167. // 处理跨天的情况
  1168. if (endDate < startDate) {
  1169. endDate.setDate(endDate.getDate() + 1); // 将结束时间设置为第二天的同一时间
  1170. }
  1171. // 计算时间差(毫秒)
  1172. const diffInMs = endDate - startDate;
  1173. // 转换为小时
  1174. const diffInHours = diffInMs / (1000 * 60 * 60);
  1175. return diffInHours;
  1176. },
  1177. // 时间格式化
  1178. convertTimeToHoursAndMinutes: function (timeWithText, flag = 0) {
  1179. if (!timeWithText) return;
  1180. // 移除'分钟'两个字
  1181. var minutesStr = timeWithText.replace('分钟', '');
  1182. var minutes = parseInt(minutesStr); // 将字符串转换为整数
  1183. if (isNaN(minutes)) {
  1184. // 如果转换失败,则可能是输入的不是有效的数字
  1185. console.error('Invalid minutes format');
  1186. return;
  1187. }
  1188. var hours = Math.floor(minutes / 60); // 整除60得到小时数
  1189. var remainingMinutes = minutes % 60; // 取余得到剩余的分钟数
  1190. // 如果小时数或分钟数小于10,前面补0
  1191. // var formattedHours = hours < 10 ? '0' + hours : hours;
  1192. var formattedHours = hours;
  1193. // var formattedMinutes = remainingMinutes < 10 ? '0' + remainingMinutes : remainingMinutes;
  1194. var formattedMinutes = remainingMinutes;
  1195. // 拼接小时和分钟,形成HH:mm格式
  1196. var formattedTime = '';
  1197. if (flag == 1) {
  1198. formattedTime = formattedHours + 'H ' + formattedMinutes + 'M';
  1199. } else if (flag == 2) {
  1200. formattedTime = formattedHours + '{units|小时}' + formattedMinutes + '{units|分钟}';
  1201. } else {
  1202. formattedTime = {
  1203. formattedHours,
  1204. formattedMinutes
  1205. };
  1206. }
  1207. // 更新数据
  1208. // this.setData({
  1209. // formattedTime: formattedTime
  1210. // });
  1211. return formattedTime;
  1212. },
  1213. // 组装深度睡眠数据
  1214. calculateTheDurationOfDeepSleep() {
  1215. var that = this;
  1216. // var totalDuration = this.data.total_duration;
  1217. // var timePeriod = this.data.rdt_arrNew;
  1218. var sleepData = this.data.rsleep_arr;//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1219. // console.log("睡眠总时长=>", totalDuration);
  1220. // console.log("睡眠时间片段=>", timePeriod);
  1221. // console.log("睡眠时间片段=>", timePeriod.length);
  1222. // console.log("睡眠数据=>", sleepData);
  1223. // console.log("睡眠数据=>", sleepData.length);
  1224. var awakeColor = [{ offset: 0, color: '#F7E3BA' }, { offset: 1, color: '#F7E3BA' }];;
  1225. var lightSleepColor = [{ offset: 0, color: '#AAD09F' }, { offset: 1, color: '#AAD09F' }];
  1226. var sleptInColor = [{ offset: 0, color: '#75BDE0' }, { offset: 1, color: '#75BDE0' }];
  1227. var deepSleepColor = [{ offset: 0, color: '#3D7299' }, { offset: 1, color: '#3D7299' }];
  1228. // var linearGradient = new echarts.graphic.LinearGradient(
  1229. // 0, 0, 0, 1, // 方向从左到右
  1230. // [
  1231. // { offset: 0, color: '#FDBE25' }, // 渐变开始的颜色
  1232. // { offset: 1, color: '#FD7778' } // 渐变结束的颜色
  1233. // ]
  1234. // );
  1235. // var item = {
  1236. // name: { name: '清醒', color: '#7b9ce1' },
  1237. // value: [index, baseTime, (baseTime += duration), duration],
  1238. // itemStyle: {
  1239. // normal: {
  1240. // color: linearGradient,
  1241. // }
  1242. // }
  1243. // };
  1244. // 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-深睡
  1245. // 状态映射
  1246. const statusMap = {
  1247. "0": "清醒",
  1248. "10": "浅睡",
  1249. "20": "中睡",
  1250. "30": "深睡"
  1251. };
  1252. // 状态映射
  1253. const statusColorMap = {
  1254. "20": awakeColor,
  1255. "0": lightSleepColor,
  1256. "10": sleptInColor,
  1257. "30": deepSleepColor
  1258. };
  1259. // 状态映射
  1260. const statusIndexMap = {
  1261. "20": 3,
  1262. "0": 2,
  1263. "10": 1,
  1264. "30": 0
  1265. };
  1266. // 初始化变量 reportDate
  1267. // let dateString = '2024/09/14 23:20:00';
  1268. let dateString = `${that.data.reportDate.replaceAll("-", "/")} ${that.data.rgobed_time + ":00"}`;
  1269. let date = new Date(dateString);
  1270. let startTime = date.getTime(); // 基准时间,这里设为午夜开始
  1271. console.log("时间=》", timestampToHHMM(startTime));
  1272. let currentTime = startTime;
  1273. let currentState = sleepData[0];
  1274. let timePeriods = [];
  1275. // 遍历睡眠数据数组
  1276. for (let i = 0; i < sleepData.length; i++) {
  1277. // 如果当前状态与前一个状态不同,则记录前一个时间段
  1278. if (i > 0 && sleepData[i] !== sleepData[i - 1]) {
  1279. // 计算前一个时间段的结束时间(注意这里不需要减去一分钟,因为 currentTime 还未递增)
  1280. let endTime = currentTime;
  1281. // 计算前一个时间段的持续时间(分钟)
  1282. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1283. // 记录时间段
  1284. if (duration > 0) {
  1285. var linearGradient = new echarts.graphic.LinearGradient(
  1286. 0, 0, 0, 1, // 方向从左到右
  1287. statusColorMap[sleepData[i - 1]]
  1288. );
  1289. timePeriods.push({
  1290. name: statusMap[sleepData[i - 1]],// 使用前一个状态
  1291. value: [statusIndexMap[sleepData[i - 1]], startTime, endTime, duration],
  1292. itemStyle: {
  1293. normal: {
  1294. color: linearGradient,
  1295. }
  1296. },
  1297. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1298. // endTime: new Date(endTime),
  1299. // durationMinutes: duration
  1300. });
  1301. }
  1302. // 更新当前状态和开始时间
  1303. currentState = sleepData[i];
  1304. startTime = currentTime;
  1305. }
  1306. // 递增时间(每分钟)
  1307. currentTime += 1000 * 60;
  1308. // 处理最后一个时间段(如果数组不是以状态变化结束的话)
  1309. if (i === sleepData.length - 1) {
  1310. let endTime = currentTime;
  1311. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1312. if (duration > 0) {
  1313. var linearGradient = new echarts.graphic.LinearGradient(
  1314. 0, 0, 0, 1, // 方向从左到右
  1315. statusColorMap[currentState]
  1316. );
  1317. timePeriods.push({
  1318. name: statusMap[currentState],// 使用前一个状态
  1319. value: [statusIndexMap[currentState], startTime, endTime, duration],
  1320. itemStyle: {
  1321. normal: {
  1322. color: linearGradient,
  1323. }
  1324. },
  1325. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1326. // endTime: new Date(endTime),
  1327. // durationMinutes: duration
  1328. });
  1329. }
  1330. }
  1331. }
  1332. wx.nextTick(() => {
  1333. setTimeout(() => {
  1334. updateTimeWaterfall(startTime, timePeriods, that)
  1335. }, 1000);
  1336. });
  1337. // console.log("睡眠数据最终=>", dateString);
  1338. // console.log("睡眠数据最终=>", startTime);
  1339. console.log("睡眠数据最终=>", JSON.stringify(timePeriods));
  1340. },
  1341. // 授权成功
  1342. authorizationSuccessful() {
  1343. console.log("授权成功");
  1344. this.setData({ showAuthorizedDialog: false })
  1345. this.showData();
  1346. },
  1347. onReady() {
  1348. },
  1349. showData() {
  1350. let hotelcodeTemp = wx.getStorageSync("hotelEmpower");
  1351. let roomcodeTemp = wx.getStorageSync("roomEmpower");
  1352. // hotelcodeTemp = wx.getStorageSync('res').result.split('|')[0];
  1353. // roomcodeTemp = wx.getStorageSync('res').result.split('|')[1];
  1354. // 设置canvas的宽高
  1355. this.setData({
  1356. hotelcode: hotelcodeTemp,
  1357. roomcode: roomcodeTemp,
  1358. });
  1359. if (this.data.isToDay) {
  1360. this.getToDayReportData();
  1361. } else {
  1362. this.getReportData();
  1363. }
  1364. },
  1365. /**
  1366. * 生命周期函数--监听页面加载
  1367. */
  1368. onShow: function () {
  1369. if (!wx.getStorageSync('hasAuth')) {
  1370. this.setData({ showAuthorizedDialog: true })
  1371. } else {
  1372. this.showData();
  1373. }
  1374. },
  1375. onLoad(options) {
  1376. var that = this;
  1377. if (options.rpids) {
  1378. that.setData({
  1379. reportId: options.rpids,
  1380. isToDay: false
  1381. })
  1382. wx.setNavigationBarTitle({
  1383. title: "历史睡眠报告"
  1384. })
  1385. } else {
  1386. wx.setNavigationBarTitle({
  1387. title: "今日睡眠报告"
  1388. })
  1389. that.setData({
  1390. isToDay: true
  1391. })
  1392. }
  1393. },
  1394. // 新版
  1395. getReportData() {
  1396. const that = this;
  1397. wx.request({
  1398. url: `${aipushApi}` + '/getsingle',
  1399. data: {
  1400. "token": token_push,
  1401. "rpids": this.data.reportId
  1402. },
  1403. method: 'POST',
  1404. success(ress) {
  1405. try {
  1406. if (ress && ress.data) {
  1407. console.log('ress.data-getsingle=' + JSON.stringify(ress.data.results));
  1408. if (!ress.data.results || ress.data.results == '') {
  1409. wx.showModal({
  1410. title: '提示',
  1411. content: '无数据',
  1412. showCancel: false
  1413. });
  1414. return;
  1415. }
  1416. wx.nextTick(() => {
  1417. setTimeout(() => {
  1418. //初始化数据
  1419. that.initReportData(ress.data.results);
  1420. that.initChartCircle(ress.data.results);
  1421. that.initOutOfBed(ress.data.results);
  1422. that.initBodyMovements(ress.data.results);
  1423. that.initCardiacSystem(ress.data.results);
  1424. that.initChartRespiratory(ress.data.results);
  1425. that.initChartSnoring(ress.data.results);
  1426. that.initChartApnea(ress.data.results);
  1427. that.initTimeWaterfall(ress.data.results);
  1428. }, 1000);
  1429. });
  1430. } else {
  1431. wx.showModal({
  1432. title: '提示',
  1433. content: '无数据',
  1434. showCancel: false
  1435. });
  1436. }
  1437. } catch (error) {
  1438. console.error(error);
  1439. }
  1440. },
  1441. fail: function (error) {
  1442. wx.showToast({
  1443. title: "无数据",
  1444. icon: "error",
  1445. mask: true,
  1446. });
  1447. }
  1448. });
  1449. },
  1450. // 新版
  1451. getToDayReportData() {
  1452. const that = this;
  1453. wx.request({
  1454. url: `${aipushApi}` + '/getunionsingle',
  1455. data: {
  1456. "token": token_today_push,
  1457. "udi": wx.getStorageSync("unionid")
  1458. },
  1459. method: 'POST',
  1460. success(ress) {
  1461. try {
  1462. if (ress && ress.data) {
  1463. console.log('ress.data-getunionsingle=' + JSON.stringify(ress.data));
  1464. if (ress.data == {}) {
  1465. wx.showModal({
  1466. title: '提示',
  1467. content: '无数据',
  1468. showCancel: false
  1469. });
  1470. return;
  1471. }
  1472. //初始化数据
  1473. wx.nextTick(() => {
  1474. setTimeout(() => {
  1475. that.initReportData(ress.data.data);
  1476. that.initChartCircle(ress.data.data);
  1477. that.initOutOfBed(ress.data.data);
  1478. that.initBodyMovements(ress.data.data);
  1479. that.initCardiacSystem(ress.data.data);
  1480. that.initChartRespiratory(ress.data.data);
  1481. that.initChartSnoring(ress.data.data);
  1482. that.initChartApnea(ress.data.data);
  1483. that.initTimeWaterfall(ress.data.data);
  1484. }, 1000);
  1485. });
  1486. } else {
  1487. wx.showModal({
  1488. title: '提示',
  1489. content: '无数据',
  1490. showCancel: false
  1491. });
  1492. }
  1493. } catch (error) {
  1494. console.error(error);
  1495. }
  1496. },
  1497. fail: function (error) {
  1498. wx.showToast({
  1499. title: "无数据",
  1500. icon: "error",
  1501. mask: true,
  1502. });
  1503. }
  1504. });
  1505. },
  1506. // 初始化的数据
  1507. initReportData(ress) {
  1508. const that = this;
  1509. let durationDataTemp = [];
  1510. let obj = {};
  1511. obj.name = '深睡';
  1512. obj.value = ress.rdeep_duration;
  1513. durationDataTemp.push(obj);
  1514. obj = {};
  1515. obj.name = '浅睡';
  1516. obj.value = ress.rlight_duration;
  1517. durationDataTemp.push(obj);
  1518. obj = {};
  1519. obj.name = '中睡';
  1520. obj.value = ress.rin_duration;
  1521. durationDataTemp.push(obj);
  1522. obj = {};
  1523. obj.name = '清醒';
  1524. obj.value = ress.rawake_duration;
  1525. durationDataTemp.push(obj);
  1526. let sleep_durationCount = 0;
  1527. if (ress.rdeep_duration) {
  1528. sleep_durationCount += parseFloat(ress.rdeep_duration)
  1529. }
  1530. if (ress.rlight_duration) {
  1531. sleep_durationCount += parseFloat(ress.rlight_duration)
  1532. }
  1533. if (ress.rin_duration) {
  1534. sleep_durationCount += parseFloat(ress.rin_duration)
  1535. }
  1536. let sleep_efficiency_temp = ress.rtotal_duration ? (Math.ceil((sleep_durationCount / ress.rtotal_duration) * 100) + '%') : '%'
  1537. let rdeep_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rdeep_duration ? parseFloat(ress.rdeep_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1538. let rlight_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rlight_duration ? parseFloat(ress.rlight_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1539. let rin_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rin_duration ? parseFloat(ress.rin_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1540. let rawake_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rawake_duration ? parseFloat(ress.rawake_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1541. let sleep_durationTemp = [];
  1542. let obj1 = {};
  1543. obj1.name = '睡眠时间';
  1544. obj1.value = Math.ceil(sleep_durationCount / 60);
  1545. sleep_durationTemp.push(obj1);
  1546. obj1 = {};
  1547. obj1.name = '清醒时间';
  1548. obj1.value = Math.ceil(parseFloat(ress.rawake_duration) / 60);
  1549. sleep_durationTemp.push(obj1);
  1550. let zdPointTemp = [];
  1551. let rdt_arrTemp = [];
  1552. let rrh_arrTemp = [];
  1553. let rhx_arrTemp = [];
  1554. let rmove_arrTemp = [];
  1555. let rsleep_arrTemp = [];
  1556. let rsleep_arr_all_Temp = [];
  1557. if (ress.rrh_arr) {
  1558. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1559. }
  1560. if (ress.rrh_arr) {
  1561. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1562. }
  1563. if (ress.rhx_arr) {
  1564. rhx_arrTemp = that.splitN(ress.rhx_arr.split(","), 100);
  1565. }
  1566. if (ress.rmove_arr) {
  1567. rmove_arrTemp = that.splitN(ress.rmove_arr.split(","), 100);
  1568. }
  1569. if (ress.rsleep_arr) {
  1570. rsleep_arrTemp = that.splitN(ress.rsleep_arr.split(","), 100);
  1571. }
  1572. if (ress.rsleep_arr) {
  1573. rsleep_arr_all_Temp = ress.rsleep_arr.split(",");
  1574. }
  1575. that.setData({
  1576. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1577. rrh_arr: ress.rrh_arr ? ress.rrh_arr.split(',') : [],
  1578. rhx_arr: ress.rhx_arr ? ress.rhx_arr.split(',') : [],
  1579. rsnoring_arr: ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [],
  1580. routbed_arr: ress.routbed_arr ? ress.routbed_arr.split(',') : [],
  1581. rmove_arr: ress.rmove_arr ? ress.rmove_arr.split(',') : [],
  1582. rhxstop_arr: ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [],
  1583. rsleep_arr: ress.rsleep_arr ? ress.rsleep_arr.split(',') : [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1584. rsnoring_arrFrequency: that.getFrequency(ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [], 1),
  1585. routbed_arrFrequency: that.getFrequency(ress.routbed_arr ? ress.routbed_arr.split(',') : [], 0),
  1586. rmove_arrFrequency: that.getFrequency(ress.rmove_arr ? ress.rmove_arr.split(',') : [], 1),
  1587. rhxstop_arrFrequency: that.getFrequency(ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [], 1),
  1588. rdeep_durationFormatA: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1589. rlight_duration: ress.rlight_duration,
  1590. rin_duration: ress.rin_duration,
  1591. rawake_duration: ress.rawake_duration,
  1592. ravg_hx_value: ress.ravg_hx_value,
  1593. ravg_hx_desc: ress.ravg_hx_desc,
  1594. ravg_rh_value: ress.ravg_rh_value,
  1595. ravg_rh_desc: ress.ravg_rh_desc,
  1596. rscore_value: ress.rscore_value,
  1597. rscore_desc: ress.rscore_desc,
  1598. rsn: ress.rsn,
  1599. rdate: ress.rdate,
  1600. total_duration: ress.rtotal_duration,
  1601. rtotal_duration: that.convertTimeToHoursAndMinutes(ress.rtotal_duration),//睡眠总时长,单位小时分钟
  1602. rinbed_duration: that.convertTimeToHoursAndMinutes(ress.rinbed_duration),//在床时长,单位小时分钟
  1603. rgobed_time: ress.rgobed_time,//上床时间
  1604. routbed_time: ress.routbed_time,//离床时间
  1605. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1606. sleepHourSub: that.getTimeDiffInHours(ress.rgobed_time, ress.routbed_time),
  1607. routbed_count_value: ress.routbed_count_value,//离床次数
  1608. rsn: ress.rsn,
  1609. zdPointT: zdPointTemp,
  1610. rdt_arrNew: rdt_arrTemp,
  1611. rrh_arrNew: rrh_arrTemp,
  1612. rhx_arrNew: rhx_arrTemp,
  1613. rmove_arrNew: rmove_arrTemp,
  1614. rsleep_arrNew: rsleep_arrTemp,
  1615. rsleep_arr_all_New: rsleep_arr_all_Temp,
  1616. durationData: durationDataTemp,
  1617. sleep_duration: sleep_durationTemp,
  1618. sleep_efficiency: sleep_efficiency_temp,
  1619. sleep_durationCountA: that.convertTimeToHoursAndMinutes(sleep_durationCount ? sleep_durationCount.toString() : '0'),
  1620. tvEntityIds: wx.getStorageSync('tvEntityIds'),
  1621. ifOneMoreTV: (wx.getStorageSync('tvEntityIds') && wx.getStorageSync('tvEntityIds').length > 1),
  1622. rdeep_duration_efficiency: rdeep_duration_efficiency_temp,
  1623. rlight_duration_efficiency: rlight_duration_efficiency_temp,
  1624. rin_duration_efficiency: rin_duration_efficiency_temp,
  1625. rawake_duration_efficiency: rawake_duration_efficiency_temp,
  1626. pushReportId: ress.rdid,
  1627. rrs_duration: that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0'),
  1628. routbed_count_value: ress.routbed_count_value,
  1629. rsleep_eff_value: ress.rsleep_eff_value,
  1630. hotelname: ress.hotelname,
  1631. roomname: ress.roomname,
  1632. bedname: ress.bedname,
  1633. });
  1634. },
  1635. // 香睡指数
  1636. initChartCircle(ress) {
  1637. var that = this;
  1638. try {
  1639. let rscore_descTemp = [];
  1640. if (ress.rscore_desc) {
  1641. rscore_descTemp = ress.rscore_desc;
  1642. }
  1643. let rscore_valueTemp = [];
  1644. if (ress.rscore_value) {
  1645. rscore_valueTemp = ress.rscore_value;
  1646. }
  1647. that.setData({
  1648. rscore_desc: rscore_descTemp,
  1649. rscore_value: rscore_valueTemp,
  1650. });
  1651. updateChartCircularProgressBarOption(rscore_descTemp, rscore_valueTemp, that);
  1652. } catch (error) {
  1653. console.error(error);
  1654. }
  1655. },
  1656. // 心脏 系统
  1657. initCardiacSystem(ress) {
  1658. var that = this;
  1659. try {
  1660. let rdt_arrTemp = [];
  1661. if (ress.rrh_arr) {
  1662. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1663. }
  1664. if (ress.rdate) {
  1665. that.setData({
  1666. reportDate: ress.rdate
  1667. });
  1668. }
  1669. let rrh_arrTemp = [];
  1670. if (ress.rrh_arr) {
  1671. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1672. }
  1673. that.setData({
  1674. rdt_arrNew: rdt_arrTemp,
  1675. rrh_arrNew: rrh_arrTemp,
  1676. });
  1677. console.log("that.data.rdt_arrNew,that.data.rrh_arrNew=" + that.data.rdt_arrNew + "," + that.data.rrh_arrNew);
  1678. updateCardiacSystem(that.data.rdt_arrNew, that.data.rrh_arrNew, that);
  1679. } catch (error) {
  1680. console.error(error);
  1681. }
  1682. },
  1683. initTimeWaterfall(ress) {//深浅睡眠
  1684. var that = this;
  1685. try {
  1686. let rdt_arrTemp = [];
  1687. if (ress.rrh_arr) {
  1688. // rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1689. rdt_arrTemp = ress.rdt_arr.split(",");
  1690. }
  1691. // console.log('深浅睡眠11111=======' + JSON.stringify(rdt_arrTemp));
  1692. let rsleep_arr_Temp = [];
  1693. if (ress.rsleep_arr) {
  1694. // rsleep_arr_Temp = that.splitN(ress.rsleep_arr.split(","), 100);
  1695. rsleep_arr_Temp = ress.rsleep_arr.split(",");
  1696. }
  1697. // console.log('深浅睡眠222222=======' + JSON.stringify(rsleep_arr_Temp));
  1698. that.setData({
  1699. rdt_arrNew: rdt_arrTemp,
  1700. rsleep_arr: rsleep_arr_Temp,
  1701. rdeep_duration: ress.rdeep_duration,
  1702. rlight_duration: ress.rlight_duration,
  1703. rin_duration: ress.rin_duration,
  1704. rawake_duration: ress.rawake_duration,
  1705. rdeep_durationFormat: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1706. rlight_durationFormat: that.convertTimeToHoursAndMinutes(ress.rlight_duration),
  1707. rin_durationFormat: that.convertTimeToHoursAndMinutes(ress.rin_duration),
  1708. rawake_durationFormat: that.convertTimeToHoursAndMinutes(ress.rawake_duration),
  1709. });
  1710. that.calculateTheDurationOfDeepSleep();
  1711. } catch (error) {
  1712. console.error(error);
  1713. }
  1714. console.log("that.data.rsleep_arr=" + that.data.rsleep_arr);
  1715. },
  1716. initOutOfBed(ress) {//离床次数
  1717. var that = this;
  1718. try {
  1719. var routbed_arr_Temp = [];
  1720. if (ress.routbed_arr) {
  1721. routbed_arr_Temp = ress.routbed_arr.split(",");
  1722. }
  1723. that.setData({
  1724. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1725. routbed_arr: routbed_arr_Temp,
  1726. rgobed_time: ress.rgobed_time,
  1727. routbed_time: ress.routbed_time,
  1728. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1729. });
  1730. updateOutOfBed(that.data.rdt_arr, that.data.routbed_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1731. } catch (error) {
  1732. console.error(error);
  1733. }
  1734. console.log("that.data.routbed_arr=" + that.data.routbed_arr);
  1735. },
  1736. initBodyMovements(ress) {//体动次数
  1737. var that = this;
  1738. try {
  1739. var rmove_arr_Temp = [];
  1740. if (ress.rmove_arr) {
  1741. rmove_arr_Temp = ress.rmove_arr.split(",");
  1742. }
  1743. that.setData({
  1744. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1745. rmove_arr: that.splitN(rmove_arr_Temp, 100),
  1746. rgobed_time: ress.rgobed_time,
  1747. routbed_time: ress.routbed_time,
  1748. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1749. });
  1750. updateBodyMovements(that.data.rdt_arr, that.data.rmove_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1751. } catch (error) {
  1752. console.error(error);
  1753. }
  1754. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  1755. },
  1756. initChartRespiratory(ress) {//平均呼吸率
  1757. var that = this;
  1758. try {
  1759. var rhx_arr_Temp = [];
  1760. if (ress.rhx_arr) {
  1761. rhx_arr_Temp = ress.rhx_arr.split(",");
  1762. }
  1763. that.setData({
  1764. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1765. rhx_arr: that.splitN(rhx_arr_Temp, 100),
  1766. rgobed_time: ress.rgobed_time,
  1767. routbed_time: ress.routbed_time,
  1768. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1769. });
  1770. updateRespiratory(that.data.rdt_arr, that.data.rhx_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1771. } catch (error) {
  1772. console.error(error);
  1773. }
  1774. console.log("c81_that.data.ravg_hx_value=" + that.data.ravg_hx_value);
  1775. },
  1776. initChartSnoring(ress) {//打鼾
  1777. var that = this;
  1778. try {
  1779. var rsnoring_arr_Temp = [];
  1780. if (ress.rsnoring_arr) {
  1781. rsnoring_arr_Temp = ress.rsnoring_arr.split(",");
  1782. }
  1783. that.setData({
  1784. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1785. rsnoring_arr: that.splitN(rsnoring_arr_Temp, 100),
  1786. rgobed_time: ress.rgobed_time,
  1787. routbed_time: ress.routbed_time,
  1788. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1789. });
  1790. updateSnoring(that.data.rdt_arr, that.data.rsnoring_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1791. } catch (error) {
  1792. console.error(error);
  1793. }
  1794. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  1795. },
  1796. initChartApnea(ress) {//呼吸暂停
  1797. var that = this;
  1798. try {
  1799. var rhxstop_arr_Temp = [];
  1800. if (ress.rhxstop_arr) {
  1801. rhxstop_arr_Temp = ress.rhxstop_arr.split(",");
  1802. }
  1803. that.setData({
  1804. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  1805. rhxstop_arr: that.splitN(rhxstop_arr_Temp, 100),
  1806. rgobed_time: ress.rgobed_time,
  1807. routbed_time: ress.routbed_time,
  1808. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1809. });
  1810. updateApnea(that.data.rdt_arr, that.data.rhxstop_arr, that.data.rgobed_time, that.data.routbed_time, that)
  1811. } catch (error) {
  1812. console.error(error);
  1813. }
  1814. console.log("c8_that.data.rhxstop_arr=" + that.data.rhxstop_arr);
  1815. },
  1816. mounted() {
  1817. },
  1818. /**
  1819. * 生命周期函数--监听页面隐藏
  1820. */
  1821. onHide: function () {
  1822. },
  1823. /**
  1824. * 生命周期函数--监听页面卸载
  1825. */
  1826. onUnload: function () {
  1827. },
  1828. /**
  1829. * 页面相关事件处理函数--监听用户下拉动作
  1830. */
  1831. onPullDownRefresh: function () {
  1832. },
  1833. /**
  1834. * 页面上拉触底事件的处理函数
  1835. */
  1836. onReachBottom: function () {
  1837. },
  1838. /**
  1839. * 用户点击右上角分享
  1840. */
  1841. onShareAppMessage: function () {
  1842. }
  1843. })