--fix 评估重写

This commit is contained in:
yuping
2023-04-14 16:10:41 +08:00
parent 5cb3a9219b
commit 7f42b60444
7 changed files with 384 additions and 1188 deletions

View File

@@ -5,60 +5,24 @@
<span class="title">创建评估</span>
<router-link to="/researchmanage" class="goback">
<span class="return"></span>
<router-link class="returntext" to="/researchmanage">
返回
</router-link>
<router-link class="returntext" to="/researchmanage">返回</router-link>
</router-link>
</div>
<div class="addtype">
<div class="addtypen">创建评估类型</div>
<div class="types" @click="handleTypes(1)">单选题</div>
<div class="types" @click="handleTypes(2)">多选题</div>
<div class="types" @click="handleTypes(3)">问答题</div>
<div class="types" @click="handleTypes(4)">评分题</div>
<div class="types" @click="addSingleItem">单选题</div>
<div class="types" @click="addMultipleItem">多选题</div>
<div class="types" @click="addEssayQuestionItem">问答题</div>
<div class="types" @click="addScoringQuestionItem">评分题</div>
</div>
<div
v-for="(item, index) in allFormsData"
:key="index + new Date().getTime()"
>
<ResearchAddSingle
v-if="item.type === 1 && item.deleted!==true"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddMulti
v-if="item.type === 2 && item.deleted!==true"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddAsk
v-if="item.type === 3 && item.deleted!==true"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddPin
v-if="item.type === 4 && item.deleted!==true"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<div v-if="orderList.length">
<div v-for="(item, index) in orderList" :key="index + new Date().getTime()">
<ResearchAddSingle v-if="item.questionType == 1" :index="item.orderNumber-1" :item="item" :list="data.singleStemVoList"/>
<ResearchAddMulti v-else-if="item.questionType == 2" :index="item.orderNumber-1" :item="item" :list="data.multipleStemVoList"/>
<ResearchAddAsk v-else-if="item.questionType == 3" :index="item.orderNumber-1" :item="item" :list="data.essayQuestionVoList"/>
<ResearchAddPin v-else-if="item.questionType == 4" :index="item.orderNumber-1" :item="item" :list="data.scoringQuestionVoList"/>
</div>
</div>
<!-- <div class="opinion name2">
<div class="namebox">
<div class="inname" style="margin-top: 13px">您的其他意见</div>
</div>
<div class="in">
<a-textarea
v-model:value="valueMore"
style="height: 110px"
show-count
:maxlength="200"
/>
</div>
</div> -->
<div class="footer">
<div class="btn">
<a-button
@@ -70,9 +34,9 @@
background-color: #4ea6ff;
"
:loading="loading"
:disabled="!canSubmit"
@click="handleSave"
>
保存
>保存
</a-button>
<a-button
type="primary"
@@ -86,639 +50,172 @@
background-color: #4ea6ff;
"
@click="handleAllCancel"
>
取消
>取消
</a-button>
</div>
</div>
</div>
</template>
<script>
import {reactive, toRefs} from "vue";
<script setup>
import {computed, ref, watch, watchEffect} from "vue";
import ResearchAddSingle from "./components/ResearchAddSingle.vue";
import ResearchAddMulti from "./components/ResearchAddMulti.vue";
import ResearchAddAsk from "./components/ResearchAddAsk.vue";
import ResearchAddPin from "./components/ResearchAddPin.vue";
import {
sortBy,
traverseArr,
filterCommon,
deepCloneFilterString,
} from "@/utils/utils";
import {
queryResearchDetailById,
editResearchMessage,
createResearch,
// deleteChoiceQuestion,
// deleteQuestionScAndQa,
} from "@/api/indexResearch";
import {editResearchMessage,} from "@/api/indexResearch";
import {useRoute, useRouter} from "vue-router";
import {message} from "ant-design-vue";
import {ASSESSMENT_DETAIL} from "@/api/apis";
import {request} from "@/api/request";
export default {
name: "ResearchAdd",
components: {
ResearchAddSingle,
ResearchAddMulti,
ResearchAddAsk,
ResearchAddPin,
},
setup() {
const router = useRouter();
const route = useRoute();
const state = reactive({
assessmentId: "", //编辑时候传
assessmentName: "",
assessmentNameNew: route.query.name,
allFormsData: [],
valueMore: "",
loading: false,
});
// 详情
const getInfoDate = async () => {
let id = router.currentRoute.value.params.id;
if (id) {
state.assessmentId = id;
let res = await queryResearchDetailById({
assessmentId: state.assessmentId,
}).then((res) => {
if (res.data.code === 200) {
return res.data.data;
}
});
state.assessmentName = res.assessmentName;
state.valueMore = res.assessmentMark;
let renderArr = [
...res.singleStemVoList,
...res.multipleStemVoList,
...res.essayQuestionVoList,
...res.scoringQuestionVoList,
];
sortBy(renderArr, "orderNumber"); //序号
console.log(renderArr)
state.allFormsData = parseData(renderArr, "questionType"); //类型
}
};
getInfoDate();
// 转换成前端格式
const parseData = (arr, typeKey) => {
const resultArr = [];
arr.forEach((item) => {
let key = Number(item[typeKey]);
let obj = {};
if (key === 1) {
let restList = traverseArr(item.assessmentSingleChoiceVoList, {
ids:"id",
deleted:"deleted",
inputVal: "singleOptionName",
imgVal: "singleOptionPictureAddress",
optionId: "singleOptionId",
}).map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
obj = {
type: key,
valueSingle: item.singleStemName,
singleList: restList,
orderNumber: item.orderNumber,
};
resultArr.push(obj);
}
if (key === 2) {
let restList = traverseArr(item.multipleChoiceVoList, {
ids:"id",
deleted:"deleted",
inputVal: "multipleOptionName",
imgVal: "multipleOptionPictureAddress",
optionId: "multipleOptionId",
}).map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
obj = {
type: key,
valueMutil: item.multipleStemName,
mutilList: restList,
orderNumber: item.orderNumber,
};
resultArr.push(obj);
}
if (key === 3) {
obj = {
ids: item.id,
deleted:item.deleted,
type: key,
valueAsk: item.assessmentQaTitle,
valueAskDesc: item.assessmentQaDescribe,
optionId: item.assessmentQaId,
};
resultArr.push(obj);
}
if (key === 4) {
obj = {
ids: item.id,
deleted:item.deleted,
type: key,
valuePin: item.assessmentScTitle,
minScore: item.assessmentMinScore,
maxScore: item.assessmentMaxScore,
pinQuan: item.weightScale,
optionId: item.assessmentScId,
};
resultArr.push(obj);
}
});
resultArr.map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
console.log(resultArr)
return resultArr;
};
// 转换成后端格式
const restData = (arr, typeKey) => {
const resultArr = [];
arr.forEach((item) => {
let obj = {};
if (item[typeKey] === 1) {
let restList = traverseArr(item.singleList, {
id:"ids",
deleted:"deleted",
singleOptionName: "inputVal",
singleOptionPictureAddress: "imgVal",
singleOptionId: "optionId",
}).map((itm, idx) => {
itm.optionOrderNum = idx + 1;
return itm;
});
restList.forEach((item) => {
item.singleOptionId = item.singleOptionId
? item.singleOptionId
: "";
});
obj = {
questionType: item[typeKey],
singleStemName: item.valueSingle,
singleList: restList,
orderNumber: item.orderNumber,
};
resultArr.push(obj);
}
if (item[typeKey] === 2) {
let restList = traverseArr(item.mutilList, {
id:"ids",
deleted:"deleted",
multipleOptionName: "inputVal",
multipleOptionPictureAddress: "imgVal",
multipleOptionId: "optionId",
}).map((itm, idx) => {
itm.optionOrderNum = idx + 1;
return itm;
});
restList.forEach((item) => {
item.multipleOptionId = item.multipleOptionId
? item.multipleOptionId
: "";
});
obj = {
questionType: item[typeKey],
multipleStemName: item.valueMutil,
mutilList: restList,
orderNumber: item.orderNumber,
};
resultArr.push(obj);
}
if (item[typeKey] === 3) {
obj = {
id:item.ids,
deleted:item.deleted,
questionType: item[typeKey],
assessmentQaTitle: item.valueAsk,
assessmentQaDescribe: item.valueAskDesc,
assessmentQaId: item.optionId ? item.optionId : "",
};
resultArr.push(obj);
}
if (item[typeKey] === 4) {
obj = {
id:item.ids,
deleted:item.deleted,
questionType: item[typeKey],
assessmentScTitle: item.valuePin,
assessmentMinScore: item.minScore,
assessmentMaxScore: item.maxScore,
weightScale: item.pinQuan,
assessmentScId: item.optionId ? item.optionId : "",
};
resultArr.push(obj);
}
});
resultArr.map((itm, idx) => {
itm.orderNumber = idx + 1;
return itm;
});
console.log(222);
console.log(resultArr);
return resultArr;
};
// 解散传值
const parseItem = (arr) => {
const filterComObj = filterCommon(arr, "questionType");
console.log('filterComObj')
console.log(filterComObj)
let resultObj = {};
for (let key in filterComObj) {
if (key === "1") {
let arrSingle = filterComObj[key];
let arr = [];
arrSingle.forEach((item) => {
if (item.singleList.length) {
item.singleList.forEach((itm) => {
arr.push({
...itm,
singleStemName: item.singleStemName,
orderNumber: item.orderNumber,
questionType: item.questionType,
});
});
}
});
resultObj.assessmentSingleChoiceDtoList = arr;
}
if (key === "2") {
let arrMulti = filterComObj[key];
let arr = [];
arrMulti.forEach((item) => {
if (item.mutilList.length) {
item.mutilList.forEach((itm) => {
arr.push({
...itm,
multipleStemName: item.multipleStemName,
orderNumber: item.orderNumber,
questionType: item.questionType,
});
});
}
});
resultObj.assessmentMultipleChoiceDtoList = arr;
}
if (key === "3") {
resultObj.assessmentEssayQuestionDtoList = filterComObj[key];
}
if (key === "4") {
resultObj.assessmentScoringQuestionDtoList = filterComObj[key];
}
}
return resultObj;
};
const creatFromData = (type) => {
let obj = {};
switch (type) {
case 1:
obj = {
type,
id: state.allFormsData.length + 1,
valueSingle: "",
deleted: false,
singleList: [
{
id: 1,
inputVal: "",
imgVal: "",
deleted: false,
},
],
};
break;
case 2:
obj = {
type,
id: state.allFormsData.length + 1,
valueMutil: "",
deleted: false,
mutilList: [
{
id: 1,
inputVal: "",
imgVal: "",
deleted: false,
},
],
};
break;
case 3:
obj = {
type,
id: state.allFormsData.length + 1,
valueAsk: "",
valueAskDesc: "",
deleted: false,
};
break;
case 4:
obj = {
type,
id: state.allFormsData.length + 1,
valuePin: "",
minScore: 1,
maxScore: 10,
pinQuan: 100,
deleted: false,
};
break;
}
return obj;
};
const handleTypes = (type) => {
state.allFormsData.push(creatFromData(type));
};
const handleDel = ({ id, type, curItem }) => {
// 接口删除
// if (state.assessmentId && (curItem.orderNumber || curItem.optionId)) {
// if (type === 1) {
// deleteChoiceQuestion({
// assessmentId: state.assessmentId,
// questionType: "1",
// orderNumber: curItem.orderNumber,
// }).then((res) => {
// if (res.data.code === 200) {
// virtualDel(id);
// }
// });
// }
// if (type === 2) {
// deleteChoiceQuestion({
// assessmentId: state.assessmentId,
// questionType: "2",
// orderNumber: curItem.orderNumber,
// }).then((res) => {
// if (res.data.code === 200) {
// virtualDel(id);
// }
// });
// }
// if (type === 3) {
// deleteQuestionScAndQa({
// assessmentId: state.assessmentId,
// questionType: "3",
// optionId: curItem.optionId,
// }).then((res) => {
// if (res.data.code === 200) {
// virtualDel(id);
// }
// });
// }
// if (type === 4) {
// deleteQuestionScAndQa({
// assessmentId: state.assessmentId,
// questionType: "4",
// optionId: curItem.optionId,
// }).then((res) => {
// if (res.data.code === 200) {
// virtualDel(id);
// }
// });
// }
// } else {
// virtualDel(id);
// }
if (state.assessmentId && (curItem.orderNumber || curItem.optionId)) {
if (type === 1) {
virtualDel(id);
}
if (type === 2) {
virtualDel(id);
}
if (type === 3) {
virtualDel(id);
}
if (type === 4) {
virtualDel(id);
}
} else {
virtualDel(id);
}
};
const virtualDel = (id) => {
// 前端删除
// state.allFormsData.forEach((item, index) => {
// if (item.id === id) {
// state.allFormsData.splice(index, 1);
// }
// });
// state.allFormsData.map((item, index) => {
// item.id = index + 1;
// return item;
// });
// 前端删除
state.allFormsData.forEach((item, index) => {
if (item.id === id) {
state.allFormsData[index].deleted = true;
}
});
};
// 处理id为空的字段
const formatID = (data) => {
let obj = {}
for(let i in data){
if(i=="assessmentSingleChoiceDtoList"){
let arr1 = []
for(let k=0;k<data[i].length;k++){
if(data[i][k].id!==undefined){
arr1.push(data[i][k])
}else{
let obj1 = {...data[i][k]}
delete obj1.id
delete obj1.deleted
arr1.push(obj1)
}
}
obj.assessmentSingleChoiceDtoList = arr1;
}
if(i=="assessmentMultipleChoiceDtoList"){
let arr1 = []
for(let k=0;k<data[i].length;k++){
if(data[i][k].id!==undefined){
arr1.push(data[i][k])
}else{
let obj1 = {...data[i][k]}
delete obj1.id
arr1.push(obj1)
}
}
obj.assessmentMultipleChoiceDtoList = arr1;
}
if(i=="assessmentEssayQuestionDtoList"){
let arr1 = []
for(let k=0;k<data[i].length;k++){
if(data[i][k].id!==undefined){
arr1.push(data[i][k])
}else{
let obj1 = {...data[i][k]}
delete obj1.id
arr1.push(obj1)
}
}
obj.assessmentEssayQuestionDtoList = arr1;
}
if(i=="assessmentScoringQuestionDtoList"){
let arr1 = []
for(let k=0;k<data[i].length;k++){
if(data[i][k].id!==undefined){
arr1.push(data[i][k])
}else{
let obj1 = {...data[i][k]}
delete obj1.id
delete obj1.deleted
arr1.push(obj1)
}
}
obj.assessmentScoringQuestionDtoList = arr1;
}
}
console.log(obj)
return obj
}
const handleSave = () => {
let resultPost = {};
let filterData = formatID(parseItem(restData(state.allFormsData, "type")));
// 处理id为undefined得字段
console.log('mmmmmmmmm------->',filterData)
// 校验
if (!checkVal(filterData)) {
return false;
}
state.loading = true;
if (state.assessmentId) {
resultPost = {
id: state.assessmentId,
assessmentName: state.assessmentName,
assessmentMark: state.valueMore,
...filterData,
};
resultPost = deepCloneFilterString(resultPost, [
"assessmentMaxScore",
"assessmentMinScore",
]);
editResearchMessage(resultPost).then((res) => {
state.loading = false;
if (res.data.code === 200) {
message.success("编辑成功");
router.push({
path: "/researchmanage",
});
}
});
} else {
resultPost = {
assessmentName: state.assessmentNameNew,
assessmentMark: state.valueMore,
...filterData,
};
resultPost = deepCloneFilterString(resultPost, [
"assessmentMaxScore",
"assessmentMinScore",
]);
createResearch(resultPost).then((res) => {
if (res.data.code === 200) {
message.success("创建成功");
router.push({
path: "/researchmanage",
});
}
});
}
};
const handleAllCancel = () => {
state.allFormsData = [];
router.push({
path: "/researchmanage",
});
};
const checkVal = (filterData) => {
// 问答
if (
filterData.assessmentEssayQuestionDtoList &&
filterData.assessmentEssayQuestionDtoList.length
) {
let arr = filterData.assessmentEssayQuestionDtoList;
for (let item of arr) {
if (!item.assessmentQaTitle) {
message.error("问答题干为必填 请确认");
return false;
}
}
}
// 多选
console.log(filterData.assessmentMultipleChoiceDtoList);
if(filterData.assessmentMultipleChoiceDtoList && !filterData.assessmentMultipleChoiceDtoList.some(t=>!t.deleted)){
message.error("多选题最少添加一个选项!");
return false;
}
if(filterData.assessmentMultipleChoiceDtoList?.some((item) => !item.deleted && (!item.multipleStemName || !item.multipleOptionName))){
message.error("多选题干或选项为必填 请确认!");
return false;
}
// 评分
if (
filterData.assessmentScoringQuestionDtoList &&
filterData.assessmentScoringQuestionDtoList.length
) {
let CountNum = 0;
let CountArr = filterData.assessmentScoringQuestionDtoList;
for (let item of CountArr) {
if (!item.assessmentScTitle) {
message.error("评分题干为必填 请确认");
return false;
}
CountNum += Number(item["weightScale"]);
}
// console.log("CountNum");
// console.log(CountNum);
// if(CountNum>100){
// CountNum = 100;
// }
if (CountNum !== 100) {
message.error("当前权重设置是百分制 请重新配置");
return false;
}
}
// 单选
if(filterData.assessmentSingleChoiceDtoList && !filterData.assessmentSingleChoiceDtoList.length){
message.error("单选题最少添加一个选项!");
return false;
}
if(filterData.assessmentSingleChoiceDtoList?.some((item) => !item.deleted && (!item.singleStemName || !item.singleOptionName))){
message.error("单选题干或选项为必填 请确认!");
return false;
}
return true;
};
return {
...toRefs(state),
handleTypes,
handleSave,
handleAllCancel,
handleDel,
};
},
const router = useRouter();
const loading = ref(false);
const { params: { id }, query: { name:assessmentName } } = useRoute();
const data = ref({
assessmentName,
singleStemVoList: [],
multipleStemVoList: [],
essayQuestionVoList: [],
scoringQuestionVoList: []
});
const canSubmit = computed(()=>data.value.singleStemVoList.length || data.value.multipleStemVoList.length || data.value.essayQuestionVoList.length || data.value.scoringQuestionVoList.length)
const orderList = computed(()=>[...data.value.singleStemVoList.filter(t=>!t.deleted),...data.value.multipleStemVoList.filter(t=>!t.deleted),...data.value.essayQuestionVoList.filter(t=>!t.deleted),...data.value.scoringQuestionVoList.filter(t=>!t.deleted)].sort((a,b)=>a.orderNumber-b.orderNumber))
watch(()=>orderList.value.length,()=> orderList.value.forEach((t,i)=>t.orderNumber = i + 1))
watchEffect(() => id && request(ASSESSMENT_DETAIL(id), {}).then((res) => data.value = res.data));
const handleSave = () => {
console.log(data);
loading.value = true;
// 校验
if (!checkVal()) {
loading.value = false;
return false;
}
editResearchMessage({
id,
assessmentName: data.value.assessmentName,
assessmentSingleChoiceDtoList: data.value.singleStemVoList.flatMap(t=>t.assessmentSingleChoiceVoList.map(s=>({...s,deleted:(t.deleted || s.deleted),singleStemName:t.singleStemName}))),
assessmentMultipleChoiceDtoList: data.value.multipleStemVoList.flatMap(t=>t.multipleChoiceVoList.map(s=>({...s,deleted:(t.deleted || s.deleted),multipleStemName:t.multipleStemName}))),
assessmentEssayQuestionDtoList: data.value.essayQuestionVoList,
assessmentScoringQuestionDtoList: data.value.scoringQuestionVoList
}).then(() => {
loading.value = false;
message.success("编辑成功");
router.push({ path: "/researchmanage"});
});
};
const handleAllCancel = () => router.push({ path: "/researchmanage" });
function addSingleItem() {
data.value.singleStemVoList.push({
questionType: 1,
singleStemName: "",
orderNumber: orderList.value?.length + 1,
assessmentSingleChoiceVoList: [
{
questionType: 1,
singleOptionName: "",
singleOptionPictureAddress: "",
singleStemName: "",
deleted: false,
orderNumber: (data.value?.singleStemVoList?.length || 0) + 1,
optionOrderNum: 1
},
{
questionType: 1,
singleOptionName: "",
singleOptionPictureAddress: "",
singleStemName: "",
deleted: false,
orderNumber: (data.value?.singleStemVoList?.length || 0) + 1,
optionOrderNum: 2
}
],
deleted: false,
});
}
function addMultipleItem() {
data.value.multipleStemVoList.push({
questionType: 2,
multipleStemName: "",
orderNumber: orderList.value?.length + 1,
multipleChoiceVoList: [
{
questionType: 2,
multipleOptionName: "",
multipleOptionPictureAddress: "",
multipleStemName: "",
deleted: false,
orderNumber: (data.value?.multipleStemVoList?.length || 0) + 1,
optionOrderNum: 1
},
{
questionType: 2,
multipleOptionName: "",
multipleOptionPictureAddress: "",
multipleStemName: "",
deleted: false,
orderNumber: (data.value?.multipleStemVoList?.length || 0) + 1,
optionOrderNum: 2
}
],
deleted: false,
});
}
function addEssayQuestionItem() {
data.value.essayQuestionVoList.push({
questionType: 3,
assessmentQaTitle: "",
orderNumber: orderList.value?.length + 1,
deleted: false,
});
}
function addScoringQuestionItem() {
data.value.scoringQuestionVoList.push({
questionType: 4,
assessmentScTitle: "",
assessmentMaxScore: 10,
assessmentMinScore: 1,
weightScale: 100,
orderNumber: orderList.value?.length + 1,
deleted: false,
});
}
const checkVal = () => {
// 问答
if (data.value.essayQuestionVoList.length && data.value.essayQuestionVoList?.some((item) => !item.deleted && (!item.assessmentQaTitle))) {
message.error("问答题干为必填 请确认!");
return false;
}
// 多选
if (data.value.multipleStemVoList.length && data.value.multipleStemVoList.some(t => !t.deleted && t.multipleChoiceVoList.filter(s=>!s.deleted)?.length < 2)) {
message.error("多选题最少添加两个选项!");
return false;
}
if (data.value.multipleStemVoList.length && data.value.multipleStemVoList?.some((item) => !item.deleted && (!item.multipleStemName || item.multipleChoiceVoList?.some((t) => !t.deleted && !t.multipleOptionName)))) {
message.error("多选题干或选项为必填 请确认!");
return false;
}
// 评分
if (data.value.scoringQuestionVoList.length && data.value.scoringQuestionVoList?.some((item) => !item.deleted && (!item.assessmentScTitle))) {
message.error("评分题干为必填 请确认!");
return false;
}
if (data.value.scoringQuestionVoList.length && data.value.scoringQuestionVoList.reduce((pre, cur) => pre + parseInt(cur.weightScale), 0) !== 100) {
message.error("当前权重设置是百分制 请重新配置");
return false;
}
// 单选
if (data.value.singleStemVoList.length && data.value.singleStemVoList.some(t => !t.deleted && t.assessmentSingleChoiceVoList.filter(s=>!s.deleted)?.length < 2)) {
message.error("单选题最少添加两个选项!");
return false;
}
if (data.value.singleStemVoList.length && data.value.singleStemVoList?.some((item) => !item.deleted && (!item.singleStemName || item.assessmentSingleChoiceVoList.some(option=>!option.deleted && !option.singleOptionName)))) {
message.error("单选题干或选项为必填 请确认!");
return false;
}
return true;
};
</script>
<style lang="scss">
.researchadd {