diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/qsv/survey/index.html b/src/main/resources/views/platform/zhghh5/dayofficework/qsv/survey/index.html index 4b26b0c..b9b9bfe 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/qsv/survey/index.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/qsv/survey/index.html @@ -83,8 +83,12 @@ layout("/layouts/platform_h5.html"){
- -
+ + 正在加载问卷 + + 返回首页 + +

{{ activity.title }}

@@ -149,7 +153,10 @@ layout("/layouts/platform_h5.html"){ remainingTime: 0, isFinished: false, answerRecord: {}, - answerRecordId: null + answerRecordId: null, + tableLoading: false, + surveyReady: false, + loadError: "" } }, @@ -173,29 +180,69 @@ layout("/layouts/platform_h5.html"){ }, methods: { - //获取活动、题目 - listSubjects() { - this.$axios.post("/platform/h5/qsv/survey/subjects", { activityId: this.id }).then((res) => { - if (res.code === 0) { - this.activity = res.data.activity - this.subjects = res.data.subjects - this.answerRecordId = res.data.answerRecordId - this.getAnswerRecord() - } - }) + //失败页直接替换为首页,避免扫码认证历史将用户再次带回无权参与的问卷。 + onBack() { + if (this.loadError) { + window.h5PopupHistory.clear().then(() => { + window.location.replace("/platform/h5/home") + }) + return + } + this.historyBack() }, - //获取回答记录 + //error 为接口业务错误或网络异常;持久展示提示,并禁止空问卷提交。 + onLoadError(error) { + this.$set(this, "surveyReady", false) + this.$set(this, "loadError", (error && (error.msg || error.message)) || "问卷加载失败,请返回首页后重试") + }, + + //activityId 传扫码地址中的 id;成功返回活动、题目及答题记录 ID,再加载历史答案。 + listSubjects() { + this.$set(this, "tableLoading", true) + this.$set(this, "surveyReady", false) + this.$set(this, "loadError", "") + return this.$axios.post("/platform/h5/qsv/survey/subjects", { activityId: this.id }) + .then((res) => { + if (res.code !== 0 || !res.data || !res.data.activity || !res.data.answerRecordId || !Array.isArray(res.data.subjects)) { + throw new Error(res.msg || "问卷数据不完整,请返回首页后重试") + } + this.$set(this, "activity", res.data.activity) + this.$set(this, "subjects", res.data.subjects) + this.$set(this, "answerRecordId", res.data.answerRecordId) + return this.getAnswerRecord() + }) + .catch((error) => { + this.onLoadError(error) + }) + .finally(() => { + this.$set(this, "tableLoading", false) + }) + }, + + //answerRecordId 传题目接口返回的记录 ID;答案回显完成后才允许展示和提交问卷。 getAnswerRecord() { - this.$axios.post("/platform/h5/qsv/survey/answerRecord", { answerRecordId: this.answerRecordId }).then((res) => { - if (res.code === 0) { - this.answerRecord = res.data + this.$set(this, "tableLoading", true) + this.$set(this, "surveyReady", false) + return this.$axios.post("/platform/h5/qsv/survey/answerRecord", { answerRecordId: this.answerRecordId }) + .then((res) => { + if (res.code !== 0 || !res.data) { + throw new Error(res.msg || "答题记录加载失败,请返回首页后重试") + } + this.$set(this, "answerRecord", res.data) if (this.answerRecord.isFinish) { this.$toast.success("您已完成该调查") } this.initAnswer() - } - }) + this.$set(this, "loadError", "") + this.$set(this, "surveyReady", true) + }) + .catch((error) => { + this.onLoadError(error) + }) + .finally(() => { + this.$set(this, "tableLoading", false) + }) }, //直接回填答案数据,隐藏题没有组件引用,也能安全完成历史答卷回显。 @@ -281,6 +328,10 @@ layout("/layouts/platform_h5.html"){ //手动提交 onSubmit() { + //范围校验失败、加载未完成或已提交时,不发送无效答卷。 + if (!this.surveyReady || this.tableLoading || this.loadError || !this.answerRecordId || this.answerRecord.isFinish) { + return + } const endTime = this.activity.endTime if (this.isEnd) { this.$toast("调查已结束") @@ -307,6 +358,10 @@ layout("/layouts/platform_h5.html"){ //自动提交 autoSubmit(loading = null) { + //同时保护直接调用入口,避免绕过按钮状态提交空记录。 + if (!this.surveyReady || this.tableLoading || this.loadError || !this.answerRecordId || this.answerRecord.isFinish) { + return + } this.$axios .post("/platform/h5/qsv/survey/submitAnswer", { answer: JSON.stringify({ @@ -337,8 +392,10 @@ layout("/layouts/platform_h5.html"){ created() { const id = GetQueryString("id") if (id) { - this.id = id + this.$set(this, "id", id) this.listSubjects() + } else { + this.onLoadError({ msg: "问卷链接缺少活动信息,请返回首页" }) } } })