sleepQualityIndexAssessment.js 14 KB

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