Files
fe-manage/src/components/vote/AddVote.vue
2023-02-13 21:50:54 +08:00

753 lines
20 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="addvoteVisible"
class="drawerStyle addvoteDrawer"
width="80%"
title="添加投票"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div v-if="edit" class="headerTitle">编辑投票任务</div>
<div v-else class="headerTitle">添加投票任务</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: 424px; height: 40px; border-radius: 8px;"
placeholder="请输入投票任务名称"
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="select">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
:disabled-date="disabledDate" :disabled-time="disabledRangeTime"
format="YYYY-MM-DD HH:mm"
style="width: 424px"
v-model:value="time"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span>创建投票题干</span>
</div>
<div class="btnbox">
<button class="xkbtn" @click="showDrawerCreVote">
{{ voteId ? "编辑" : "创建" }}投票题干
</button>
<div v-if="voteId">
<a-tag closable color="processing" @close="handlelog">
<span style="font-size: 14px; line-height: 33px">
删除投票题干
</span>
</a-tag>
</div>
<div>
<CreateVote
v-model:createVoteVisible="createVoteVisible"
v-model:voteId="voteId"
/>
</div>
<button
class="xkbtn"
:style="{ display: creVote ? 'block' : 'none' }"
@click="showDrawerCreVote"
>
编辑投票
</button>
<div :style="{ display: creVote ? 'block' : 'none' }">
<div class="fileTigan">
<span style="color: #4ea6ff">{{ voteName }}</span>
<div class="delBox" @click="dleVoteStem()"></div>
</div>
</div>
</div>
<!-- 创建投票侧弹窗 -->
<div>
<create-vote
v-model:crevoteVisible="crevotevisible"
v-model:voteId="voteId"
/>
</div>
<!-- 创建投票侧弹窗 -->
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">投票说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="textV1"
placeholder="请输入投票说明"
allow-clear
:rows="6"
maxlength="150"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer()">取消</button>
<button class="btn2" @click="updateVoteInfo()">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import {reactive, toRefs} from "vue";
import CreateVote from "./CreateVote.vue";
import * as api from "../../api/indexVote";
import {message} from "ant-design-vue";
import {RouterEditTask} from "@/api/indexTask";
import dayjs from "dayjs";
import * as apiTask from "../../api/indexTaskadd";
import {addTempTask} from "../../api/indexTaskadd";
import {baseVoteupload} from "../../api/indexEval";
export default {
name: "AddVote",
components: {
CreateVote,
},
props: {
addvoteVisible: {
type: Boolean,
default: false,
},
taskIdDraft: {
type: Number,
default: null,
},
edit: {
type: Boolean,
default: false,
},
EditVoteId: {
type: Number,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
routerTaskId: {
type: Number,
default: 0,
},
isLevel: {
// 是否是关卡页面触发
type: Number,
default: null,
},
projectTaskId: {
// 要编辑的projectId
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
projectTemplateId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
textV1: "",
createVoteVisible: false,
time: undefined,
startTime: "",
endTime: "",
basevote: "",
ascriptionId: "",
voteStemId: null,
EditVoteId: "",
voteStemName: "",
ballot_name: "",
editStem: false, //编辑状态
voteId: '', //题干id
optionId: "", //删除修改选项id
addStemVisible: false, //
editChild: false,
fileList: [],
voteCount: null,
projectTemplateId: null,
});
const closeDrawer = () => {
state.inputV1 = "";
state.textV1 = "";
state.time = undefined;
state.basevote = "";
state.voteId = "";
ctx.emit("update:addvoteVisible", false);
ctx.emit("update:edit", false);
};
const afterVisibleChange = (bool) => {
if (props.edit && bool) {
queryVoteInfo();
}
state.projectTemplateId = props.projectTemplateId;
console.log("projectTemplateId visible====", state.projectTemplateId);
};
const showDrawerCreVote = () => {
state.createVoteVisible = true;
state.editChild = props.edit;
};
// 限制文件格式上传
const beforeUpload = (file) => {
if (file.type.indexOf("sheet") == -1) {
message.destroy();
message.error("请上传正确的文件格式");
state.fileList = [];
return false;
}
const formData = new FormData();
formData.append("uploadFile", file);
baseVoteupload(formData).then((res) => {
if (res.data.code === 200) {
state.basevote = res.data.data;
}
});
return false;
};
//删除题干信息接口
const dleVoteStem = () => {
api.deleteVoteStem({voteStemId: state.voteId}).then(() => {
message.success("删除题干信息成功");
});
};
//根据投票id获取投票信息
const queryVoteInfo = () => {
api.queryVoteDetailById(props.EditVoteId)
.then((res) => {
state.inputV1 = res.data.data.voteName;
state.textV1 = res.data.data.voteExplain;
state.baseVote = res.data.data.baseVote;
state.ascriptionId = res.data.data.ascriptionId;
state.voteId = res.data.data.id;
state.time = [
dayjs(res.data.data.voteStartTime, "YYYY-MM-DD HH:mm"),
dayjs(res.data.data.voteEndTime, "YYYY-MM-DD HH:mm"),
];
})
};
const updateToTask = (res) => {
console.log("props.isLevel=====", props.isLevel);
if (props.isLevel == 1) {
if (!props.isactive) {
message.destroy();
return message.warning("请先选中关卡");
}
RouterEditTask({
chapterId: props.isactive,
courseId: res.data.data.id,
name: res.data.data.voteName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 12,
id: props.taskIdDraft
}).then(() => {
ctx.emit("changeData", false);
state.addLoading = false;
})
} else if (props.isLevel == 2) {
apiTask.addTask({
courseId: res.data.data.id,
name: res.data.data.voteName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 12,
id: props.taskIdDraft
})
.then(() => {
ctx.emit("changeData", false);
})
} else if (props.isLevel == 3) {
addTempTask({
courseId: res.data.data.id,
name: res.data.data.voteName,
projectTemplateId: props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 12,
id: props.taskIdDraft
})
.then(() => {
ctx.emit("changeData", false);
//message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
}
};
//修改投票信息接口
const updateVoteInfo = () => {
if (!state.inputV1) {
message.destroy();
return message.warning("请输入投票名称");
}
if (!state.voteId) {
message.destroy();
return message.warning("请创建题干信息");
}
if (!state.time) {
message.destroy();
return message.warning("请输入起止时间");
}
if (state.time) {
state.startTime = dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss");
state.endTime = dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss");
}
let obj = {
voteName: state.inputV1,
voteStartTime: dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss"),
voteEndTime: dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss"),
id: state.voteId,
voteExplain: state.textV1,
};
api.editVote(obj).then(async (res) => {
await updateToTask(res);
closeDrawer();
message.destroy();
message.success(props.edit ? "修改投票信息成功" : "添加投票信息成功");
})
};
const queryStem = () => {
state.addStemVisible = true;
};
const closeStem = () => {
state.addStemVisible = false;
};
const handlelog = (e) => {
state.ballotId = null;
console.log(e);
};
function downloadTemplate() {
window.open("/manageApi/投票基础数据模版.xlsx");
}
return {
...toRefs(state),
downloadTemplate,
showDrawerCreVote,
afterVisibleChange,
closeDrawer,
queryVoteInfo,
dleVoteStem,
updateVoteInfo,
queryStem,
closeStem,
beforeUpload,
handlelog,
};
},
};
</script>
<style lang="scss">
.ConfirmModal {
.ant-modal {
width: 424px !important;
height: 258px !important;
.ant-modal-content {
width: 424px !important;
height: 258px !important;
.ant-modal-body {
width: 424px !important;
height: 258px !important;
padding: 0 !important;
.delete {
z-index: 999;
width: 424px;
height: 258px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
border-radius: 4px;
.del_header {
position: absolute;
width: calc(100%);
height: 40px;
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
.del_main {
width: 100%;
position: relative;
.header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/QR.png);
background-size: 100% 100%;
}
.close_exit {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.body {
width: 100%;
margin: 34px auto 56px auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
.back {
position: absolute;
top: 30px;
font-size: 12px;
font-weight: 400;
color: #666666;
}
}
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addvoteDrawer {
.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 {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
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;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
margin-right: 10px;
}
.fileTigan {
display: flex;
align-items: center;
padding: 3px 5px;
background-color: rgba(42, 103, 209, 0.4);
span {
margin-right: 5px;
}
.delBox {
width: 13px;
height: 13px;
background-image: url(@/assets/images/basicinfo/ch.png);
background-size: 100% 100%;
border-radius: 50%;
}
}
}
}
.in {
element.style {
border-radius: 8px;
}
.ant-input-affix-wrapper {
position: relative;
display: inline-block;
width: 132%;
/* min-width: 19px; */
padding: 4px 11px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 1.5715;
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 2px;
transition: all 0.3s;
display: inline-flex;
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 423px;
.ant-input {
width: 355px;
}
.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;
}
}
}
}
</style>