fix: pinia改写
This commit is contained in:
parent
20ef020a19
commit
2162f3cffd
@ -18,8 +18,6 @@ import { SURVEY_PERMISSION } from 'src/enums/surveyPermission';
|
|||||||
import { Logger } from 'src/logger';
|
import { Logger } from 'src/logger';
|
||||||
import { HttpException } from 'src/exceptions/httpException';
|
import { HttpException } from 'src/exceptions/httpException';
|
||||||
import { EXCEPTION_CODE } from 'src/enums/exceptionCode';
|
import { EXCEPTION_CODE } from 'src/enums/exceptionCode';
|
||||||
import { val } from 'cheerio/lib/api/attributes';
|
|
||||||
|
|
||||||
@ApiTags('survey')
|
@ApiTags('survey')
|
||||||
@Controller('/api/surveyHisotry')
|
@Controller('/api/surveyHisotry')
|
||||||
export class SurveyHistoryController {
|
export class SurveyHistoryController {
|
||||||
|
@ -189,7 +189,7 @@ export class SurveyDownloadService implements OnModuleInit {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
...data,
|
...data,
|
||||||
difTime: (submitedData.difTime / 1000).toFixed(2),
|
diffTime: (submitedData.diffTime / 1000).toFixed(2),
|
||||||
createDate: moment(submitedData.createDate).format(
|
createDate: moment(submitedData.createDate).format(
|
||||||
'YYYY-MM-DD HH:mm:ss',
|
'YYYY-MM-DD HH:mm:ss',
|
||||||
),
|
),
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import { useEditStore } from '@/management/stores/edit'
|
import { useEditStore } from '@/management/stores/edit'
|
||||||
|
import { useUserStore } from '@/management/stores/user'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import { ElMessage, ElMessageBox, type Action } from 'element-plus'
|
import { ElMessage, ElMessageBox, type Action } from 'element-plus'
|
||||||
import 'element-plus/theme-chalk/src/message.scss'
|
import 'element-plus/theme-chalk/src/message.scss'
|
||||||
@ -24,9 +25,10 @@ const props = defineProps<Props>()
|
|||||||
const isPublishing = ref<boolean>(false)
|
const isPublishing = ref<boolean>(false)
|
||||||
const editStore = useEditStore()
|
const editStore = useEditStore()
|
||||||
const { schema, getSchemaFromRemote } = editStore
|
const { schema, getSchemaFromRemote } = editStore
|
||||||
|
const userStore = useUserStore()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const saveData = computed(() => {
|
const saveData = computed(() => {
|
||||||
return buildData(store.state.edit.schema, sessionStorage.getItem('sessionUUID'))
|
return buildData(schema, sessionStorage.getItem('sessionUUID'))
|
||||||
})
|
})
|
||||||
|
|
||||||
const validate = () => {
|
const validate = () => {
|
||||||
@ -74,12 +76,12 @@ const onSave = async () => {
|
|||||||
// 增加冲突检测
|
// 增加冲突检测
|
||||||
const [isconflict, conflictName] = await checkConflict(saveData.value.surveyId)
|
const [isconflict, conflictName] = await checkConflict(saveData.value.surveyId)
|
||||||
if(isconflict) {
|
if(isconflict) {
|
||||||
if (conflictName == store.state.user.userInfo.username) {
|
if (conflictName == userStore.userInfo.username) {
|
||||||
ElMessageBox.alert('当前问卷已在其它页面开启编辑,刷新以获取最新内容。', '提示', {
|
ElMessageBox.alert('当前问卷已在其它页面开启编辑,刷新以获取最新内容。', '提示', {
|
||||||
confirmButtonText: '确认',
|
confirmButtonText: '确认',
|
||||||
callback: (action: Action) => {
|
callback: (action: Action) => {
|
||||||
if (action === 'confirm') {
|
if (action === 'confirm') {
|
||||||
store.dispatch('edit/getSchemaFromRemote')
|
getSchemaFromRemote()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -88,58 +90,7 @@ const onSave = async () => {
|
|||||||
confirmButtonText: '确认',
|
confirmButtonText: '确认',
|
||||||
callback: (action: Action) => {
|
callback: (action: Action) => {
|
||||||
if (action === 'confirm') {
|
if (action === 'confirm') {
|
||||||
store.dispatch('edit/getSchemaFromRemote')
|
getSchemaFromRemote()
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
} else {
|
|
||||||
// 保存数据
|
|
||||||
res = await saveSurvey(saveData.value)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
const checkConflict = async (surveyid:string) => {
|
|
||||||
try {
|
|
||||||
const dailyHis = await getConflictHistory({surveyId: surveyid, historyType: 'dailyHis', sessionId: sessionStorage.getItem('sessionUUID')})
|
|
||||||
if (dailyHis.data.length > 0) {
|
|
||||||
const lastHis = dailyHis.data.at(0)
|
|
||||||
if (Date.now() - lastHis.createDate > 2 * 60 * 1000) {
|
|
||||||
return [false, '']
|
|
||||||
}
|
|
||||||
return [true, lastHis.operator.username]
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
return [false, '']
|
|
||||||
}
|
|
||||||
const onSave = async () => {
|
|
||||||
let res
|
|
||||||
|
|
||||||
if (!saveData.value.surveyId) {
|
|
||||||
ElMessage.error('未获取到问卷id')
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
// 增加冲突检测
|
|
||||||
const [isconflict, conflictName] = await checkConflict(saveData.value.surveyId)
|
|
||||||
if(isconflict) {
|
|
||||||
if (conflictName == store.state.user.userInfo.username) {
|
|
||||||
ElMessageBox.alert('当前问卷已在其它页面开启编辑,刷新以获取最新内容。', '提示', {
|
|
||||||
confirmButtonText: '确认',
|
|
||||||
callback: (action: Action) => {
|
|
||||||
if (action === 'confirm') {
|
|
||||||
store.dispatch('edit/getSchemaFromRemote')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
ElMessageBox.alert(`当前问卷2分钟内由${conflictName}编辑,刷新以获取最新内容。`, '提示', {
|
|
||||||
confirmButtonText: '确认',
|
|
||||||
callback: (action: Action) => {
|
|
||||||
if (action === 'confirm') {
|
|
||||||
store.dispatch('edit/getSchemaFromRemote')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -200,7 +200,7 @@ const handleSave = async () => {
|
|||||||
isSaving.value = false
|
isSaving.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const schemaUpdateTime = computed(() => _get(store.state, 'edit.schemaUpdateTime'))
|
|
||||||
watch(schemaUpdateTime, () => {
|
watch(schemaUpdateTime, () => {
|
||||||
triggerAutoSave()
|
triggerAutoSave()
|
||||||
})
|
})
|
||||||
|
@ -7,7 +7,7 @@ export default [
|
|||||||
{
|
{
|
||||||
title: '提交限制',
|
title: '提交限制',
|
||||||
key: 'limitConfig',
|
key: 'limitConfig',
|
||||||
formList: ['limit_tLimit']
|
formList: ['limit_tLimit', 'limit_breakAnswer', 'limit_backAnswer']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '作答限制',
|
title: '作答限制',
|
||||||
|
@ -22,6 +22,20 @@ export default {
|
|||||||
type: 'QuestionTimeHour',
|
type: 'QuestionTimeHour',
|
||||||
placement: 'top'
|
placement: 'top'
|
||||||
},
|
},
|
||||||
|
limit_breakAnswer: {
|
||||||
|
key: 'baseConf.breakAnswer',
|
||||||
|
label: '允许断点续答',
|
||||||
|
tip: '回填前一次作答中的内容(注:更换设备/浏览器/清除缓存/更改内容重新发布则此功能失效)',
|
||||||
|
type: 'ELSwitch',
|
||||||
|
value: false
|
||||||
|
},
|
||||||
|
limit_backAnswer: {
|
||||||
|
key: 'baseConf.backAnswer',
|
||||||
|
label: '自动填充上次填写内容',
|
||||||
|
tip: '回填前一次提交的内容(注:更换设备/浏览器/清除缓存/更改内容重新发布则此功能失效)',
|
||||||
|
type: 'ELSwitch',
|
||||||
|
value: false
|
||||||
|
},
|
||||||
interview_pwd_switch: {
|
interview_pwd_switch: {
|
||||||
key: 'passwordSwitch',
|
key: 'passwordSwitch',
|
||||||
label: '访问密码',
|
label: '访问密码',
|
||||||
@ -96,5 +110,5 @@ export default {
|
|||||||
relyFunc: (data) => {
|
relyFunc: (data) => {
|
||||||
return data.whitelistType == 'MEMBER'
|
return data.whitelistType == 'MEMBER'
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
@ -143,6 +143,12 @@ const handleChange = (data) => {
|
|||||||
if (props.moduleConfig.type === QUESTION_TYPE.VOTE) {
|
if (props.moduleConfig.type === QUESTION_TYPE.VOTE) {
|
||||||
questionStore.updateVoteData(data)
|
questionStore.updateVoteData(data)
|
||||||
}
|
}
|
||||||
|
// 处理选项配额
|
||||||
|
if (props.moduleConfig.type === NORMAL_CHOICES) {
|
||||||
|
store.dispatch('changeQuota', data)
|
||||||
|
}
|
||||||
|
// 断点续答的的数据缓存
|
||||||
|
localStorageBack()
|
||||||
processJumpSkip()
|
processJumpSkip()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,4 +186,15 @@ const processJumpSkip = () => {
|
|||||||
questionStore.addNeedHideFields(skipKey)
|
questionStore.addNeedHideFields(skipKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const localStorageBack = () => {
|
||||||
|
var formData = Object.assign({}, surveyStore.formValues);
|
||||||
|
for(const key in formData){
|
||||||
|
formData[key] = encodeURIComponent(formData[key])
|
||||||
|
}
|
||||||
|
|
||||||
|
//浏览器存储
|
||||||
|
localStorage.removeItem(surveyStore.surveyPath + "_questionData")
|
||||||
|
localStorage.setItem(surveyStore.surveyPath + "_questionData", JSON.stringify(formData))
|
||||||
|
localStorage.setItem('isSubmit', JSON.stringify(false))
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import store from '../store/index'
|
import { useQuestionStore } from '../stores/question'
|
||||||
export const useOptionsQuota = (questionKey) => {
|
export const useOptionsQuota = (questionKey) => {
|
||||||
const options = store.state.questionData[questionKey].options.map((option) => {
|
const questionStore = useQuestionStore()
|
||||||
|
const options = questionStore.questionData[questionKey].options.map((option) => {
|
||||||
if(option.quota){
|
if(option.quota){
|
||||||
const optionHash = option.hash
|
const optionHash = option.hash
|
||||||
const selectCount = store.state.quotaMap?.[questionKey]?.[optionHash] || 0
|
const selectCount = questionStore.quotaMap?.[questionKey]?.[optionHash] || 0
|
||||||
const release = Number(option.quota) - Number(selectCount)
|
const release = Number(option.quota) - Number(selectCount)
|
||||||
return {
|
return {
|
||||||
...option,
|
...option,
|
||||||
|
@ -92,7 +92,7 @@ const normalizationRequestBody = () => {
|
|||||||
localStorage.removeItem(surveyPath.value + "_questionData")
|
localStorage.removeItem(surveyPath.value + "_questionData")
|
||||||
localStorage.removeItem("isSubmit")
|
localStorage.removeItem("isSubmit")
|
||||||
//数据加密
|
//数据加密
|
||||||
var formData = Object.assign({}, store.state.formValues)
|
var formData = Object.assign({}, surveyStore.formValues)
|
||||||
for(const key in formData){
|
for(const key in formData){
|
||||||
formData[key] = encodeURIComponent(formData[key])
|
formData[key] = encodeURIComponent(formData[key])
|
||||||
}
|
}
|
||||||
|
@ -360,5 +360,5 @@ export default {
|
|||||||
})
|
})
|
||||||
// 获取已投票数据
|
// 获取已投票数据
|
||||||
dispatch('initVoteData')
|
dispatch('initVoteData')
|
||||||
dispatch('initQuotaMap')
|
// dispatch('initQuotaMap')
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,201 @@ import { defineStore } from 'pinia'
|
|||||||
import { set } from 'lodash-es'
|
import { set } from 'lodash-es'
|
||||||
import { useSurveyStore } from '@/render/stores/survey'
|
import { useSurveyStore } from '@/render/stores/survey'
|
||||||
import { queryVote } from '@/render/api/survey'
|
import { queryVote } from '@/render/api/survey'
|
||||||
|
import { QUESTION_TYPE, NORMAL_CHOICES } from '@/common/typeEnum'
|
||||||
|
|
||||||
const VOTE_INFO_KEY = 'voteinfo'
|
const VOTE_INFO_KEY = 'voteinfo'
|
||||||
|
const QUOTA_INFO_KEY = 'limitinfo'
|
||||||
|
|
||||||
|
|
||||||
|
import useCommandComponent from '../hooks/useCommandComponent'
|
||||||
|
import BackAnswerDialog from '../components/BackAnswerDialog.vue'
|
||||||
|
|
||||||
|
const confirm = useCommandComponent(BackAnswerDialog)
|
||||||
|
|
||||||
|
// 投票进度逻辑聚合
|
||||||
|
const usevVoteMap = (questionData) => {
|
||||||
|
const voteMap = ref({})
|
||||||
|
//初始化投票题的数据
|
||||||
|
const initVoteData = async () => {
|
||||||
|
const surveyStore = useSurveyStore()
|
||||||
|
const surveyPath = surveyStore.surveyPath
|
||||||
|
|
||||||
|
const fieldList = []
|
||||||
|
|
||||||
|
for (const field in questionData.value) {
|
||||||
|
const { type } = questionData.value[field]
|
||||||
|
if (type.includes(QUESTION_TYPE.VOTE)) {
|
||||||
|
fieldList.push(field)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fieldList.length <= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
localStorage.removeItem(VOTE_INFO_KEY)
|
||||||
|
const voteRes = await queryVote({
|
||||||
|
surveyPath,
|
||||||
|
fieldList: fieldList.join(',')
|
||||||
|
})
|
||||||
|
|
||||||
|
if (voteRes.code === 200) {
|
||||||
|
localStorage.setItem(
|
||||||
|
VOTE_INFO_KEY,
|
||||||
|
JSON.stringify({
|
||||||
|
...voteRes.data
|
||||||
|
})
|
||||||
|
)
|
||||||
|
setVoteMap(voteRes.data)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const updateVoteMapByKey = (data) => {
|
||||||
|
const { questionKey, voteKey, voteValue } = data
|
||||||
|
// 兼容为空的情况
|
||||||
|
if (!voteMap.value[questionKey]) {
|
||||||
|
voteMap.value[questionKey] = {}
|
||||||
|
}
|
||||||
|
voteMap.value[questionKey][voteKey] = voteValue
|
||||||
|
}
|
||||||
|
const setVoteMap = (data) => {
|
||||||
|
voteMap.value = data
|
||||||
|
}
|
||||||
|
const updateVoteData = (data) => {
|
||||||
|
const { key: questionKey, value: questionVal } = data
|
||||||
|
// 更新前获取接口缓存在localStorage中的数据
|
||||||
|
const localData = localStorage.getItem(VOTE_INFO_KEY)
|
||||||
|
const voteinfo = JSON.parse(localData)
|
||||||
|
const currentQuestion = questionData.value[questionKey]
|
||||||
|
const options = currentQuestion.options
|
||||||
|
const voteTotal = voteinfo?.[questionKey]?.total || 0
|
||||||
|
let totalPayload = {
|
||||||
|
questionKey,
|
||||||
|
voteKey: 'total',
|
||||||
|
voteValue: voteTotal
|
||||||
|
}
|
||||||
|
options.forEach((option) => {
|
||||||
|
const optionhash = option.hash
|
||||||
|
const voteCount = voteinfo?.[questionKey]?.[optionhash] || 0
|
||||||
|
// 如果选中值包含该选项,对应voteCount 和 voteTotal + 1
|
||||||
|
if (
|
||||||
|
Array.isArray(questionVal) ? questionVal.includes(optionhash) : questionVal === optionhash
|
||||||
|
) {
|
||||||
|
const countPayload = {
|
||||||
|
questionKey,
|
||||||
|
voteKey: optionhash,
|
||||||
|
voteValue: voteCount + 1
|
||||||
|
}
|
||||||
|
totalPayload.voteValue += 1
|
||||||
|
updateVoteMapByKey(countPayload)
|
||||||
|
} else {
|
||||||
|
const countPayload = {
|
||||||
|
questionKey,
|
||||||
|
voteKey: optionhash,
|
||||||
|
voteValue: voteCount
|
||||||
|
}
|
||||||
|
updateVoteMapByKey(countPayload)
|
||||||
|
}
|
||||||
|
updateVoteMapByKey(totalPayload)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
voteMap,
|
||||||
|
initVoteData,
|
||||||
|
updateVoteData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 选项配额逻辑聚合
|
||||||
|
const useQuotaMap = (questionData) => {
|
||||||
|
const quotaMap = ref({})
|
||||||
|
const updateQuotaMapByKey = ({ questionKey, optionKey, data }) =>{
|
||||||
|
// 兼容为空的情况
|
||||||
|
if (!quotaMap.value[questionKey]) {
|
||||||
|
quotaMap.value[questionKey] = {}
|
||||||
|
}
|
||||||
|
quotaMap.value[questionKey][optionKey] = data
|
||||||
|
}
|
||||||
|
const initQuotaMap = async () => {
|
||||||
|
const surveyStore = useSurveyStore()
|
||||||
|
const surveyPath = surveyStore.surveyPath
|
||||||
|
const fieldList = Object.keys(questionData.value).filter(field => {
|
||||||
|
if (NORMAL_CHOICES.includes(questionData.value[field].type)) {
|
||||||
|
return questionData.value[field].options.some(option => option.quota > 0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 如果不存在则不请求选项上限接口
|
||||||
|
if (fieldList.length <= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
localStorage.removeItem(QUOTA_INFO_KEY)
|
||||||
|
const quotaRes = await queryVote({
|
||||||
|
surveyPath,
|
||||||
|
fieldList: fieldList.join(',')
|
||||||
|
})
|
||||||
|
|
||||||
|
if (quotaRes.code === 200) {
|
||||||
|
localStorage.setItem(
|
||||||
|
QUOTA_INFO_KEY,
|
||||||
|
JSON.stringify({
|
||||||
|
...quotaRes.data
|
||||||
|
})
|
||||||
|
)
|
||||||
|
Object.keys(quotaRes.data).forEach(field => {
|
||||||
|
Object.keys(quotaRes.data[field]).forEach((optionHash) => {
|
||||||
|
updateQuotaMapByKey({ questionKey: field, optionKey: optionHash, data: quotaRes.data[field][optionHash] })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const updateQuotaData = (data) => {
|
||||||
|
const { key: questionKey, value: questionVal } = data
|
||||||
|
// 更新前获取接口缓存在localStorage中的数据
|
||||||
|
const localData = localStorage.getItem(QUOTA_INFO_KEY)
|
||||||
|
const quotaMap = JSON.parse(localData)
|
||||||
|
// const quotaMap = state.quotaMap
|
||||||
|
const currentQuestion = questionData.value[questionKey]
|
||||||
|
const options = currentQuestion.options
|
||||||
|
options.forEach((option) => {
|
||||||
|
const optionhash = option.hash
|
||||||
|
const selectCount = quotaMap?.[questionKey]?.[optionhash].selectCount || 0
|
||||||
|
// 如果选中值包含该选项,对应 voteCount 和 voteTotal + 1
|
||||||
|
if (
|
||||||
|
Array.isArray(questionVal) ? questionVal.includes(optionhash) : questionVal === optionhash
|
||||||
|
) {
|
||||||
|
const countPayload = {
|
||||||
|
questionKey,
|
||||||
|
optionKey: optionhash,
|
||||||
|
selectCount: selectCount + 1
|
||||||
|
}
|
||||||
|
updateQuotaMapByKey(countPayload)
|
||||||
|
} else {
|
||||||
|
const countPayload = {
|
||||||
|
questionKey,
|
||||||
|
optionKey: optionhash,
|
||||||
|
selectCount: selectCount
|
||||||
|
}
|
||||||
|
updateQuotaMapByKey(countPayload)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
quotaMap,
|
||||||
|
initQuotaMap,
|
||||||
|
updateQuotaMapByKey,
|
||||||
|
updateQuotaData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const useQuestionStore = defineStore('question', () => {
|
export const useQuestionStore = defineStore('question', () => {
|
||||||
const voteMap = ref({})
|
|
||||||
const questionData = ref(null)
|
const questionData = ref(null)
|
||||||
const questionSeq = ref([]) // 题目的顺序,因为可能会有分页的情况,所以是一个二维数组[[qid1, qid2], [qid3,qid4]]
|
const questionSeq = ref([]) // 题目的顺序,因为可能会有分页的情况,所以是一个二维数组[[qid1, qid2], [qid3,qid4]]
|
||||||
const pageIndex = ref(1) // 当前分页的索引
|
const pageIndex = ref(1) // 当前分页的索引
|
||||||
@ -82,6 +272,8 @@ export const useQuestionStore = defineStore('question', () => {
|
|||||||
const setQuestionData = (data) => {
|
const setQuestionData = (data) => {
|
||||||
questionData.value = data
|
questionData.value = data
|
||||||
}
|
}
|
||||||
|
const { voteMap, setVoteMap, initVoteData, updateVoteData } = usevVoteMap(questionData)
|
||||||
|
const { quotaMap, initQuotaMap, updateQuotaData } = useQuotaMap(questionData)
|
||||||
|
|
||||||
const changeSelectMoreData = (data) => {
|
const changeSelectMoreData = (data) => {
|
||||||
const { key, value, field } = data
|
const { key, value, field } = data
|
||||||
@ -91,96 +283,7 @@ export const useQuestionStore = defineStore('question', () => {
|
|||||||
const setQuestionSeq = (data) => {
|
const setQuestionSeq = (data) => {
|
||||||
questionSeq.value = data
|
questionSeq.value = data
|
||||||
}
|
}
|
||||||
|
|
||||||
const setVoteMap = (data) => {
|
|
||||||
voteMap.value = data
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateVoteMapByKey = (data) => {
|
|
||||||
const { questionKey, voteKey, voteValue } = data
|
|
||||||
// 兼容为空的情况
|
|
||||||
if (!voteMap.value[questionKey]) {
|
|
||||||
voteMap.value[questionKey] = {}
|
|
||||||
}
|
|
||||||
voteMap.value[questionKey][voteKey] = voteValue
|
|
||||||
}
|
|
||||||
|
|
||||||
//初始化投票题的数据
|
|
||||||
const initVoteData = async () => {
|
|
||||||
const surveyStore = useSurveyStore()
|
|
||||||
const surveyPath = surveyStore.surveyPath
|
|
||||||
|
|
||||||
const fieldList = []
|
|
||||||
|
|
||||||
for (const field in questionData.value) {
|
|
||||||
const { type } = questionData.value[field]
|
|
||||||
if (/vote/.test(type)) {
|
|
||||||
fieldList.push(field)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fieldList.length <= 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
localStorage.removeItem(VOTE_INFO_KEY)
|
|
||||||
const voteRes = await queryVote({
|
|
||||||
surveyPath,
|
|
||||||
fieldList: fieldList.join(',')
|
|
||||||
})
|
|
||||||
|
|
||||||
if (voteRes.code === 200) {
|
|
||||||
localStorage.setItem(
|
|
||||||
VOTE_INFO_KEY,
|
|
||||||
JSON.stringify({
|
|
||||||
...voteRes.data
|
|
||||||
})
|
|
||||||
)
|
|
||||||
setVoteMap(voteRes.data)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateVoteData = (data) => {
|
|
||||||
const { key: questionKey, value: questionVal } = data
|
|
||||||
// 更新前获取接口缓存在localStorage中的数据
|
|
||||||
const localData = localStorage.getItem(VOTE_INFO_KEY)
|
|
||||||
const voteinfo = JSON.parse(localData)
|
|
||||||
const currentQuestion = questionData.value[questionKey]
|
|
||||||
const options = currentQuestion.options
|
|
||||||
const voteTotal = voteinfo?.[questionKey]?.total || 0
|
|
||||||
let totalPayload = {
|
|
||||||
questionKey,
|
|
||||||
voteKey: 'total',
|
|
||||||
voteValue: voteTotal
|
|
||||||
}
|
|
||||||
options.forEach((option) => {
|
|
||||||
const optionhash = option.hash
|
|
||||||
const voteCount = voteinfo?.[questionKey]?.[optionhash] || 0
|
|
||||||
// 如果选中值包含该选项,对应voteCount 和 voteTotal + 1
|
|
||||||
if (
|
|
||||||
Array.isArray(questionVal) ? questionVal.includes(optionhash) : questionVal === optionhash
|
|
||||||
) {
|
|
||||||
const countPayload = {
|
|
||||||
questionKey,
|
|
||||||
voteKey: optionhash,
|
|
||||||
voteValue: voteCount + 1
|
|
||||||
}
|
|
||||||
totalPayload.voteValue += 1
|
|
||||||
updateVoteMapByKey(countPayload)
|
|
||||||
} else {
|
|
||||||
const countPayload = {
|
|
||||||
questionKey,
|
|
||||||
voteKey: optionhash,
|
|
||||||
voteValue: voteCount
|
|
||||||
}
|
|
||||||
updateVoteMapByKey(countPayload)
|
|
||||||
}
|
|
||||||
updateVoteMapByKey(totalPayload)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const setChangeField = (field) => {
|
const setChangeField = (field) => {
|
||||||
changeField.value = field
|
changeField.value = field
|
||||||
@ -199,7 +302,7 @@ export const useQuestionStore = defineStore('question', () => {
|
|||||||
needHideFields.value = needHideFields.value.filter(field => !fields.includes(field))
|
needHideFields.value = needHideFields.value.filter(field => !fields.includes(field))
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
voteMap,
|
|
||||||
questionData,
|
questionData,
|
||||||
questionSeq,
|
questionSeq,
|
||||||
renderData,
|
renderData,
|
||||||
@ -209,8 +312,8 @@ export const useQuestionStore = defineStore('question', () => {
|
|||||||
setQuestionData,
|
setQuestionData,
|
||||||
changeSelectMoreData,
|
changeSelectMoreData,
|
||||||
setQuestionSeq,
|
setQuestionSeq,
|
||||||
|
voteMap,
|
||||||
setVoteMap,
|
setVoteMap,
|
||||||
updateVoteMapByKey,
|
|
||||||
initVoteData,
|
initVoteData,
|
||||||
updateVoteData,
|
updateVoteData,
|
||||||
changeField,
|
changeField,
|
||||||
@ -219,6 +322,9 @@ export const useQuestionStore = defineStore('question', () => {
|
|||||||
needHideFields,
|
needHideFields,
|
||||||
addNeedHideFields,
|
addNeedHideFields,
|
||||||
removeNeedHideFields,
|
removeNeedHideFields,
|
||||||
getQuestionIndexByField
|
getQuestionIndexByField,
|
||||||
|
quotaMap,
|
||||||
|
initQuotaMap,
|
||||||
|
updateQuotaData
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -26,6 +26,8 @@ const CODE_MAP = {
|
|||||||
ERROR: 500,
|
ERROR: 500,
|
||||||
NO_AUTH: 403
|
NO_AUTH: 403
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const useSurveyStore = defineStore('survey', () => {
|
export const useSurveyStore = defineStore('survey', () => {
|
||||||
const surveyPath = ref('')
|
const surveyPath = ref('')
|
||||||
const isMobile = ref(isInMobile())
|
const isMobile = ref(isInMobile())
|
||||||
@ -110,15 +112,11 @@ export const useSurveyStore = defineStore('survey', () => {
|
|||||||
|
|
||||||
return isSuccess
|
return isSuccess
|
||||||
}
|
}
|
||||||
const initSurvey = (option) => {
|
|
||||||
setEnterTime()
|
|
||||||
|
|
||||||
if (!canFillQuestionnaire(option.baseConf, option.submitConf)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 加载空白页面
|
||||||
|
function clearFormData(option) {
|
||||||
// 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段
|
// 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段
|
||||||
const {
|
const {
|
||||||
questionData,
|
questionData,
|
||||||
@ -137,6 +135,7 @@ export const useSurveyStore = defineStore('survey', () => {
|
|||||||
'pageConf'
|
'pageConf'
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
|
// todo: 建议通过questionStore提供setqueationdata方法修改属性,否则不好跟踪变化
|
||||||
questionStore.questionData = questionData
|
questionStore.questionData = questionData
|
||||||
questionStore.questionSeq = questionSeq
|
questionStore.questionSeq = questionSeq
|
||||||
|
|
||||||
@ -151,8 +150,139 @@ export const useSurveyStore = defineStore('survey', () => {
|
|||||||
formValues.value = _formValues
|
formValues.value = _formValues
|
||||||
whiteData.value = option.whiteData
|
whiteData.value = option.whiteData
|
||||||
pageConf.value = option.pageConf
|
pageConf.value = option.pageConf
|
||||||
|
|
||||||
// 获取已投票数据
|
// 获取已投票数据
|
||||||
questionStore.initVoteData()
|
questionStore.initVoteData()
|
||||||
|
questionStore.initQuotaMap()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载上次填写过的数据到问卷页
|
||||||
|
function loadFormData({bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }, formData) {
|
||||||
|
// 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段
|
||||||
|
const { questionData, questionSeq, rules, formValues } = adapter.generateData({
|
||||||
|
bannerConf,
|
||||||
|
baseConf,
|
||||||
|
bottomConf,
|
||||||
|
dataConf,
|
||||||
|
skinConf,
|
||||||
|
submitConf
|
||||||
|
})
|
||||||
|
|
||||||
|
for(const key in formData){
|
||||||
|
formValues[key] = formData[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将数据设置到state上
|
||||||
|
commit('assignState', {
|
||||||
|
questionData,
|
||||||
|
questionSeq,
|
||||||
|
rules,
|
||||||
|
bannerConf,
|
||||||
|
baseConf,
|
||||||
|
bottomConf,
|
||||||
|
dataConf,
|
||||||
|
skinConf,
|
||||||
|
submitConf,
|
||||||
|
formValues
|
||||||
|
})
|
||||||
|
// 获取已投票数据
|
||||||
|
dispatch('initVoteData')
|
||||||
|
// 获取选项上线选中数据
|
||||||
|
dispatch('initQuotaMap')
|
||||||
|
|
||||||
|
// todo: 建议通过questionStore提供setqueationdata方法修改属性,否则不好跟踪变化
|
||||||
|
questionStore.questionData = questionData
|
||||||
|
questionStore.questionSeq = questionSeq
|
||||||
|
|
||||||
|
// 将数据设置到state上
|
||||||
|
rules.value = rules
|
||||||
|
bannerConf.value = option.bannerConf
|
||||||
|
baseConf.value = option.baseConf
|
||||||
|
bottomConf.value = option.bottomConf
|
||||||
|
dataConf.value = option.dataConf
|
||||||
|
skinConf.value = option.skinConf
|
||||||
|
submitConf.value = option.submitConf
|
||||||
|
formValues.value = _formValues
|
||||||
|
|
||||||
|
whiteData.value = option.whiteData
|
||||||
|
pageConf.value = option.pageConf
|
||||||
|
|
||||||
|
// 获取已投票数据
|
||||||
|
questionStore.initVoteData()
|
||||||
|
questionStore.initQuotaMap()
|
||||||
|
|
||||||
|
}
|
||||||
|
const initSurvey = (option) => {
|
||||||
|
setEnterTime()
|
||||||
|
|
||||||
|
if (!canFillQuestionnaire(option.baseConf, option.submitConf)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const localData = JSON.parse(localStorage.getItem(surveyPath.value + "_questionData"))
|
||||||
|
for(const key in localData){
|
||||||
|
localData[key] = decodeURIComponent(localData[key])
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSubmit = JSON.parse(localStorage.getItem('isSubmit'))
|
||||||
|
if(localData) {
|
||||||
|
if(isSubmit){
|
||||||
|
if(!option.baseConf.backAnswer) {
|
||||||
|
clearFormData(option)
|
||||||
|
} else {
|
||||||
|
confirm({
|
||||||
|
title: "您之前已提交过问卷,是否要回填?",
|
||||||
|
onConfirm: async () => {
|
||||||
|
try {
|
||||||
|
loadFormData(option, localData)
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
} finally {
|
||||||
|
confirm.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onCancel: async() => {
|
||||||
|
try {
|
||||||
|
clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf })
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
} finally {
|
||||||
|
confirm.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!option.baseConf.breakAnswer) {
|
||||||
|
clearFormData(option)
|
||||||
|
} else {
|
||||||
|
confirm({
|
||||||
|
title: "您之前已填写部分内容, 是否要继续填写?",
|
||||||
|
onConfirm: async () => {
|
||||||
|
try {
|
||||||
|
loadFormData(option, localData)
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
} finally {
|
||||||
|
confirm.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onCancel: async() => {
|
||||||
|
try {
|
||||||
|
clearFormData(option)
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
} finally {
|
||||||
|
confirm.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
clearFormData(option)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户输入或者选择后,更新表单数据
|
// 用户输入或者选择后,更新表单数据
|
||||||
|
Loading…
Reference in New Issue
Block a user