data.js 74 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603
  1. import * as echarts from '../../ec-canvas/echarts';
  2. import api from "../../utils/api";
  3. import api2 from "../../utils/api2";
  4. import {getCheckInInfo, getDrawImg} from "./getPosterObj";
  5. // 渐变圆环
  6. let chartCircularProgressBar;//圈圈
  7. let chartOutOfBed;//离床
  8. let chartBodyMovementsLine;//体动
  9. let chartCardiacSystemLine;//心脏系统
  10. let chartRespiratoryLine;//平均呼吸率
  11. let chartSnoringLine;//打鼾
  12. let chartApneaLine;//呼吸暂停
  13. let chartTimeWaterfall;//深浅睡眠
  14. // 圈圈>90分极好(绿色)
  15. // > 75分,(浅绿色)良好
  16. // 各项睡眠监测数据统计 > 60分,较差(黄色)
  17. // < 60分,很差(红色)
  18. function setChartCircularProgressBarOption(chart, data = {}) {
  19. var rscore_value = data?.rscore_value || 0;
  20. var checkList = [{
  21. title: "极好",
  22. titleColor: "#0BC3AA",
  23. startColor: "#0AB1C3",
  24. centerColor: "#0BC3AA",
  25. endColor: "#36E1CA",
  26. }, {
  27. title: "良好",
  28. titleColor: "#9C43FF",
  29. startColor: "#8D25FF",
  30. centerColor: "#A631FF",
  31. endColor: "#FF8FF0",
  32. }, {
  33. title: "较差",
  34. titleColor: "#FF8F4E",
  35. startColor: "#EE8B52",
  36. centerColor: "#FAA472",
  37. endColor: "#FAA472",
  38. }, {
  39. title: "很差",
  40. titleColor: "#FB717B",
  41. startColor: "#FB717B",
  42. centerColor: "#FB717B",
  43. endColor: "#FF98A0",
  44. }];
  45. var checkData = checkList[0];
  46. if (rscore_value >= 90 && rscore_value <= 100) {
  47. checkData = checkList[0];
  48. } else if (rscore_value >= 75 && rscore_value < 90) {
  49. checkData = checkList[1];
  50. } else if (rscore_value >= 60 && rscore_value < 75) {
  51. checkData = checkList[2];
  52. } else {
  53. checkData = checkList[3];
  54. }
  55. // 定义仪表盘配置项
  56. var option = {
  57. series: [
  58. {
  59. type: 'gauge', // 仪表盘类型
  60. startAngle: -270, // 仪表盘起始角度
  61. endAngle: 90, // 仪表盘结束角度
  62. legendHoverLink: true, // 是否启用图例悬浮联动
  63. min: 0, // 仪表盘最小值
  64. max: 100, // 仪表盘最大值
  65. itemStyle: {
  66. color: '#58D9F9', // 仪表盘背景色
  67. shadowColor: 'rgba(0,138,255,0.45)', // 阴影颜色
  68. shadowBlur: 5, // 阴影模糊大小
  69. shadowOffsetX: 1, // 阴影水平偏移
  70. shadowOffsetY: 1 // 阴影垂直偏移
  71. },
  72. progress: {
  73. show: true, // 是否显示进度条
  74. roundCap: true, // 是否显示圆角
  75. width: 10, // 进度条宽度
  76. itemStyle: {
  77. // 进度条样式
  78. color: {
  79. // 自定义渐变色
  80. type: 'linear',
  81. x: 0.75,
  82. y: 0.75,
  83. x2: 0,
  84. y2: 0.75,
  85. colorStops: [
  86. {
  87. offset: 0,
  88. color: checkData.startColor // 0% 处的颜色
  89. },
  90. {
  91. offset: 0.5,
  92. color: checkData.centerColor // 100% 处的颜色
  93. },
  94. {
  95. offset: 1,
  96. color: checkData.endColor // 100% 处的颜色
  97. }
  98. ],
  99. global: false // 缺省为 false
  100. }
  101. }
  102. },
  103. pointer: {
  104. show: false, // 是否显示指针
  105. },
  106. axisLine: {
  107. roundCap: true, // 是否显示圆角
  108. lineStyle: {
  109. width: 10, // 轴线宽度
  110. }
  111. },
  112. axisTick: {
  113. show: false // 是否显示分隔线
  114. },
  115. splitLine: {
  116. show: false // 是否显示分隔线
  117. },
  118. axisLabel: {
  119. show: false, // 是否显示标签
  120. },
  121. title: {
  122. color: checkData.titleColor, // 标题颜色
  123. offsetCenter: [0, '-36%'], // 标题位置
  124. lineHeight: 15, // 行高
  125. fontSize: 15, // 字体大小
  126. },
  127. detail: {
  128. backgroundColor: '#fff', // 背景颜色
  129. width: '60%', // 宽度
  130. lineHeight: 40, // 行高
  131. height: 40, // 高度
  132. color: '#333333', // 字体颜色
  133. offsetCenter: [0, "24%"], // 位置
  134. valueAnimation: true, // 是否启用值的动画效果
  135. formatter: function (value) {
  136. value=(isNaN(value)||null||undefined)?"--":value.toFixed(0);
  137. return '{value|' + value+ '}'; // 数据格式化
  138. },
  139. rich: {
  140. value: {
  141. fontSize: 30, // 字体大小
  142. fontWeight: 'bolder', // 加粗
  143. color: checkData.titleColor // 颜色
  144. },
  145. }
  146. },
  147. data: [
  148. {
  149. name: data?.rscore_desc || checkData.title || '无', // 数据名称
  150. value: data?.rscore_value || 0 // 数据值
  151. }
  152. ]
  153. }
  154. ]
  155. };
  156. chart.setOption(option, true);
  157. }
  158. function initChartHumidifier(canvas, width, height, dpr) {
  159. // this.selectComponent('#mychart-dom-bar00').init((canvas, width, height, dpr) => {
  160. // 获取组件的 canvas、width、height 后的回调函数
  161. // 在这里初始化图表
  162. const chart = echarts.init(canvas, null, {
  163. width: width,
  164. height: height,
  165. devicePixelRatio: dpr // new
  166. });
  167. canvas.setChart(chart);
  168. setChartCircularProgressBarOption(chart);
  169. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  170. chartCircularProgressBar = chart;
  171. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  172. return chart;
  173. // });
  174. };
  175. function updateChartCircularProgressBarOption(rscore_desc, rscore_value, that) {
  176. if (chartCircularProgressBar) {
  177. setChartCircularProgressBarOption(chartCircularProgressBar, { rscore_desc, rscore_value });
  178. } else {
  179. that.selectComponent('#mychart-dom-CircularProgressBar').init((canvas, width, height, dpr) => {
  180. const chart = echarts.init(canvas, null, {
  181. width: width,
  182. height: height,
  183. devicePixelRatio: dpr // new
  184. });
  185. canvas.setChart(chart);
  186. setChartCircularProgressBarOption(chart, { rscore_desc, rscore_value });
  187. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  188. chartCircularProgressBar = chart;
  189. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  190. return chart;
  191. });
  192. }
  193. }
  194. //离床
  195. function initChartOutOfBed(canvas, width, height, dpr) {
  196. // this.selectComponent('#mychart-dom-bar00').init((canvas, width, height, dpr) => {
  197. // 获取组件的 canvas、width、height 后的回调函数
  198. // 在这里初始化图表
  199. const chart = echarts.init(canvas, null, {
  200. width: width,
  201. height: height,
  202. devicePixelRatio: dpr // new
  203. });
  204. canvas.setChart(chart);
  205. setChartOutOfBedOption(chart);
  206. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  207. chartOutOfBed = chart;
  208. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  209. return chart;
  210. // });
  211. };
  212. function setChartOutOfBedOption(chart, data1 = [], data2 = [],) {
  213. var option = option = {
  214. tooltip: {
  215. show: true,
  216. trigger: 'axis',
  217. formatter: function (param) {
  218. return `${param[0] && param[0].value == 1 ? '在床' : '离床'}`
  219. }
  220. },
  221. dataZoom: [
  222. { // 第一个 dataZoom 组件
  223. type: 'inside',
  224. },
  225. ],
  226. grid: {
  227. top: '40rpx',
  228. left: 0,
  229. right: '20rpx',
  230. bottom: 0,
  231. containLabel: true
  232. },
  233. xAxis: {
  234. type: 'category',
  235. axisLabel: {
  236. color: '#6C6970',// 设置 x 轴标签颜色为白色
  237. fontSize: 10
  238. },
  239. boundaryGap: false,
  240. splitLine: {
  241. show: false, // 是否显示刻度线
  242. },
  243. axisTick: {
  244. // 不显示Y轴刻度线
  245. show: false
  246. },
  247. data: data1,
  248. axisLine: {
  249. // 不显示X轴轴线
  250. show: false
  251. }
  252. },
  253. yAxis: {
  254. // Y 轴配置
  255. type: 'value',
  256. show: false
  257. },
  258. series: [{
  259. type: 'line',
  260. name: '睡眠状态',
  261. smooth: true,
  262. lineStyle: {
  263. width: 1,
  264. color: '#54C68B'
  265. },
  266. emphasis: {
  267. disabled: true,
  268. scale: false,
  269. lineStyle: {
  270. width: 1,
  271. color: '#54C68B'
  272. },
  273. },
  274. showSymbol: false,
  275. areaStyle: {
  276. opacity: 0.8,
  277. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  278. {
  279. offset: 0,
  280. color: '#B8EBD0'
  281. },
  282. {
  283. offset: 1,
  284. color: 'rgba(255, 255, 255, 0)'
  285. }
  286. ])
  287. },
  288. data: data2,
  289. }]
  290. };
  291. chart.setOption(option, true);
  292. }
  293. function updateOutOfBed(data1, data2, startSleepTime, endSleepTime, that) {
  294. if (chartOutOfBed) {
  295. setChartOutOfBedOption(chartOutOfBed, data1, data2);
  296. } else {
  297. that.selectComponent('#chartOutOfBed-dom').init((canvas, width, height, dpr) => {
  298. const chart = echarts.init(canvas, null, {
  299. width: width,
  300. height: height,
  301. devicePixelRatio: dpr // new
  302. });
  303. canvas.setChart(chart);
  304. setChartOutOfBedOption(chart, data1, data2);
  305. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  306. chartOutOfBed = chart;
  307. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  308. return chart;
  309. });
  310. }
  311. }
  312. //体动
  313. function initChartBodyMovementsLine(canvas, width, height, dpr) {
  314. // 在这里初始化图表
  315. const chart = echarts.init(canvas, null, {
  316. width: width,
  317. height: height,
  318. devicePixelRatio: dpr // new
  319. });
  320. canvas.setChart(chart);
  321. setBodyMovementsOption(chart);
  322. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  323. chartBodyMovementsLine = chart;
  324. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  325. return chart;
  326. };
  327. function setBodyMovementsOption(chart, data1 = [], data2 = [],) {
  328. var option = option = {
  329. tooltip: {
  330. show: true,
  331. trigger: 'axis',
  332. formatter: function (param) {
  333. return `${param[0] && param[0].value == 1 ? '体动' : '否'}`
  334. }
  335. },
  336. dataZoom: [
  337. { // 第一个 dataZoom 组件
  338. type: 'inside',
  339. },
  340. ],
  341. grid: {
  342. top: '40rpx',
  343. left: 0,
  344. right: '20rpx',
  345. bottom: 0,
  346. containLabel: true
  347. },
  348. xAxis: {
  349. type: 'category',
  350. axisLabel: {
  351. color: '#6C6970',// 设置 x 轴标签颜色为白色
  352. fontSize: 10
  353. },
  354. boundaryGap: false,
  355. splitLine: {
  356. show: false, // 是否显示刻度线
  357. },
  358. axisTick: {
  359. // 不显示Y轴刻度线
  360. show: false
  361. },
  362. data: data1,
  363. axisLine: {
  364. // 不显示X轴轴线
  365. show: false
  366. }
  367. },
  368. yAxis: {
  369. // Y 轴配置
  370. type: 'value',
  371. show: false
  372. },
  373. series: [{
  374. name: '睡眠状态',
  375. type: 'line',
  376. smooth: true,
  377. lineStyle: {
  378. width: 1,
  379. color: '#5582FF'
  380. },
  381. emphasis: {
  382. disabled: true,
  383. scale: false,
  384. lineStyle: {
  385. width: 1,
  386. color: '#5582FF'
  387. },
  388. },
  389. showSymbol: false,
  390. areaStyle: {
  391. opacity: 0.8,
  392. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  393. {
  394. offset: 0,
  395. color: 'rgba(85, 130, 255, 0.5)'
  396. },
  397. {
  398. offset: 1,
  399. color: 'rgba(149, 177, 255, 0.3)'
  400. }
  401. ])
  402. },
  403. data: data2,
  404. }]
  405. };
  406. chart.setOption(option, true);
  407. }
  408. function updateBodyMovements(data1, data2, startSleepTime, endSleepTime, that) {
  409. if (chartBodyMovementsLine) {
  410. setBodyMovementsOption(chartBodyMovementsLine, data1, data2);
  411. } else {
  412. that.selectComponent('#chartBodyMovementsLine-dom').init((canvas, width, height, dpr) => {
  413. const chart = echarts.init(canvas, null, {
  414. width: width,
  415. height: height,
  416. devicePixelRatio: dpr // new
  417. });
  418. canvas.setChart(chart);
  419. setBodyMovementsOption(chart, data1, data2);
  420. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  421. chartBodyMovementsLine = chart;
  422. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  423. return chart;
  424. });
  425. }
  426. }
  427. //心脏系统
  428. function initChartCardiacSystemLine(canvas, width, height, dpr) {
  429. // 在这里初始化图表
  430. const chart = echarts.init(canvas, null, {
  431. width: width,
  432. height: height,
  433. devicePixelRatio: dpr // new
  434. });
  435. canvas.setChart(chart);
  436. setCardiacSystemOption(chart);
  437. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  438. chartCardiacSystemLine = chart;
  439. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  440. return chart;
  441. };
  442. function setCardiacSystemOption(chart, data1 = [], data2 = [],) {
  443. var option = option = {
  444. tooltip: {
  445. show: true,
  446. trigger: 'axis',
  447. formatter: function (param) {
  448. return `${(param[0].value || 0) + '次'}`
  449. }
  450. },
  451. dataZoom: [
  452. { // 第一个 dataZoom 组件
  453. type: 'inside',
  454. },
  455. ],
  456. grid: {
  457. top: '20rpx',
  458. left: '20rpx',
  459. right: '20rpx',
  460. bottom: '10rpx',
  461. containLabel: true
  462. },
  463. xAxis: {
  464. type: 'category',
  465. axisLabel: {
  466. color: '#6C6970',// 设置 x 轴标签颜色为白色
  467. fontSize: 10
  468. },
  469. boundaryGap: false,
  470. splitLine: {
  471. show: false, // 是否显示刻度线
  472. },
  473. axisTick: {
  474. // 不显示Y轴刻度线
  475. show: false
  476. },
  477. data: data1,
  478. axisLine: {
  479. // 不显示X轴轴线
  480. show: false
  481. }
  482. },
  483. yAxis: {
  484. type: 'value',
  485. max: 100,
  486. min: 0,
  487. show: true,
  488. offset: 10,
  489. splitLine: {
  490. show: false
  491. },
  492. axisLabel: {
  493. hideOverlap: true,
  494. fontSize: 10,
  495. }
  496. },
  497. series: [{
  498. type: 'line',
  499. smooth: true,
  500. lineStyle: {
  501. width: 1,
  502. color: '#F47893'
  503. },
  504. emphasis: {
  505. disabled: true,
  506. scale: false,
  507. lineStyle: {
  508. width: 1,
  509. color: '#F47893'
  510. },
  511. },
  512. showSymbol: false,
  513. areaStyle: {
  514. opacity: 0.8,
  515. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  516. {
  517. offset: 0,
  518. color: 'rgba(244, 120, 147, 0.5)'
  519. },
  520. {
  521. offset: 1,
  522. color: 'rgba(250, 140, 164, 0.3)'
  523. }
  524. ])
  525. },
  526. data: data2,
  527. }]
  528. };
  529. chart.setOption(option, true);
  530. }
  531. function updateCardiacSystem(data1, data2, that) {
  532. if (chartCardiacSystemLine) {
  533. setCardiacSystemOption(chartCardiacSystemLine, data1, data2);
  534. } else {
  535. that.selectComponent('#chartCardiacSystemLine-dom').init((canvas, width, height, dpr) => {
  536. const chart = echarts.init(canvas, null, {
  537. width: width,
  538. height: height,
  539. devicePixelRatio: dpr // new
  540. });
  541. canvas.setChart(chart);
  542. setCardiacSystemOption(chart, data1, data2);
  543. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  544. chartBodyMovementsLine = chart;
  545. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  546. return chart;
  547. });
  548. }
  549. }
  550. //平均呼吸率
  551. function initChartRespiratoryLine(canvas, width, height, dpr) {
  552. // 在这里初始化图表
  553. const chart = echarts.init(canvas, null, {
  554. width: width,
  555. height: height,
  556. devicePixelRatio: dpr // new
  557. });
  558. canvas.setChart(chart);
  559. setRespiratoryOption(chart);
  560. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  561. chartRespiratoryLine = chart;
  562. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  563. return chart;
  564. };
  565. function setRespiratoryOption(chart, data1 = [], data2 = [],) {
  566. var option = option = {
  567. tooltip: {
  568. show: true,
  569. trigger: 'axis',
  570. formatter: function (param) {
  571. return `${(param[0].value || 0) + '次'}`
  572. }
  573. },
  574. dataZoom: [
  575. { // 第一个 dataZoom 组件
  576. type: 'inside',
  577. },
  578. ],
  579. grid: {
  580. top: '20rpx',
  581. left: '20rpx',
  582. right: '20rpx',
  583. bottom: '10rpx',
  584. containLabel: true
  585. },
  586. xAxis: {
  587. type: 'category',
  588. axisLabel: {
  589. color: '#6C6970',// 设置 x 轴标签颜色为白色
  590. fontSize: 10
  591. },
  592. boundaryGap: false,
  593. splitLine: {
  594. show: false, // 是否显示刻度线
  595. },
  596. axisTick: {
  597. // 不显示Y轴刻度线
  598. show: false
  599. },
  600. data: data1,
  601. axisLine: {
  602. // 不显示X轴轴线
  603. show: false
  604. }
  605. },
  606. yAxis: {
  607. type: 'value',
  608. max: 24,
  609. min: 0,
  610. show: true,
  611. offset: 10,
  612. splitLine: {
  613. show: false
  614. },
  615. axisLabel: {
  616. hideOverlap: true,
  617. fontSize: 10,
  618. }
  619. },
  620. series: [{
  621. type: 'line',
  622. smooth: true,
  623. lineStyle: {
  624. width: 1,
  625. color: '#06A9AD'
  626. },
  627. emphasis: {
  628. disabled: true,
  629. scale: false,
  630. lineStyle: {
  631. width: 1,
  632. color: '#06A9AD'
  633. },
  634. },
  635. showSymbol: false,
  636. areaStyle: {
  637. opacity: 0.8,
  638. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  639. {
  640. offset: 0,
  641. color: 'rgba(186, 246, 231, 1)'
  642. },
  643. {
  644. offset: 1,
  645. color: 'rgba(255, 255, 255, 0)'
  646. }
  647. ])
  648. },
  649. data: data2,
  650. }]
  651. };
  652. chart.setOption(option, true);
  653. }
  654. function updateRespiratory(data1, data2, startSleepTime, endSleepTime, that) {
  655. if (chartRespiratoryLine) {
  656. setRespiratoryOption(chartRespiratoryLine, data1, data2);
  657. } else {
  658. that.selectComponent('#chartRespiratoryLine-dom').init((canvas, width, height, dpr) => {
  659. const chart = echarts.init(canvas, null, {
  660. width: width,
  661. height: height,
  662. devicePixelRatio: dpr // new
  663. });
  664. canvas.setChart(chart);
  665. setRespiratoryOption(chart, data1, data2);
  666. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  667. chartRespiratoryLine = chart;
  668. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  669. return chart;
  670. });
  671. }
  672. }
  673. //打鼾
  674. function initSnoringLine(canvas, width, height, dpr) {
  675. // 在这里初始化图表
  676. const chart = echarts.init(canvas, null, {
  677. width: width,
  678. height: height,
  679. devicePixelRatio: dpr // new
  680. });
  681. canvas.setChart(chart);
  682. setSnoringOption(chart);
  683. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  684. chartSnoringLine = chart;
  685. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  686. return chart;
  687. };
  688. function setSnoringOption(chart, data1 = [], data2 = [],) {
  689. var option = option = {
  690. tooltip: {
  691. show: true,
  692. trigger: 'axis',
  693. formatter: function (param) {
  694. return `${param[0] && param[0].value == 1 ? '打鼾' : '否'}`
  695. }
  696. },
  697. dataZoom: [
  698. { // 第一个 dataZoom 组件
  699. type: 'inside',
  700. },
  701. ],
  702. grid: {
  703. top: '40rpx',
  704. left: 0,
  705. right: '20rpx',
  706. bottom: 0,
  707. containLabel: true
  708. },
  709. xAxis: {
  710. type: 'category',
  711. axisLabel: {
  712. color: '#6C6970',// 设置 x 轴标签颜色为白色
  713. fontSize: 10
  714. },
  715. boundaryGap: false,
  716. splitLine: {
  717. show: false, // 是否显示刻度线
  718. },
  719. axisTick: {
  720. // 不显示Y轴刻度线
  721. show: false
  722. },
  723. data: data1,
  724. axisLine: {
  725. // 不显示X轴轴线
  726. show: false
  727. }
  728. },
  729. yAxis: {
  730. type: 'value',
  731. show: false,
  732. },
  733. series: [{
  734. type: 'line',
  735. smooth: true,
  736. lineStyle: {
  737. width: 1,
  738. color: '#EE8B52'
  739. },
  740. emphasis: {
  741. disabled: true,
  742. scale: false,
  743. lineStyle: {
  744. width: 1,
  745. color: '#EE8B52'
  746. },
  747. },
  748. showSymbol: false,
  749. areaStyle: {
  750. opacity: 0.8,
  751. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  752. {
  753. offset: 0,
  754. color: 'rgba(249, 211, 189, 1)'
  755. },
  756. {
  757. offset: 1,
  758. color: 'rgba(255, 255, 255, 0)'
  759. }
  760. ])
  761. },
  762. data: data2,
  763. }]
  764. };
  765. chart.setOption(option, true);
  766. }
  767. function updateSnoring(data1, data2, startSleepTime, endSleepTime, that) {
  768. if (chartSnoringLine) {
  769. setSnoringOption(chartSnoringLine, data1, data2);
  770. } else {
  771. that.selectComponent('#chartSnoringLine-dom').init((canvas, width, height, dpr) => {
  772. const chart = echarts.init(canvas, null, {
  773. width: width,
  774. height: height,
  775. devicePixelRatio: dpr // new
  776. });
  777. canvas.setChart(chart);
  778. setSnoringOption(chart, data1, data2);
  779. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  780. chartSnoringLine = chart;
  781. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  782. return chart;
  783. });
  784. }
  785. }
  786. //呼吸暂停
  787. function initApneaLine(canvas, width, height, dpr) {
  788. // 在这里初始化图表
  789. const chart = echarts.init(canvas, null, {
  790. width: width,
  791. height: height,
  792. devicePixelRatio: dpr // new
  793. });
  794. canvas.setChart(chart);
  795. setApneaOption(chart);
  796. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  797. chartApneaLine = chart;
  798. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  799. return chart;
  800. };
  801. function setApneaOption(chart, data1 = [], data2 = [],) {
  802. var option = option = {
  803. tooltip: {
  804. show: true,
  805. trigger: 'axis',
  806. formatter: function (param) {
  807. return `${param[0] && param[0].value == 1 ? '停止' : '否'}`
  808. }
  809. },
  810. dataZoom: [
  811. { // 第一个 dataZoom 组件
  812. type: 'inside',
  813. },
  814. ],
  815. grid: {
  816. top: '40rpx',
  817. left: 0,
  818. right: '20rpx',
  819. bottom: 0,
  820. containLabel: true
  821. },
  822. xAxis: {
  823. type: 'category',
  824. axisLabel: {
  825. color: '#6C6970',// 设置 x 轴标签颜色为白色
  826. fontSize: 10
  827. },
  828. boundaryGap: false,
  829. splitLine: {
  830. show: false, // 是否显示刻度线
  831. },
  832. axisTick: {
  833. // 不显示Y轴刻度线
  834. show: false
  835. },
  836. data: data1,
  837. axisLine: {
  838. // 不显示X轴轴线
  839. show: false
  840. }
  841. },
  842. yAxis: {
  843. type: 'value',
  844. show: false,
  845. },
  846. series: [{
  847. type: 'line',
  848. smooth: true,
  849. lineStyle: {
  850. width: 1,
  851. color: '#6086EF'
  852. },
  853. emphasis: {
  854. disabled: true,
  855. scale: false,
  856. lineStyle: {
  857. width: 1,
  858. color: '#6086EF'
  859. },
  860. },
  861. showSymbol: false,
  862. areaStyle: {
  863. opacity: 0.8,
  864. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  865. {
  866. offset: 0,
  867. color: 'rgba(96, 134, 239, 1)'
  868. },
  869. {
  870. offset: 1,
  871. color: 'rgba(255, 255, 255, 0)'
  872. }
  873. ])
  874. },
  875. data: data2,
  876. }]
  877. };
  878. chart.setOption(option, true);
  879. }
  880. function updateApnea(data1, data2, startSleepTime, endSleepTime, that) {
  881. if (chartApneaLine) {
  882. setApneaOption(chartApneaLine, data1, data2);
  883. } else {
  884. that.selectComponent('#chartApneaLine-dom').init((canvas, width, height, dpr) => {
  885. const chart = echarts.init(canvas, null, {
  886. width: width,
  887. height: height,
  888. devicePixelRatio: dpr // new
  889. });
  890. canvas.setChart(chart);
  891. setApneaOption(chart, data1, data2);
  892. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  893. chartApneaLine = chart;
  894. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  895. return chart;
  896. });
  897. }
  898. }
  899. //深浅睡眠
  900. function timestampToHHMM(timestamp) {
  901. let date = new Date(timestamp); // 注意:JavaScript中的Date是以毫秒为单位的
  902. let hours = date.getHours().toString().padStart(2, '0'); // 获取小时数,并补零
  903. let minutes = date.getMinutes().toString().padStart(2, '0'); // 获取分钟数,并补零
  904. return hours + ':' + minutes;
  905. }
  906. // 自定义图形
  907. function renderItem(params, api) {
  908. var categoryIndex = api.value(0);
  909. var startX = api.coord([api.value(1), categoryIndex])[0];
  910. var endX = api.coord([api.value(2), categoryIndex])[0];
  911. var centerY = api.coord([
  912. api.value(1) + (api.value(2) - api.value(1)) / 2,
  913. categoryIndex
  914. ])[1]; // 取中间点的y坐标
  915. var height = api.size([0, 1])[1] * 1;
  916. var width = endX - startX;
  917. // 创建一个矩形
  918. var rect = {
  919. x: startX,
  920. y: centerY - height / 2,
  921. r: 2,
  922. width: width,
  923. height: height
  924. };
  925. // 返回的图形对象
  926. return {
  927. type: 'rect',
  928. shape: rect,
  929. style: api.style()
  930. };
  931. }
  932. function initChartTimeWaterfall(canvas, width, height, dpr) {
  933. // 在这里初始化图表
  934. const chart = echarts.init(canvas, null, {
  935. width: width,
  936. height: height,
  937. devicePixelRatio: dpr // new
  938. });
  939. canvas.setChart(chart);
  940. 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 } } } }]);
  941. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  942. chartTimeWaterfall = chart;
  943. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  944. return chart;
  945. };
  946. function setTimeWaterfallOption(chart, startTime = new Date().getTime(), data = [], categories = ['深睡', '中睡', '浅睡', '清醒']) {
  947. var option =
  948. option = {
  949. tooltip: {
  950. show: true,
  951. formatter: function (params) {
  952. return params.marker + params.name + ': ' + params.value[3] + ' m';
  953. }
  954. },
  955. dataZoom: [
  956. {
  957. type: 'inside',
  958. filterMode: 'weakFilter'
  959. }
  960. ],
  961. grid: {
  962. top: 0,
  963. bottom: 0,
  964. height: 160,
  965. containLabel: false
  966. },
  967. xAxis: {
  968. type: 'value',
  969. scale: true,
  970. min: startTime,
  971. splitLine: {
  972. show: false // 是否显示刻度线
  973. },
  974. axisLabel: {
  975. color: '#6C6970',// 设置 x 轴标签颜色为白色
  976. fontSize: 10,
  977. formatter: function (val) {
  978. return timestampToHHMM(val || startTime);
  979. }
  980. }
  981. },
  982. yAxis: {
  983. show: false,
  984. data: categories
  985. },
  986. series: [
  987. {
  988. type: 'custom',
  989. renderItem: renderItem,
  990. itemStyle: {
  991. opacity: 1
  992. },
  993. encode: {
  994. x: [1, 2],
  995. y: 0
  996. },
  997. data: data
  998. }
  999. ]
  1000. };
  1001. chart.setOption(option, true);
  1002. }
  1003. function updateTimeWaterfall(startTime = new Date().getTime(), data, that) {
  1004. if (chartTimeWaterfall) {
  1005. setTimeWaterfallOption(chartTimeWaterfall, startTime, data);
  1006. } else {
  1007. that.selectComponent('#chartTimeWaterfall-dom').init((canvas, width, height, dpr) => {
  1008. const chart = echarts.init(canvas, null, {
  1009. width: width,
  1010. height: height,
  1011. devicePixelRatio: dpr // new
  1012. });
  1013. canvas.setChart(chart);
  1014. setTimeWaterfallOption(chart, startTime, data);
  1015. // 将图表实例绑定到 this 上,可以在其他成员函数(如 dispose)中访问
  1016. chartTimeWaterfall = chart;
  1017. // 注意这里一定要返回 chart 实例,否则会影响事件处理等
  1018. return chart;
  1019. });
  1020. }
  1021. }
  1022. function addZero(str) {
  1023. if (String(str).length == 1) {
  1024. return "0" + String(str);
  1025. } else {
  1026. return String(str);
  1027. }
  1028. }
  1029. const aipushApi = "https://aipush.aidsleep.cn";
  1030. const token_push = "b74fd5754c5ef24cf600c39194abdaeb";
  1031. const token_today_push = "89835e65993fee4a6a6cbbe4c271da51e5521822934e13769e61cadabaed72c3";
  1032. Page({
  1033. imageaBase64Path: '',
  1034. imageaPath: '',
  1035. history: [],
  1036. future: [],
  1037. isSave: false,
  1038. /**
  1039. * 页面的初始数据
  1040. */
  1041. data: {
  1042. customActionStyle: {
  1043. border: {
  1044. borderColor: '#1A7AF8',
  1045. },
  1046. scale: {
  1047. textIcon: '/palette/switch.png',
  1048. imageIcon: '/palette/scale.png',
  1049. },
  1050. delete: {
  1051. icon: '/palette/close.png',
  1052. },
  1053. },
  1054. paintPallette: {},
  1055. template: {},
  1056. showImg:false,
  1057. ecCircularProgressBar: {
  1058. // lazyLoad: true, // 懒加载
  1059. onInit: initChartHumidifier
  1060. },
  1061. ecOutOfBed: {
  1062. // lazyLoad: true, // 懒加载
  1063. onInit: initChartOutOfBed
  1064. },
  1065. ecBodyMovements: {
  1066. // lazyLoad: true, // 懒加载
  1067. onInit: initChartBodyMovementsLine
  1068. },
  1069. ecCardiacSystemLine: {
  1070. // lazyLoad: true, // 懒加载
  1071. onInit: initChartCardiacSystemLine
  1072. },
  1073. ecChartRespiratoryLine: {
  1074. // lazyLoad: true, // 懒加载
  1075. onInit: initChartRespiratoryLine
  1076. },
  1077. // ecSnoringLine: {
  1078. // // lazyLoad: true, // 懒加载
  1079. // onInit: initSnoringLine
  1080. // },
  1081. // ecApneaLine: {
  1082. // // lazyLoad: true, // 懒加载
  1083. // onInit: initApneaLine
  1084. // },
  1085. ecTimeWaterfall: {
  1086. // lazyLoad: true, // 懒加载
  1087. onInit: initChartTimeWaterfall
  1088. },
  1089. showAuthorizedDialog: false,
  1090. status: "",
  1091. isToDay: false,
  1092. year: addZero(new Date().getFullYear()),
  1093. month: addZero(new Date().getMonth()),
  1094. date: addZero(new Date().getDate()),
  1095. hours: addZero(new Date().getHours()),
  1096. rdt_arr: [],
  1097. rrh_arr: [],
  1098. rhx_arr: [],
  1099. rsnoring_arr: [],
  1100. routbed_arr: [],
  1101. rmove_arr: [],
  1102. rhxstop_arr: [],
  1103. rsleep_arr: [],
  1104. rdt_arrNew: [],//睡眠时间轴数据集合
  1105. rrh_arrNew: [],//睡眠心率数据集合
  1106. rhx_arrNew: [],//睡眠呼吸数据集合
  1107. rmove_arrNew: [],//体动状态数据集合,0-否,1-体动状态
  1108. rsleep_arrNew: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1109. rsleep_arr_all_New: [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1110. durationData: [], //睡眠时长
  1111. sleep_duration: [], //睡眠和清醒对比
  1112. rdeep_durationFormatA: {},
  1113. rdeep_duration: 0,
  1114. rlight_duration: 0,
  1115. rin_duration: 0,
  1116. rawake_duration: 0,
  1117. rrs_duration: 0,//入睡时长
  1118. routbed_count_value: 0,//离床次数
  1119. rsleep_eff_value: '',//睡眠效率
  1120. rdeep_durationFormat: '',
  1121. rlight_durationFormat: '',
  1122. rin_durationFormat: '',
  1123. rawake_durationFormat: '',
  1124. ravg_hx_value: 0,
  1125. ravg_hx_desc: '',
  1126. ravg_rh_value: 0,
  1127. ravg_rh_desc: '',
  1128. rscore_value: 0,
  1129. rscore_desc: '',
  1130. sleep_efficiency: '',//睡眠效率
  1131. zdPoint: [],
  1132. rsn: '',
  1133. rdate: '',
  1134. total_duration: 0,
  1135. rtotal_duration: 0,
  1136. rinbed_duration: 0,
  1137. rgobed_time: 0,
  1138. routbed_time: 0,
  1139. rgobed_routbed: 0,
  1140. sleepHourSub: 0,
  1141. reportDate: '',
  1142. currentDate: '',
  1143. currentTime: '',
  1144. rmove_arrFrequency: 0,//体动次数
  1145. routbed_arrFrequency: 0,//离床次数
  1146. rsnoring_arrFrequency: 0,//打鼾次数
  1147. rhxstop_arrFrequency: 0,//呼吸暂停次数
  1148. sleep_durationCountA: 0,//睡眠时间
  1149. tvEntityIds: [],
  1150. ifOneMoreTV: false,//数据推送是否有多于一台电视
  1151. hotelcode: '',//酒店编码
  1152. roomcode: '',//房间编码
  1153. rdeep_duration_efficiency: '',//深睡比例
  1154. rlight_duration_efficiency: '',//浅睡比例
  1155. rin_duration_efficiency: '',//中睡比例
  1156. rawake_duration_efficiency: '',//清醒比例
  1157. isLoading: false,
  1158. reportId: '',
  1159. hotelname: '',
  1160. roomname: '',
  1161. bedname: '',
  1162. pushReportId: '',//推送用:reportId
  1163. sn: '',//今日报告切换用
  1164. sns: [],//床
  1165. dateData: [],//日期
  1166. dateTimeData: [],//时间段
  1167. selectTitleList: [],//床垫
  1168. showSelect: false,
  1169. showSelectSn: false,
  1170. showSelectDate: false,
  1171. showSelectDateTime: false,
  1172. isNoReportToday: false,
  1173. isShowTz: false,
  1174. tzTitle: '',
  1175. tzSubTitle: '',
  1176. },
  1177. handleSureDownload() {
  1178. if (this.data.rscore_value && this.data.rscore_value > 0 && this.data.reportDate &&this.data.reportDate!=='' ){
  1179. const dateString = this.data.reportDate; // "2025-12-30"
  1180. const date = new Date(dateString);
  1181. const year = date.getFullYear(); // 2025
  1182. const month = date.getMonth() + 1; // 12(注意:getMonth() 返回 0~11)
  1183. const day = date.getDate();
  1184. this.isSave = false;
  1185. api.painter({
  1186. params: {
  1187. score: this.data.rscore_value,
  1188. union_id: wx.getStorageSync('unionid'),
  1189. date:dateString
  1190. },
  1191. }).then(data => {
  1192. if (data.code === 1) {
  1193. var DrawImg = getDrawImg(data?.data?.pic||'/static/painter/hua.png', 0);
  1194. var CheckInInfo = getCheckInInfo(data?.data?.talk|| "亲爱的,哪怕只有一分钟的平静闭眼,也是身体在努力修复的信号。新的一天,新的开始!",this. data.hotelname || wx.getStorageSync('hname'),this. data.roomname,this.data.rscore_value, year+'年'+month+'月'+day+"日", DrawImg.height);
  1195. // 定义 palette 对象 "height": CheckInInfo.height + "rpx" 1166,
  1196. const palette = {
  1197. "width": "750rpx",
  1198. "height": CheckInInfo.height+ "rpx",
  1199. "background": "transparent",
  1200. "views": [
  1201. ...DrawImg.obj,
  1202. ...CheckInInfo.obj,
  1203. ]
  1204. };
  1205. console.log("paletCheckInInfo.heighte",CheckInInfo.height)
  1206. // 更新数据到页面 l
  1207. this.isSave = true;
  1208. this.setData({
  1209. paintPallette: palette
  1210. });
  1211. } else {
  1212. }
  1213. }).catch(err => {
  1214. });
  1215. }
  1216. },
  1217. hotelPrinting(){
  1218. api2.getToken({
  1219. body: {
  1220. "tks":"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
  1221. }
  1222. }).then(data => {
  1223. if (data?.token) {
  1224. api2.print({
  1225. body: {
  1226. "filename":"bk_login.png","file_content":this.imageaBase64Path
  1227. }
  1228. ,headers:{
  1229. "X-Print-Token": data.token
  1230. }
  1231. }).then(data => {
  1232. }).catch(err => {
  1233. });
  1234. }
  1235. }).catch(err => {
  1236. });
  1237. },
  1238. saveImage() {
  1239. console.log("saveImage", this.imageaBase64Path)
  1240. if (this.imageaBase64Path && typeof this.imageaBase64Path === 'string') {
  1241. this.isSave = false;
  1242. // 存入系统相册
  1243. wx.saveImageToPhotosAlbum({
  1244. filePath: this.imageaPath || '',
  1245. success: res => {
  1246. this.onClickHide()
  1247. },
  1248. fail: res => {
  1249. console.log(res)
  1250. this.onClickHide()
  1251. }
  1252. })
  1253. }
  1254. },
  1255. // 生成海报点击事件
  1256. onImgOK(e) {
  1257. this.imageaBase64Path = this.convertImageToBase64(e.detail.path );
  1258. this.imageaPath = e.detail.path;
  1259. this.setData({
  1260. image: this.imageaBase64Path,
  1261. });
  1262. if (this.isSave) {
  1263. this.onClickShow()
  1264. }
  1265. },
  1266. convertImageToBase64(filePath) {
  1267. const fs = wx.getFileSystemManager();
  1268. try {
  1269. // 使用 'base64' 而不是 'binary'
  1270. let data = fs.readFileSync(filePath, 'base64'); // 直接以 base64 格式读取
  1271. return 'data:image/png;base64,' + data; // 直接返回带有 MIME 类型的 base64 字符串
  1272. // 你可以把 base64Url 存起来或上传服务器
  1273. } catch (err) {
  1274. console.error('读取文件失败', err);
  1275. return ''; // 发生错误时返回空字符串或者进行其他处理
  1276. }
  1277. },
  1278. touchEnd({detail}) {
  1279. let needRefresh = detail.index >= 0 && detail.index <= this.data.template.views.length;
  1280. if (needRefresh) {
  1281. this.history.push({
  1282. ...detail,
  1283. });
  1284. if (this.data.template.views[detail.index].id === detail.view.id) {
  1285. this.data.template.views.splice(detail.index, 1);
  1286. } else {
  1287. this.data.template.views.splice(detail.index, 0, detail.view);
  1288. }
  1289. } else {
  1290. if (!this.data.template || !this.data.template.views) {
  1291. return;
  1292. }
  1293. for (let view of this.data.template.views) {
  1294. if (view.id === detail.view.id) {
  1295. this.history.push({
  1296. view: {
  1297. ...detail.view,
  1298. ...view,
  1299. },
  1300. });
  1301. view.css = detail.view.css;
  1302. break;
  1303. }
  1304. }
  1305. }
  1306. this.future.length = 0;
  1307. const props = {
  1308. paintPallette: this.data.template,
  1309. };
  1310. if (needRefresh) {
  1311. props.template = this.data.template;
  1312. }
  1313. this.setData(props);
  1314. },
  1315. toWarmReminder(e) {
  1316. const tabName = e.currentTarget.dataset.index || 1;
  1317. wx.navigateTo({
  1318. url: '/subpages/warmReminder/warmReminder?id=' + tabName
  1319. })
  1320. },
  1321. getRsleep_arr(list) {
  1322. if (list) {
  1323. // console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1324. for (let i = 0; i < list.length; i++) {
  1325. if (list[i] == '0') {
  1326. list[i] = '清醒';
  1327. } else if (list[i] == '10') {
  1328. list[i] = '浅睡';
  1329. } else if (list[i] == '20') {
  1330. list[i] = '中睡';
  1331. } else if (list[i] == '30') {
  1332. list[i] = '深睡';
  1333. } else {
  1334. list[i] = '其他';
  1335. }
  1336. }
  1337. }
  1338. // console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1339. },
  1340. getFrequency(list) {//获取
  1341. if (list) {
  1342. // console.log("getRsleep_arr_list1==" + JSON.stringify(list));
  1343. for (let i = 0; i < list.length; i++) {
  1344. if (list[i] == '0') {
  1345. list[i] = '清醒';
  1346. } else if (list[i] == '10') {
  1347. list[i] = '浅睡';
  1348. } else if (list[i] == '20') {
  1349. list[i] = '中睡';
  1350. } else if (list[i] == '30') {
  1351. list[i] = '深睡';
  1352. } else {
  1353. list[i] = '其他';
  1354. }
  1355. }
  1356. }
  1357. // console.log("getRsleep_arr_list2==" + JSON.stringify(list));
  1358. },
  1359. splitN(originalArray, n) {
  1360. if (!originalArray) return [];
  1361. // 计算每份的大小
  1362. // let chunkSize = Math.ceil(originalArray.length / n);
  1363. // 分割数组并获取每份的最后一个元素
  1364. // let lastElements = [];
  1365. // for (let i = 0; i < originalArray.length; i += chunkSize) {
  1366. // let chunk = originalArray.slice(i, i + chunkSize);
  1367. // lastElements.push(chunk[chunk.length - 1]);
  1368. // }
  1369. // 输出每份的最后一个元素
  1370. // console.log('lastElements=' + lastElements);
  1371. return originalArray;
  1372. },
  1373. //获取次数
  1374. getFrequency(list, o) {
  1375. if (!list) return 0;
  1376. let frequency = 0;
  1377. for (let i = 0; i < list.length; i++) {
  1378. if (list[i] == o) frequency++;
  1379. }
  1380. // console.log('frequency=' + frequency);
  1381. return frequency;
  1382. },
  1383. getTimeDiffInHours: function (startTimeStr, endTimeStr) {
  1384. // 假设两个时间都是同一天的,这里我们使用当前日期作为基准
  1385. if (!startTimeStr || !endTimeStr) return null;
  1386. const now = new Date();
  1387. const startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...startTimeStr.split(':').map(Number));
  1388. const endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), ...endTimeStr.split(':').map(Number));
  1389. // 处理跨天的情况
  1390. if (endDate < startDate) {
  1391. endDate.setDate(endDate.getDate() + 1); // 将结束时间设置为第二天的同一时间
  1392. }
  1393. // 计算时间差(毫秒)
  1394. const diffInMs = endDate - startDate;
  1395. // 转换为小时
  1396. const diffInHours = diffInMs / (1000 * 60 * 60);
  1397. return diffInHours;
  1398. },
  1399. // 时间格式化
  1400. convertTimeToHoursAndMinutes: function (timeWithText, flag = 0) {
  1401. if (!timeWithText) return;
  1402. // 移除'分钟'两个字
  1403. var minutesStr = timeWithText.replace('分钟', '');
  1404. var minutes = parseInt(minutesStr); // 将字符串转换为整数
  1405. if (isNaN(minutes)) {
  1406. // 如果转换失败,则可能是输入的不是有效的数字
  1407. console.error('Invalid minutes format');
  1408. return;
  1409. }
  1410. var hours = Math.floor(minutes / 60); // 整除60得到小时数
  1411. var remainingMinutes = minutes % 60; // 取余得到剩余的分钟数
  1412. // 如果小时数或分钟数小于10,前面补0
  1413. // var formattedHours = hours < 10 ? '0' + hours : hours;
  1414. var formattedHours = hours;
  1415. // var formattedMinutes = remainingMinutes < 10 ? '0' + remainingMinutes : remainingMinutes;
  1416. var formattedMinutes = remainingMinutes;
  1417. // 拼接小时和分钟,形成HH:mm格式
  1418. var formattedTime = '';
  1419. if (flag == 1) {
  1420. formattedTime = formattedHours + 'H ' + formattedMinutes + 'M';
  1421. } else if (flag == 2) {
  1422. formattedTime = formattedHours + '{units|小时}' + formattedMinutes + '{units|分钟}';
  1423. } else {
  1424. formattedTime = {
  1425. formattedHours,
  1426. formattedMinutes
  1427. };
  1428. }
  1429. // 更新数据
  1430. // this.setData({
  1431. // formattedTime: formattedTime
  1432. // });
  1433. return formattedTime;
  1434. },
  1435. // 组装深度睡眠数据
  1436. calculateTheDurationOfDeepSleep() {
  1437. var that = this;
  1438. // var totalDuration = this.data.total_duration;
  1439. // var timePeriod = this.data.rdt_arrNew;
  1440. var sleepData = this.data.rsleep_arr;//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  1441. // console.log("睡眠总时长=>", totalDuration);
  1442. // console.log("睡眠时间片段=>", timePeriod);
  1443. // console.log("睡眠时间片段=>", timePeriod.length);
  1444. // console.log("睡眠数据=>", sleepData);
  1445. // console.log("睡眠数据=>", sleepData.length);
  1446. var awakeColor = [{ offset: 0, color: '#F7E3BA' }, { offset: 1, color: '#F7E3BA' }];;
  1447. var lightSleepColor = [{ offset: 0, color: '#AAD09F' }, { offset: 1, color: '#AAD09F' }];
  1448. var sleptInColor = [{ offset: 0, color: '#75BDE0' }, { offset: 1, color: '#75BDE0' }];
  1449. var deepSleepColor = [{ offset: 0, color: '#3D7299' }, { offset: 1, color: '#3D7299' }];
  1450. // var linearGradient = new echarts.graphic.LinearGradient(
  1451. // 0, 0, 0, 1, // 方向从左到右
  1452. // [
  1453. // { offset: 0, color: '#FDBE25' }, // 渐变开始的颜色
  1454. // { offset: 1, color: '#FD7778' } // 渐变结束的颜色
  1455. // ]
  1456. // );
  1457. // var item = {
  1458. // name: { name: '清醒', color: '#7b9ce1' },
  1459. // value: [index, baseTime, (baseTime += duration), duration],
  1460. // itemStyle: {
  1461. // normal: {
  1462. // color: linearGradient,
  1463. // }
  1464. // }
  1465. // };
  1466. // 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-深睡
  1467. // 状态映射
  1468. const statusMap = {
  1469. "0": "清醒",
  1470. "10": "REM",
  1471. "20": "浅睡",
  1472. "30": "深睡"
  1473. };
  1474. // 状态映射
  1475. const statusColorMap = {
  1476. "20": awakeColor,
  1477. "0": lightSleepColor,
  1478. "10": sleptInColor,
  1479. "30": deepSleepColor
  1480. };
  1481. // 状态映射
  1482. const statusIndexMap = {
  1483. "20": 3,
  1484. "0": 2,
  1485. "10": 1,
  1486. "30": 0
  1487. };
  1488. // 初始化变量 reportDate
  1489. // let dateString = '2024/09/14 23:20:00';
  1490. let dateString = `${that.data.reportDate.replaceAll("-", "/")} ${that.data.rgobed_time + ":00"}`;
  1491. let date = new Date(dateString);
  1492. let startTime = date.getTime(); // 基准时间,这里设为午夜开始
  1493. // console.log("时间=》", timestampToHHMM(startTime));
  1494. let oldTime = startTime;
  1495. let currentTime = startTime;
  1496. let currentState = sleepData[0];
  1497. let timePeriods = [];
  1498. // 遍历睡眠数据数组
  1499. for (let i = 0; i < sleepData.length; i++) {
  1500. // 如果当前状态与前一个状态不同,则记录前一个时间段
  1501. if (i > 0 && sleepData[i] !== sleepData[i - 1]) {
  1502. // 计算前一个时间段的结束时间(注意这里不需要减去一分钟,因为 currentTime 还未递增)
  1503. let endTime = currentTime;
  1504. // 计算前一个时间段的持续时间(分钟)
  1505. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1506. // 记录时间段
  1507. if (duration > 0) {
  1508. var linearGradient = new echarts.graphic.LinearGradient(
  1509. 0, 0, 0, 1, // 方向从左到右
  1510. statusColorMap[sleepData[i - 1]]
  1511. );
  1512. timePeriods.push({
  1513. name: statusMap[sleepData[i - 1]],// 使用前一个状态
  1514. value: [statusIndexMap[sleepData[i - 1]], startTime, endTime, duration],
  1515. itemStyle: {
  1516. normal: {
  1517. color: linearGradient,
  1518. }
  1519. },
  1520. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1521. // endTime: new Date(endTime),
  1522. // durationMinutes: duration
  1523. });
  1524. }
  1525. // 更新当前状态和开始时间
  1526. currentState = sleepData[i];
  1527. startTime = currentTime;
  1528. }
  1529. // 递增时间(每分钟)
  1530. currentTime += 1000 * 60;
  1531. // 处理最后一个时间段(如果数组不是以状态变化结束的话)
  1532. if (i === sleepData.length - 1) {
  1533. let endTime = currentTime;
  1534. let duration = Math.floor((endTime - startTime) / (1000 * 60));
  1535. if (duration > 0) {
  1536. var linearGradient = new echarts.graphic.LinearGradient(
  1537. 0, 0, 0, 1, // 方向从左到右
  1538. statusColorMap[currentState]
  1539. );
  1540. timePeriods.push({
  1541. name: statusMap[currentState],// 使用前一个状态
  1542. value: [statusIndexMap[currentState], startTime, endTime, duration],
  1543. itemStyle: {
  1544. normal: {
  1545. color: linearGradient,
  1546. }
  1547. },
  1548. // startTime: new Date(startTime), // 转换为 Date 对象以便更易于阅读
  1549. // endTime: new Date(endTime),
  1550. // durationMinutes: duration
  1551. });
  1552. }
  1553. }
  1554. }
  1555. wx.nextTick(() => {
  1556. setTimeout(() => {
  1557. updateTimeWaterfall(oldTime, timePeriods, that)
  1558. }, 1000);
  1559. });
  1560. // console.log("睡眠数据最终=>", dateString);
  1561. // console.log("睡眠数据最终=>", startTime);
  1562. // console.log("睡眠数据最终=>", JSON.stringify(timePeriods));
  1563. },
  1564. onClickShow() {
  1565. this.setData({ showImg: true });
  1566. },
  1567. onClickHide() {
  1568. this.setData({ showImg: false });
  1569. },
  1570. // 授权成功
  1571. authorizationSuccessful() {
  1572. // console.log("授权成功");
  1573. this.setData({ showAuthorizedDialog: false })
  1574. this.showData();
  1575. },
  1576. onReady() {
  1577. },
  1578. showData() {
  1579. let hotelcodeTemp = wx.getStorageSync("hotelEmpower");
  1580. let roomcodeTemp = wx.getStorageSync("roomEmpower");
  1581. // hotelcodeTemp = wx.getStorageSync('res').result.split('|')[0];
  1582. // roomcodeTemp = wx.getStorageSync('res').result.split('|')[1];
  1583. // 设置canvas的宽高
  1584. this.setData({
  1585. hotelcode: hotelcodeTemp,
  1586. roomcode: roomcodeTemp,
  1587. });
  1588. if (this.data.isToDay) {
  1589. this.getToDayReportData();
  1590. } else {
  1591. this.getReportData();
  1592. }
  1593. this.getTzData();
  1594. },
  1595. /**
  1596. * 生命周期函数--监听页面加载
  1597. */
  1598. onShow: function () {
  1599. if (!wx.getStorageSync('hasAuth')) {
  1600. this.setData({ showAuthorizedDialog: true })
  1601. } else {
  1602. this.showData();
  1603. }
  1604. },
  1605. onLoad(options) {
  1606. var that = this;
  1607. if (options.rpids) {
  1608. that.setData({
  1609. reportId: options.rpids,
  1610. isToDay: false
  1611. })
  1612. wx.setNavigationBarTitle({
  1613. title: "历史睡眠报告"
  1614. })
  1615. } else {
  1616. wx.setNavigationBarTitle({
  1617. title: "最新睡眠报告" || "今日睡眠报告"
  1618. })
  1619. that.setData({
  1620. isToDay: true
  1621. })
  1622. }
  1623. },
  1624. onTitleChange(event) {
  1625. const { picker, value, index } = event.detail;
  1626. this.setData({
  1627. reportId: value.rpid,
  1628. hotelname: value.hotelname,
  1629. roomname: value.roomname,
  1630. bedname: value.bedname,
  1631. });
  1632. this.closePicker();
  1633. this.getReportData();//更新报告
  1634. },
  1635. onSnChange(event) {
  1636. const { picker, value, index } = event.detail;
  1637. this.closePicker();
  1638. this.getDateData(value.sn);//自动获取日期
  1639. //
  1640. // this.getDateTimeData(this.data.reportDate);//如果不能修改日期 自动获取时间段
  1641. },
  1642. onDateChange(event) {
  1643. const { picker, value, index } = event.detail;
  1644. this.closePicker();
  1645. this.getDateTimeData(value.rdate);//自动获取时间段
  1646. },
  1647. onDateTimeChange(event) {
  1648. const { picker, value, index } = event.detail;
  1649. this.setData({
  1650. reportId: value.rpids
  1651. });
  1652. this.closePicker();
  1653. this.getReportData();//更新报告
  1654. },
  1655. showPicker(e) {
  1656. // return //暂时不开放
  1657. // 不是今天不让选择
  1658. if (!this.data.isToDay) {
  1659. return
  1660. }
  1661. var type = e.currentTarget.dataset.type;
  1662. if (type == 'sn' && this.data.selectTitleList.length) {
  1663. this.setData({
  1664. showSelect: true,
  1665. });
  1666. } else if (type == 'sn' && this.data.sns.length) {
  1667. // this.setData({
  1668. // showSelectSn: true,
  1669. // });
  1670. } else if (type == 'date' && this.data.dateData.length) {
  1671. return
  1672. // this.setData({
  1673. // showSelectDate: true,
  1674. // });
  1675. } else if (type == 'dateTime' && this.data.dateTimeData.length) {
  1676. return
  1677. // this.setData({
  1678. // showSelectDateTime: true,
  1679. // });
  1680. }
  1681. },
  1682. closePicker() {
  1683. this.setData({
  1684. showSelect: false,
  1685. showSelectSn: false,
  1686. showSelectDate: false,
  1687. showSelectDateTime: false
  1688. });
  1689. },
  1690. getAllUnionidList() {
  1691. var that = this;
  1692. wx.request({
  1693. url: `${aipushApi}` + '/allunionidlist',
  1694. data: {
  1695. "udi": wx.getStorageSync("unionid"),
  1696. "token": token_today_push
  1697. },
  1698. method: 'POST',
  1699. success(res) {
  1700. try {
  1701. const tempList = res.data.data || []
  1702. that.setData({
  1703. selectTitleList: tempList,
  1704. });
  1705. } catch (error) {
  1706. console.error(error);
  1707. }
  1708. },
  1709. })
  1710. },
  1711. getSnData() {
  1712. var that = this;
  1713. wx.request({
  1714. url: `${aipushApi}` + '/getsn',
  1715. data: {
  1716. // "hotelcode": "lab",
  1717. // "roomcode": "labs",
  1718. "hotelcode": that.data.hotelcode ? that.data.hotelcode : "club",
  1719. "roomcode": that.data.roomcode ? that.data.roomcode : "nuange",
  1720. "token": token_push
  1721. },
  1722. method: 'POST',
  1723. success(res) {
  1724. try {
  1725. if (res && res.data && res.data[0]) {
  1726. that.setData({
  1727. hotelname: res.data[0].hn,
  1728. roomname: res.data[0].rn,
  1729. sn: res.data[0].sn,
  1730. sns: res.data //床的数组
  1731. });
  1732. that.getDateData(res.data[0].sn, false);//根据 sn 获取可以用的时间段
  1733. // console.log("res.data=sn=" + JSON.stringify(res.data));
  1734. }
  1735. } catch (error) {
  1736. console.error(error);
  1737. }
  1738. },
  1739. })
  1740. },
  1741. toReport() {
  1742. wx.navigateTo({
  1743. url: '/subpages/constitutionDiagnosis/constitutionDiagnosis'
  1744. })
  1745. },
  1746. getTzData() {
  1747. var that = this;
  1748. var userId = wx.getStorageSync("unionid");
  1749. wx.request({
  1750. url: `https://fare.somnisix.top/system/constitutionDiagnosis/user/${userId}`,
  1751. data: {
  1752. "token": "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk5YzI3MjI2LTdkOWQtNDhiOC1hYjlhLWM4YjVjYWZiZGNkNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zITQOINFkHs19_1RAgHS4I9YMaVxVq0Dsn3t6r_K7rv3rXvJy0sMtodejIMi_PNa_m4uQYxnU-6k3wC2LZht_Q"
  1753. },
  1754. header: {
  1755. 'Authorization': 'Bearer ' + "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk5YzI3MjI2LTdkOWQtNDhiOC1hYjlhLWM4YjVjYWZiZGNkNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zITQOINFkHs19_1RAgHS4I9YMaVxVq0Dsn3t6r_K7rv3rXvJy0sMtodejIMi_PNa_m4uQYxnU-6k3wC2LZht_Q" // 在头部设置Bearer Token
  1756. },
  1757. method: 'GET',
  1758. success(res) {
  1759. try {
  1760. if (res && res.data && res.data.data) {
  1761. if (res.data.data.value2) {
  1762. var data = JSON.parse(res.data.data.value2);
  1763. var ratingResultsMap = {
  1764. A: {
  1765. index: 0,
  1766. title: "气虚型",
  1767. tips: "(体力和气力都低下,需要规律性的生活方式)",
  1768. subTitle: "累啊』『真倒霉』成了口头语",
  1769. desc: "一般来说气虚型的人,就是被称作生命力的“气”整体不足。因为体力和气力的整体下降,无论做什么都会感到“真倒霉”“真麻烦”,饮食和运动也是马马虎虎地应付。结果,陷入生活越不规律,“气”就越衰弱的恶性循环。特点就是免疫力降低,易患感冒,而且很难一次性治愈。\n\n为了改善气虚,最重要的就是要有规律性的生活方式。晚上早睡,早上早起。日常食物也要以应季的食材为主,促进胃肠的蠕动,尽量多食用可以提升体温的豆类、薯类等食材。\n\n适度的运动是必要的,但因体力下降,所以万不可强求大的运动量,可以从散步呀、瑜伽呀等轻负荷的运动练起。\n\n特征:驼背。显老像;稍一运动就出汗;手脚发冷;易疲劳,总有困意与疲倦感;下半身易发胖。"
  1770. }, B: {
  1771. index: 1,
  1772. title: "气滞型",
  1773. tips: "(常常紧张、焦虑~要有意识地放松自己)",
  1774. subTitle: "感情起伏剧烈",
  1775. desc: "“气”本来是在体内正常循环的,但是因紧张和压力等使气滞留,就造成了气滞型。“气’一旦滞留,就表现为腹胀、肿胀、疼痛等症状。而且,感情起伏剧烈也是其特征。一旦情绪低落,很快就会焦虑起来,给人以“易发怒”歇斯底里”的感觉。更年期出现气滞的人也不在少数。\n\n养生法无疑是减轻压力的最好办法,但暴饮暴食则会适得其反。值得注意的是体重的增加会影响气的循环。香草和香味蔬菜有促进气循环和防止暴饮暴食的作用。除此之外,每天的日常安排中应留出自我放松的时间,也可以进行深呼吸,这些都有助于改善气滞。\n\n气滞型:入睡困难;眼睛充血;肚子容易生赘肉;焦虑,易怒,皮肤油腻,发红;易打嗝,矢气。"
  1776. }, C: {
  1777. index: 2,
  1778. title: "血虚型",
  1779. tips: "(饮食生活无规律~可能也有气虚或气滞的原因)",
  1780. subTitle: "头发散乱,皮肤无光泽",
  1781. desc: "你是否为了减肥极端地限制饮食,或者光在外边吃快餐?如果一直这样,就会使营养失去平衡,引起“血”的不足,陷入血虚状态。\n\n为此,日常饮食重要的是要注意营养的平衡,特别要多食用有造血作用的羊栖菜、动物肝脏、梅干等。“血”增加了,头发散乱、皮肤无光泽这些血虚型的症状自然就消失了。夜间是人体的造血时间,因此不要熬夜。还要控制电脑和手机的使用,也要控制看电视的时间。中医学以为用眼是消耗“血”的。\n\n特征:头发脆弱,脱发;常常眩晕,站起时头晕;脸色不好,皮肤干燥;指甲偏薄,易裂;耳鸣;冷静,认真型。"
  1782. }, D: {
  1783. index: 3,
  1784. title: "淤血型",
  1785. tips: "(血流不畅~更要注意减压,慎食生冷食品)",
  1786. subTitle: "常常感到肩凝、头痛",
  1787. desc: "血流不顺畅,易在体内形成血块(瘀血)。其原因有喜食生冷食品、压力大、过劳、睡眠不足等等。也有因气虚和血虚造成的瘀血。\n\n对这个型的人,首先是必须使其血行畅通,提高代谢。要多食用牛蒡、蒟蒻(魔芋)、黑醋等有化解瘀血作用的食品,也要多食用生姜和韭菜、葱等有香味的蔬菜。饮料也要尽量选择热你,偏冷会影响血循环。\n\n要养成运动的习惯。运动可以促进血行,缓解瘀血引起的肩凝和腰痛。当然,按摩下半身也可以有效地改善脸部的气色。\n\n特征:容易被晒伤;容易长色斑,雀斑;容易出现黑眼圈;常常为肩凝和腰痛烦恼;经血中有动物肝脏样血块;基本上自制力较强,但偶尔也会感情爆发。"
  1788. }, E: {
  1789. index: 4,
  1790. title: "水虚型",
  1791. tips: "(身体如同干枯一般~避免食用香辛食物和剧烈运动)",
  1792. subTitle: "常为头晕眼花、身体发热而烦恼",
  1793. desc: "体内水分不足称为水虚。皮肤、毛发、大便干燥的入水虚的可能性较大。而且,这类人因为给身体起到降温作用的水分不足,所以,常常感到头晕眼花或者身体发热。\n\n作为养生法,就是要通过食物的摄取,有效地补充水分。其中,苹果和香蕉、白菜可以有效地滋润身体,要有意识地多多食用。而且,因为睡眠中容易出汗,水分会在不知不觉中流失,因此,要在枕边预备下温开水,醒来后先饮水。\n\n另一方面,要尽量避免食用香辛食材。因为香辛料有温暖身体的作用,可能会加重头晕眼花和身体发热的症状。水虚的人还要避免剧烈的运动。因为他们的关节水分不足,剧烈运动会引发疼痛。\n\n特征:睡眠浅,盗汗;关节运动不灵活;不明原因的消沉,情绪低落;毛发和皮肤脆弱,口腔和咽喉干燥;便秘,尿量少。"
  1794. }, F: {
  1795. index: 5,
  1796. title: "痰湿型",
  1797. tips: "(体内多余的水分~常常引发各种“不调”,要慎食味重食品)",
  1798. subTitle: "体型胖墩墩的",
  1799. desc: "现代职场女性多为痰湿型。所谓痰湿就是生活不规律、压力大等原因造成身体内形成多余的水分块(痰湿)的状态。因为我们的身体70%是由水构成的,所以痰湿的影响不容忽视,会造成我们的身心状态出现各种各样的“不调”。\n\n首先,有氧运动能够增加肌肉的弹力,促进血行和代谢。肌肉弹力的提高、血行和代谢的改善,就可以通过汗和取把多余的水分排出体外。\n\n第二要注意减少冷饮和味重食品的摄入量,因为它们会造成水分的滞留。\n\n第三要多食用黄瓜和西瓜、梨等有较好利尿作用的食物。也要多食红豆、薏米。\n\n特征:整个身体容易浮肿;容易发胖;早晨起床后脸上有枕头的痕迹;皮肤发白。胖墩墩的;爱生湿乎乎的疙瘩;性格自我,爱慕虚荣。"
  1800. }
  1801. };
  1802. var key = that.findKeyWithMaxValue(data);
  1803. // console.log("睡眠数据最终555=>", ratingResultsMap[key]);
  1804. // console.log("睡眠数据最终555=>", key);
  1805. that.setData({
  1806. tzTitle: ratingResultsMap[key]?.title ?? "健康型",
  1807. tzSubTitle: ratingResultsMap[key]?.subTitle ?? "太棒了,您的身体非常健康,请继续保持",
  1808. isShowTz: true
  1809. })
  1810. }
  1811. }
  1812. } catch (error) {
  1813. console.error(error);
  1814. }
  1815. },
  1816. })
  1817. },
  1818. /**
  1819. * A、B、C、D、E、F 最后积累的数量对比,按数量多少来判断,6个分别对应:气虚型、气滞型、血虚型、淤血型、水虚型、痰湿型
  1820. * 找出对象中值最大的键
  1821. * @param {Object} obj - 包含键值对的对象
  1822. * @returns {string|null} - 值最大的键,如果没有找到则返回null
  1823. */
  1824. findKeyWithMaxValue(obj) {
  1825. if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
  1826. throw new Error('Input must be a plain object');
  1827. }
  1828. let maxKey = null;
  1829. let maxValue = 0;
  1830. for (let key in obj) {
  1831. if (obj.hasOwnProperty(key)) {
  1832. if (obj[key] > maxValue) {
  1833. maxValue = obj[key];
  1834. maxKey = key;
  1835. }
  1836. }
  1837. }
  1838. return maxKey;
  1839. },
  1840. // 可选择的日期
  1841. getDateData: function (sn, isRefresh = true) {
  1842. var that = this;
  1843. var sourceFourthTemp = [];
  1844. wx.request({
  1845. url: `${aipushApi}/getdatefromsn`, //
  1846. method: 'POST',
  1847. // header: {
  1848. // 'content-type': 'application/json', // 默认值
  1849. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1850. // },
  1851. data: {
  1852. "sn": sn, "token": token_push
  1853. },
  1854. success(res) {
  1855. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1856. that.setData({
  1857. isNoReportToday: true
  1858. })
  1859. return;
  1860. }
  1861. that.setData({
  1862. dateData: res.data.results //床的数组
  1863. });
  1864. // {"results": [{ "rdate": "2024-10-08" }]}
  1865. that.getDateTimeData(res.data.results[0].rdate, isRefresh);
  1866. // var resDataSn = res.data.results
  1867. },
  1868. fail: function (error) {
  1869. console.error('error', error);
  1870. that.setData({
  1871. isNoReportToday: true
  1872. })
  1873. },
  1874. complete: function (e) {
  1875. }
  1876. });
  1877. },
  1878. // 可选择的时间 可自动选择 更改 reportId
  1879. getDateTimeData: function (rdate, isRefresh = true) {
  1880. var that = this;
  1881. wx.request({
  1882. url: `${aipushApi}/getimefromsn`, //
  1883. method: 'POST',
  1884. // header: {
  1885. // 'content-type': 'application/json', // 默认值
  1886. // 'Authorization': 'Bearer ' + token // 在头部设置认证信息,例如使用Bearer Token
  1887. // },
  1888. data: {
  1889. "sn": that.data.sn, "date": rdate, "token": token_push
  1890. },
  1891. success(res) {
  1892. // { "results": [{ "rpids": "459857", "durations": "14:17-17:55" }] }
  1893. if (!res || !res.data || !res.data.results || !res.data.results.length) {
  1894. that.setData({
  1895. isNoReportToday: true
  1896. })
  1897. return;
  1898. }
  1899. that.setData({
  1900. dateTimeData: res.data.results, //床的数组
  1901. });
  1902. if (isRefresh) {
  1903. that.setData({
  1904. isNoReportToday: false,
  1905. reportId: res.data.results[0].rpids
  1906. });
  1907. that.getReportData();
  1908. }
  1909. },
  1910. fail: function (error) {
  1911. console.error('error', error);
  1912. that.setData({
  1913. isNoReportToday: true
  1914. })
  1915. }
  1916. });
  1917. },
  1918. // 新版
  1919. getReportData() {
  1920. const that = this;
  1921. wx.request({
  1922. url: `${aipushApi}` + '/getsingle',
  1923. data: {
  1924. "token": token_push,
  1925. "rpids": this.data.reportId,
  1926. "udi": wx.getStorageSync("unionid")
  1927. },
  1928. method: 'POST',
  1929. success(ress) {
  1930. try {
  1931. if (ress && ress.data) {
  1932. if (!ress.data.results || ress.data.results == '') {
  1933. // wx.showModal({
  1934. // title: '提示',
  1935. // content: '无数据',
  1936. // showCancel: false
  1937. // });
  1938. that.setData({
  1939. isNoReportToday: true
  1940. })
  1941. return;
  1942. }
  1943. wx.nextTick(() => {
  1944. setTimeout(() => {
  1945. //初始化数据
  1946. that.initReportData(ress.data.results);
  1947. that.initChartCircle(ress.data.results);
  1948. that.initOutOfBed(ress.data.results);
  1949. that.initBodyMovements(ress.data.results);
  1950. that.initCardiacSystem(ress.data.results);
  1951. that.initChartRespiratory(ress.data.results);
  1952. // that.initChartSnoring(ress.data.results);
  1953. // that.initChartApnea(ress.data.results);
  1954. that.initTimeWaterfall(ress.data.results);
  1955. that.handleSureDownload()
  1956. }, 1000);
  1957. });
  1958. } else {
  1959. // wx.showModal({
  1960. // title: '提示',
  1961. // content: '无数据',
  1962. // showCancel: false
  1963. // });
  1964. that.setData({
  1965. isNoReportToday: true
  1966. })
  1967. }
  1968. } catch (error) {
  1969. console.error(error);
  1970. }
  1971. },
  1972. fail: function (error) {
  1973. // wx.showToast({
  1974. // title: "无数据",
  1975. // icon: "error",
  1976. // mask: true,
  1977. // });
  1978. that.setData({
  1979. isNoReportToday: true
  1980. })
  1981. }
  1982. });
  1983. },
  1984. // 新版
  1985. getToDayReportData() {
  1986. const that = this;
  1987. wx.request({
  1988. url: `${aipushApi}` + '/getunionsingle',
  1989. data: {
  1990. "token": token_today_push,
  1991. "udi": wx.getStorageSync("unionid")
  1992. },
  1993. method: 'POST',
  1994. success(ress) {
  1995. try {
  1996. if (ress && ress.data) {
  1997. // console.log('ress.data-getunionsingle=' + JSON.stringify(ress.data));
  1998. if (ress.data == {} || ress.data.data == {} || ress.data.data == [] || !ress.data.data) {
  1999. // wx.showModal({
  2000. // title: '提示',
  2001. // content: '无数据',
  2002. // showCancel: false
  2003. // });
  2004. that.setData({
  2005. isNoReportToday: true
  2006. })
  2007. return;
  2008. }
  2009. //初始化数据
  2010. wx.nextTick(() => {
  2011. setTimeout(() => {
  2012. that.initReportData(ress.data.data);
  2013. that.initChartCircle(ress.data.data);
  2014. that.initOutOfBed(ress.data.data);
  2015. that.initBodyMovements(ress.data.data);
  2016. that.initCardiacSystem(ress.data.data);
  2017. that.initChartRespiratory(ress.data.data);
  2018. // that.initChartSnoring(ress.data.data);
  2019. // that.initChartApnea(ress.data.data);
  2020. that.initTimeWaterfall(ress.data.data);
  2021. that.handleSureDownload()
  2022. }, 1000);
  2023. });
  2024. that.getSnData();//需要筛选的 要获取sn
  2025. that.getAllUnionidList();
  2026. } else {
  2027. // wx.showModal({
  2028. // title: '提示',
  2029. // content: '无数据',
  2030. // showCancel: false
  2031. // });
  2032. that.setData({
  2033. isNoReportToday: true
  2034. })
  2035. }
  2036. } catch (error) {
  2037. console.error(error);
  2038. }
  2039. },
  2040. fail: function (error) {
  2041. // wx.showToast({
  2042. // title: "无数据",
  2043. // icon: "error",
  2044. // mask: true,
  2045. // });
  2046. that.setData({
  2047. isNoReportToday: true
  2048. })
  2049. }
  2050. });
  2051. },
  2052. // 初始化的数据
  2053. initReportData(ress) {
  2054. const that = this;
  2055. let durationDataTemp = [];
  2056. let obj = {};
  2057. obj.name = '深睡';
  2058. obj.value = ress.rdeep_duration;
  2059. durationDataTemp.push(obj);
  2060. obj = {};
  2061. obj.name = '浅睡';
  2062. obj.value = ress.rin_duration;
  2063. durationDataTemp.push(obj);
  2064. obj = {};
  2065. obj.name = '中睡';//REM
  2066. obj.value = ress.rlight_duration;
  2067. durationDataTemp.push(obj);
  2068. obj = {};
  2069. obj.name = '清醒';
  2070. obj.value = ress.rawake_duration;
  2071. durationDataTemp.push(obj);
  2072. let sleep_durationCount = 0;
  2073. if (ress.rdeep_duration) {
  2074. sleep_durationCount += parseFloat(ress.rdeep_duration)
  2075. }
  2076. if (ress.rlight_duration) {
  2077. sleep_durationCount += parseFloat(ress.rlight_duration)
  2078. }
  2079. if (ress.rin_duration) {
  2080. sleep_durationCount += parseFloat(ress.rin_duration)
  2081. }
  2082. let sleep_efficiency_temp = ress.rtotal_duration ? (Math.ceil((sleep_durationCount / ress.rtotal_duration) * 100) + '%') : '%'
  2083. let rdeep_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rdeep_duration ? parseFloat(ress.rdeep_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  2084. let rlight_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rlight_duration ? parseFloat(ress.rlight_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  2085. let rin_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rin_duration ? parseFloat(ress.rin_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  2086. let rawake_duration_efficiency_temp = ress.rtotal_duration ? (Math.ceil(((ress.rawake_duration ? parseFloat(ress.rawake_duration) : 0) / ress.rtotal_duration) * 100) + '%') : '%'
  2087. // let rdeep_duration_efficiency_temp = ress.darktrate;
  2088. // let rlight_duration_efficiency_temp = ress.lightrate;
  2089. // let rin_duration_efficiency_temp = ress.midrate;
  2090. // let rawake_duration_efficiency_temp = ress.awakenrate;
  2091. let sleep_durationTemp = [];
  2092. let obj1 = {};
  2093. obj1.name = '睡眠时间';
  2094. obj1.value = Math.ceil(sleep_durationCount / 60);
  2095. sleep_durationTemp.push(obj1);
  2096. obj1 = {};
  2097. obj1.name = '清醒时间';
  2098. obj1.value = Math.ceil(parseFloat(ress.rawake_duration) / 60);
  2099. sleep_durationTemp.push(obj1);
  2100. let zdPointTemp = [];
  2101. let rdt_arrTemp = [];
  2102. let rrh_arrTemp = [];
  2103. let rhx_arrTemp = [];
  2104. let rmove_arrTemp = [];
  2105. let rsleep_arrTemp = [];
  2106. let rsleep_arr_all_Temp = [];
  2107. if (ress.rrh_arr) {
  2108. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  2109. }
  2110. if (ress.rrh_arr) {
  2111. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  2112. }
  2113. if (ress.rhx_arr) {
  2114. rhx_arrTemp = that.splitN(ress.rhx_arr.split(","), 100);
  2115. }
  2116. if (ress.rmove_arr) {
  2117. rmove_arrTemp = that.splitN(ress.rmove_arr.split(","), 100);
  2118. }
  2119. if (ress.rsleep_arr) {
  2120. rsleep_arrTemp = that.splitN(ress.rsleep_arr.split(","), 100);
  2121. }
  2122. if (ress.rsleep_arr) {
  2123. rsleep_arr_all_Temp = ress.rsleep_arr.split(",");
  2124. }
  2125. that.setData({
  2126. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  2127. rrh_arr: ress.rrh_arr ? ress.rrh_arr.split(',') : [],
  2128. rhx_arr: ress.rhx_arr ? ress.rhx_arr.split(',') : [],
  2129. rsnoring_arr: ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [],
  2130. routbed_arr: ress.routbed_arr ? ress.routbed_arr.split(',') : [],
  2131. rmove_arr: ress.rmove_arr ? ress.rmove_arr.split(',') : [],
  2132. rhxstop_arr: ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [],
  2133. rsleep_arr: ress.rsleep_arr ? ress.rsleep_arr.split(',') : [],//睡眠状态数据集合,0-清醒,10-浅睡,20-中睡,30-深睡
  2134. rsnoring_arrFrequency: that.getFrequency(ress.rsnoring_arr ? ress.rsnoring_arr.split(',') : [], 1),
  2135. routbed_arrFrequency: that.getFrequency(ress.routbed_arr ? ress.routbed_arr.split(',') : [], 0),
  2136. rmove_arrFrequency: that.getFrequency(ress.rmove_arr ? ress.rmove_arr.split(',') : [], 1),
  2137. rhxstop_arrFrequency: that.getFrequency(ress.rhxstop_arr ? ress.rhxstop_arr.split(',') : [], 1),
  2138. rdeep_durationFormatA: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  2139. rlight_duration: ress.rlight_duration,
  2140. rin_duration: ress.rin_duration,
  2141. rawake_duration: ress.rawake_duration,
  2142. ravg_hx_value: ress.ravg_hx_value===null?"--":ress.ravg_hx_value,
  2143. ravg_hx_desc: ress.ravg_hx_desc===null?"--":ress.ravg_hx_desc,
  2144. ravg_rh_value: ress.ravg_rh_value===null?"--":ress.ravg_rh_value,
  2145. ravg_rh_desc: ress.ravg_rh_desc===null?"--":ress.ravg_rh_desc,
  2146. rscore_value: ress.rscore_value===null?"--":ress.rscore_value,
  2147. rscore_desc: ress.rscore_desc===null?"--":ress.rscore_desc,
  2148. rsn: ress.rsn,
  2149. rdate: ress.rdate,
  2150. total_duration: ress.rtotal_duration,
  2151. rtotal_duration: that.convertTimeToHoursAndMinutes(ress.rtotal_duration),//睡眠总时长,单位小时分钟
  2152. rinbed_duration: that.convertTimeToHoursAndMinutes(ress.rinbed_duration),//在床时长,单位小时分钟
  2153. rgobed_time: ress.rgobed_time,//上床时间
  2154. routbed_time: ress.routbed_time,//离床时间
  2155. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2156. sleepHourSub: that.getTimeDiffInHours(ress.rgobed_time, ress.routbed_time),
  2157. zdPointT: zdPointTemp,
  2158. rdt_arrNew: rdt_arrTemp,
  2159. rrh_arrNew: rrh_arrTemp,
  2160. rhx_arrNew: rhx_arrTemp,
  2161. rmove_arrNew: rmove_arrTemp,
  2162. rsleep_arrNew: rsleep_arrTemp,
  2163. rsleep_arr_all_New: rsleep_arr_all_Temp,
  2164. durationData: durationDataTemp,
  2165. sleep_duration: sleep_durationTemp,
  2166. sleep_efficiency: sleep_efficiency_temp,
  2167. sleep_durationCountA: that.convertTimeToHoursAndMinutes(sleep_durationCount ? sleep_durationCount.toString() : '0'),
  2168. tvEntityIds: wx.getStorageSync('tvEntityIds'),
  2169. ifOneMoreTV: (wx.getStorageSync('tvEntityIds') && wx.getStorageSync('tvEntityIds').length > 1),
  2170. rdeep_duration_efficiency: rdeep_duration_efficiency_temp,
  2171. rlight_duration_efficiency: rlight_duration_efficiency_temp,
  2172. rin_duration_efficiency: rin_duration_efficiency_temp,
  2173. rawake_duration_efficiency: rawake_duration_efficiency_temp,
  2174. pushReportId: ress.rdid,
  2175. isNoReportToday: false,
  2176. rrs_duration: that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0')===null?"--":that.convertTimeToHoursAndMinutes(ress.rrs_duration ? ress.rrs_duration.toString() : '0'),
  2177. routbed_count_value: ress.routbed_count_value===null?"--":ress.routbed_count_value ,
  2178. rsleep_eff_value: ress.rsleep_eff_value===null?"--":ress.rsleep_eff_value ,
  2179. hotelname: ress.hotelname,
  2180. roomname: ress.roomname,
  2181. bedname: ress.bedname,
  2182. });
  2183. },
  2184. // 香睡指数
  2185. initChartCircle(ress) {
  2186. var that = this;
  2187. try {
  2188. let rscore_descTemp = [];
  2189. if (ress.rscore_desc) {
  2190. rscore_descTemp = ress.rscore_desc;
  2191. }
  2192. let rscore_valueTemp = [];
  2193. if (ress.rscore_value) {
  2194. rscore_valueTemp = ress.rscore_value;
  2195. }
  2196. that.setData({
  2197. rscore_desc: rscore_descTemp,
  2198. rscore_value: rscore_valueTemp,
  2199. });
  2200. updateChartCircularProgressBarOption(rscore_descTemp, rscore_valueTemp, that);
  2201. } catch (error) {
  2202. console.error(error);
  2203. }
  2204. },
  2205. // 心脏 系统
  2206. initCardiacSystem(ress) {
  2207. var that = this;
  2208. try {
  2209. let rdt_arrTemp = [];
  2210. if (ress.rrh_arr) {
  2211. rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  2212. }
  2213. if (ress.rdate) {
  2214. that.setData({
  2215. reportDate: ress.rdate
  2216. });
  2217. }
  2218. let rrh_arrTemp = [];
  2219. if (ress.rrh_arr) {
  2220. rrh_arrTemp = that.splitN(ress.rrh_arr.split(","), 100);
  2221. }
  2222. that.setData({
  2223. rdt_arrNew: rdt_arrTemp,
  2224. rrh_arrNew: rrh_arrTemp,
  2225. });
  2226. // console.log("that.data.rdt_arrNew,that.data.rrh_arrNew=" + that.data.rdt_arrNew + "," + that.data.rrh_arrNew);
  2227. updateCardiacSystem(that.data.rdt_arrNew, that.data.rrh_arrNew, that);
  2228. } catch (error) {
  2229. console.error(error);
  2230. }
  2231. },
  2232. initTimeWaterfall(ress) {//深浅睡眠
  2233. var that = this;
  2234. try {
  2235. let rdt_arrTemp = [];
  2236. if (ress.rrh_arr) {
  2237. // rdt_arrTemp = that.splitN(ress.rdt_arr.split(","), 100);
  2238. rdt_arrTemp = ress.rdt_arr.split(",");
  2239. }
  2240. // console.log('深浅睡眠11111=======' + JSON.stringify(rdt_arrTemp));
  2241. let rsleep_arr_Temp = [];
  2242. if (ress.rsleep_arr) {
  2243. // rsleep_arr_Temp = that.splitN(ress.rsleep_arr.split(","), 100);
  2244. rsleep_arr_Temp = ress.rsleep_arr.split(",");
  2245. }
  2246. // console.log('深浅睡眠222222=======' + JSON.stringify(rsleep_arr_Temp));
  2247. that.setData({
  2248. rdt_arrNew: rdt_arrTemp,
  2249. rsleep_arr: rsleep_arr_Temp,
  2250. rdeep_duration: ress.rdeep_duration,
  2251. rlight_duration: ress.rlight_duration,
  2252. rin_duration: ress.rin_duration,
  2253. rawake_duration: ress.rawake_duration,
  2254. rdeep_durationFormat: that.convertTimeToHoursAndMinutes(ress.rdeep_duration),
  2255. rlight_durationFormat: that.convertTimeToHoursAndMinutes(ress.rlight_duration),
  2256. rin_durationFormat: that.convertTimeToHoursAndMinutes(ress.rin_duration),
  2257. rawake_durationFormat: that.convertTimeToHoursAndMinutes(ress.rawake_duration),
  2258. });
  2259. that.calculateTheDurationOfDeepSleep();
  2260. } catch (error) {
  2261. console.error(error);
  2262. }
  2263. // console.log("that.data.rsleep_arr=" + that.data.rsleep_arr);
  2264. },
  2265. initOutOfBed(ress) {//离床次数
  2266. var that = this;
  2267. try {
  2268. var routbed_arr_Temp = [];
  2269. if (ress.routbed_arr) {
  2270. routbed_arr_Temp = ress.routbed_arr.split(",");
  2271. }
  2272. that.setData({
  2273. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  2274. routbed_arr: routbed_arr_Temp,
  2275. rgobed_time: ress.rgobed_time,
  2276. routbed_time: ress.routbed_time,
  2277. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2278. });
  2279. updateOutOfBed(that.data.rdt_arr, that.data.routbed_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2280. } catch (error) {
  2281. console.error(error);
  2282. }
  2283. // console.log("that.data.routbed_arr=" + that.data.routbed_arr);
  2284. },
  2285. initBodyMovements(ress) {//体动次数
  2286. var that = this;
  2287. try {
  2288. var rmove_arr_Temp = [];
  2289. if (ress.rmove_arr) {
  2290. rmove_arr_Temp = ress.rmove_arr.split(",");
  2291. }
  2292. that.setData({
  2293. // rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2294. // rmove_arr: that.splitN(rmove_arr_Temp, 100),
  2295. rdt_arr: ress.rdt_arr ? ress.rdt_arr.split(',') : [],
  2296. rmove_arr: rmove_arr_Temp,
  2297. rgobed_time: ress.rgobed_time,
  2298. routbed_time: ress.routbed_time,
  2299. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2300. });
  2301. updateBodyMovements(that.data.rdt_arr, that.data.rmove_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2302. } catch (error) {
  2303. console.error(error);
  2304. }
  2305. // console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2306. },
  2307. initChartRespiratory(ress) {//平均呼吸率
  2308. var that = this;
  2309. try {
  2310. var rhx_arr_Temp = [];
  2311. if (ress.rhx_arr) {
  2312. rhx_arr_Temp = ress.rhx_arr.split(",");
  2313. }
  2314. that.setData({
  2315. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2316. rhx_arr: that.splitN(rhx_arr_Temp, 100),
  2317. rgobed_time: ress.rgobed_time,
  2318. routbed_time: ress.routbed_time,
  2319. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2320. });
  2321. updateRespiratory(that.data.rdt_arr, that.data.rhx_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2322. } catch (error) {
  2323. console.error(error);
  2324. }
  2325. // console.log("c81_that.data.ravg_hx_value=" + that.data.ravg_hx_value);
  2326. },
  2327. initChartSnoring(ress) {//打鼾
  2328. var that = this;
  2329. try {
  2330. var rsnoring_arr_Temp = [];
  2331. if (ress.rsnoring_arr) {
  2332. rsnoring_arr_Temp = ress.rsnoring_arr.split(",");
  2333. }
  2334. that.setData({
  2335. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2336. rsnoring_arr: that.splitN(rsnoring_arr_Temp, 100),
  2337. rgobed_time: ress.rgobed_time,
  2338. routbed_time: ress.routbed_time,
  2339. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2340. });
  2341. updateSnoring(that.data.rdt_arr, that.data.rsnoring_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2342. } catch (error) {
  2343. console.error(error);
  2344. }
  2345. // console.log("c8_that.data.rmove_arr=" + that.data.rmove_arr);
  2346. },
  2347. initChartApnea(ress) {//呼吸暂停
  2348. var that = this;
  2349. try {
  2350. var rhxstop_arr_Temp = [];
  2351. if (ress.rhxstop_arr) {
  2352. rhxstop_arr_Temp = ress.rhxstop_arr.split(",");
  2353. }
  2354. that.setData({
  2355. rdt_arr: that.splitN(ress.rdt_arr ? ress.rdt_arr.split(',') : [], 100),
  2356. rhxstop_arr: that.splitN(rhxstop_arr_Temp, 100),
  2357. rgobed_time: ress.rgobed_time,
  2358. routbed_time: ress.routbed_time,
  2359. rgobed_routbed: ress.rgobed_time + '~' + ress.routbed_time,
  2360. });
  2361. updateApnea(that.data.rdt_arr, that.data.rhxstop_arr, that.data.rgobed_time, that.data.routbed_time, that)
  2362. } catch (error) {
  2363. console.error(error);
  2364. }
  2365. // console.log("c8_that.data.rhxstop_arr=" + that.data.rhxstop_arr);
  2366. },
  2367. mounted() {
  2368. },
  2369. /**
  2370. * 生命周期函数--监听页面隐藏
  2371. */
  2372. onHide: function () {
  2373. },
  2374. /**
  2375. * 生命周期函数--监听页面卸载
  2376. */
  2377. onUnload: function () {
  2378. },
  2379. /**
  2380. * 页面相关事件处理函数--监听用户下拉动作
  2381. */
  2382. onPullDownRefresh: function () {
  2383. },
  2384. /**
  2385. * 页面上拉触底事件的处理函数
  2386. */
  2387. onReachBottom: function () {
  2388. },
  2389. /**
  2390. * 用户点击右上角分享
  2391. */
  2392. onShareAppMessage: function () {
  2393. }
  2394. })