Files
fe-manage/src/components/drawers/AddEval.vue
2022-12-13 09:11:52 +08:00

589 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<a-drawer :visible="addevalVisible" class="drawerStyle addevalDrawer" width="80%" title="添加测评" placement="right"
@after-visible-change="afterVisibleChange">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ edit ? "编辑" : "添加" }}测评</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer" />
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
</div>
<span style="margin-right: 3px">测评名称</span>
</div>
<div class="btnbox">
<a-input v-model:value="inputV1" style="width: 400px; height: 40px; border-radius: 8px;" placeholder="请输入测评名称"
show-count
:maxlength="20" />
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
</div>
<span style="margin-right: 3px">选择测评</span>
</div>
<div class="btnbox">
<button class="checkEval" @click="showEvalDrawer">
选择测评
</button>
<div v-if="(evaluationTypeName !== '')" style="margin-left:20px">
<a-tag closable @close="delTag" color="processing">
<span style="font-size: 14px; line-height: 33px"
>{{evaluationTypeName}}</span
>
</a-tag>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">有效期</span>
</div>
<div class="btnbox">
<a-range-picker
show-time
style="width: 400px; height: 40px; border-radius: 8px;" v-model:value="time" format="YYYY-MM-DD HH:mm:ss"
:placeholder="[' 开始时间', ' 结束时间']" />
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">测评说明</span>
</div>
<div class="textarea">
<a-textarea show-count :maxlength="200" v-model:value="description" placeholder="请输入测评说明"
style="width:400px;" allowClear :rows="6"/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="creoredit">确定</button>
</div>
</div>
<EvList v-model:EvalListVisible="EvalListVisible" v-model:evaluationTypeName="evaluationTypeName"
@getEvListData="checkFinish" />
<!-- <div class="aeLoading" :style="{display:addLoading?'flex':'none'}">
<a-spin :spinning="addLoading" tip="" />
</div> -->
</a-drawer>
</template>
<script>
import { reactive, toRefs, ref } from "vue";
// import { useRouter } from "vue-router";
import EvList from "./EvList.vue";
import * as api from "../../api/indexEval";
import * as apitaskadd from "../../api/indexTaskadd";
import { message } from "ant-design-vue";
import { RouterEditTask } from "@/api/indexTask";
import dayjs from "dayjs";
import { addTempTask } from "../../api/indexTaskadd";
export default {
name: "AddEval",
components: {
EvList,
},
props: {
addevalVisible: {
type: Boolean,
default: false,
},
EditEvalId: {
type: Number,
default: null,
},
edit: {
// 是否为编辑
type: Boolean,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
routerTaskId: {
type: Number,
default: 0,
},
isLevel: {
// 是否是关卡页面触发
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
time: undefined,
EvalId: null,
//子传回来的参数
evaluationTypeId: null,
evaluationTypeName: '',
description: "",
EvalListVisible: false
// addLoading:false,
});
const checkFinish = (value) => {
state.evaluationTypeId = value.quiz_kid ? value.quiz_kid : null
state.evaluationTypeName = value.title ? value.title : ""
}
const closeDrawer = () => {
ctx.emit("update:addevalVisible", false);
ctx.emit("update:edit", false);
state.inputV1 = "";
state.time = undefined;
state.description = "";
state.evaluationTypeId = 0,
state.evaluationTypeName = "",
localStorage.setItem("stageId", props.chooseStageId);
localStorage.setItem("chapterId", props.isactive);
};
const afterVisibleChange = (bool) => {
if (props.edit && bool) {
queryInvistById();
}
};
const showEvalDrawer = () => {
state.EvalListVisible = true;
};
//删除标签要清除子组件传过来的参数
const delTag = () => {
state.evaluationTypeId = 0;
state.evaluationTypeName = "";
};
//向关卡或阶段渲染
const updateTask = async (value) => {
if(!props.isactive){
message.destroy();
return message.warning("请先选中关卡");
}
if (props.isLevel == 1) {
await RouterEditTask({
chapterId: props.isactive,
courseId: Number(value.evaluationId),
name: value.evaluationName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 10,
})
.then(() => {
//message.success(`${props.EditTestId ? "编辑" : "新增"}关卡任务成功`);
})
.catch(() => {
//message.error(`${props.EditTestId ? "编辑" : "新增"}关卡任务失败`);
});
} else if (props.isLevel == 2) {
await apitaskadd
.addTask({
duration: 0,
flag: true,
courseId: Number(value.evaluationId),
name: value.evaluationName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 10,
})
.then(() => {
//message.destroy()
// message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
.catch(() => {
// message.destroy()
//message.error(`${props.edit ? "编辑" : "新增"}阶段任务失败`);
});
} else if (props.isLevel == 3) {
await addTempTask({
courseId: Number(value.evaluationId),
name: value.evaluationName,
projectTemplateId: Number(localStorage.getItem("projectTemplateId")),
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 10,
})
.then(() => {
//message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
.catch(() => {
//message.error(`${props.edit ? "编辑" : "新增"}阶段任务失败`);
});
}
};
//根据id获取测评信息
const queryInvistById = () => {
let objqi = {
evaluationId: props.EditEvalId,
};
api
.queryEvaluationDetailById(objqi)
.then((res) => {
message.destroy()
message.success("获取测评信息成功");
state.inputV1 = res.data.data.evaluationName;
state.evaluationTypeName = res.data.data.evaluationTypeName;
state.evaluationTypeId = res.data.data.evaluationTypeId;
state.time = res.data.data.evaluationStartTime ? [
dayjs(res.data.data.evaluationStartTime, "YYYY-MM-DD HH:mm:ss"),
dayjs(res.data.data.evaluationEndTime, "YYYY-MM-DD HH:mm:ss"),
] : undefined;
state.description = res.data.data.evaluationExplain;
})
.catch((err) => {
//message.destroy()
// message.error("获取测量平信息失败");
console.log(err, "erererrerererererer");
});
}
// 防止连续点击出现添加多条问题
const prohibitClick = ref(false);
const creoredit = () => {
if(prohibitClick.value){
message.destroy();
message.error('请勿频繁点击')
return
}
prohibitClick.value = true;
if (props.edit) {
editInvistText()
} else {
createEvalText()
}
}
const editInvistText = () => {
if (!state.inputV1) {
message.destroy();
return message.warning("请输入测评名称");
}
if (!state.evaluationTypeId) {
message.destroy();
return message.warning("请选择测评");
}
let objei = {
evaluationName: state.inputV1,
evaluationEndTime: state.time ? dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss") : "",
evaluationId: props.edit ? Number(props.EditEvalId) : 0,
evaluationStartTime: state.time ? dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss") : "",
evaluationTypeId: state.evaluationTypeId,
evaluationTypeName: state.evaluationTypeName,
evaluationExplain: state.description,
evaluationPictureAddress: "",
evaluationTag: "",
updateTime: "",
};
api
.updateEvaluation(objei)
.then(async (res) => {
await updateTask(res.data.data);
closeDrawer();
ctx.emit("changeData", false);
message.destroy();
message.success("创建测评成功");
prohibitClick.value = false;
})
.catch(() => {
message.destroy();
message.error("创建测评失败");
prohibitClick.value = false;
});
}
//创建测评信息
const createEvalText = () => {
if (!state.inputV1) {
message.destroy();
return message.warning("请输入测评名称");
}
if (!state.evaluationTypeId) {
message.destroy();
return message.warning("请选择测评");
}
let obj = {
evaluationName: state.inputV1,
evaluationEndTime: state.time ? dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss") : "",
evaluationId: props.evaluationId,
evaluationStartTime: state.time ? dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss") : "",
evaluationTypeId: state.evaluationTypeId,
evaluationTypeName: state.evaluationTypeName,
evaluationExplain: state.description,
evaluationFlag: "",
evaluationPictureAddress: "",
evaluationTag: "",
updateTime: "",
};
api
.createEvaluation(obj)
.then(async (res) => {
await updateTask(res.data.data);
closeDrawer();
ctx.emit("changeData", false);
message.destroy();
message.success("创建测评成功");
prohibitClick.value = false;
})
.catch(() => {
message.destroy();
message.error("创建测评失败");
prohibitClick.value = false;
});
};
return {
...toRefs(state),
afterVisibleChange,
checkFinish,
closeDrawer,
delTag,
//增改
creoredit,
createEvalText,
queryInvistById,
editInvistText,
showEvalDrawer,
updateTask
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addevalDrawer {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
margin-top: 32px;
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.checkEval {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
.tag-style {
color: rgb(113, 113, 237);
background-color: #d7d1f7;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 423px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
.main_table {
position: relative;
padding-bottom: 80px;
.ant-checkbox-wrapper {
align-items: center;
margin-top: -2px;
}
.ant-table-selection-column {
padding: 0px !important;
padding-left: 5px !important;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.pa {
left: 0;
width: 100%;
display: flex;
justify-content: center;
position: absolute;
bottom: 20px;
}
}
}
}
</style>