testSAS.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. // miniprogram/pages/testSAS/testSAS.js
  2. // const db = wx.cloud.database()
  3. const qnaire = require("./sas.js")
  4. var ans = new Array(27)
  5. var ansJson = []
  6. Page({
  7. data: {
  8. qnaire: qnaire.qnaire,
  9. answer: ans,
  10. answerJson: [],
  11. id: 0,
  12. inputValue: '' ,// 初始值为空字符串
  13. BMI: null,
  14. weight: 0,
  15. height: 0,
  16. promptTextMessage: [],
  17. totalAll: 0,
  18. isPrivacyAgreed: false, // 隐私条款是否勾选
  19. privacyDetailShow: false ,// 隐私条款弹出页是否显示
  20. checkboxes: [
  21. { name: 'checkbox1', checked: false },
  22. ],
  23. changeValue:''//
  24. },
  25. // drawCircle: function() {
  26. // // 创建 canvas 上下文
  27. // const ctx = wx.createCanvasContext('myCanvas');
  28. // // 设置圆环的颜色和样式
  29. // ctx.setStrokeStyle('green'); // 圆环的颜色
  30. // ctx.setLineWidth(20); // 圆环的宽度
  31. // // 绘制外圆
  32. // ctx.beginPath();
  33. // ctx.arc(90, 80, 80, 0, 2 * Math.PI); // 圆心 (100, 100),半径 100
  34. // ctx.stroke(); // 绘制外圆
  35. // // 绘制内圆(与外圆同圆心,但半径小20rpx,即80rpx)
  36. // ctx.beginPath();
  37. // ctx.arc(90, 80, 80, 0, 2 * Math.PI);
  38. // ctx.setFillStyle('white'); // 设置内圆的填充颜色为白色(或者透明,取决于你希望的效果)
  39. // ctx.fill(); // 填充内圆,这样圆环内部就是白色或透明的了
  40. // // 结束绘制并更新 canvas
  41. // ctx.draw();
  42. // },
  43. hideModal: function() {
  44. this.setData({
  45. privacyDetailShow: false
  46. });
  47. },
  48. checkboxChange: function(e) {
  49. // e.detail.value 是一个数组,包含了所有被选中的 checkbox 的 value
  50. const checkedValues = e.detail.value;
  51. // 遍历 checkboxes 数组,根据 checkedValues 更新 checked 属性
  52. const updatedCheckboxes = this.data.checkboxes.map(checkbox => {
  53. return {
  54. ...checkbox,
  55. // 如果 checkbox 的 name 在 checkedValues 中,则设为 true,否则设为 false
  56. checked: checkedValues.includes(checkbox.name)
  57. };
  58. });
  59. // 更新 data 中的 checkboxes 数组
  60. this.setData({
  61. checkboxes: updatedCheckboxes
  62. });
  63. },
  64. showPrivacyDetail: function() {
  65. this.setData({
  66. privacyDetailShow: true
  67. });
  68. // 这里可以添加代码来显示隐私条款弹出页,比如使用 wx.showModal 或自定义组件
  69. },
  70. hidePrivacyPolicy() {
  71. this.setData({
  72. privacyDetailShow: false
  73. });
  74. },
  75. // otherButtonTap: function() {
  76. // if (!this.data.isPrivacyAgreed) {
  77. // wx.showToast({
  78. // title: '请勾选隐私条款',
  79. // icon: 'none'
  80. // });
  81. // return;
  82. // }
  83. // // 如果隐私条款已勾选,执行其他操作
  84. // },
  85. handleInputChange: function(e) {
  86. this.setData({
  87. height: e.detail.value
  88. });
  89. if(this.data.id == 1){
  90. this.setData({
  91. weight: e.detail.value
  92. });
  93. }
  94. if(this.data.id == 3){
  95. this.setData({
  96. weight: e.detail.value
  97. });
  98. if (this.data.weight >= 0 || this.data.height >= 0) {
  99. var bmi = this.data.weight / (this.data.height * this.data.height);
  100. this.setData({
  101. BMI: bmi
  102. });
  103. }
  104. }
  105. },
  106. radioChange: function (e) {
  107. console.log(e.detail.value)
  108. this.setData({
  109. changeValue: e.detail.value
  110. });
  111. },
  112. nextq: function () {
  113. if (!this.data.checkboxes[0].checked) {
  114. wx.showToast({
  115. title: '请勾选隐私条款',
  116. icon: 'none'
  117. });
  118. return;
  119. }
  120. if (this.data.id < 26) {
  121. this.setData({
  122. id: this.data.id + 1,
  123. })
  124. }
  125. },
  126. lastq: function (e) {
  127. if (!this.data.checkboxes[0].checked) {
  128. wx.showToast({
  129. title: '请勾选隐私条款',
  130. icon: 'none'
  131. });
  132. return;
  133. }
  134. if (this.data.id != 0) {
  135. this.setData({
  136. id: this.data.id - 1,
  137. })
  138. }
  139. },
  140. submit: function (e) {
  141. if (!this.data.checkboxes[0].checked) {
  142. return;
  143. }
  144. var a = e.detail.value.answer?e.detail.value.answer:e.detail.value.input;
  145. var id = this.data.id-1;
  146. var obj = {};
  147. obj.type = e.detail.value.answer?'answer':'input'
  148. obj.value = a
  149. ans[id] = a;
  150. ansJson[id] = obj;
  151. this.setData({
  152. answer: ans,
  153. answerJson: ansJson,
  154. })
  155. console.log("submit-answer="+this.data.answer);
  156. console.log("e.detail.value.answer="+e.detail.value.answer);
  157. console.log("e.detail.value.input="+e.detail.value.input);
  158. },
  159. formSubmit: function() {
  160. if (!this.data.checkboxes[0].checked) {
  161. return;
  162. }
  163. var a = this.data.changeValue;
  164. var id = 26;
  165. var obj = {};
  166. obj.type = 'answer'
  167. obj.value = a
  168. ans[id] = a;
  169. ansJson[id] = obj;
  170. this.setData({
  171. answer: ans,
  172. answerJson: ansJson,
  173. })
  174. var finish;
  175. var i = 0;
  176. var _this = this;
  177. while(i<27) {
  178. if(ans[i]=="") {
  179. finish='false';
  180. break;
  181. } else {
  182. finish='true';
  183. }
  184. i++;
  185. }
  186. if(finish=='false') {
  187. // if('true'=='false') {
  188. wx.showModal({
  189. title: '无法提交',
  190. content: '您还有部分题目未完成,请检查后重新提交',
  191. showCancel: false,
  192. confirmColor: '#fcbe39',
  193. confirmText: "好的",
  194. success (res) {
  195. _this.setData({
  196. id: i,
  197. })
  198. }
  199. })
  200. } else{
  201. wx.showLoading({
  202. title: '加载中',
  203. })
  204. setTimeout(function () {
  205. wx.hideLoading({
  206. success (res) {
  207. _this.answer2db(_this.data.answerJson);
  208. wx.navigateBack({
  209. delta: 1
  210. })
  211. }
  212. })
  213. }, 2000)
  214. }
  215. },
  216. answer2db: function(answerJson) {
  217. // db.collection('SAS').add({
  218. // data: {
  219. // answer: this.data.answer
  220. // },
  221. // success (res) {
  222. // console.log(res._id);
  223. // },
  224. // fail (res) {
  225. // wx.showToast({
  226. // icon: 'none',
  227. // title: '新增记录失败'
  228. // })
  229. // console.error('[数据库] [新增记录] 失败:', err)
  230. // }
  231. // })
  232. console.log('answerJson='+JSON.stringify(answerJson))
  233. let totalAllTemp = 0;
  234. let value20 = answerJson[19].value;
  235. let total20 = 0//因子1
  236. if(total20 == 'A'){
  237. total20 += 0;
  238. }else if(total20 == 'B'){
  239. total20 += 1;
  240. }else if(total20 == 'C'){
  241. total20 += 2;
  242. }else if(total20 == 'D'){
  243. total20 += 3;
  244. }
  245. let total7 = 0//近1个月,从上床到入睡通常需要___________分钟
  246. let value7 = answerJson[6].value;
  247. if(value7<15){
  248. total7 += 0;
  249. }else if(value7>16 && value7<=30){
  250. total7 += 1;
  251. }else if(value7>31 && value7<=60){
  252. total7 += 2;
  253. }else if(value7>60){
  254. total7 += 3;
  255. }
  256. let value10 = answerJson[9].value;
  257. let total10 = 0//入睡困难(30分钟内不能入睡)
  258. if(value10 == 'A'){
  259. total10 += 0;
  260. }else if(value10 == 'B'){
  261. total10 += 1;
  262. }else if(value10 == 'C'){
  263. total10 += 2;
  264. }else if(value10 == 'D'){
  265. total10 += 3;
  266. }
  267. let value9 = answerJson[8].value;//近1个月,每夜通常实际睡眠时间___________小时(不等于卧床时间)
  268. let total91 = total7 + total10
  269. let total9_1 = 0//因子2
  270. if(total91 == 0){
  271. total9_1 += 0;
  272. }else if(total91 == 1 || total91 == 2){
  273. total9_1 += 1;
  274. }else if(total91 == 3 || total91 == 4){
  275. total9_1 += 2;
  276. }else if(total91 == 5 || total91 == 6){
  277. total9_1 += 3;
  278. }
  279. let total9 = 0
  280. let total9_3 = 0//因子3
  281. if(value9 > 7){
  282. total9_3 += 0;
  283. }else if(value9 > 6 || value9 <= 7){
  284. total9_3 += 1;
  285. }else if(value9 > 5 || value9 <= 6){
  286. total9_3 += 2;
  287. }else if(value9 < 5){
  288. total9_3 += 3;
  289. }
  290. let value8 = answerJson[7].value;//起床时间
  291. let value6 = answerJson[5].value;//入睡时间
  292. let percentage = ((24-(value6-value8))==0)?0:((value9/(24-(value6-value8)))*100);
  293. percentage = percentage.toFixed(2);
  294. let percentage9 = 0;//因子4
  295. if(percentage>=85){
  296. percentage9 += 0;
  297. }else if(percentage>=75 && percentage<=84){
  298. percentage9 += 1;
  299. }else if(percentage>=65 && percentage<=74){
  300. percentage9 += 2;
  301. }else if(percentage<65){
  302. percentage9 += 3;
  303. }
  304. let value11 = this.resultABCD(answerJson[10].value);//5b
  305. let value12 = this.resultABCD(answerJson[11].value);//5c
  306. let value13 = this.resultABCD(answerJson[12].value);//5d
  307. let value14 = this.resultABCD(answerJson[13].value);//5e
  308. let value15 = this.resultABCD(answerJson[14].value);//5f
  309. let value16 = this.resultABCD(answerJson[15].value);//5g
  310. let value17 = this.resultABCD(answerJson[16].value);//5h
  311. let value18 = this.resultABCD(answerJson[17].value);//5i
  312. let value19 = this.resultABCD(answerJson[18].value);//5i
  313. let value_b_i = value11+value12+value13+value14+value15
  314. +value16+value17+value18+value19
  315. let total_b_i = 0;//因子5
  316. if(value_b_i<1){
  317. total_b_i += 0;
  318. }else if(value_b_i>=1 && value_b_i<=9){
  319. total_b_i += 1;
  320. }else if(value_b_i>=10 && value_b_i<=18){
  321. total_b_i += 2;
  322. }else if(value_b_i>=19 && value_b_i<=27){
  323. total_b_i += 3;
  324. }
  325. totalAllTemp = total20 + total9_1 + total9_3 + percentage9 + total_b_i
  326. let percentAll = 0
  327. if(totalAllTemp<=5){
  328. percentAll = '90'
  329. }else if(totalAllTemp>5 && totalAllTemp<=10){
  330. percentAll = '75'
  331. }else if(totalAllTemp>10 && totalAllTemp<=15){
  332. percentAll = '50'
  333. }else if(totalAllTemp>15 && totalAllTemp<=20){
  334. percentAll = '25'
  335. }else{
  336. percentAll = '未知'
  337. }
  338. let promptTextMessageTemp = [];
  339. let sleepState = this.sleepState(answerJson[0].value,answerJson[8].value);
  340. promptTextMessageTemp.push('在全人群中,您的个人情况决定了睡眠基础条件的分是('+totalAllTemp+')分,您已经超过了全国('+percentAll+')%的人群;(纯正态分布,5分,25%;10分,50%;15分75%;20分,位于前20%)');
  341. promptTextMessageTemp.push('您需要改进的睡眠问题主要集中在');
  342. promptTextMessageTemp.push('1.睡眠时长:您每天的睡眠时间'+sleepState);
  343. promptTextMessageTemp.push('2.不良因素:您的生理健康或生活习惯存在改进的空间,为了获得健康睡眠建议您(立刻进行改进//发挥优势,改进不足//继续保持良好的生活习惯)');
  344. let text10 = '';
  345. if(value10=='D'){
  346. text10 += '入睡困难//'
  347. }
  348. if(sleepState == '不足'){
  349. text10 += '深度睡眠不足//'
  350. }
  351. if(percentage9 == 3){
  352. text10 += '睡眠效率不高'
  353. }
  354. promptTextMessageTemp.push('3.睡眠质量:您存在('+text10+')的问题,这会导致睡眠质量较低或身心难以得到放松的问题,这会是我们共同努力的方向。');
  355. let value25 = answerJson[25].value;
  356. let value26 = answerJson[26].value;
  357. let text26 = '';
  358. if(!value25||!value26){
  359. text26 += '';
  360. }else if(value25=='C'||value26=='C'){
  361. text26 += '较差';
  362. }else if(value25=='A'||value26=='A'){
  363. text26 += '较好';
  364. }else{
  365. text26 += '适中';
  366. }
  367. promptTextMessageTemp.push('4.睡眠环境(对应:客观环境):您的睡眠环境总体来看,('+text26+')具有安全、安静和舒适的睡眠环境可以让您的睡眠质量得到显著的改善。');
  368. promptTextMessageTemp.push('5.改善意愿:您对改善自己睡眠质量的意愿(充分)。任何的改变都意味着要对以往你熟悉的环境,已经能够接受的不适进行改变甚至颠覆,不知道您愿不愿意为改善自己睡眠多一点付出,承受一点便或者痛苦呢?');
  369. this.setData({
  370. promptTextMessage: promptTextMessageTemp,
  371. totalAll: totalAllTemp,
  372. })
  373. },
  374. resultABCD:function(a){
  375. if(a = 'A'){
  376. return 0;
  377. }else if(a = 'B'){
  378. return 1;
  379. } else if(a = 'C'){
  380. return 2;
  381. } else if(a = 'D'){
  382. return 3;
  383. }
  384. },
  385. sleepState:function(a,b){
  386. console.log('a='+a+',b='+b);
  387. if(a=='A'){
  388. if(b>=1 && b<=9){
  389. return '不足';
  390. }else if(b>=10 && b<=12){
  391. return '适中';
  392. }else if(b>=13){
  393. return '过长';
  394. }else{
  395. return '未知';
  396. }
  397. }else if(a=='B'){
  398. if(b>=1 && b<=9){
  399. return '不足';
  400. }else if(b>=10 && b<=12){
  401. return '适中';
  402. }else if(b>=13){
  403. return '过长';
  404. }else{
  405. return '未知';
  406. }
  407. }else if(a=='C'){
  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=='D'){
  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{
  428. return '未知';
  429. }
  430. },
  431. /**
  432. * 生命周期函数--监听页面加载
  433. */
  434. onLoad: function (options) {
  435. for(var i=0; i<27; i++) {
  436. ans[i] = "";
  437. }
  438. this.setData({
  439. privacyDetailShow: false
  440. });
  441. // 绘制圆环
  442. // this.drawCircle();
  443. },
  444. /**
  445. * 生命周期函数--监听页面初次渲染完成
  446. */
  447. onReady: function () {
  448. },
  449. /**
  450. * 生命周期函数--监听页面显示
  451. */
  452. onShow: function () {
  453. },
  454. /**
  455. * 生命周期函数--监听页面隐藏
  456. */
  457. onHide: function () {
  458. },
  459. /**
  460. * 生命周期函数--监听页面卸载
  461. */
  462. onUnload: function () {
  463. },
  464. /**
  465. * 页面相关事件处理函数--监听用户下拉动作
  466. */
  467. onPullDownRefresh: function () {
  468. },
  469. /**
  470. * 页面上拉触底事件的处理函数
  471. */
  472. onReachBottom: function () {
  473. },
  474. /**
  475. * 用户点击右上角分享
  476. */
  477. onShareAppMessage: function () {
  478. }
  479. })