sleepQualityIndexAssessment.js 14 KB

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