testSAS.js 15 KB

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