sleepQualityIndexAssessment.js 14 KB

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