data.js 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344
  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. console.log("睡眠数据最终555=>", key);
  1558. that.setData({
  1559. tzTitle: ratingResultsMap[key]?.title ?? "健康型",
  1560. tzSubTitle: ratingResultsMap[key]?.subTitle ?? "太棒了,您的身体非常健康,请继续保持",
  1561. isShowTz: true
  1562. })
  1563. }
  1564. }
  1565. } catch (error) {
  1566. console.error(error);
  1567. }
  1568. },
  1569. })
  1570. },
  1571. /**
  1572. * A、B、C、D、E、F 最后积累的数量对比,按数量多少来判断,6个分别对应:气虚型、气滞型、血虚型、淤血型、水虚型、痰湿型
  1573. * 找出对象中值最大的键
  1574. * @param {Object} obj - 包含键值对的对象
  1575. * @returns {string|null} - 值最大的键,如果没有找到则返回null
  1576. */
  1577. findKeyWithMaxValue(obj) {
  1578. if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
  1579. throw new Error('Input must be a plain object');
  1580. }
  1581. let maxKey = null;
  1582. let maxValue = 0;
  1583. for (let key in obj) {
  1584. if (obj.hasOwnProperty(key)) {
  1585. if (obj[key] > maxValue) {
  1586. maxValue = obj[key];
  1587. maxKey = key;
  1588. }
  1589. }
  1590. }
  1591. return maxKey;
  1592. },
  1593. // 可选择的日期
  1594. getDateData: function (sn, isRefresh = true) {
  1595. var that = this;
  1596. var sourceFourthTemp = [];
  1597. wx.request({
  1598. url: `${aipushApi}/getdatefromsn`, //
  1599. method: 'POST',
  1600. // header: {
  1601. // 'content-type': 'application/json', // 默认值
  1602. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1603. // },
  1604. data: {
  1605. "sn": sn, "token": token_push
  1606. },
  1607. success(res) {
  1608. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1609. that.setData({
  1610. isNoReportToday: true
  1611. })
  1612. return;
  1613. }
  1614. that.setData({
  1615. dateData: res.data.results //床的数组
  1616. });
  1617. // {"results": [{ "rdate": "2024-10-08" }]}
  1618. that.getDateTimeData(res.data.results[0].rdate, isRefresh);
  1619. // var resDataSn = res.data.results
  1620. },
  1621. fail: function (error) {
  1622. console.error('error', error);
  1623. that.setData({
  1624. isNoReportToday: true
  1625. })
  1626. },
  1627. complete: function (e) {
  1628. }
  1629. });
  1630. },
  1631. // 可选择的时间 可自动选择 更改 reportId
  1632. getDateTimeData: function (rdate, isRefresh = true) {
  1633. var that = this;
  1634. wx.request({
  1635. url: `${aipushApi}/getimefromsn`, //
  1636. method: 'POST',
  1637. // header: {
  1638. // 'content-type': 'application/json', // 默认值
  1639. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1640. // },
  1641. data: {
  1642. "sn": that.data.sn, "date": rdate, "token": token_push
  1643. },
  1644. success(res) {
  1645. // { "results": [{ "rpids": "459857", "durations": "14:17-17:55" }] }
  1646. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1647. that.setData({
  1648. isNoReportToday: true
  1649. })
  1650. return;
  1651. }
  1652. that.setData({
  1653. dateTimeData: res.data.results, //床的数组
  1654. });
  1655. if (isRefresh) {
  1656. that.setData({
  1657. isNoReportToday: false,
  1658. reportId: res.data.results[0].rpids
  1659. });
  1660. that.getReportData();
  1661. }
  1662. },
  1663. fail: function (error) {
  1664. console.error('error', error);
  1665. that.setData({
  1666. isNoReportToday: true
  1667. })
  1668. }
  1669. });
  1670. },
  1671. // 新版
  1672. getReportData() {
  1673. const that = this;
  1674. wx.request({
  1675. url: `${aipushApi}` + '/getsingle',
  1676. data: {
  1677. "token": token_push,
  1678. "rpids": this.data.reportId,
  1679. "udi": wx.getStorageSync("unionid")
  1680. },
  1681. method: 'POST',
  1682. success(ress) {
  1683. try {
  1684. if (ress && ress.data) {
  1685. console.log('ress.data-getsingle=' + JSON.stringify(ress.data.results));
  1686. if (!ress.data.results || ress.data.results == '') {
  1687. // wx.showModal({
  1688. // title: '提示',
  1689. // content: '无数据',
  1690. // showCancel: false
  1691. // });
  1692. that.setData({
  1693. isNoReportToday: true
  1694. })
  1695. return;
  1696. }
  1697. wx.nextTick(() => {
  1698. setTimeout(() => {
  1699. //初始化数据
  1700. that.initReportData(ress.data.results);
  1701. that.initChartCircle(ress.data.results);
  1702. that.initOutOfBed(ress.data.results);
  1703. that.initBodyMovements(ress.data.results);
  1704. that.initCardiacSystem(ress.data.results);
  1705. that.initChartRespiratory(ress.data.results);
  1706. that.initChartSnoring(ress.data.results);
  1707. that.initChartApnea(ress.data.results);
  1708. that.initTimeWaterfall(ress.data.results);
  1709. }, 1000);
  1710. });
  1711. } else {
  1712. // wx.showModal({
  1713. // title: '提示',
  1714. // content: '无数据',
  1715. // showCancel: false
  1716. // });
  1717. that.setData({
  1718. isNoReportToday: true
  1719. })
  1720. }
  1721. } catch (error) {
  1722. console.error(error);
  1723. }
  1724. },
  1725. fail: function (error) {
  1726. // wx.showToast({
  1727. // title: "无数据",
  1728. // icon: "error",
  1729. // mask: true,
  1730. // });
  1731. that.setData({
  1732. isNoReportToday: true
  1733. })
  1734. }
  1735. });
  1736. },
  1737. // 新版
  1738. getToDayReportData() {
  1739. const that = this;
  1740. wx.request({
  1741. url: `${aipushApi}` + '/getunionsingle',
  1742. data: {
  1743. "token": token_today_push,
  1744. "udi": wx.getStorageSync("unionid")
  1745. },
  1746. method: 'POST',
  1747. success(ress) {
  1748. try {
  1749. if (ress && ress.data) {
  1750. console.log('ress.data-getunionsingle=' + JSON.stringify(ress.data));
  1751. if (ress.data == {} || ress.data.data == {} || ress.data.data == [] || !ress.data.data) {
  1752. // wx.showModal({
  1753. // title: '提示',
  1754. // content: '无数据',
  1755. // showCancel: false
  1756. // });
  1757. that.setData({
  1758. isNoReportToday: true
  1759. })
  1760. return;
  1761. }
  1762. //初始化数据
  1763. wx.nextTick(() => {
  1764. setTimeout(() => {
  1765. that.initReportData(ress.data.data);
  1766. that.initChartCircle(ress.data.data);
  1767. that.initOutOfBed(ress.data.data);
  1768. that.initBodyMovements(ress.data.data);
  1769. that.initCardiacSystem(ress.data.data);
  1770. that.initChartRespiratory(ress.data.data);
  1771. that.initChartSnoring(ress.data.data);
  1772. that.initChartApnea(ress.data.data);
  1773. that.initTimeWaterfall(ress.data.data);
  1774. }, 1000);
  1775. });
  1776. that.getSnData();//需要筛选的 要获取sn
  1777. } else {
  1778. // wx.showModal({
  1779. // title: '提示',
  1780. // content: '无数据',
  1781. // showCancel: false
  1782. // });
  1783. that.setData({
  1784. isNoReportToday: true
  1785. })
  1786. }
  1787. } catch (error) {
  1788. console.error(error);
  1789. }
  1790. },
  1791. fail: function (error) {
  1792. // wx.showToast({
  1793. // title: "无数据",
  1794. // icon: "error",
  1795. // mask: true,
  1796. // });
  1797. that.setData({
  1798. isNoReportToday: true
  1799. })
  1800. }
  1801. });
  1802. },
  1803. // 初始化的数据
  1804. initReportData(ress) {
  1805. const that = this;
  1806. let durationDataTemp = [];
  1807. let obj = {};
  1808. obj.name = '深睡';
  1809. obj.value = ress.rdeep_duration;
  1810. durationDataTemp.push(obj);
  1811. obj = {};
  1812. obj.name = '浅睡';
  1813. obj.value = ress.rlight_duration;
  1814. durationDataTemp.push(obj);
  1815. obj = {};
  1816. obj.name = '中睡';
  1817. obj.value = ress.rin_duration;
  1818. durationDataTemp.push(obj);
  1819. obj = {};
  1820. obj.name = '清醒';
  1821. obj.value = ress.rawake_duration;
  1822. durationDataTemp.push(obj);
  1823. let sleep_durationCount = 0;
  1824. if (ress.rdeep_duration) {
  1825. sleep_durationCount += parseFloat(ress.rdeep_duration)
  1826. }
  1827. if (ress.rlight_duration) {
  1828. sleep_durationCount += parseFloat(ress.rlight_duration)
  1829. }
  1830. if (ress.rin_duration) {
  1831. sleep_durationCount += parseFloat(ress.rin_duration)
  1832. }
  1833. let sleep_efficiency_temp = ress.rtotal_duration ? (Math.ceil((sleep_durationCount / ress.rtotal_duration) * 100) + '%') : '%'
  1834. let rdeep_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rdeep_duration ? parseFloat(ress.rdeep_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1835. let rlight_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rlight_duration ? parseFloat(ress.rlight_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1836. let rin_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rin_duration ? parseFloat(ress.rin_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1837. let rawake_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rawake_duration ? parseFloat(ress.rawake_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  1838. // let rdeep_duration_efficiency_temp = ress.darktrate;
  1839. // let rlight_duration_efficiency_temp = ress.lightrate;
  1840. // let rin_duration_efficiency_temp = ress.midrate;
  1841. // let rawake_duration_efficiency_temp = ress.awakenrate;
  1842. let sleep_durationTemp = [];
  1843. let obj1 = {};
  1844. obj1.name = '睡眠时间';
  1845. obj1.value = Math.ceil(sleep_durationCount / 60);
  1846. sleep_durationTemp.push(obj1);
  1847. obj1 = {};
  1848. obj1.name = '清醒时间';
  1849. obj1.value = Math.ceil(parseFloat(ress.rawake_duration) / 60);
  1850. sleep_durationTemp.push(obj1);
  1851. let zdPointTemp = [];
  1852. let rdt_arrTemp = [];
  1853. let rrh_arrTemp = [];
  1854. let rhx_arrTemp = [];
  1855. let rmove_arrTemp = [];
  1856. let rsleep_arrTemp = [];
  1857. let rsleep_arr_all_Temp = [];
  1858. if (ress.rrh_arr) {
  1859. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1860. }
  1861. if (ress.rrh_arr) {
  1862. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1863. }
  1864. if (ress.rhx_arr) {
  1865. rhx_arrTemp = that.splitN(ress.rhx_arr.split(","), 100);
  1866. }
  1867. if (ress.rmove_arr) {
  1868. rmove_arrTemp = that.splitN(ress.rmove_arr.split(","), 100);
  1869. }
  1870. if (ress.rsleep_arr) {
  1871. rsleep_arrTemp = that.splitN(ress.rsleep_arr.split(","), 100);
  1872. }
  1873. if (ress.rsleep_arr) {
  1874. rsleep_arr_all_Temp = ress.rsleep_arr.split(",");
  1875. }
  1876. that.setData({
  1877. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  1878. rrh_arr: ress.rrh_arr ? ress.rrh_arr.split(',') : [],
  1879. rhx_arr: ress.rhx_arr ? ress.rhx_arr.split(',') : [],
  1880. rsnoring_arr: ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [],
  1881. routbed_arr: ress.routbed_arr ? ress.routbed_arr.split(',') : [],
  1882. rmove_arr: ress.rmove_arr ? ress.rmove_arr.split(',') : [],
  1883. rhxstop_arr: ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [],
  1884. rsleep_arr: ress.rsleep_arr ? ress.rsleep_arr.split(',') : [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1885. rsnoring_arrFrequency: that.getFrequency(ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [], 1),
  1886. routbed_arrFrequency: that.getFrequency(ress.routbed_arr ? ress.routbed_arr.split(',') : [], 0),
  1887. rmove_arrFrequency: that.getFrequency(ress.rmove_arr ? ress.rmove_arr.split(',') : [], 1),
  1888. rhxstop_arrFrequency: that.getFrequency(ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [], 1),
  1889. rdeep_durationFormatA: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  1890. rlight_duration: ress.rlight_duration,
  1891. rin_duration: ress.rin_duration,
  1892. rawake_duration: ress.rawake_duration,
  1893. ravg_hx_value: ress.ravg_hx_value,
  1894. ravg_hx_desc: ress.ravg_hx_desc,
  1895. ravg_rh_value: ress.ravg_rh_value,
  1896. ravg_rh_desc: ress.ravg_rh_desc,
  1897. rscore_value: ress.rscore_value,
  1898. rscore_desc: ress.rscore_desc,
  1899. rsn: ress.rsn,
  1900. rdate: ress.rdate,
  1901. total_duration: ress.rtotal_duration,
  1902. rtotal_duration: that.convertTimeToHoursAndMinutes(ress.rtotal_duration),//睡眠总时长,单位小时分钟
  1903. rinbed_duration: that.convertTimeToHoursAndMinutes(ress.rinbed_duration),//在床时长,单位小时分钟
  1904. rgobed_time: ress.rgobed_time,//上床时间
  1905. routbed_time: ress.routbed_time,//离床时间
  1906. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  1907. sleepHourSub: that.getTimeDiffInHours(ress.rgobed_time, ress.routbed_time),
  1908. routbed_count_value: ress.routbed_count_value,//离床次数
  1909. zdPointT: zdPointTemp,
  1910. rdt_arrNew: rdt_arrTemp,
  1911. rrh_arrNew: rrh_arrTemp,
  1912. rhx_arrNew: rhx_arrTemp,
  1913. rmove_arrNew: rmove_arrTemp,
  1914. rsleep_arrNew: rsleep_arrTemp,
  1915. rsleep_arr_all_New: rsleep_arr_all_Temp,
  1916. durationData: durationDataTemp,
  1917. sleep_duration: sleep_durationTemp,
  1918. sleep_efficiency: sleep_efficiency_temp,
  1919. sleep_durationCountA: that.convertTimeToHoursAndMinutes(sleep_durationCount ? sleep_durationCount.toString() : '0'),
  1920. tvEntityIds: wx.getStorageSync('tvEntityIds'),
  1921. ifOneMoreTV: (wx.getStorageSync('tvEntityIds') && wx.getStorageSync('tvEntityIds').length > 1),
  1922. rdeep_duration_efficiency: rdeep_duration_efficiency_temp,
  1923. rlight_duration_efficiency: rlight_duration_efficiency_temp,
  1924. rin_duration_efficiency: rin_duration_efficiency_temp,
  1925. rawake_duration_efficiency: rawake_duration_efficiency_temp,
  1926. pushReportId: ress.rdid,
  1927. isNoReportToday: false,
  1928. rrs_duration: that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0'),
  1929. routbed_count_value: ress.routbed_count_value,
  1930. rsleep_eff_value: ress.rsleep_eff_value,
  1931. hotelname: ress.hotelname,
  1932. roomname: ress.roomname,
  1933. bedname: ress.bedname,
  1934. });
  1935. },
  1936. // 香睡指数
  1937. initChartCircle(ress) {
  1938. var that = this;
  1939. try {
  1940. let rscore_descTemp = [];
  1941. if (ress.rscore_desc) {
  1942. rscore_descTemp = ress.rscore_desc;
  1943. }
  1944. let rscore_valueTemp = [];
  1945. if (ress.rscore_value) {
  1946. rscore_valueTemp = ress.rscore_value;
  1947. }
  1948. that.setData({
  1949. rscore_desc: rscore_descTemp,
  1950. rscore_value: rscore_valueTemp,
  1951. });
  1952. updateChartCircularProgressBarOption(rscore_descTemp, rscore_valueTemp, that);
  1953. } catch (error) {
  1954. console.error(error);
  1955. }
  1956. },
  1957. // 心脏 系统
  1958. initCardiacSystem(ress) {
  1959. var that = this;
  1960. try {
  1961. let rdt_arrTemp = [];
  1962. if (ress.rrh_arr) {
  1963. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1964. }
  1965. if (ress.rdate) {
  1966. that.setData({
  1967. reportDate: ress.rdate
  1968. });
  1969. }
  1970. let rrh_arrTemp = [];
  1971. if (ress.rrh_arr) {
  1972. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  1973. }
  1974. that.setData({
  1975. rdt_arrNew: rdt_arrTemp,
  1976. rrh_arrNew: rrh_arrTemp,
  1977. });
  1978. console.log("that.data.rdt_arrNew,that.data.rrh_arrNew=" + that.data.rdt_arrNew + "," + that.data.rrh_arrNew);
  1979. updateCardiacSystem(that.data.rdt_arrNew, that.data.rrh_arrNew, that);
  1980. } catch (error) {
  1981. console.error(error);
  1982. }
  1983. },
  1984. initTimeWaterfall(ress) {//深浅睡眠
  1985. var that = this;
  1986. try {
  1987. let rdt_arrTemp = [];
  1988. if (ress.rrh_arr) {
  1989. // rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  1990. rdt_arrTemp = ress.rdt_arr.split(",");
  1991. }
  1992. // console.log('深浅睡眠11111=======' + JSON.stringify(rdt_arrTemp));
  1993. let rsleep_arr_Temp = [];
  1994. if (ress.rsleep_arr) {
  1995. // rsleep_arr_Temp = that.splitN(ress.rsleep_arr.split(","), 100);
  1996. rsleep_arr_Temp = ress.rsleep_arr.split(",");
  1997. }
  1998. // console.log('深浅睡眠222222=======' + JSON.stringify(rsleep_arr_Temp));
  1999. that.setData({
  2000. rdt_arrNew: rdt_arrTemp,
  2001. rsleep_arr: rsleep_arr_Temp,
  2002. rdeep_duration: ress.rdeep_duration,
  2003. rlight_duration: ress.rlight_duration,
  2004. rin_duration: ress.rin_duration,
  2005. rawake_duration: ress.rawake_duration,
  2006. rdeep_durationFormat: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  2007. rlight_durationFormat: that.convertTimeToHoursAndMinutes(ress.rlight_duration),
  2008. rin_durationFormat: that.convertTimeToHoursAndMinutes(ress.rin_duration),
  2009. rawake_durationFormat: that.convertTimeToHoursAndMinutes(ress.rawake_duration),
  2010. });
  2011. that.calculateTheDurationOfDeepSleep();
  2012. } catch (error) {
  2013. console.error(error);
  2014. }
  2015. console.log("that.data.rsleep_arr=" + that.data.rsleep_arr);
  2016. },
  2017. initOutOfBed(ress) {//离床次数
  2018. var that = this;
  2019. try {
  2020. var routbed_arr_Temp = [];
  2021. if (ress.routbed_arr) {
  2022. routbed_arr_Temp = ress.routbed_arr.split(",");
  2023. }
  2024. that.setData({
  2025. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  2026. routbed_arr: routbed_arr_Temp,
  2027. rgobed_time: ress.rgobed_time,
  2028. routbed_time: ress.routbed_time,
  2029. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2030. });
  2031. updateOutOfBed(that.data.rdt_arr, that.data.routbed_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2032. } catch (error) {
  2033. console.error(error);
  2034. }
  2035. console.log("that.data.routbed_arr=" + that.data.routbed_arr);
  2036. },
  2037. initBodyMovements(ress) {//体动次数
  2038. var that = this;
  2039. try {
  2040. var rmove_arr_Temp = [];
  2041. if (ress.rmove_arr) {
  2042. rmove_arr_Temp = ress.rmove_arr.split(",");
  2043. }
  2044. that.setData({
  2045. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2046. rmove_arr: that.splitN(rmove_arr_Temp, 100),
  2047. rgobed_time: ress.rgobed_time,
  2048. routbed_time: ress.routbed_time,
  2049. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2050. });
  2051. updateBodyMovements(that.data.rdt_arr, that.data.rmove_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2052. } catch (error) {
  2053. console.error(error);
  2054. }
  2055. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2056. },
  2057. initChartRespiratory(ress) {//平均呼吸率
  2058. var that = this;
  2059. try {
  2060. var rhx_arr_Temp = [];
  2061. if (ress.rhx_arr) {
  2062. rhx_arr_Temp = ress.rhx_arr.split(",");
  2063. }
  2064. that.setData({
  2065. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2066. rhx_arr: that.splitN(rhx_arr_Temp, 100),
  2067. rgobed_time: ress.rgobed_time,
  2068. routbed_time: ress.routbed_time,
  2069. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2070. });
  2071. updateRespiratory(that.data.rdt_arr, that.data.rhx_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2072. } catch (error) {
  2073. console.error(error);
  2074. }
  2075. console.log("c81_that.data.ravg_hx_value=" + that.data.ravg_hx_value);
  2076. },
  2077. initChartSnoring(ress) {//打鼾
  2078. var that = this;
  2079. try {
  2080. var rsnoring_arr_Temp = [];
  2081. if (ress.rsnoring_arr) {
  2082. rsnoring_arr_Temp = ress.rsnoring_arr.split(",");
  2083. }
  2084. that.setData({
  2085. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2086. rsnoring_arr: that.splitN(rsnoring_arr_Temp, 100),
  2087. rgobed_time: ress.rgobed_time,
  2088. routbed_time: ress.routbed_time,
  2089. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2090. });
  2091. updateSnoring(that.data.rdt_arr, that.data.rsnoring_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2092. } catch (error) {
  2093. console.error(error);
  2094. }
  2095. console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2096. },
  2097. initChartApnea(ress) {//呼吸暂停
  2098. var that = this;
  2099. try {
  2100. var rhxstop_arr_Temp = [];
  2101. if (ress.rhxstop_arr) {
  2102. rhxstop_arr_Temp = ress.rhxstop_arr.split(",");
  2103. }
  2104. that.setData({
  2105. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2106. rhxstop_arr: that.splitN(rhxstop_arr_Temp, 100),
  2107. rgobed_time: ress.rgobed_time,
  2108. routbed_time: ress.routbed_time,
  2109. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2110. });
  2111. updateApnea(that.data.rdt_arr, that.data.rhxstop_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2112. } catch (error) {
  2113. console.error(error);
  2114. }
  2115. console.log("c8_that.data.rhxstop_arr=" + that.data.rhxstop_arr);
  2116. },
  2117. mounted() {
  2118. },
  2119. /**
  2120. * 生命周期函数--监听页面隐藏
  2121. */
  2122. onHide: function () {
  2123. },
  2124. /**
  2125. * 生命周期函数--监听页面卸载
  2126. */
  2127. onUnload: function () {
  2128. },
  2129. /**
  2130. * 页面相关事件处理函数--监听用户下拉动作
  2131. */
  2132. onPullDownRefresh: function () {
  2133. },
  2134. /**
  2135. * 页面上拉触底事件的处理函数
  2136. */
  2137. onReachBottom: function () {
  2138. },
  2139. /**
  2140. * 用户点击右上角分享
  2141. */
  2142. onShareAppMessage: function () {
  2143. }
  2144. })