sleepQualityIndexAssessment.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. // miniprogram/pages/testSAS/testSAS.js
  2. // const db = wx.cloud.database()
  3. const baseUrl = "https://fare.somnisix.top/";
  4. const authorization = "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk5YzI3MjI2LTdkOWQtNDhiOC1hYjlhLWM4YjVjYWZiZGNkNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.zITQOINFkHs19_1RAgHS4I9YMaVxVq0Dsn3t6r_K7rv3rXvJy0sMtodejIMi_PNa_m4uQYxnU-6k3wC2LZht_Q";
  5. const api = "system/questionInvest";
  6. const qnaire = require("./data.js")
  7. var ans = new Array(24)
  8. var ansJson = []
  9. Page({
  10. data: {
  11. qnaire: [],
  12. activeIcon: "/subpages/icons/ic_selected_radio.svg",
  13. normalIcon: "/subpages/icons/ic_radio.svg",
  14. activeColor: "color:#0BC3AA;",
  15. normalColor: "color:#666666;",
  16. showDateDialog: false,
  17. currentDate: "",
  18. currentDateItem: null,
  19. answerJson: [],
  20. columns: [[], []],
  21. BMI: null,
  22. mInputScrollId:null,
  23. weight: 0,
  24. height: 0,
  25. promptTextMessageFlag: false,//结果弹窗
  26. isPrivacyAgreed: false, // 隐私条款是否勾选
  27. privacyDetailShow: false,// 隐私条款弹出页是否显示
  28. changeValue: '',//
  29. comScore: 0,
  30. comScoreStatus: '',
  31. comScoreIndex: 0,
  32. comScoreDesc: "如果你在这一级别内,那么你的睡眠质量可就亮起红灯了。你必须警惕,因为你的睡眠质量确实比较糟糕,健康状况明显受损。饮食起居会受到一定影响,甚至部分工作你都开始感觉吃力。",
  33. ratingResultsList: [{
  34. title: "非常好",
  35. icon: "/subpages/icons/ic_triangle_down_1.svg",
  36. color: "#70B3FE"
  37. }, {
  38. title: "良好",
  39. icon: "/subpages/icons/ic_triangle_down_2.svg",
  40. color: "#68D89E"
  41. }, {
  42. title: "一般",
  43. icon: "/subpages/icons/ic_triangle_down_3.svg",
  44. color: "#FFA95A"
  45. }, {
  46. title: "差",
  47. icon: "/subpages/icons/ic_triangle_down_4.svg",
  48. color: "#FC726E"
  49. }],
  50. formatter(type, value) {
  51. if (type === 'hour') {
  52. return `${value}时`;
  53. }
  54. if (type === 'minute') {
  55. return `${value}分`;
  56. }
  57. return value;
  58. },
  59. },
  60. onOpenDateDialog(event) {
  61. const item = event.currentTarget.dataset.item;
  62. const value = item.value || "";
  63. this.setData({ currentDateItem: item, currentDate: value, showDateDialog: true });
  64. },
  65. onCloseDateDialog() {
  66. this.setData({ showDateDialog: false, currentDateItem: null });
  67. },
  68. onCloseResultsDialog() {
  69. this.setData({ promptTextMessageFlag: false });
  70. },
  71. onDateInput(event) {
  72. const item = this.data.currentDateItem;
  73. if (!item) {
  74. return
  75. }
  76. let oldJsonList = this.data.qnaire;
  77. for (let i = 0; i < oldJsonList.length; i++) {
  78. const element = oldJsonList[i];
  79. if (element.num == item.num) {
  80. element['value'] = event.detail;
  81. break;
  82. }
  83. }
  84. this.setData({
  85. qnaire: oldJsonList
  86. });
  87. this.onCloseDateDialog()
  88. },
  89. onChangeInput(event) {
  90. const item = event.currentTarget.dataset.item
  91. // console.log(item);
  92. let oldJsonList = this.data.qnaire;
  93. for (let i = 0; i < oldJsonList.length; i++) {
  94. const element = oldJsonList[i];
  95. if (element.num == item.num) {
  96. element['questionValue'] = event.detail.value;
  97. break;
  98. }
  99. }
  100. this.setData({
  101. qnaire: oldJsonList
  102. });
  103. },
  104. onChangeFocus(event) {
  105. const item = event.currentTarget.dataset.item
  106. const that = this;
  107. setTimeout(() => {
  108. that.setData({
  109. mInputScrollId: "item" + item.num
  110. });
  111. }, 200);
  112. },
  113. onChangePrivacy(event) {
  114. const check = event.detail;
  115. this.setData({
  116. checkedPrivacy: check
  117. });
  118. },
  119. onChangeRadio(event) {
  120. const item = event.currentTarget.dataset.item
  121. // console.log(item);
  122. let oldJsonList = this.data.qnaire;
  123. for (let i = 0; i < oldJsonList.length; i++) {
  124. const element = oldJsonList[i];
  125. if (element.num == item.num) {
  126. element['value'] = event.detail;
  127. break;
  128. }
  129. }
  130. this.setData({
  131. qnaire: oldJsonList
  132. });
  133. },
  134. handleTouchMove: function () {
  135. return false; // 阻止手动滑动
  136. },
  137. hideModal: function () {
  138. this.setData({
  139. privacyDetailShow: false
  140. });
  141. },
  142. showPrivacyDetail: function () {
  143. this.setData({
  144. privacyDetailShow: true
  145. });
  146. // 这里可以添加代码来显示隐私条款弹出页,比如使用 wx.showModal 或自定义组件
  147. },
  148. hidePrivacyPolicy() {
  149. this.setData({
  150. privacyDetailShow: false
  151. });
  152. },
  153. handleInputChange: function (e) {
  154. this.setData({
  155. height: e.detail.value
  156. });
  157. if (this.data.id == 1) {
  158. this.setData({
  159. weight: e.detail.value
  160. });
  161. }
  162. if (this.data.id == 3) {
  163. this.setData({
  164. weight: e.detail.value
  165. });
  166. if (this.data.weight >= 0 || this.data.height >= 0) {
  167. var bmi = this.data.weight / (this.data.height * this.data.height);
  168. this.setData({
  169. BMI: bmi
  170. });
  171. }
  172. }
  173. },
  174. radioChange: function (e) {
  175. console.log(e.detail.value)
  176. this.setData({
  177. changeValue: e.detail.value
  178. });
  179. },
  180. calculateTotalHours: function (hoursInput, minutesInput) {
  181. // 获取小时和分钟的值,如果为空或不是数字,则设置为0
  182. let hours = parseFloat(hoursInput.value) || 0;
  183. let minutes = parseFloat(minutesInput.value) || 0;
  184. // 将分钟转换为小时的小数部分
  185. // let minutesInHours = minutes / 60;
  186. // 计算总时间(小时)
  187. // let totalHours = hours + minutesInHours;
  188. // 显示结果
  189. // document.getElementById('result').textContent = `总时间: ${totalHours.toFixed(2)} 小时`;
  190. // return totalHours.toFixed(2);
  191. return hours * 60 + minutes;
  192. },
  193. formSubmit: function () {
  194. if (!this.data.checkedPrivacy) {
  195. wx.showToast({
  196. icon: "none",
  197. title: "请先阅读并同意《舒眠调查问卷隐私条款》"
  198. })
  199. return;
  200. }
  201. var finish = true;
  202. var _this = this;
  203. let oldJsonList = _this.data.qnaire;
  204. var mInputScrollId = null;
  205. for (let i = 0; i < oldJsonList.length; i++) {
  206. const element = oldJsonList[i];
  207. if (!element.value) {
  208. finish = false;
  209. console.log("未完成的:", element.num);
  210. mInputScrollId = "item" + element.num;
  211. wx.showModal({
  212. title: '无法提交',
  213. content: '您还有部分题目未完成,请检查后重新提交',
  214. showCancel: false,
  215. confirmColor: '#0BC3AA',
  216. confirmText: "好的",
  217. success(res) {
  218. _this.setData({
  219. mInputScrollId: mInputScrollId
  220. })
  221. }
  222. })
  223. return;
  224. } else {
  225. // if (element.type == "radio&input" && !element.questionValue) {
  226. // finish = false;
  227. // }
  228. }
  229. }
  230. if (finish == false) {
  231. wx.showModal({
  232. title: '无法提交',
  233. content: '您还有部分题目未完成,请检查后重新提交',
  234. showCancel: false,
  235. confirmColor: '#0BC3AA',
  236. confirmText: "好的",
  237. success(res) {
  238. _this.setData({
  239. mInputScrollId: mInputScrollId
  240. })
  241. }
  242. })
  243. } else {
  244. wx.showLoading({
  245. title: '加载中',
  246. })
  247. setTimeout(function () {
  248. wx.hideLoading({
  249. success(res) {
  250. _this.answer2db(oldJsonList);
  251. }
  252. })
  253. }, 2000)
  254. }
  255. },
  256. answer2db: function (answerJson) {
  257. // db.collection('SAS').add({
  258. // data: {
  259. // answer: this.data.answer
  260. // },
  261. // success (res) {
  262. // console.log(res._id);
  263. // },
  264. // fail (res) {
  265. // wx.showToast({
  266. // icon: 'none',
  267. // title: '新增记录失败'
  268. // })
  269. // console.error('[数据库] [新增记录] 失败:', err)
  270. // }
  271. // })
  272. console.log('answerJson=' + JSON.stringify(answerJson))
  273. let totalAllTemp = 0;
  274. let value1 = answerJson[0].value;
  275. let value2 = answerJson[1].value;
  276. let value3 = answerJson[2].value;
  277. let value4 = answerJson[3].value;
  278. let value5a = answerJson[4].value;
  279. let value5b = answerJson[5].value;
  280. let value5c = answerJson[6].value;
  281. let value5d = answerJson[7].value;
  282. let value5e = answerJson[8].value;
  283. let value5f = answerJson[9].value;
  284. let value5g = answerJson[10].value;
  285. let value5h = answerJson[11].value;
  286. let value5i = answerJson[12].value;
  287. let value5j = answerJson[13].value;
  288. let value6 = answerJson[14].value;
  289. let value7 = answerJson[15].value;
  290. let value8 = answerJson[16].value;
  291. let value9 = answerJson[17].value;
  292. let value10 = answerJson[18].value;
  293. let value11 = answerJson[19].value;
  294. let value12 = answerJson[20].value;
  295. let value13 = answerJson[21].value;
  296. let value14 = answerJson[22].value;
  297. let value15 = answerJson[23].value;
  298. //计算规则 https://mp.weixin.qq.com/s/QyTzuPoNErMjc2KcA1M61g
  299. let comA = 0;//条目6
  300. let comB = 0;
  301. let comB1 = 0;
  302. let comC = 0;
  303. let comD = 0;
  304. let comE = 0;
  305. let comF = 0;
  306. let comG = 0;
  307. comA = this.resultABCD(value6);
  308. comB1 = this.resultABCD(value2) + this.resultABCD(value5a);
  309. console.log("comB1=" + comB1);
  310. if (comB1 == 0) {
  311. comB = 0;
  312. } else if (comB1 >= 1 && comB1 <= 2) {
  313. comB = 1;
  314. } else if (comB1 >= 3 && comB1 <= 4) {
  315. comB = 2;
  316. } else if (comB1 >= 5 && comB1 <= 6) {
  317. comB = 3;
  318. }
  319. let value41 = parseInt((value4.split(':')[0]), 10) || 0;
  320. let value42 = parseInt((value4.split(':')[1]), 10) || 0;
  321. let value43 = value41 * 60 + value42
  322. console.log("value43=" + value43);
  323. if (value43 > 420) {
  324. comC = 0;
  325. } else if (value43 >= 360 && value43 <= 420) {
  326. comC = 1;
  327. } else if (value43 >= 300 && value43 < 360) {
  328. comC = 2;
  329. } else if (value43 < 300) {
  330. comC = 3;
  331. }
  332. let datediff = this.calculateTimeDifference(value1, value3);
  333. console.log("datediff=" + datediff);
  334. let sleepRate = datediff ? ((value43 / datediff) * 100) : 0;
  335. console.log("sleepRate=" + sleepRate);
  336. if (sleepRate >= 85) {
  337. comD = 0;
  338. } else if (sleepRate >= 75 && sleepRate <= 84) {
  339. comD = 1;
  340. } else if (sleepRate >= 65 && sleepRate < 74) {
  341. comD = 2;
  342. } else if (sleepRate < 65) {
  343. comD = 3;
  344. }
  345. let value5All = this.resultABCD(value5b)
  346. + this.resultABCD(value5c)
  347. + this.resultABCD(value5d)
  348. + this.resultABCD(value5e)
  349. + this.resultABCD(value5f)
  350. + this.resultABCD(value5g)
  351. + this.resultABCD(value5h)
  352. + this.resultABCD(value5i)
  353. + this.resultABCD(value5j);
  354. console.log("value5All=" + value5All);
  355. if (value5All == 0) {
  356. comE = 0;
  357. } else if (value5All >= 1 && value5All <= 9) {
  358. comE = 1;
  359. } else if (value5All >= 10 && value5All <= 18) {
  360. comE = 2;
  361. } else if (value5All >= 19 && value5All <= 27) {
  362. comE = 3;
  363. }
  364. comF = this.resultABCD(value7);
  365. console.log("comF=" + comF);
  366. let valueGAll = this.resultABCD(value8) + this.resultABCD(value9);
  367. console.log("valueGAll=" + valueGAll);
  368. if (valueGAll == 0) {
  369. comG = 0;
  370. } else if (valueGAll >= 1 && valueGAll <= 2) {
  371. comG = 1;
  372. } else if (valueGAll >= 3 && valueGAll <= 4) {
  373. comG = 2;
  374. } else if (valueGAll >= 5 && valueGAll <= 6) {
  375. comG = 3;
  376. }
  377. console.log('comA=' + comA);
  378. console.log('comB=' + comB);
  379. console.log('comC=' + comC);
  380. console.log('comD=' + comD);
  381. console.log('comE=' + comE);
  382. console.log('comF=' + comF);
  383. console.log('comG=' + comG);
  384. let comAll = comA + comB + comC + comD + comE + comF + comG;
  385. let comScoreIndex = 0;
  386. let _comScoreStatus = "";
  387. let _comScoreDesc = "";
  388. if (comAll >= 0 && comAll <= 5) {
  389. _comScoreStatus = "非常好";
  390. } else if (comAll >= 6 && comAll <= 10) {
  391. _comScoreStatus = "良好";
  392. comScoreIndex = 1;
  393. } else if (comAll >= 11 && comAll <= 15) {
  394. _comScoreStatus = "一般";
  395. comScoreIndex = 2;
  396. } else {
  397. // if (comAll >= 16 && comAll <= 21)
  398. _comScoreStatus = "差";
  399. comScoreIndex = 3;
  400. }
  401. if (this.judgmentScoreRange(comAll,0,5)) {
  402. _comScoreDesc = "你目前的睡眠质量非常高,而且健康状况良好,这一切应该继续保持下去。"
  403. } else if (this.judgmentScoreRange(comAll, 6, 10)) {
  404. _comScoreDesc = "你的睡眠质量平平,健康状况也受到影响, 如果再不引起你对睡眠质量的足够重视, 那么你的睡眠质量很可能会迅速下降,向下一级别发展。"
  405. } else if (this.judgmentScoreRange(comAll, 11, 15)) {
  406. _comScoreDesc = "如果你在这一级别内,那么你的睡眠质量可 就亮起红灯了。你必须警惕,因为你的睡眠质量确实比较糟糕,健康状况明显受损。饮食起居会受到一定影响,甚至部分工作你都开始感觉吃力。"
  407. } else {
  408. _comScoreDesc = "天啊!你的睡眠质量已经到了令人发指的地 步—长期睡眠不足导致了你的健康状况严重恶化,这就是你工作力不从心,情绪起伏不定的原因。"
  409. }
  410. console.log('comAll=' + comAll + ',comScoreStatus=' + _comScoreStatus);
  411. this.setData({
  412. comScore: comAll,
  413. comScoreStatus: _comScoreStatus,
  414. comScoreIndex,
  415. comScoreDesc: _comScoreDesc,
  416. promptTextMessageFlag: true,
  417. })
  418. },
  419. judgmentScoreRange(scoreValue, startScore, endScore) {
  420. return scoreValue >= startScore && scoreValue <= endScore;
  421. },
  422. resultABCD: function (a) {
  423. if (a == 'a') {
  424. return 0;
  425. } else if (a == 'b') {
  426. return 1;
  427. } else if (a == 'c') {
  428. return 2;
  429. } else if (a == 'd') {
  430. return 3;
  431. }
  432. },
  433. sleepState: function (a, b) {
  434. console.log('a=' + a + ',b=' + b);
  435. if (a == 'A') {
  436. if (b >= 1 && b <= 9) {
  437. return '不足';
  438. } else if (b >= 10 && b <= 12) {
  439. return '适中';
  440. } else if (b >= 13) {
  441. return '过长';
  442. } else {
  443. return '未知';
  444. }
  445. } else if (a == 'B') {
  446. if (b >= 1 && b <= 9) {
  447. return '不足';
  448. } else if (b >= 10 && b <= 12) {
  449. return '适中';
  450. } else if (b >= 13) {
  451. return '过长';
  452. } else {
  453. return '未知';
  454. }
  455. } else if (a == 'C') {
  456. if (b >= 1 && b <= 9) {
  457. return '不足';
  458. } else if (b >= 10 && b <= 12) {
  459. return '适中';
  460. } else if (b >= 13) {
  461. return '过长';
  462. } else {
  463. return '未知';
  464. }
  465. } else if (a == 'D') {
  466. if (b >= 1 && b <= 9) {
  467. return '不足';
  468. } else if (b >= 10 && b <= 12) {
  469. return '适中';
  470. } else if (b >= 13) {
  471. return '过长';
  472. } else {
  473. return '未知';
  474. }
  475. } else {
  476. return '未知';
  477. }
  478. },
  479. // 将时间字符串转换为分钟数
  480. timeStringToMinutes: function (timeStr) {
  481. var parts = timeStr.split(":");
  482. return parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10);
  483. },
  484. // 将分钟数转换回时间字符串格式 HH:mm
  485. minutesToTimeString: function (minutes) {
  486. var hours = Math.floor(minutes / 60);
  487. var mins = minutes % 60;
  488. var minsStr = mins < 10 ? "0" + mins : mins.toString();
  489. return hours.toString() + ":" + minsStr;
  490. },
  491. // 计算时间差(分钟)
  492. calculateTimeDifference: function (sleepTimeStr, wakeUpTimeStr) {
  493. // 将时间字符串转换为分钟
  494. var sleepTimeMinutes = this.timeStringToMinutes(sleepTimeStr);
  495. var wakeUpTimeMinutes = this.timeStringToMinutes("24:00") + this.timeStringToMinutes(wakeUpTimeStr); // 加上第二天的0点到起床时间的分钟数
  496. // 计算时间差
  497. var diffInMinutes = wakeUpTimeMinutes - sleepTimeMinutes;
  498. // 将分钟数转换回时间字符串格式 HH:mm
  499. var diffInHours = Math.floor(diffInMinutes / 60);
  500. var diffInMins = diffInMinutes % 60;
  501. // 返回时间差字符串
  502. console.log("diffInMinutes==" + diffInMinutes)
  503. return diffInMinutes;
  504. },
  505. /**
  506. * 生命周期函数--监听页面加载
  507. */
  508. onLoad: function (options) {
  509. let oldJsonList = qnaire.qnaire
  510. oldJsonList.forEach(element => {
  511. let mapArray = [];
  512. if (element.type == "radio" || element.type == "radio&input") {
  513. for (let key in element.option) {
  514. mapArray.push({ key: key, value: element.option[key] });
  515. }
  516. element['options'] = mapArray;
  517. }
  518. });
  519. // console.log(oldJsonList);
  520. let columns = [[], []];
  521. for (let i = 0; i < 24; i++) {
  522. if (i < 10) {
  523. columns[0].push("0" + i);
  524. } else {
  525. columns[0].push("" + i);
  526. }
  527. }
  528. for (let i = 0; i < 60; i++) {
  529. if (i < 10) {
  530. columns[1].push("0" + i);
  531. } else {
  532. columns[1].push("" + i);
  533. }
  534. }
  535. console.log(columns);
  536. this.setData({
  537. privacyDetailShow: false,
  538. qnaire: oldJsonList,
  539. columns
  540. });
  541. },
  542. /**
  543. * 生命周期函数--监听页面初次渲染完成
  544. */
  545. onReady: function () {
  546. },
  547. /**
  548. * 生命周期函数--监听页面显示
  549. */
  550. onShow: function () {
  551. },
  552. /**
  553. * 生命周期函数--监听页面隐藏
  554. */
  555. onHide: function () {
  556. },
  557. /**
  558. * 生命周期函数--监听页面卸载
  559. */
  560. onUnload: function () {
  561. },
  562. /**
  563. * 页面相关事件处理函数--监听用户下拉动作
  564. */
  565. onPullDownRefresh: function () {
  566. },
  567. /**
  568. * 页面上拉触底事件的处理函数
  569. */
  570. onReachBottom: function () {
  571. },
  572. /**
  573. * 用户点击右上角分享
  574. */
  575. onShareAppMessage: function () {
  576. }
  577. })