不在组别内的扫描调查问卷二维码优化

This commit is contained in:
2026-10-22 17:05:06 +08:00
parent 3f51f5ebc4
commit f20bccc1ee
@@ -83,8 +83,12 @@ layout("/layouts/platform_h5.html"){
</style> </style>
<div id="app" v-cloak> <div id="app" v-cloak>
<van-nav-bar title="问卷调查" left-arrow @click-left="historyBack" placeholder fixed></van-nav-bar> <van-nav-bar title="问卷调查" left-arrow @click-left="onBack" placeholder fixed></van-nav-bar>
<div class="container" :style="{'padding-bottom': answerRecord.isFinish ? 0 : '84px'}"> <van-loading v-if="tableLoading" vertical style="padding: 40px 0">正在加载问卷</van-loading>
<van-empty v-else-if="loadError" :description="loadError">
<van-button type="primary" @click="onBack">返回首页</van-button>
</van-empty>
<div v-else-if="surveyReady" class="container" :style="{'padding-bottom': answerRecord.isFinish ? 0 : '84px'}">
<h2 class="title">{{ activity.title }}</h2> <h2 class="title">{{ activity.title }}</h2>
<div v-if="!isFinished"> <div v-if="!isFinished">
<div v-for="(subject, index) in visibleSubjects" :key="subject.id" class="subject"> <div v-for="(subject, index) in visibleSubjects" :key="subject.id" class="subject">
@@ -149,7 +153,10 @@ layout("/layouts/platform_h5.html"){
remainingTime: 0, remainingTime: 0,
isFinished: false, isFinished: false,
answerRecord: {}, answerRecord: {},
answerRecordId: null answerRecordId: null,
tableLoading: false,
surveyReady: false,
loadError: ""
} }
}, },
@@ -173,29 +180,69 @@ layout("/layouts/platform_h5.html"){
}, },
methods: { methods: {
//获取活动、题目 //失败页直接替换为首页,避免扫码认证历史将用户再次带回无权参与的问卷。
listSubjects() { onBack() {
this.$axios.post("/platform/h5/qsv/survey/subjects", { activityId: this.id }).then((res) => { if (this.loadError) {
if (res.code === 0) { window.h5PopupHistory.clear().then(() => {
this.activity = res.data.activity window.location.replace("/platform/h5/home")
this.subjects = res.data.subjects })
this.answerRecordId = res.data.answerRecordId return
this.getAnswerRecord() }
} 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() { getAnswerRecord() {
this.$axios.post("/platform/h5/qsv/survey/answerRecord", { answerRecordId: this.answerRecordId }).then((res) => { this.$set(this, "tableLoading", true)
if (res.code === 0) { this.$set(this, "surveyReady", false)
this.answerRecord = res.data 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) { if (this.answerRecord.isFinish) {
this.$toast.success("您已完成该调查") this.$toast.success("您已完成该调查")
} }
this.initAnswer() 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() { onSubmit() {
//范围校验失败、加载未完成或已提交时,不发送无效答卷。
if (!this.surveyReady || this.tableLoading || this.loadError || !this.answerRecordId || this.answerRecord.isFinish) {
return
}
const endTime = this.activity.endTime const endTime = this.activity.endTime
if (this.isEnd) { if (this.isEnd) {
this.$toast("调查已结束") this.$toast("调查已结束")
@@ -307,6 +358,10 @@ layout("/layouts/platform_h5.html"){
//自动提交 //自动提交
autoSubmit(loading = null) { autoSubmit(loading = null) {
//同时保护直接调用入口,避免绕过按钮状态提交空记录。
if (!this.surveyReady || this.tableLoading || this.loadError || !this.answerRecordId || this.answerRecord.isFinish) {
return
}
this.$axios this.$axios
.post("/platform/h5/qsv/survey/submitAnswer", { .post("/platform/h5/qsv/survey/submitAnswer", {
answer: JSON.stringify({ answer: JSON.stringify({
@@ -337,8 +392,10 @@ layout("/layouts/platform_h5.html"){
created() { created() {
const id = GetQueryString("id") const id = GetQueryString("id")
if (id) { if (id) {
this.id = id this.$set(this, "id", id)
this.listSubjects() this.listSubjects()
} else {
this.onLoadError({ msg: "问卷链接缺少活动信息,请返回首页" })
} }
} }
}) })