init
This commit is contained in:
2025-06-27 17:42:38 +08:00
commit bd6402478b
5317 changed files with 785994 additions and 0 deletions
@@ -0,0 +1,497 @@
<template>
<div id="evaluating">
<div class="history" @click="handleHistory">历史测评</div>
<template v-for="(item, index) in questionnaireData.qsList" :key="index">
<div class="question" v-if="index === questionnaireIndex">
<div class="questionTitle">{{ index + 1 }}{{ item.qsDes }}</div>
<!--1:单选 2:多选 3:是否 4: 填空 5:滑块-->
<template v-if="item.qsType === 1">
<template v-for="(item_, index_) in item.answerList" :key="index_">
<div class="radioDom" @click="radioChange(index, index_)">
<div :class="[item.answerNo.toString().split(',').includes(item_.answerNo.toString()) ? 'active' : '']">
<div>{{ english[index_] }}</div>
<div>{{ item_.answerDesc }}</div>
</div>
</div>
</template>
</template>
<template v-if="item.qsType === 2">
<template v-for="(item_, index_) in item.answerList" :key="index_">
<div class="checkboxDom" @click="checkboxChange(index, index_)">
<div :class="[item.answerNo.toString().split(',').includes(item_.answerNo.toString()) ? 'active' : '']">
<div>{{ english[index_] }}</div>
<div>{{ item_.answerDesc }}</div>
</div>
</div>
</template>
</template>
<template v-if="item.qsType === 4">
<div class="inputDom">
<div>
<input type="text" placeholder="填入答案" v-model="item.answer" @input="inputChange(index)" />
</div>
</div>
</template>
<template v-if="item.qsType === 5">
<div class="sliderDom">
<van-slider v-model="item.answer" :step="1" :min="0" :max="100" @change="sliderChange(index)">
<template #button>
<div class="custom-button">{{ item.answer }}</div>
</template>
</van-slider>
</div>
</template>
</div>
</template>
<div class="btn">
<div v-if="questionnaireBtn === 'next'" @click="nextQuestionnaire()">下一题</div>
<div v-if="questionnaireBtn === 'submit'" @click="submitQuestionnaire()">提交</div>
</div>
<quit-answering :questionnaireIndex="questionnaireIndex" ref="quitAnswering" />
</div>
</template>
<script>
import { psychologicalEvaluationSubmit, questionnaire } from '/@/api/index';
import { defineComponent, reactive, toRefs, onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import { showSuccessToast, showFailToast } from 'vant';
import quitAnswering from '/@/components/quitAnswering.vue';
import { useLoading } from '../../../utils/compUtils';
const { loadingSpinner, loadingClose } = useLoading();
export default defineComponent({
components: {
quitAnswering,
},
setup() {
const router = useRouter();
const quitAnswering = ref(null);
const state = reactive({
english: [
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
],
questionnaireIndex: 0,
questionnaireData: [],
questionnaireBtn: 'next',
backStatus: true,
isClick: true,
});
onMounted(() => {
getQuestionnaire();
});
// 点击选择问题 单选
const radioChange = (index, index_) => {
let qsList = state.questionnaireData.qsList[index];
let answerList = qsList.answerList[index_];
qsList.answerNo = answerList.answerNo;
qsList.answer = answerList.answerDesc;
qsList.qsScore = parseInt(answerList.answerScore);
};
// 点击选择问题 多选
const checkboxChange = (index, index_) => {
let qsList = state.questionnaireData.qsList[index];
let answerNo = qsList.answerNo ? qsList.answerNo.split(',') : [];
let answer = qsList.answer ? qsList.answer.split(',') : [];
let qsScore = qsList.qsScore ? qsList.qsScore.split(',') : [];
let answerList = qsList.answerList[index_];
let answerNoIndexOf = answerNo.indexOf(answerList.answerNo.toString());
if (answerNoIndexOf === -1) {
answerNo.push(answerList.answerNo);
answer.push(answerList.answerDesc);
qsScore.push(answerList.answerScore);
} else {
answerNo.splice(answerNoIndexOf, 1);
answer.splice(answerNoIndexOf, 1);
qsScore.splice(answerNoIndexOf, 1);
}
qsList.answerNo = answerNo.join(',');
qsList.answer = answer.join(',');
qsList.qsScore = qsScore.join(',');
};
// input 输入文字
const inputChange = (index) => {
let qsList = state.questionnaireData.qsList;
qsList[index].answerNo = '';
qsList[index].qsScore = '';
let answer = qsList[index].answer;
let fillType = qsList[index].fillType;
let fieldName = qsList[index].fieldName;
if (fillType === 'n' && answer) {
answer = answer.replace(/\D/g, '');
if (fieldName === 'Children_number') {
if (parseInt(answer) < 18) {
showFailToast({
message: '最小只支持18',
forbidClick: true,
});
answer = 18;
}
if (parseInt(answer) > 70) {
showFailToast({
message: '最大只支持70',
forbidClick: true,
});
answer = 70;
}
}
if (fieldName === 'PSQI_duration') {
if (parseInt(answer) < 0) {
showFailToast({
message: '最小只支持0',
forbidClick: true,
});
answer = 0;
}
if (parseInt(answer) > 24) {
showFailToast({
message: '最大只支持24',
forbidClick: true,
});
answer = 24;
}
}
qsList[index].answer = answer;
}
};
// slider 滑动
const sliderChange = (index) => {
let qsList = state.questionnaireData.qsList;
qsList[index].answerNo = '';
qsList[index].qsScore = '';
};
// 下一题
const nextQuestionnaire = () => {
let questionnaireIndex = state.questionnaireIndex;
let qsListLength = state.questionnaireData.qsList.length - 2;
let answer = state.questionnaireData.qsList[questionnaireIndex].answer;
let qsJumpType = state.questionnaireData.qsList[questionnaireIndex].qsJumpType;
if (answer) {
if (qsJumpType === 0) {
state.questionnaireIndex = questionnaireIndex + 1;
}
if (qsJumpType === 1) {
switch (answer) {
case '未婚':
state.questionnaireIndex = state.questionnaireData.qsList.findIndex((item) => {
return item.qsDes === '您和家人的生活方式是';
});
break;
case '从不倒班':
state.questionnaireIndex = state.questionnaireData.qsList.findIndex((item) => {
return item.qsDes === '您工作地点距离最近的县城有多远(公里)';
});
break;
case '否':
state.questionnaireIndex = state.questionnaireData.qsList.findIndex((item) => {
return item.qsDes === '您是否感觉因油田工作与社会脱节';
});
break;
default:
state.questionnaireIndex = questionnaireIndex + 1;
}
}
if (qsJumpType === 2) {
let i = 1;
if (state.questionnaireData.qsList[questionnaireIndex].qsDes === '我能经常保持愉快的心情和丈夫(妻子、前夫、前妻)相处') {
let b = state.questionnaireData.qsList.findIndex((item) => {
return item.qsDes === '您目前有多少个子女';
});
if (state.questionnaireData.qsList[b].answer === '零个' || !state.questionnaireData.qsList[b].answer) {
i = i + 2;
}
}
state.questionnaireIndex = questionnaireIndex + i;
}
if (qsJumpType === 3) {
let i = 1;
let a = state.questionnaireData.qsList.findIndex((item) => {
return item.qsDes === '婚姻状况';
});
if (state.questionnaireData.qsList[a].answer === '未婚') {
i = i + 4;
}
state.questionnaireIndex = questionnaireIndex + i;
}
state.questionnaireBtn = questionnaireIndex === qsListLength ? 'submit' : 'next';
quitAnswering.value.editBackStatus(questionnaireIndex !== qsListLength);
} else {
showFailToast({
message: '请先回答该问题',
forbidClick: true,
});
}
};
// 提交答案
const submitQuestionnaire = () => {
if (state.isClick) {
loadingSpinner();
let params = JSON.parse(JSON.stringify(state.questionnaireData));
psychologicalEvaluationSubmit(params)
.then((res) => {
loadingClose();
state.isClick = false;
showSuccessToast(res.msg);
setTimeout(() => {
router.replace({
path: '/assessmentResultA',
query: {
serialNo: res.data.serialNo,
},
});
}, 1500);
})
.catch((err) => {
showFailToast({
message: err.msg,
forbidClick: true,
});
});
} else {
showFailToast({
message: '请勿重复提交',
forbidClick: true,
});
}
};
const getQuestionnaire = () => {
let params = {
templateNo: 20000,
};
questionnaire(params)
.then((res) => {
res.data.qsList.map((item) => {
item.answer = '';
item.answerNo = '';
item.qsScore = '';
});
state.questionnaireData = res.data;
})
.catch((err) => {
showFailToast({
message: err.msg,
forbidClick: true,
});
});
};
const handleHistory = () => {
router.push({
path: '/historyA',
});
};
return {
...toRefs(state),
getQuestionnaire,
nextQuestionnaire,
radioChange,
checkboxChange,
inputChange,
sliderChange,
submitQuestionnaire,
quitAnswering,
handleHistory,
};
},
});
</script>
<style lang="less" scoped>
@import '/@/assets/less/index';
#evaluating {
width: 100%;
height: 100%;
.history {
width: 100%;
color: #007aff;
font-size: 14px;
height: 45px;
line-height: 45px;
padding: 0 20px;
text-align: right;
box-sizing: border-box;
}
.question {
width: 100%;
overflow-y: scroll;
padding: 14px 15px 0;
box-sizing: border-box;
height: calc(100% - 100px);
.questionTitle {
color: @zp-text-color;
font-size: 14px;
line-height: 25px;
margin-bottom: 25px;
}
.radioDom {
width: 100%;
> div {
width: 100%;
display: flex;
flex-wrap: nowrap;
align-items: center;
border-radius: 8px;
margin-bottom: 10px;
padding: 12px 20px;
box-sizing: border-box;
background-color: @zp-bg-color-grey;
border: 1px solid @zp-bg-color-grey;
> div {
color: @zp-text-color;
font-size: 13px;
line-height: 22px;
&:first-of-type {
margin-right: 22px;
}
}
}
.active {
background: rgba(31, 145, 242, 0.2);
border: 1px solid @zp-color-primary;
> div {
color: @zp-color-primary;
}
}
}
.checkboxDom {
width: 100%;
> div {
width: 100%;
display: flex;
flex-wrap: nowrap;
align-items: center;
border-radius: 8px;
margin-bottom: 10px;
padding: 12px 20px;
box-sizing: border-box;
background-color: @zp-bg-color-grey;
border: 1px solid @zp-bg-color-grey;
> div {
color: @zp-text-color;
font-size: 13px;
line-height: 22px;
&:first-of-type {
margin-right: 22px;
}
}
}
.active {
background: rgba(33, 190, 189, 0.2);
border: 1px solid @zp-color-primary;
> div {
color: @zp-color-primary;
}
}
}
.inputDom {
width: 100%;
> div {
width: 100%;
padding: 0 20px;
border-radius: 8px;
box-sizing: border-box;
background-color: @zp-bg-color-grey;
border: 1px solid @zp-bg-color-grey;
input {
color: @zp-text-color;
width: 100%;
height: 46px;
font-size: 14px;
line-height: 46px;
}
}
}
.sliderDom {
width: 100%;
margin-top: 40px;
.custom-button {
width: 26px;
color: #fff;
font-size: 10px;
line-height: 18px;
text-align: center;
background-color: var(--van-primary-color);
border-radius: 100px;
}
}
}
.btn {
width: 100%;
height: 55px;
display: flex;
align-items: center;
> div {
color: @zp-text-color-inverse;
width: 250px;
height: 35px;
margin: 0 auto;
font-size: 14px;
line-height: 35px;
text-align: center;
border-radius: 18px;
background: #21bebd;
}
}
}
</style>