@@ -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: "问卷链接缺少活动信息,请返回首页" })
}
}
})