data.js 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342
  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. 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. sn: '',//今日报告切换用
  1093. sns: [],//床
  1094. dateData: [],//日期
  1095. dateTimeData: [],//时间段
  1096. showSelectSn: false,
  1097. showSelectDate: false,
  1098. showSelectDateTime: false,
  1099. isNoReportToday: false,
  1100. isShowTz: false,
  1101. tzTitle: '',
  1102. tzSubTitle: '',
  1103. },
  1104. toWarmReminder(e) {
  1105. const tabName = e.currentTarget.dataset.index || 1;
  1106. wx.navigateTo({
  1107. url: '/subpages/warmReminder/warmReminder?id=' + tabName
  1108. })
  1109. },
  1110. getRsleep_arr(list) {
  1111. if (list) {
  1112. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1113. for (let i = 0; i < list.length; i++) {
  1114. if (list[i] == '0') {
  1115. list[i] = '清醒';
  1116. } else if (list[i] == '10') {
  1117. list[i] = '浅睡';
  1118. } else if (list[i] == '20') {
  1119. list[i] = '中睡';
  1120. } else if (list[i] == '30') {
  1121. list[i] = '深睡';
  1122. } else {
  1123. list[i] = '其他';
  1124. }
  1125. }
  1126. }
  1127. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1128. },
  1129. getFrequency(list) {//获取
  1130. if (list) {
  1131. console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1132. for (let i = 0; i < list.length; i++) {
  1133. if (list[i] == '0') {
  1134. list[i] = '清醒';
  1135. } else if (list[i] == '10') {
  1136. list[i] = '浅睡';
  1137. } else if (list[i] == '20') {
  1138. list[i] = '中睡';
  1139. } else if (list[i] == '30') {
  1140. list[i] = '深睡';
  1141. } else {
  1142. list[i] = '其他';
  1143. }
  1144. }
  1145. }
  1146. console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1147. },
  1148. splitN(originalArray, n) {
  1149. if (!originalArray) return [];
  1150. // 计算每份的大小
  1151. let chunkSize = Math.ceil(originalArray.length / n);
  1152. // 分割数组并获取每份的最后一个元素
  1153. let lastElements = [];
  1154. for (let i = 0; i < originalArray.length; i += chunkSize) {
  1155. let chunk = originalArray.slice(i, i + chunkSize);
  1156. lastElements.push(chunk[chunk.length - 1]);
  1157. }
  1158. // 输出每份的最后一个元素
  1159. console.log('lastElements=' + lastElements);
  1160. return lastElements;
  1161. },
  1162. //获取次数
  1163. getFrequency(list, o) {
  1164. if (!list) return 0;
  1165. let frequency = 0;
  1166. for (let i = 0; i < list.length; i++) {
  1167. if (list[i] == o) frequency++;
  1168. }
  1169. console.log('frequency=' + frequency);
  1170. return frequency;
  1171. },
  1172. getTimeDiffInHours: function (startTimeStr, endTimeStr) {
  1173. // 假设两个时间都是同一天的,这里我们使用当前日期作为基准
  1174. if (!startTimeStr || !endTimeStr) return null;
  1175. const now = new Date();
  1176. const startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...startTimeStr.split(':').map(Number));
  1177. const endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...endTimeStr.split(':').map(Number));
  1178. // 处理跨天的情况
  1179. if (endDate < startDate) {
  1180. endDate.setDate(endDate.getDate() + 1); // 将结束时间设置为第二天的同一时间
  1181. }
  1182. // 计算时间差(毫秒)
  1183. const diffInMs = endDate - startDate;
  1184. // 转换为小时
  1185. const diffInHours = diffInMs / (1000 * 60 * 60);
  1186. return diffInHours;
  1187. },
  1188. // 时间格式化
  1189. convertTimeToHoursAndMinutes: function (timeWithText, flag = 0) {
  1190. if (!timeWithText) return;
  1191. // 移除'分钟'两个字
  1192. var minutesStr = timeWithText.replace('分钟', '');
  1193. var minutes = parseInt(minutesStr); // 将字符串转换为整数
  1194. if (isNaN(minutes)) {
  1195. // 如果转换失败,则可能是输入的不是有效的数字
  1196. console.error('Invalid minutes format');
  1197. return;
  1198. }
  1199. var hours = Math.floor(minutes / 60); // 整除60得到小时数
  1200. var remainingMinutes = minutes % 60; // 取余得到剩余的分钟数
  1201. // 如果小时数或分钟数小于10,前面补0
  1202. // var formattedHours = hours < 10 ? '0' + hours : hours;
  1203. var formattedHours = hours;
  1204. // var formattedMinutes = remainingMinutes < 10 ? '0' + remainingMinutes : remainingMinutes;
  1205. var formattedMinutes = remainingMinutes;
  1206. // 拼接小时和分钟,形成HH:mm格式
  1207. var formattedTime = '';
  1208. if (flag == 1) {
  1209. formattedTime = formattedHours + 'H ' + formattedMinutes + 'M';
  1210. } else if (flag == 2) {
  1211. formattedTime = formattedHours + '{units|小时}' + formattedMinutes + '{units|分钟}';
  1212. } else {
  1213. formattedTime = {
  1214. formattedHours,
  1215. formattedMinutes
  1216. };
  1217. }
  1218. // 更新数据
  1219. // this.setData({
  1220. // formattedTime: formattedTime
  1221. // });
  1222. return formattedTime;
  1223. },
  1224. // 组装深度睡眠数据
  1225. calculateTheDurationOfDeepSleep() {
  1226. var that = this;
  1227. // var totalDuration = this.data.total_duration;
  1228. // var timePeriod = this.data.rdt_arrNew;
  1229. var sleepData = this.data.rsleep_arr;//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1230. // console.log("睡眠总时长=>", totalDuration);
  1231. // console.log("睡眠时间片段=>", timePeriod);
  1232. // console.log("睡眠时间片段=>", timePeriod.length);
  1233. // console.log("睡眠数据=>", sleepData);
  1234. // console.log("睡眠数据=>", sleepData.length);
  1235. var awakeColor = [{ offset: 0, color: '#F7E3BA' }, { offset: 1, color: '#F7E3BA' }];;
  1236. var lightSleepColor = [{ offset: 0, color: '#AAD09F' }, { offset: 1, color: '#AAD09F' }];
  1237. var sleptInColor = [{ offset: 0, color: '#75BDE0' }, { offset: 1, color: '#75BDE0' }];
  1238. var deepSleepColor = [{ offset: 0, color: '#3D7299' }, { offset: 1, color: '#3D7299' }];
  1239. // var linearGradient = new echarts.graphic.LinearGradient(
  1240. // 0, 0, 0, 1, // 方向从左到右
  1241. // [
  1242. // { offset: 0, color: '#FDBE25' }, // 渐变开始的颜色
  1243. // { offset: 1, color: '#FD7778' } // 渐变结束的颜色
  1244. // ]
  1245. // );
  1246. // var item = {
  1247. // name: { name: '清醒', color: '#7b9ce1' },
  1248. // value: [index, baseTime, (baseTime += duration), duration],
  1249. // itemStyle: {
  1250. // normal: {
  1251. // color: linearGradient,
  1252. // }
  1253. // }
  1254. // };
  1255. // 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-深睡
  1256. // 状态映射
  1257. const statusMap = {
  1258. "0": "清醒",
  1259. "10": "浅睡",
  1260. "20": "中睡",
  1261. "30": "深睡"
  1262. };
  1263. // 状态映射
  1264. const statusColorMap = {
  1265. "20": awakeColor,
  1266. "0": lightSleepColor,
  1267. "10": sleptInColor,
  1268. "30": deepSleepColor
  1269. };
  1270. // 状态映射
  1271. const statusIndexMap = {
  1272. "20": 3,
  1273. "0": 2,
  1274. "10": 1,
  1275. "30": 0
  1276. };
  1277. // 初始化变量 reportDate
  1278. // let dateString = '2024/09/14 23:20:00';
  1279. let dateString = `${that.data.reportDate.replaceAll("-", "/")} ${that.data.rgobed_time + ":00"}`;
  1280. let date = new Date(dateString);
  1281. let startTime = date.getTime(); // 基准时间,这里设为午夜开始
  1282. console.log("时间=》", timestampToHHMM(startTime));
  1283. let oldTime = startTime;
  1284. let currentTime = startTime;
  1285. let currentState = sleepData[0];
  1286. let timePeriods = [];
  1287. // 遍历睡眠数据数组
  1288. for (let i = 0; i < sleepData.length; i++) {
  1289. // 如果当前状态与前一个状态不同,则记录前一个时间段
  1290. if (i > 0 && sleepData[i] !== sleepData[i - 1]) {
  1291. // 计算前一个时间段的结束时间(注意这里不需要减去一分钟,因为 currentTime 还未递增)
  1292. let endTime = currentTime;
  1293. // 计算前一个时间段的持续时间(分钟)
  1294. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1295. // 记录时间段
  1296. if (duration > 0) {
  1297. var linearGradient = new echarts.graphic.LinearGradient(
  1298. 0, 0, 0, 1, // 方向从左到右
  1299. statusColorMap[sleepData[i - 1]]
  1300. );
  1301. timePeriods.push({
  1302. name: statusMap[sleepData[i - 1]],// 使用前一个状态
  1303. value: [statusIndexMap[sleepData[i - 1]], startTime, endTime, duration],
  1304. itemStyle: {
  1305. normal: {
  1306. color: linearGradient,
  1307. }
  1308. },
  1309. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1310. // endTime: new Date(endTime),
  1311. // durationMinutes: duration
  1312. });
  1313. }
  1314. // 更新当前状态和开始时间
  1315. currentState = sleepData[i];
  1316. startTime = currentTime;
  1317. }
  1318. // 递增时间(每分钟)
  1319. currentTime += 1000 * 60;
  1320. // 处理最后一个时间段(如果数组不是以状态变化结束的话)
  1321. if (i === sleepData.length - 1) {
  1322. let endTime = currentTime;
  1323. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1324. if (duration > 0) {
  1325. var linearGradient = new echarts.graphic.LinearGradient(
  1326. 0, 0, 0, 1, // 方向从左到右
  1327. statusColorMap[currentState]
  1328. );
  1329. timePeriods.push({
  1330. name: statusMap[currentState],// 使用前一个状态
  1331. value: [statusIndexMap[currentState], startTime, endTime, duration],
  1332. itemStyle: {
  1333. normal: {
  1334. color: linearGradient,
  1335. }
  1336. },
  1337. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1338. // endTime: new Date(endTime),
  1339. // durationMinutes: duration
  1340. });
  1341. }
  1342. }
  1343. }
  1344. wx.nextTick(() => {
  1345. setTimeout(() => {
  1346. updateTimeWaterfall(oldTime, timePeriods, that)
  1347. }, 1000);
  1348. });
  1349. // console.log("睡眠数据最终=>", dateString);
  1350. // console.log("睡眠数据最终=>", startTime);
  1351. console.log("睡眠数据最终=>", JSON.stringify(timePeriods));
  1352. },
  1353. // 授权成功
  1354. authorizationSuccessful() {
  1355. console.log("授权成功");
  1356. this.setData({ showAuthorizedDialog: false })
  1357. this.showData();
  1358. },
  1359. onReady() {
  1360. },
  1361. showData() {
  1362. let hotelcodeTemp = wx.getStorageSync("hotelEmpower");
  1363. let roomcodeTemp = wx.getStorageSync("roomEmpower");
  1364. // hotelcodeTemp = wx.getStorageSync('res').result.split('|')[0];
  1365. // roomcodeTemp = wx.getStorageSync('res').result.split('|')[1];
  1366. // 设置canvas的宽高
  1367. this.setData({
  1368. hotelcode: hotelcodeTemp,
  1369. roomcode: roomcodeTemp,
  1370. });
  1371. if (this.data.isToDay) {
  1372. this.getToDayReportData();
  1373. } else {
  1374. this.getReportData();
  1375. }
  1376. this.getTzData();
  1377. },
  1378. /**
  1379. * 生命周期函数--监听页面加载
  1380. */
  1381. onShow: function () {
  1382. if (!wx.getStorageSync('hasAuth')) {
  1383. this.setData({ showAuthorizedDialog: true })
  1384. } else {
  1385. this.showData();
  1386. }
  1387. },
  1388. onLoad(options) {
  1389. var that = this;
  1390. if (options.rpids) {
  1391. that.setData({
  1392. reportId: options.rpids,
  1393. isToDay: false
  1394. })
  1395. wx.setNavigationBarTitle({
  1396. title: "历史睡眠报告"
  1397. })
  1398. } else {
  1399. wx.setNavigationBarTitle({
  1400. title: "最新睡眠报告" || "今日睡眠报告"
  1401. })
  1402. that.setData({
  1403. isToDay: true
  1404. })
  1405. }
  1406. },
  1407. onSnChange(event) {
  1408. const { picker, value, index } = event.detail;
  1409. console.log(`当前值:${value.sn}, 当前索引:${index}`);
  1410. this.closePicker();
  1411. this.getDateData(value.sn);//自动获取日期
  1412. //
  1413. // this.getDateTimeData(this.data.reportDate);//如果不能修改日期 自动获取时间段
  1414. },
  1415. onDateChange(event) {
  1416. const { picker, value, index } = event.detail;
  1417. console.log(`当前值:${value.rdate}, 当前索引:${index}`);
  1418. this.closePicker();
  1419. this.getDateTimeData(value.rdate);//自动获取时间段
  1420. },
  1421. onDateTimeChange(event) {
  1422. const { picker, value, index } = event.detail;
  1423. console.log(`当前值:${value.rpids}, 当前索引:${index}`);
  1424. this.setData({
  1425. reportId: value.rpids
  1426. });
  1427. this.closePicker();
  1428. this.getReportData();//更新报告
  1429. },
  1430. showPicker(e) {
  1431. // return //暂时不开放
  1432. // 不是今天不让选择
  1433. if (!this.data.isToDay) {
  1434. return
  1435. }
  1436. var type = e.currentTarget.dataset.type;
  1437. console.log(type);
  1438. if (type == 'sn' && this.data.sns.length) {
  1439. this.setData({
  1440. showSelectSn: true,
  1441. });
  1442. } else if (type == 'date' && this.data.dateData.length) {
  1443. return
  1444. // this.setData({
  1445. // showSelectDate: true,
  1446. // });
  1447. } else if (type == 'dateTime' && this.data.dateTimeData.length) {
  1448. return
  1449. // this.setData({
  1450. // showSelectDateTime: true,
  1451. // });
  1452. }
  1453. },
  1454. closePicker() {
  1455. this.setData({
  1456. showSelectSn: false,
  1457. showSelectDate: false,
  1458. showSelectDateTime: false
  1459. });
  1460. },
  1461. getSnData() {
  1462. var that = this;
  1463. wx.request({
  1464. url: `${aipushApi}` + '/getsn',
  1465. data: {
  1466. // "hotelcode": "lab",
  1467. // "roomcode": "labs",
  1468. "hotelcode": that.data.hotelcode ? that.data.hotelcode : "club",
  1469. "roomcode": that.data.roomcode ? that.data.roomcode : "nuange",
  1470. "token": token_push
  1471. },
  1472. method: 'POST',
  1473. success(res) {
  1474. try {
  1475. if (res && res.data && res.data[0]) {
  1476. that.setData({
  1477. hotelname: res.data[0].hn,
  1478. roomname: res.data[0].rn,
  1479. sn: res.data[0].sn,
  1480. sns: res.data //床的数组
  1481. });
  1482. that.getDateData(res.data[0].sn, false);//根据 sn 获取可以用的时间段
  1483. // console.log("res.data=sn=" + JSON.stringify(res.data));
  1484. }
  1485. } catch (error) {
  1486. console.error(error);
  1487. }
  1488. },
  1489. })
  1490. },
  1491. toReport() {
  1492. wx.navigateTo({
  1493. url: '/subpages/constitutionDiagnosis/constitutionDiagnosis'
  1494. })
  1495. },
  1496. getTzData() {
  1497. var that = this;
  1498. var userId = wx.getStorageSync("unionid");
  1499. wx.request({
  1500. url: `https://fare.somnisix.top/system/constitutionDiagnosis/user/${userId}`,
  1501. data: {
  1502. "token": "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk5YzI3MjI2LTdkOWQtNDhiOC1hYjlhLWM4YjVjYWZiZGNkNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zITQOINFkHs19_1RAgHS4I9YMaVxVq0Dsn3t6r_K7rv3rXvJy0sMtodejIMi_PNa_m4uQYxnU-6k3wC2LZht_Q"
  1503. },
  1504. header: {
  1505. 'Authorization': 'Bearer ' + "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk5YzI3MjI2LTdkOWQtNDhiOC1hYjlhLWM4YjVjYWZiZGNkNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zITQOINFkHs19_1RAgHS4I9YMaVxVq0Dsn3t6r_K7rv3rXvJy0sMtodejIMi_PNa_m4uQYxnU-6k3wC2LZht_Q" // 在头部设置Bearer Token
  1506. },
  1507. method: 'GET',
  1508. success(res) {
  1509. try {
  1510. if (res && res.data && res.data.data) {
  1511. console.log("睡眠数据最终33=>", res.data);
  1512. if (res.data.data.value2) {
  1513. console.log("睡眠数据最终444=>", res.data.data.value2);
  1514. var data = JSON.parse(res.data.data.value2);
  1515. console.log("睡眠数据最终555=>", data);
  1516. var ratingResultsMap = {
  1517. A: {
  1518. index: 0,
  1519. title: "气虚型",
  1520. tips: "(体力和气力都低下,需要规律性的生活方式)",
  1521. subTitle: "累啊』『真倒霉』成了口头语",
  1522. desc: "一般来说气虚型的人,就是被称作生命力的“气”整体不足。因为体力和气力的整体下降,无论做什么都会感到“真倒霉”“真麻烦”,饮食和运动也是马马虎虎地应付。结果,陷入生活越不规律,“气”就越衰弱的恶性循环。特点就是免疫力降低,易患感冒,而且很难一次性治愈。\n\n为了改善气虚,最重要的就是要有规律性的生活方式。晚上早睡,早上早起。日常食物也要以应季的食材为主,促进胃肠的蠕动,尽量多食用可以提升体温的豆类、薯类等食材。\n\n适度的运动是必要的,但因体力下降,所以万不可强求大的运动量,可以从散步呀、瑜伽呀等轻负荷的运动练起。\n\n特征:驼背。显老像;稍一运动就出汗;手脚发冷;易疲劳,总有困意与疲倦感;下半身易发胖。"
  1523. }, B: {
  1524. index: 1,
  1525. title: "气滞型",
  1526. tips: "(常常紧张、焦虑~要有意识地放松自己)",
  1527. subTitle: "感情起伏剧烈",
  1528. desc: "“气”本来是在体内正常循环的,但是因紧张和压力等使气滞留,就造成了气滞型。“气’一旦滞留,就表现为腹胀、肿胀、疼痛等症状。而且,感情起伏剧烈也是其特征。一旦情绪低落,很快就会焦虑起来,给人以“易发怒”歇斯底里”的感觉。更年期出现气滞的人也不在少数。\n\n养生法无疑是减轻压力的最好办法,但暴饮暴食则会适得其反。值得注意的是体重的增加会影响气的循环。香草和香味蔬菜有促进气循环和防止暴饮暴食的作用。除此之外,每天的日常安排中应留出自我放松的时间,也可以进行深呼吸,这些都有助于改善气滞。\n\n气滞型:入睡困难;眼睛充血;肚子容易生赘肉;焦虑,易怒,皮肤油腻,发红;易打嗝,矢气。"
  1529. }, C: {
  1530. index: 2,
  1531. title: "血虚型",
  1532. tips: "(饮食生活无规律~可能也有气虚或气滞的原因)",
  1533. subTitle: "头发散乱,皮肤无光泽",
  1534. desc: "你是否为了减肥极端地限制饮食,或者光在外边吃快餐?如果一直这样,就会使营养失去平衡,引起“血”的不足,陷入血虚状态。\n\n为此,日常饮食重要的是要注意营养的平衡,特别要多食用有造血作用的羊栖菜、动物肝脏、梅干等。“血”增加了,头发散乱、皮肤无光泽这些血虚型的症状自然就消失了。夜间是人体的造血时间,因此不要熬夜。还要控制电脑和手机的使用,也要控制看电视的时间。中医学以为用眼是消耗“血”的。\n\n特征:头发脆弱,脱发;常常眩晕,站起时头晕;脸色不好,皮肤干燥;指甲偏薄,易裂;耳鸣;冷静,认真型。"
  1535. }, D: {
  1536. index: 3,
  1537. title: "淤血型",
  1538. tips: "(血流不畅~更要注意减压,慎食生冷食品)",
  1539. subTitle: "常常感到肩凝、头痛",
  1540. desc: "血流不顺畅,易在体内形成血块(瘀血)。其原因有喜食生冷食品、压力大、过劳、睡眠不足等等。也有因气虚和血虚造成的瘀血。\n\n对这个型的人,首先是必须使其血行畅通,提高代谢。要多食用牛蒡、蒟蒻(魔芋)、黑醋等有化解瘀血作用的食品,也要多食用生姜和韭菜、葱等有香味的蔬菜。饮料也要尽量选择热你,偏冷会影响血循环。\n\n要养成运动的习惯。运动可以促进血行,缓解瘀血引起的肩凝和腰痛。当然,按摩下半身也可以有效地改善脸部的气色。\n\n特征:容易被晒伤;容易长色斑,雀斑;容易出现黑眼圈;常常为肩凝和腰痛烦恼;经血中有动物肝脏样血块;基本上自制力较强,但偶尔也会感情爆发。"
  1541. }, E: {
  1542. index: 4,
  1543. title: "水虚型",
  1544. tips: "(身体如同干枯一般~避免食用香辛食物和剧烈运动)",
  1545. subTitle: "常为头晕眼花、身体发热而烦恼",
  1546. desc: "体内水分不足称为水虚。皮肤、毛发、大便干燥的入水虚的可能性较大。而且,这类人因为给身体起到降温作用的水分不足,所以,常常感到头晕眼花或者身体发热。\n\n作为养生法,就是要通过食物的摄取,有效地补充水分。其中,苹果和香蕉、白菜可以有效地滋润身体,要有意识地多多食用。而且,因为睡眠中容易出汗,水分会在不知不觉中流失,因此,要在枕边预备下温开水,醒来后先饮水。\n\n另一方面,要尽量避免食用香辛食材。因为香辛料有温暖身体的作用,可能会加重头晕眼花和身体发热的症状。水虚的人还要避免剧烈的运动。因为他们的关节水分不足,剧烈运动会引发疼痛。\n\n特征:睡眠浅,盗汗;关节运动不灵活;不明原因的消沉,情绪低落;毛发和皮肤脆弱,口腔和咽喉干燥;便秘,尿量少。"
  1547. }, F: {
  1548. index: 5,
  1549. title: "痰湿型",
  1550. tips: "(体内多余的水分~常常引发各种“不调”,要慎食味重食品)",
  1551. subTitle: "体型胖墩墩的",
  1552. desc: "现代职场女性多为痰湿型。所谓痰湿就是生活不规律、压力大等原因造成身体内形成多余的水分块(痰湿)的状态。因为我们的身体70%是由水构成的,所以痰湿的影响不容忽视,会造成我们的身心状态出现各种各样的“不调”。\n\n首先,有氧运动能够增加肌肉的弹力,促进血行和代谢。肌肉弹力的提高、血行和代谢的改善,就可以通过汗和取把多余的水分排出体外。\n\n第二要注意减少冷饮和味重食品的摄入量,因为它们会造成水分的滞留。\n\n第三要多食用黄瓜和西瓜、梨等有较好利尿作用的食物。也要多食红豆、薏米。\n\n特征:整个身体容易浮肿;容易发胖;早晨起床后脸上有枕头的痕迹;皮肤发白。胖墩墩的;爱生湿乎乎的疙瘩;性格自我,爱慕虚荣。"
  1553. }
  1554. };
  1555. var key = that.findKeyWithMaxValue(data);
  1556. console.log("睡眠数据最终555=>", ratingResultsMap[key]);
  1557. that.setData({
  1558. tzTitle: ratingResultsMap[key]?.title,
  1559. tzSubTitle: ratingResultsMap[key]?.subTitle,
  1560. isShowTz: true
  1561. })
  1562. }
  1563. }
  1564. } catch (error) {
  1565. console.error(error);
  1566. }
  1567. },
  1568. })
  1569. },
  1570. /**
  1571. * A、B、C、D、E、F 最后积累的数量对比,按数量多少来判断,6个分别对应:气虚型、气滞型、血虚型、淤血型、水虚型、痰湿型
  1572. * 找出对象中值最大的键
  1573. * @param {Object} obj - 包含键值对的对象
  1574. * @returns {string|null} - 值最大的键,如果没有找到则返回null
  1575. */
  1576. findKeyWithMaxValue(obj) {
  1577. if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
  1578. throw new Error('Input must be a plain object');
  1579. }
  1580. let maxKey = null;
  1581. let maxValue = -Infinity;
  1582. for (let key in obj) {
  1583. if (obj.hasOwnProperty(key)) {
  1584. if (obj[key] > maxValue) {
  1585. maxValue = obj[key];
  1586. maxKey = key;
  1587. }
  1588. }
  1589. }
  1590. return maxKey;
  1591. },
  1592. // 可选择的日期
  1593. getDateData: function (sn, isRefresh = true) {
  1594. var that = this;
  1595. var sourceFourthTemp = [];
  1596. wx.request({
  1597. url: `${aipushApi}/getdatefromsn`, //
  1598. method: 'POST',
  1599. // header: {
  1600. // 'content-type': 'application/json', // 默认值
  1601. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1602. // },
  1603. data: {
  1604. "sn": sn, "token": token_push
  1605. },
  1606. success(res) {
  1607. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1608. that.setData({
  1609. isNoReportToday: true
  1610. })
  1611. return;
  1612. }
  1613. that.setData({
  1614. dateData: res.data.results //床的数组
  1615. });
  1616. // {"results": [{ "rdate": "2024-10-08" }]}
  1617. that.getDateTimeData(res.data.results[0].rdate, isRefresh);
  1618. // var resDataSn = res.data.results
  1619. },
  1620. fail: function (error) {
  1621. console.error('error', error);
  1622. that.setData({
  1623. isNoReportToday: true
  1624. })
  1625. },
  1626. complete: function (e) {
  1627. }
  1628. });
  1629. },
  1630. // 可选择的时间 可自动选择 更改 reportId
  1631. getDateTimeData: function (rdate, isRefresh = true) {
  1632. var that = this;
  1633. wx.request({
  1634. url: `${aipushApi}/getimefromsn`, //
  1635. method: 'POST',
  1636. // header: {
  1637. // 'content-type': 'application/json', // 默认值
  1638. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1639. // },
  1640. data: {
  1641. "sn": that.data.sn, "date": rdate, "token": token_push
  1642. },
  1643. success(res) {
  1644. // { "results": [{ "rpids": "459857", "durations": "14:17-17:55" }] }
  1645. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1646. that.setData({
  1647. isNoReportToday: true
  1648. })
  1649. return;
  1650. }
  1651. that.setData({
  1652. dateTimeData: res.data.results, //床的数组
  1653. });
  1654. if (isRefresh) {
  1655. that.setData({
  1656. isNoReportToday: false,
  1657. reportId: res.data.results[0].rpids
  1658. });
  1659. that.getReportData();
  1660. }
  1661. },
  1662. fail: function (error) {
  1663. console.error('error', error);
  1664. that.setData({
  1665. isNoReportToday: true
  1666. })
  1667. }
  1668. });
  1669. },
  1670. // 新版
  1671. getReportData() {
  1672. const that = this;
  1673. wx.request({
  1674. url: `${aipushApi}` + '/getsingle',
  1675. data: {
  1676. "token": token_push,
  1677. "rpids": this.data.reportId
  1678. },
  1679. method: 'POST',
  1680. success(ress) {
  1681. try {
  1682. if (ress && ress.data) {
  1683. console.log('ress.data-getsingle=' + JSON.stringify(ress.data.results));
  1684. if (!ress.data.results || ress.data.results == '') {
  1685. // wx.showModal({
  1686. // title: '提示',
  1687. // content: '无数据',
  1688. // showCancel: false
  1689. // });
  1690. that.setData({
  1691. isNoReportToday: true
  1692. })
  1693. return;
  1694. }
  1695. wx.nextTick(() => {
  1696. setTimeout(() => {
  1697. //初始化数据
  1698. that.initReportData(ress.data.results);
  1699. that.initChartCircle(ress.data.results);
  1700. that.initOutOfBed(ress.data.results);
  1701. that.initBodyMovements(ress.data.results);
  1702. that.initCardiacSystem(ress.data.results);
  1703. that.initChartRespiratory(ress.data.results);
  1704. that.initChartSnoring(ress.data.results);
  1705. that.initChartApnea(ress.data.results);
  1706. that.initTimeWaterfall(ress.data.results);
  1707. }, 1000);
  1708. });
  1709. } else {
  1710. // wx.showModal({
  1711. // title: '提示',
  1712. // content: '无数据',
  1713. // showCancel: false
  1714. // });
  1715. that.setData({
  1716. isNoReportToday: true
  1717. })
  1718. }
  1719. } catch (error) {
  1720. console.error(error);
  1721. }
  1722. },
  1723. fail: function (error) {
  1724. // wx.showToast({
  1725. // title: "无数据",
  1726. // icon: "error",
  1727. // mask: true,
  1728. // });
  1729. that.setData({
  1730. isNoReportToday: true
  1731. })
  1732. }
  1733. });
  1734. },
  1735. // 新版
  1736. getToDayReportData() {
  1737. const that = this;
  1738. wx.request({
  1739. url: `${aipushApi}` + '/getunionsingle',
  1740. data: {
  1741. "token": token_today_push,
  1742. "udi": wx.getStorageSync("unionid")
  1743. },
  1744. method: 'POST',
  1745. success(ress) {
  1746. try {
  1747. if (ress && ress.data) {
  1748. console.log('ress.data-getunionsingle=' + JSON.stringify(ress.data));
  1749. if (ress.data == {} || ress.data.data == {} || ress.data.data == [] || !ress.data.data) {
  1750. // wx.showModal({
  1751. // title: '提示',
  1752. // content: '无数据',
  1753. // showCancel: false
  1754. // });
  1755. that.setData({
  1756. isNoReportToday: true
  1757. })
  1758. return;
  1759. }
  1760. //初始化数据
  1761. wx.nextTick(() => {
  1762. setTimeout(() => {
  1763. that.initReportData(ress.data.data);
  1764. that.initChartCircle(ress.data.data);
  1765. that.initOutOfBed(ress.data.data);
  1766. that.initBodyMovements(ress.data.data);
  1767. that.initCardiacSystem(ress.data.data);
  1768. that.initChartRespiratory(ress.data.data);
  1769. that.initChartSnoring(ress.data.data);
  1770. that.initChartApnea(ress.data.data);
  1771. that.initTimeWaterfall(ress.data.data);
  1772. }, 1000);
  1773. });
  1774. that.getSnData();//需要筛选的 要获取sn
  1775. } else {
  1776. // wx.showModal({
  1777. // title: '提示',
  1778. // content: '无数据',
  1779. // showCancel: false
  1780. // });
  1781. that.setData({
  1782. isNoReportToday: true
  1783. })
  1784. }
  1785. } catch (error) {
  1786. console.error(error);
  1787. }
  1788. },
  1789. fail: function (error) {
  1790. // wx.showToast({
  1791. // title: "无数据",
  1792. // icon: "error",
  1793. // mask: true,
  1794. // });
  1795. that.setData({
  1796. isNoReportToday: true
  1797. })
  1798. }
  1799. });
  1800. },
  1801. // 初始化的数据
  1802. initReportData(ress) {
  1803. const that = this;
  1804. let durationDataTemp = [];
  1805. let obj = {};
  1806. obj.name = '深睡';
  1807. obj.value = ress.rdeep_duration;
  1808. durationDataTemp.push(obj);
  1809. obj = {};
  1810. obj.name = '浅睡';
  1811. obj.value = ress.rlight_duration;
  1812. durationDataTemp.push(obj);
  1813. obj = {};
  1814. obj.name = '中睡';
  1815. obj.value = ress.rin_duration;
  1816. durationDataTemp.push(obj);
  1817. obj = {};
  1818. obj.name = '清醒';
  1819. obj.value = ress.rawake_duration;
  1820. durationDataTemp.push(obj);
  1821. let sleep_durationCount = 0;
  1822. if (ress.rdeep_duration) {
  1823. sleep_durationCount += parseFloat(ress.rdeep_duration)
  1824. }
  1825. if (ress.rlight_duration) {
  1826. sleep_durationCount += parseFloat(ress.rlight_duration)
  1827. }
  1828. if (ress.rin_duration) {
  1829. sleep_durationCount += parseFloat(ress.rin_duration)
  1830. }
  1831. let sleep_efficiency_temp = ress.rtotal_duration ? (Math.ceil((sleep_durationCount / ress.rtotal_duration) * 100) + '%') : '%'
  1832. let rdeep_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rdeep_duration ? parseFloat(ress.rdeep_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1833. let rlight_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rlight_duration ? parseFloat(ress.rlight_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1834. let rin_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rin_duration ? parseFloat(ress.rin_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1835. let rawake_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rawake_duration ? parseFloat(ress.rawake_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1836. // let rdeep_duration_efficiency_temp = ress.darktrate;
  1837. // let rlight_duration_efficiency_temp = ress.lightrate;
  1838. // let rin_duration_efficiency_temp = ress.midrate;
  1839. // let rawake_duration_efficiency_temp = ress.awakenrate;
  1840. let sleep_durationTemp = [];
  1841. let obj1 = {};
  1842. obj1.name = '睡眠时间';
  1843. obj1.value = Math.ceil(sleep_durationCount / 60);
  1844. sleep_durationTemp.push(obj1);
  1845. obj1 = {};
  1846. obj1.name = '清醒时间';
  1847. obj1.value = Math.ceil(parseFloat(ress.rawake_duration) / 60);
  1848. sleep_durationTemp.push(obj1);
  1849. let zdPointTemp = [];
  1850. let rdt_arrTemp = [];
  1851. let rrh_arrTemp = [];
  1852. let rhx_arrTemp = [];
  1853. let rmove_arrTemp = [];
  1854. let rsleep_arrTemp = [];
  1855. let rsleep_arr_all_Temp = [];
  1856. if (ress.rrh_arr) {
  1857. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1858. }
  1859. if (ress.rrh_arr) {
  1860. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1861. }
  1862. if (ress.rhx_arr) {
  1863. rhx_arrTemp = that.splitN(ress.rhx_arr.split(","), 100);
  1864. }
  1865. if (ress.rmove_arr) {
  1866. rmove_arrTemp = that.splitN(ress.rmove_arr.split(","), 100);
  1867. }
  1868. if (ress.rsleep_arr) {
  1869. rsleep_arrTemp = that.splitN(ress.rsleep_arr.split(","), 100);
  1870. }
  1871. if (ress.rsleep_arr) {
  1872. rsleep_arr_all_Temp = ress.rsleep_arr.split(",");
  1873. }
  1874. that.setData({
  1875. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1876. rrh_arr: ress.rrh_arr ? ress.rrh_arr.split(',') : [],
  1877. rhx_arr: ress.rhx_arr ? ress.rhx_arr.split(',') : [],
  1878. rsnoring_arr: ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [],
  1879. routbed_arr: ress.routbed_arr ? ress.routbed_arr.split(',') : [],
  1880. rmove_arr: ress.rmove_arr ? ress.rmove_arr.split(',') : [],
  1881. rhxstop_arr: ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [],
  1882. rsleep_arr: ress.rsleep_arr ? ress.rsleep_arr.split(',') : [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1883. rsnoring_arrFrequency: that.getFrequency(ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [], 1),
  1884. routbed_arrFrequency: that.getFrequency(ress.routbed_arr ? ress.routbed_arr.split(',') : [], 0),
  1885. rmove_arrFrequency: that.getFrequency(ress.rmove_arr ? ress.rmove_arr.split(',') : [], 1),
  1886. rhxstop_arrFrequency: that.getFrequency(ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [], 1),
  1887. rdeep_durationFormatA: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1888. rlight_duration: ress.rlight_duration,
  1889. rin_duration: ress.rin_duration,
  1890. rawake_duration: ress.rawake_duration,
  1891. ravg_hx_value: ress.ravg_hx_value,
  1892. ravg_hx_desc: ress.ravg_hx_desc,
  1893. ravg_rh_value: ress.ravg_rh_value,
  1894. ravg_rh_desc: ress.ravg_rh_desc,
  1895. rscore_value: ress.rscore_value,
  1896. rscore_desc: ress.rscore_desc,
  1897. rsn: ress.rsn,
  1898. rdate: ress.rdate,
  1899. total_duration: ress.rtotal_duration,
  1900. rtotal_duration: that.convertTimeToHoursAndMinutes(ress.rtotal_duration),//睡眠总时长,单位小时分钟
  1901. rinbed_duration: that.convertTimeToHoursAndMinutes(ress.rinbed_duration),//在床时长,单位小时分钟
  1902. rgobed_time: ress.rgobed_time,//上床时间
  1903. routbed_time: ress.routbed_time,//离床时间
  1904. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1905. sleepHourSub: that.getTimeDiffInHours(ress.rgobed_time, ress.routbed_time),
  1906. routbed_count_value: ress.routbed_count_value,//离床次数
  1907. zdPointT: zdPointTemp,
  1908. rdt_arrNew: rdt_arrTemp,
  1909. rrh_arrNew: rrh_arrTemp,
  1910. rhx_arrNew: rhx_arrTemp,
  1911. rmove_arrNew: rmove_arrTemp,
  1912. rsleep_arrNew: rsleep_arrTemp,
  1913. rsleep_arr_all_New: rsleep_arr_all_Temp,
  1914. durationData: durationDataTemp,
  1915. sleep_duration: sleep_durationTemp,
  1916. sleep_efficiency: sleep_efficiency_temp,
  1917. sleep_durationCountA: that.convertTimeToHoursAndMinutes(sleep_durationCount ? sleep_durationCount.toString() : '0'),
  1918. tvEntityIds: wx.getStorageSync('tvEntityIds'),
  1919. ifOneMoreTV: (wx.getStorageSync('tvEntityIds') && wx.getStorageSync('tvEntityIds').length > 1),
  1920. rdeep_duration_efficiency: rdeep_duration_efficiency_temp,
  1921. rlight_duration_efficiency: rlight_duration_efficiency_temp,
  1922. rin_duration_efficiency: rin_duration_efficiency_temp,
  1923. rawake_duration_efficiency: rawake_duration_efficiency_temp,
  1924. pushReportId: ress.rdid,
  1925. isNoReportToday: false,
  1926. rrs_duration: that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0'),
  1927. routbed_count_value: ress.routbed_count_value,
  1928. rsleep_eff_value: ress.rsleep_eff_value,
  1929. hotelname: ress.hotelname,
  1930. roomname: ress.roomname,
  1931. bedname: ress.bedname,
  1932. });
  1933. },
  1934. // 香睡指数
  1935. initChartCircle(ress) {
  1936. var that = this;
  1937. try {
  1938. let rscore_descTemp = [];
  1939. if (ress.rscore_desc) {
  1940. rscore_descTemp = ress.rscore_desc;
  1941. }
  1942. let rscore_valueTemp = [];
  1943. if (ress.rscore_value) {
  1944. rscore_valueTemp = ress.rscore_value;
  1945. }
  1946. that.setData({
  1947. rscore_desc: rscore_descTemp,
  1948. rscore_value: rscore_valueTemp,
  1949. });
  1950. updateChartCircularProgressBarOption(rscore_descTemp, rscore_valueTemp, that);
  1951. } catch (error) {
  1952. console.error(error);
  1953. }
  1954. },
  1955. // 心脏 系统
  1956. initCardiacSystem(ress) {
  1957. var that = this;
  1958. try {
  1959. let rdt_arrTemp = [];
  1960. if (ress.rrh_arr) {
  1961. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1962. }
  1963. if (ress.rdate) {
  1964. that.setData({
  1965. reportDate: ress.rdate
  1966. });
  1967. }
  1968. let rrh_arrTemp = [];
  1969. if (ress.rrh_arr) {
  1970. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1971. }
  1972. that.setData({
  1973. rdt_arrNew: rdt_arrTemp,
  1974. rrh_arrNew: rrh_arrTemp,
  1975. });
  1976. console.log("that.data.rdt_arrNew,that.data.rrh_arrNew=" + that.data.rdt_arrNew + "," + that.data.rrh_arrNew);
  1977. updateCardiacSystem(that.data.rdt_arrNew, that.data.rrh_arrNew, that);
  1978. } catch (error) {
  1979. console.error(error);
  1980. }
  1981. },
  1982. initTimeWaterfall(ress) {//深浅睡眠
  1983. var that = this;
  1984. try {
  1985. let rdt_arrTemp = [];
  1986. if (ress.rrh_arr) {
  1987. // rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1988. rdt_arrTemp = ress.rdt_arr.split(",");
  1989. }
  1990. // console.log('深浅睡眠11111=======' + JSON.stringify(rdt_arrTemp));
  1991. let rsleep_arr_Temp = [];
  1992. if (ress.rsleep_arr) {
  1993. // rsleep_arr_Temp = that.splitN(ress.rsleep_arr.split(","), 100);
  1994. rsleep_arr_Temp = ress.rsleep_arr.split(",");
  1995. }
  1996. // console.log('深浅睡眠222222=======' + JSON.stringify(rsleep_arr_Temp));
  1997. that.setData({
  1998. rdt_arrNew: rdt_arrTemp,
  1999. rsleep_arr: rsleep_arr_Temp,
  2000. rdeep_duration: ress.rdeep_duration,
  2001. rlight_duration: ress.rlight_duration,
  2002. rin_duration: ress.rin_duration,
  2003. rawake_duration: ress.rawake_duration,
  2004. rdeep_durationFormat: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  2005. rlight_durationFormat: that.convertTimeToHoursAndMinutes(ress.rlight_duration),
  2006. rin_durationFormat: that.convertTimeToHoursAndMinutes(ress.rin_duration),
  2007. rawake_durationFormat: that.convertTimeToHoursAndMinutes(ress.rawake_duration),
  2008. });
  2009. that.calculateTheDurationOfDeepSleep();
  2010. } catch (error) {
  2011. console.error(error);
  2012. }
  2013. console.log("that.data.rsleep_arr=" + that.data.rsleep_arr);
  2014. },
  2015. initOutOfBed(ress) {//离床次数
  2016. var that = this;
  2017. try {
  2018. var routbed_arr_Temp = [];
  2019. if (ress.routbed_arr) {
  2020. routbed_arr_Temp = ress.routbed_arr.split(",");
  2021. }
  2022. that.setData({
  2023. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  2024. routbed_arr: routbed_arr_Temp,
  2025. rgobed_time: ress.rgobed_time,
  2026. routbed_time: ress.routbed_time,
  2027. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2028. });
  2029. updateOutOfBed(that.data.rdt_arr, that.data.routbed_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2030. } catch (error) {
  2031. console.error(error);
  2032. }
  2033. console.log("that.data.routbed_arr=" + that.data.routbed_arr);
  2034. },
  2035. initBodyMovements(ress) {//体动次数
  2036. var that = this;
  2037. try {
  2038. var rmove_arr_Temp = [];
  2039. if (ress.rmove_arr) {
  2040. rmove_arr_Temp = ress.rmove_arr.split(",");
  2041. }
  2042. that.setData({
  2043. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2044. rmove_arr: that.splitN(rmove_arr_Temp, 100),
  2045. rgobed_time: ress.rgobed_time,
  2046. routbed_time: ress.routbed_time,
  2047. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2048. });
  2049. updateBodyMovements(that.data.rdt_arr, that.data.rmove_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2050. } catch (error) {
  2051. console.error(error);
  2052. }
  2053. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2054. },
  2055. initChartRespiratory(ress) {//平均呼吸率
  2056. var that = this;
  2057. try {
  2058. var rhx_arr_Temp = [];
  2059. if (ress.rhx_arr) {
  2060. rhx_arr_Temp = ress.rhx_arr.split(",");
  2061. }
  2062. that.setData({
  2063. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2064. rhx_arr: that.splitN(rhx_arr_Temp, 100),
  2065. rgobed_time: ress.rgobed_time,
  2066. routbed_time: ress.routbed_time,
  2067. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2068. });
  2069. updateRespiratory(that.data.rdt_arr, that.data.rhx_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2070. } catch (error) {
  2071. console.error(error);
  2072. }
  2073. console.log("c81_that.data.ravg_hx_value=" + that.data.ravg_hx_value);
  2074. },
  2075. initChartSnoring(ress) {//打鼾
  2076. var that = this;
  2077. try {
  2078. var rsnoring_arr_Temp = [];
  2079. if (ress.rsnoring_arr) {
  2080. rsnoring_arr_Temp = ress.rsnoring_arr.split(",");
  2081. }
  2082. that.setData({
  2083. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2084. rsnoring_arr: that.splitN(rsnoring_arr_Temp, 100),
  2085. rgobed_time: ress.rgobed_time,
  2086. routbed_time: ress.routbed_time,
  2087. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2088. });
  2089. updateSnoring(that.data.rdt_arr, that.data.rsnoring_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2090. } catch (error) {
  2091. console.error(error);
  2092. }
  2093. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2094. },
  2095. initChartApnea(ress) {//呼吸暂停
  2096. var that = this;
  2097. try {
  2098. var rhxstop_arr_Temp = [];
  2099. if (ress.rhxstop_arr) {
  2100. rhxstop_arr_Temp = ress.rhxstop_arr.split(",");
  2101. }
  2102. that.setData({
  2103. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2104. rhxstop_arr: that.splitN(rhxstop_arr_Temp, 100),
  2105. rgobed_time: ress.rgobed_time,
  2106. routbed_time: ress.routbed_time,
  2107. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2108. });
  2109. updateApnea(that.data.rdt_arr, that.data.rhxstop_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2110. } catch (error) {
  2111. console.error(error);
  2112. }
  2113. console.log("c8_that.data.rhxstop_arr=" + that.data.rhxstop_arr);
  2114. },
  2115. mounted() {
  2116. },
  2117. /**
  2118. * 生命周期函数--监听页面隐藏
  2119. */
  2120. onHide: function () {
  2121. },
  2122. /**
  2123. * 生命周期函数--监听页面卸载
  2124. */
  2125. onUnload: function () {
  2126. },
  2127. /**
  2128. * 页面相关事件处理函数--监听用户下拉动作
  2129. */
  2130. onPullDownRefresh: function () {
  2131. },
  2132. /**
  2133. * 页面上拉触底事件的处理函数
  2134. */
  2135. onReachBottom: function () {
  2136. },
  2137. /**
  2138. * 用户点击右上角分享
  2139. */
  2140. onShareAppMessage: function () {
  2141. }
  2142. })