data.js 70 KB

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