天波h5前端应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

398 lines
12KB

  1. <template>
  2. <div class="page" v-if="isSHowPage">
  3. <van-nav-bar title="" :border="true" :left-arrow="true" @click-left="onNavBack" v-if="showLeftArrow">
  4. <template #left>
  5. <van-icon name="arrow-left" size="23" style="padding: 0" />返回
  6. </template>
  7. </van-nav-bar>
  8. <div class="tip">
  9. <div class="icon">
  10. <i class="iconfont icon-tishi"></i>
  11. </div>
  12. <div class="info">
  13. <div class="titie">温馨提醒:</div>
  14. <div class="content">
  15. {{ tips }}
  16. </div>
  17. </div>
  18. </div>
  19. <div v-if="info">
  20. <!-- 第一步 -->
  21. <div class="step" v-show="info.initScaleState !== 1">
  22. <div class="name">第一步</div>
  23. <div class="title">
  24. <div class="text">情绪初始化评估</div>
  25. <div class="status success" v-if="info.initScaleState === 1">
  26. <span class="icon"><i class="iconfont icon-caozuochenggong"></i></span>
  27. <span>已完成</span>
  28. </div>
  29. <div class="status" v-else>待完成</div>
  30. </div>
  31. <div class="sub_title">
  32. 完成一次“情绪初始化评估”,有助于建立您的个人情绪模型。
  33. </div>
  34. <div class="step_button">
  35. <van-button round type="info" style="width: 100%; height: 100%" v-if="info.initScaleState !== 1"
  36. @click="toQuestion">去完成</van-button>
  37. </div>
  38. </div>
  39. <!-- 第二步 -->
  40. <div class="step" v-show="info.progress !== 1">
  41. <div class="name">第二步</div>
  42. <div class="title">
  43. <div class="text">连续佩戴两小时</div>
  44. <div class="status success" v-if="info.progress === 1">
  45. <span class="icon"><i class="iconfont icon-caozuochenggong"></i></span>
  46. <span>已完成</span>
  47. </div>
  48. <div class="status" v-else>{{ stateText }}</div>
  49. </div>
  50. <div class="schedule">
  51. <van-progress :percentage="info.progress * 100" stroke-width="10px" color="#638ee4"
  52. :show-pivot="true"></van-progress>
  53. </div>
  54. <div class="sub_title">
  55. 请连续佩戴不低于2小时,有助于为您输出更加精准的情绪分析指标。
  56. </div>
  57. </div>
  58. <div class="completed" v-show="info.progress === 1 && info.initScaleState === 1">
  59. <van-button round type="info">建模已完成</van-button>
  60. </div>
  61. </div>
  62. </div>
  63. </template>
  64. <script>
  65. import axios from "axios";
  66. import APICore from "@/api/core";
  67. export default {
  68. name: "PsychologicalModeling",
  69. data() {
  70. return {
  71. info: null,
  72. showLeftArrow: null,
  73. isSHowPage: false,
  74. fromUrl: "",
  75. };
  76. },
  77. computed: {
  78. stateText() {
  79. return this.info.progress > 0 ? "进行中" : "待完成";
  80. },
  81. autoJump() {
  82. return this.$route.query.autoJump === "1";
  83. },
  84. tips() {
  85. return this.info.isFirstModeling === 1
  86. ? `首次佩戴,需完成以下2步,建立情绪模型。完成初始化建模后,将为您计算${this.$replaceAll('抑郁', '抑郁', '焦虑')}、压力、疲劳分值。`
  87. : `由于您长时间未佩戴手表,需重新建模,请连续佩戴不低于2小时,佩戴完成后,将为您计算${this.$replaceAll('抑郁', '抑郁', '焦虑')}、压力、疲劳的分值。`;
  88. },
  89. },
  90. mounted() {
  91. //页面标题
  92. window.document.title = "情绪初始化建模";
  93. //页面传参
  94. let params = { ...this.$route.query };
  95. if (params.uid) {
  96. this.uid = params.uid;
  97. // 缓存从随手精灵传过来的token
  98. this.$store.commit("ssjlToken", params.accessToken || "");
  99. if (params.appType) {
  100. this.$store.commit("appType", params.appType);
  101. }
  102. // 缓存从随手精灵传过来的标识
  103. this.$store.commit("fromSsjl", params.fromSsjl);
  104. // 是否显示 返回标签
  105. this.showLeftArrow = this.$store.getters.fromSsjl === "true";
  106. this.fromUrl = params.fromUrl;
  107. console.log("fromUrl", this.fromUrl);
  108. //初始化
  109. this.init();
  110. } else {
  111. this.$toast("参数错误");
  112. }
  113. },
  114. methods: {
  115. // 获取b端token
  116. getAuth() {
  117. let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650";
  118. let that = this;
  119. return new Promise((resolve, reject) => {
  120. APICore.getAuth({ manufactorId: manufactorId }).then((res) => {
  121. let data = res.data;
  122. if (data.code === 0) {
  123. resolve(res.data.data);
  124. } else {
  125. that.$toast.fail(`${data.message}`);
  126. reject("");
  127. }
  128. });
  129. });
  130. },
  131. // 返回
  132. onNavBack() {
  133. let fromSsjl = this.$store.getters.fromSsjl === "true";
  134. if (fromSsjl) {
  135. let baseUrl = this.fromUrl;
  136. window.location.href = `${baseUrl}/#/${this.$route.query.fromMenu || "device"
  137. }`;
  138. } else {
  139. this.$router.go(-1);
  140. }
  141. },
  142. async init() {
  143. if (!this.$route.query.accessToken) {
  144. // 如果当前url没有 accessToken, 获取token,并且存储到本地缓存里面
  145. let authToken = await this.getAuth();
  146. this.$store.commit("ssjlToken", authToken);
  147. }
  148. let ssjlToken = this.$store.getters.ssjlToken;
  149. let re = await this.api(
  150. "/api/Question/Progress",
  151. {
  152. method: "GET",
  153. sslVerify: false,
  154. withCredentials: false,
  155. params: {
  156. uid: this.uid,
  157. },
  158. },
  159. ssjlToken
  160. );
  161. if (re.success) {
  162. this.info = re.response;
  163. setTimeout(() => {
  164. this.isSHowPage = true;
  165. }, 800);
  166. if (re.response && re.response.state === -1) {
  167. this.$toast("用户不存在或未绑定手表");
  168. } else if (
  169. re.response &&
  170. re.response.initScaleState === 1 &&
  171. re.response.progress === 1 &&
  172. !this.autoJump
  173. ) {
  174. // 2023.6.1 需求变更,建模完成直接跳到心理健康汇总页面
  175. this.$router.replace(
  176. `/psychologicalMain?uid=${this.uid}&fromUrl=${this.fromUrl || ""
  177. }&fromMenu=${this.showLeftArrow ? "device" : ""}`
  178. );
  179. }
  180. } else {
  181. this.$toast(re.msg);
  182. }
  183. },
  184. toQuestion() {
  185. this.$router.replace(`/PsychologicalQuestionnaire?uid=${this.uid}`);
  186. },
  187. api(url, config, token) {
  188. let baseUrl =
  189. process.env.NODE_ENV === "production"
  190. ? "https://dbmq.rzliot.com/auth_heart"
  191. : "https://dbmq.rzliot.com/heart";
  192. setTimeout(() => {
  193. this.$toast.loading({
  194. message: "",
  195. forbidClick: true,
  196. duration: 0,
  197. });
  198. }, 100);
  199. return new Promise((res) => {
  200. axios({
  201. url: `${baseUrl}${url}`,
  202. ...config,
  203. // 增加请求头部 token
  204. headers: {
  205. AccessToken: token,
  206. },
  207. })
  208. .then((re) => {
  209. if (re) {
  210. if (re.data) {
  211. console.log(re.data);
  212. res(re.data);
  213. this.$toast.clear();
  214. return;
  215. }
  216. this.$toast(`信息获取失败-${re.status}`);
  217. res(true);
  218. this.$toast.clear();
  219. return;
  220. }
  221. this.$toast(`信息获取失败-${url}`);
  222. res(true);
  223. this.$toast.clear();
  224. })
  225. .catch((e) => {
  226. this.$toast(`信息获取失败-${url}`);
  227. res(true);
  228. this.$toast.clear();
  229. console.log(e);
  230. });
  231. });
  232. },
  233. },
  234. };
  235. </script>
  236. <style lang="scss" scoped>
  237. @font-face {
  238. font-family: "iconfont";
  239. /* Project id 2652084 */
  240. src: url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAQoAAsAAAAACFQAAAPaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDBgqEIIQDATYCJAMMCwgABCAFhGcHQRtqBxEVnBvJPhLjmMRz8aCJJho3wfN8ne+5817QmS/XTApqUAGT1kmpHaidloBWXGdzOaZE+Aj1S75l+ek70v5OL82zLE6hFEIiJEbx96dyFkjAnwUAJnXNTcUP1HiBAtaxhhUr2KsXyLuo1/rCrIx6BgFM6tACo12HbjZpk4bPmkIRGksqkFbKpPFjhxOWRnRLpRBGCEKXamQTATDWGo+AjeHn5RdRCYNBQGHt0mtM+1Hc+Zr+1VZ+0gf1Gl+CgIcbQABQQI2NmWVIu7MfKk7WQGHWKTUpDKIRjEkjySSEglIHt/zHM0CCWMoUTFVRGBclugwEvto8VnH9qyAIhIDrIApTOVMVOr2mNDQjKSPHeM4zz6ZrPrYDY3fjR7a4+xTrY15tvZVw5KkZtx/X+HznyRPHnvCeqZskVmTOjMmRnF1girdzz7F4ju3uiB/xc53CoFi1HdXMW9Vu1TonY+gTzqB98OucaHakkW3GjxWJhX9kQXymq/AjJ5sfbS5Hc9nm5+KfvW9ZiYfnRXbG8tzG6nK7+u265yW2Hv38lNG3PmqlJo7Hjv0enTXu0fJ0ouuAIf1WL94ysHiw9aA5vca2mth0ZPGOvtu99JioF7HtiBd95LA4E7Gj3qPSVmO6tC3erV1e54F9yvUsu3Bh2Z7l+lwiLGETNtvRp9ylmtsGlm7eieOF8GLvn+zifT/067/LLFd8TdeujrureHTFyFEf+hbPVft+SK96RrBXE7tqx8rt21XpUO2QwwZswmZvsZsOz8+pN3TsrzXZ143c71m5NwLL+4xyo30jdTbxttGdTvRcMG4rPzrU0SFdrfTjHqXWlOrxuHR1FdK1219m/7yFvU52Hh3x6th9I25U9b0QTS1XvFyq35thACTvqtuqZZiOq5kq9v9/w/jtj8cOTW/2P2xpAN5vbXsP+5NxDcwN4RfjFPjbqkFApFYhULpOcFsQQLEkk4cBmLYJfm81QBZvh6uzweUghMlOwSBEcVCEKYdpqhoEsIhCkDDNwaQ67VdbZPsIzBFdDKjEC4GQwRsM0rgKigw+mKa+ECCPHwTJ4A8mrqy2s6gkZs2oBC3oB9SGBudoJJR7QD92iqtiF+RY4wjkSVbM7HFAHmNGvPpCxIFj6mHHT8OuIwhMDRpJKpFQpqmre0liqJ+sYRCFgFgAzQOgxkAMOB8t+e87gHhGOhQMxC52JlKeyAdyEjIAtlcOoLYb6R254ikQBEdHORiiB9gpO9LZSQII9YMaEIOQUA2IB0pSgnJQZbK8un+5XYCJtaUSQ5Ro0kcqeo5kKhy8J7dhKXWs6skEAAA=");
  241. }
  242. .iconfont {
  243. font-family: "iconfont" !important;
  244. // font-size: 16px;
  245. font-style: normal;
  246. -webkit-font-smoothing: antialiased;
  247. -moz-osx-font-smoothing: grayscale;
  248. }
  249. .icon-caozuochenggong:before {
  250. content: "\e60f";
  251. }
  252. .icon-tishi:before {
  253. content: "\e654";
  254. }
  255. .page {
  256. width: 100%;
  257. min-height: 100%;
  258. box-sizing: border-box;
  259. font-size: 3.6vw;
  260. text-align: left;
  261. background: #f4f4f4;
  262. padding-bottom: 30vw;
  263. .tip {
  264. display: flex;
  265. font-size: 3.3vw;
  266. padding: 6vw 4vw;
  267. justify-content: space-between;
  268. align-items: center;
  269. background: white;
  270. .icon {
  271. overflow: hidden;
  272. display: flex;
  273. justify-content: center;
  274. align-items: center;
  275. width: 40px;
  276. height: 40px;
  277. color: #ff865a;
  278. font-size: 6vw;
  279. border-radius: 50%;
  280. background: #fff5f1;
  281. }
  282. .info {
  283. width: calc(100% - 50px);
  284. line-height: 20px;
  285. text-align: left;
  286. .titie {
  287. color: #ff865a;
  288. }
  289. .content {
  290. color: gray;
  291. }
  292. }
  293. }
  294. .step {
  295. margin-top: 3vw;
  296. padding: 4vw 8vw;
  297. padding-right: 4vw;
  298. background: white;
  299. .name {
  300. display: flex;
  301. align-items: center;
  302. font-size: 3.8vw;
  303. padding-bottom: 2vw;
  304. &::before {
  305. content: "";
  306. display: block;
  307. width: 1vw;
  308. height: 1vw;
  309. border: 2px solid #638ee4;
  310. border-radius: 50%;
  311. margin-left: calc(-2vw - 4px);
  312. margin-right: 1vw;
  313. }
  314. }
  315. .title {
  316. display: flex;
  317. justify-content: space-between;
  318. padding: 3vw 0;
  319. .status {
  320. color: #ff865a;
  321. }
  322. .success {
  323. color: #638ee4;
  324. .icon {
  325. font-size: 4vw;
  326. margin-right: 1vw;
  327. }
  328. }
  329. }
  330. .sub_title {
  331. padding: 3vw 0;
  332. color: gray;
  333. }
  334. .step_button {
  335. height: 14vw;
  336. width: 60vw;
  337. margin: auto;
  338. .van-button--info {
  339. background-color: #638ee4;
  340. border: 1px solid #638ee4;
  341. }
  342. }
  343. }
  344. .completed {
  345. position: relative;
  346. margin-top: 3vw;
  347. height: 400px;
  348. @include center();
  349. .van-button--info {
  350. height: 8vh;
  351. width: 75vw;
  352. background-color: #638ee4;
  353. border: 1px solid #638ee4;
  354. }
  355. }
  356. .button {
  357. position: fixed;
  358. left: 0;
  359. right: 0;
  360. bottom: 15vw;
  361. width: 75vw;
  362. height: 14vw;
  363. margin: auto;
  364. .van-button--info {
  365. background-color: #638ee4;
  366. border: 1px solid #638ee4;
  367. }
  368. }
  369. }
  370. </style>