Files
fe-manage/src/components/vote/AddVote.vue

717 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: 32px"
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>创建投票</span>
</div>
<div class="btnbox">
<button
class="xkbtn"
@click="showDrawerCreVote"
>
{{ ballotId ? "编辑" : "添加" }}投票
</button>
<div v-if = "ballotId>0">
<a-tag closable color="processing" @close="log">
<span style="font-size:14px;line-height: 33px;" >删除投票</span>
</a-tag></div>
<div>
<CreateVote
v-model:createVoteVisible="createVoteVisible"
v-model:ballotId="ballotId"
v-model:editChild="editChild"
/>
</div>
<button
class="xkbtn"
:style="{ display: creVote ? 'block' : 'none' }"
@click="showDrawerCreVote"
>
编辑投票
</button>
<div :style="{ display: creVote ? 'block' : 'none' }">
<div class="fileTigan">
<span style="color: #388be1">{{ballotName}}</span>
<div class="delBox" @click="dleVoteStem()"></div>
</div>
</div>
</div>
<!-- 创建投票侧弹窗 -->
<div>
<create-vote
v-model:crevoteVisible="crevotevisible"
@getData="getStemId"
v-model:ballotId="ballotId"
/>
</div>
<!-- 创建投票侧弹窗 -->
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">起止时间:</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 424px"
v-model:value="time"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">基础投票数:</span>
</div>
<div class="btnbox">
<a-upload
@change="handleChange"
:multiple="true"
:max-count="1"
action="/manageApi/vote/baseVoteupload"
v-model:file-list="fileList"
>
<button class="xkbtn">点击上传</button></a-upload>
<div v-if="voteCount > 0"><a-tag color="processing"> <span style="font-size:14px;line-height: 33px;" >{{voteCount}}票</span></a-tag></div>
</div>
</div>
<div class="main_item" style="margin-top: -25px">
<div class="signbox"></div>
<div class="btnbox">
<span style="color: #999999">支持xls.xlsx</span>
</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
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";
export default {
name: "AddVote",
components: {
CreateVote
},
props: {
addvoteVisible: {
type: Boolean,
default: false,
},
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:"",
ballotName: "",
editStem: false, //编辑状态
ballotId: 0, //题干id
optionId: "", //删除修改选项id
addStemVisible:false, //
editChild:false,
fileList: [],
voteCount:null,
projectTemplateId:null,
});
const closeDrawer = () => {
state.inputV1 = "",
state.textV1 = "",
state.time = undefined,
state.basevote = "",
state.ballotId ="",
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 handleChange = info => {
let resFileList = [...info.fileList];
resFileList.map(file => {
if (file.response) {
// Component will show file.url as link
file.url = file.response.url;
console.log("file========",file);
console.log("file========",file.response);
state.voteCount = file.response.data;
}
});
//fileList.value = resFileList;
};
//删除题干信息接口
const dleVoteStem = () => {
api.deleteVoteStem({voteStemId:state.ballotId})
.then(() => {
message.success('删除题干信息成功')
})
}
//根据投票id获取投票信息
const queryVoteInfo = ()=>{
api.queryVoteDetailById({voteId:props.EditVoteId})
.then((res)=>{
console.log('获取投票信息成功',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.ballotId = res.data.data.ballotId;
state.time = [
dayjs(res.data.data.voteStartTime, "YYYY-MM-DD"),
dayjs(res.data.data.voteEndTime, "YYYY-MM-DD"),
];
})
.catch((err)=>{
console.log('获取投票信息失败',err);
});
}
const updateToTask =(res)=>{
console.log("props.isLevel=====",props.isLevel);
if(props.isLevel ==1){
RouterEditTask({
chapterId: props.isactive,
courseId: res.data.data.voteId,
name: res.data.data.voteName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 12,
})
.then(() => {
//message.success(`${props.edit ? '编辑' : '新增'}关卡任务成功`)
ctx.emit("changeData", false);
state.addLoading = false;
})
.catch(( ) => {
//message.error(`${props.edit ? '编辑' : '新增'}关卡任务失败`)
});
}else if(props.isLevel ==2){
apiTask
.addTask({
courseId:res.data.data.voteId,
name: res.data.data.voteName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 12,
})
.then(() => {
//message.success(`${props.edit ? '编辑' : '新增'}阶段任务成功`)
ctx.emit("changeData", false);
})
.catch(() => {
////message.error(`${props.edit ? '编辑' : '新增'}阶段任务失败`)
});
}else if (props.isLevel == 3) {
addTempTask({
courseId: res.data.data.voteId,
name: res.data.data.voteName,
projectTemplateId: props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 12,
})
.then(() => {
ctx.emit("changeData", false);
//message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
.catch(() => {
//message.error(`${props.edit ? "编辑" : "新增"}阶段任务失败`);
});
}
}
//修改投票信息接口
const updateVoteInfo = () => {
if (!state.inputV1) {
message.destroy();
return message.info("请输入投票名称");
}
if (!state.ballotId) {
message.destroy();
return message.info("请创建题干信息");
}
if (state.basevote == "") {
state.basevote = 1;
}
if(state.time != undefined){
state.startTime = dayjs(state.time[0]).format("YYYY-MM-DD");
state.endTime = dayjs(state.time[1]).format("YYYY-MM-DD");
}
let obj = {
voteId: props.edit?state.EditVoteId : 0,
voteName: state.inputV1,
voteStartTime: dayjs(state.time[0]).format("YYYY-MM-DD"),
voteEndTime: dayjs(state.time[1]).format("YYYY-MM-DD"),
ballotId: state.ballotId,
baseVote: state.basevote,
voteExplain: state.textV1,
}
if(props.edit){
api
.editVote(obj)
.then((res) => {
console.log("updte======");
updateToTask(res);
closeDrawer();
message.destroy();
message.success("修改投票信息成功")
})
.catch(() => {
message.destroy();
message.error("修改投票信息失败")
})
}else{
api
.createVote(obj)
.then((res) => {
updateToTask(res);
closeDrawer();
message.destroy();
message.success("创建投票信息成功")
})
.catch(() => {
message.destroy();
message.error("创建投票信息失败")
})
}
}
const queryStem = () => {
state.addStemVisible = true;
};
const closeStem = () => {
state.addStemVisible = false;
};
const log = e => {
state.ballotId=null;
console.log(e);
};
return {
...toRefs(state),
showDrawerCreVote,
afterVisibleChange,
closeDrawer,
queryVoteInfo,
dleVoteStem,
updateVoteInfo,
queryStem,
closeStem,
handleChange,
log,
};
},
};
</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: #388be1;
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%;
}
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.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: #388be1;
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>