评估接口+课程部分

This commit is contained in:
kclf
2022-11-08 15:49:53 +08:00
parent 57509c7e8c
commit 5a647ef48a
25 changed files with 17428 additions and 1199 deletions

View File

@@ -3,244 +3,45 @@
<div class="researchadd">
<div class="header">
<span class="title">创建评估</span>
<router-link to="/researchmanage" class="goback"
><span class="return"></span
><router-link class="returntext" to="/researchmanage"
>返回</router-link
></router-link
>
<router-link to="/researchmanage" class="goback">
<span class="return"></span>
<router-link class="returntext" to="/researchmanage">
返回
</router-link>
</router-link>
</div>
<div class="addtype">
<div class="addtypen">创建评估类型</div>
<div class="types">单选题</div>
<div class="types">多选题</div>
<div class="types">问答题</div>
<div class="types">评分题</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>
<div class="content">
<div class="tagbox">
<div class="tagname">单选题</div>
<div class="deleteop">
<div><img src="../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">标题</div>
</div>
<div class="in">
<a-input
v-model:value="valueE"
placeholder="请输入提干名称"
show-count
:maxlength="20"
style="border-radius: 8px"
/>
</div>
</div>
<div class="options">
<div class="name">
<div class="namebox">
<div class="inname">选项1</div>
</div>
<div class="in">
<a-input
v-model:value="valueE"
show-count
:maxlength="30"
style="border-radius: 8px"
/>
</div>
</div>
<div class="delete">删除</div>
</div>
<div class="name">
<div class="in" style="margin-left: 133px">
<div class="addimg">+添加图片</div>
</div>
</div>
<div class="options">
<div class="name">
<div class="namebox">
<div class="inname">选项2</div>
</div>
<div class="in">
<a-input
v-model:value="valueE"
show-count
:maxlength="30"
style="border-radius: 8px"
/>
</div>
</div>
<div class="delete">删除</div>
</div>
<div class="picture" style="position: relative">
<img
class="pictureimg"
src="../../assets/images/research/picture.png"
/>
<div class="picturename">图片名称1.jpg</div>
<img
style="
cursor: pointer;
width: 20px;
height: 20px;
position: absolute;
right: 0;
top: 0;
"
src="../../assets/images/basicinfo/close.png"
/>
</div>
<div class="name">
<div class="in" style="margin-left: 85px; margin-bottom: 20px">
<a-button
type="primary"
style="
width: 100px;
height: 40px;
border-radius: 8px;
background-color: #409eff;
"
>添加选项</a-button
>
</div>
</div>
</div>
<div class="content">
<div class="tagbox">
<div class="tagname">问答题</div>
<div class="deleteop">
<div><img src="../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">标题</div>
</div>
<div class="in">
<a-input
v-model:value="valueEi"
placeholder="请输入标题名称"
show-count
:maxlength="20"
style="border-radius: 8px"
/>
</div>
</div>
<div class="name name2" style="margin-bottom: 20px">
<div class="namebox">
<div class="inname">描述</div>
</div>
<div class="in">
<a-textarea v-model:value="valueii" style="height: 148px" />
</div>
</div>
</div>
<div class="content">
<div class="tagbox">
<div class="tagname">评分题</div>
<div class="deleteop">
<div><img src="../../assets/images/projectadd/delete.png" /></div>
<div class="del_text">删除选项</div>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">标题</div>
</div>
<div class="in">
<a-input
v-model:value="valueE1"
placeholder="请输入标题名称"
show-count
:maxlength="20"
style="border-radius: 8px"
/>
</div>
</div>
<div class="name">
<div class="namebox">
<div class="inname">最低分</div>
</div>
<div class="in numberInp">
<a-input-number
:value="minScore"
:min="1"
:max="10"
@change="minChange"
/>
</div>
<div class="namebox">
<div class="inname">最高分</div>
</div>
<div class="in numberInp">
<a-input-number
:value="maxScore"
:min="1"
:max="10"
@change="maxChange"
/>
</div>
</div>
<div class="scorebox">
<div class="scoretext">非常满意</div>
<div class="number">
<div
class="btn"
style="margin-left: 10px"
v-for="(value, index) in scoreList"
:key="index"
>
{{ value.text }}
</div>
<!-- <a-button class="btn">2</a-button>
<a-button class="btn">3</a-button>
<a-button class="btn">4</a-button>
<a-button class="btn">5</a-button>
<a-button class="btn">6</a-button>
<a-button class="btn">7</a-button>
<a-button class="btn">8</a-button>
<a-button class="btn">9</a-button>
<a-button class="btn" style="display: flex;align-items:center;margin-right: 10px;justify-content: center">10</a-button> -->
</div>
<div class="scoretext">非常不满意</div>
</div>
<div class="name" style="margin-bottom: 20px">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">配置权重</div>
</div>
<div class="in" style="display: flex">
<div class="assess">
<div class="assesstype">评估类型</div>
<div class="assesswhole">整体评估</div>
</div>
<div class="assess" style="margin-left: 50px; position: relative">
<div class="assesstype">权重比例</div>
<div class="assesswhole" style="background: #ffffff">20</div>
<div class="ratio">%</div>
</div>
</div>
</div>
<div v-for="(item, index) in allFormsData" :key="index">
<ResearchAddSingle
v-if="item.type === 1"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddMulti
v-if="item.type === 2"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddAsk
v-if="item.type === 3"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
<ResearchAddPin
v-if="item.type === 4"
:item="item"
:assessmentId="assessmentId"
@del="handleDel"
/>
</div>
<div class="opinion name2">
<div class="namebox">
@@ -248,7 +49,7 @@
</div>
<div class="in">
<a-textarea
v-model:value="valuep"
v-model:value="valueMore"
style="height: 110px"
show-count
:maxlength="200"
@@ -265,8 +66,10 @@
border-radius: 8px;
background-color: #409eff;
"
>保存</a-button
@click="handleSave"
>
保存
</a-button>
<a-button
type="primary"
ghost
@@ -276,134 +79,524 @@
margin-left: 14px;
border-radius: 8px;
"
>取消</a-button
@click="handleAllCancel"
>
取消
</a-button>
</div>
</div>
</div>
</template>
<script>
import { reactive, toRefs } from "vue";
import { reactive, toRefs, computed } from "vue";
// import { message } from "ant-design-vue";
// import { createResearch } from "../../api/indexResearch";
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 { useRouter } from "vue-router";
import store from "@/store";
import { message } from "ant-design-vue";
export default {
name: "ResearchAdd",
components: {
ResearchAddSingle,
ResearchAddMulti,
ResearchAddAsk,
ResearchAddPin,
},
setup() {
const router = useRouter();
const state = reactive({
minScore: 1,
maxScore: 10,
scoreList: [
{
id: 1,
text: 1,
},
{
id: 2,
text: 2,
},
{
id: 3,
text: 3,
},
{
id: 4,
text: 4,
},
{
id: 5,
text: 5,
},
{
id: 6,
text: 6,
},
{
id: 7,
text: 7,
},
{
id: 8,
text: 8,
},
{
id: 9,
text: 9,
},
{
id: 10,
text: 10,
},
],
scoreListClone: [
{
id: 1,
text: 1,
},
{
id: 2,
text: 2,
},
{
id: 3,
text: 3,
},
{
id: 4,
text: 4,
},
{
id: 5,
text: 5,
},
{
id: 6,
text: 6,
},
{
id: 7,
text: 7,
},
{
id: 8,
text: 8,
},
{
id: 9,
text: 9,
},
{
id: 10,
text: 10,
},
],
assessmentId: "", //编辑时候传
assessmentName: "",
assessmentNameNew: computed(() => store.state.assessmentName),
allFormsData: [],
valueMore: "",
});
const minChange = (e) => {
// console.log("eee", e);
if (e > state.maxScore) return message.info("最低分不能超过最高分");
state.minScore = e;
let arr = state.scoreListClone.concat([]);
arr.map((value, index) => {
if (value.id === e) {
arr = arr.slice(index, state.maxScore);
// 详情
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"); //序号
state.allFormsData = parseData(renderArr, "questionType"); //类型
// console.log("state.allFormsData");
// console.log(state.allFormsData);
}
};
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, {
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, {
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 = {
type: key,
valueAsk: item.assessmentQaTitle,
valueAskDesc: item.assessmentQaDescribe,
optionId: item.assessmentQaId,
};
resultArr.push(obj);
}
if (key === 4) {
obj = {
type: key,
valuePin: item.assessmentScTitle,
minScore: item.assessmentMinScore,
maxScore: item.assessmentMaxScore,
pinQuan: item.weightScale,
optionId: item.assessmentScId,
};
resultArr.push(obj);
}
});
state.scoreList = arr;
resultArr.map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
return resultArr;
};
const maxChange = (e) => {
if (e < state.minScore) return message.info("最高分不能低于最低分");
state.maxScore = e;
let arr = state.scoreListClone.concat([]);
arr.map((value, index) => {
if (value.id === e) {
arr = arr.slice(state.minScore - 1, index + 1);
// 转换成后端格式
const restData = (arr, typeKey) => {
const resultArr = [];
arr.forEach((item) => {
let obj = {};
if (item[typeKey] === 1) {
let restList = traverseArr(item.singleList, {
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, {
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 = {
questionType: item[typeKey],
assessmentQaTitle: item.valueAsk,
assessmentQaDescribe: item.valueAskDesc,
assessmentQaId: item.optionId ? item.optionId : "",
};
resultArr.push(obj);
}
if (item[typeKey] === 4) {
obj = {
questionType: item[typeKey],
assessmentScTitle: item.valuePin,
assessmentMinScore: item.minScore,
assessmentMaxScore: item.maxScore,
weightScale: item.pinQuan,
assessmentScId: item.optionId ? item.optionId : "",
};
resultArr.push(obj);
}
});
state.scoreList = arr;
resultArr.map((itm, idx) => {
itm.orderNumber = idx + 1;
return itm;
});
return resultArr;
};
// 解散传值
const parseItem = (arr) => {
const filterComObj = filterCommon(arr, "questionType");
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,
valueSingle: "",
singleList: [
{
id: 1,
inputVal: "",
imgVal: "",
},
],
};
break;
case 2:
obj = {
type,
id: state.allFormsData.length,
valueMutil: "",
mutilList: [
{
id: 1,
inputVal: "",
imgVal: "",
},
],
};
break;
case 3:
obj = {
type,
id: state.allFormsData.length,
valueAsk: "",
valueAskDesc: "",
};
break;
case 4:
obj = {
type,
id: state.allFormsData.length,
valuePin: "",
minScore: 1,
maxScore: 10,
pinQuan: 100,
};
break;
}
return obj;
};
const handleTypes = (type) => {
state.allFormsData.push(creatFromData(type));
};
const handleDel = ({ id, type, curItem }) => {
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;
});
if (type === 1) {
console.log(11111);
console.log(curItem);
deleteChoiceQuestion({
assessmentId: state.assessmentId,
questionType: "1",
orderNumber: curItem.orderNumber,
}).then((res) => {
console.log(56444);
console.log(res);
});
}
if (type === 2) {
console.log(11111);
console.log(curItem);
deleteChoiceQuestion({
assessmentId: state.assessmentId,
questionType: "2",
orderNumber: curItem.orderNumber,
}).then((res) => {
console.log(56444);
console.log(res);
});
}
if (type === 3) {
console.log(2222);
console.log(curItem);
deleteQuestionScAndQa({
assessmentId: state.assessmentId,
questionType: "3",
optionId: curItem.optionId,
}).then((res) => {
console.log(56444);
console.log(res);
});
}
if (type === 4) {
console.log(2222);
console.log(curItem);
deleteQuestionScAndQa({
assessmentId: state.assessmentId,
questionType: "4",
optionId: curItem.optionId,
}).then((res) => {
console.log(56444);
console.log(res);
});
}
};
const handleSave = () => {
let resultPost = {};
let filterData = parseItem(restData(state.allFormsData, "type"));
// 校验
if (!checkVal(filterData)) {
return false;
}
console.log(12121212);
console.log(filterData);
if (state.assessmentId) {
resultPost = {
assessmentId: state.assessmentId,
assessmentName: state.assessmentName,
assessmentMark: state.valueMore,
...filterData,
};
resultPost = deepCloneFilterString(resultPost, [
"assessmentMaxScore",
"assessmentMinScore",
]);
console.log(1212334);
console.log(resultPost);
editResearchMessage(resultPost).then((res) => {
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;
}
}
}
// 多选
if (
filterData.assessmentMultipleChoiceDtoList &&
filterData.assessmentMultipleChoiceDtoList.length
) {
let arr = filterData.assessmentMultipleChoiceDtoList;
for (let item of arr) {
if (!item.multipleStemName) {
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"]);
}
if (CountNum !== 100) {
message.error("当前权重设置是百分制 请重新配置");
return false;
}
}
// 单选
if (
filterData.assessmentSingleChoiceDtoList &&
filterData.assessmentSingleChoiceDtoList.length
) {
let arr = filterData.assessmentSingleChoiceDtoList;
for (let item of arr) {
if (!item.singleStemName) {
message.error("单选题干为必填 请确认");
return false;
}
}
}
return true;
};
return {
...toRefs(state),
minChange,
maxChange,
handleTypes,
handleSave,
handleAllCancel,
handleDel,
};
},
};
@@ -468,6 +661,10 @@ export default {
align-items: center;
margin: 20px 10px;
}
.typesCur {
color: #fff;
background: #409eff;
}
}
.content {
display: flex;
@@ -541,6 +738,10 @@ export default {
line-height: 24px;
cursor: pointer;
}
.curBtn {
background: #56a3f9;
color: #fff;
}
}
}
.picture {
@@ -712,5 +913,12 @@ export default {
cursor: pointer;
}
}
.uploadContent {
display: block !important;
.uploadBtn {
margin-left: 120px !important;
}
}
}
</style>