Files
fe-manage/src/components/vote/CreateVote.vue
2023-02-13 19:25:35 +08:00

427 lines
9.8 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="createVoteVisible"
class="drawerStyle createvoteDrawer"
width="100%"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="researchadd">
<div class="header">
<div class="headerTitle">{{ ballotId ? "编辑投票题干" : "创建投票题干" }}</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt="asterisk"
/>
</div>
<span>创建题干</span>
</div>
<div class="btnbox">
<button class="xkbtn" @click="handleTypes">添加题干</button>
</div>
</div>
</div>
<div
v-for="(item, index) in allFormsData"
:key="index + new Date().getTime()"
>
<VoteQuestion :item="item" @del="handleDel"/>
</div>
<div class="footer">
<div class="btn">
<a-button
type="primary"
style="
width: 100px;
height: 40px;
border-radius: 8px;
background-color: #4ea6ff;
"
@click="handleSave"
>
保存
</a-button>
<a-button
type="primary"
ghost
style="
width: 100px;
height: 40px;
margin-left: 14px;
border-radius: 8px;
"
@click="closeDrawer"
>
取消
</a-button>
</div>
</div>
</div>
</a-drawer>
</template>
<script>
import {reactive, toRefs, toRef, watch} from "vue";
import {message} from "ant-design-vue";
import VoteQuestion from "./VoteQuestion.vue";
import {sortBy, traverseArr} from "../../utils/utils";
import * as api from "@/api/indexVote";
export default {
name: "CreateVote",
components: {
VoteQuestion,
},
props: {
createVoteVisible: {
type: Boolean,
default: false,
},
voteId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const ballotIdWatch = toRef(props, "voteId");
const state = reactive({
voteId: "",
allFormsData: [],
});
watch(ballotIdWatch, (newValue) => {
if (!newValue) {
state.voteId = "";
state.allFormsData = [];
}
});
const afterVisibleChange = () => {
if (props.voteId) {
getInfoDate();
} else {
handleTypes();
}
};
const closeDrawer = () => {
handleAllCancel();
ctx.emit("update:createVoteVisible", false);
ctx.emit("update:voteId", state.voteId);
};
// 详情
const getInfoDate = async () => {
if (props.voteId) {
let res = await api.queryStemByStemId(props.voteId).then((res) => res.data.data);
state.voteId = res.id;
let renderArr = [...res.voteStemDtoList];
sortBy(renderArr, "orderNumber"); //序号
state.allFormsData = parseData(renderArr);
}
};
// 转换成前端格式
const parseData = (arr) => {
const resultArr = [];
console.log("arr.voteStemVoList=====", arr);
arr.forEach((item) => {
let obj = {};
let restList = traverseArr(item.optionDetailList, {
inputVal: "optionName",
imgVal: "optionPictureAddress",
optionId: "optionId",
voteStemId: "voteStemId",
stem: "stem",
}).map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
obj = {
valueSingle: item.voteStemName,
optionDetailList: restList,
orderNumber: item.orderNumber,
voteStemId: item.voteStemId,
};
resultArr.push(obj);
});
resultArr.map((itm, idx) => {
itm.id = idx + 1;
return itm;
});
return resultArr;
};
// 转换成后端格式
const restData = (arr) => {
const resultArr = [];
arr.forEach((item) => {
let obj = {};
console.log("item=======", item);
let restList = traverseArr(item.optionDetailList, {
optionName: "inputVal",
optionPictureAddress: "imgVal",
optionId: "optionId",
voteStemId: "voteStemId",
stem: "stem",
}).map((itm, idx) => {
itm.optionOrderNum = idx + 1;
return itm;
});
restList.forEach((item) => {
item.optionId = item.optionId ? item.optionId : "";
});
obj = {
voteStemName: item.valueSingle,
optionDetailList: restList,
orderNumber: item.orderNumber,
voteStemId: item.voteStemId,
};
resultArr.push(obj);
console.log("resultArr=======", resultArr);
});
resultArr.map((itm, idx) => {
itm.orderNumber = idx + 1;
return itm;
});
return resultArr;
};
const handleTypes = () => {
let obj = {
id: state.allFormsData.length + 1,
valueSingle: "",
optionDetailList: [
{
id: 1,
inputVal: "",
imgVal: "",
},
{
id: 2,
inputVal: "",
imgVal: "",
},
],
};
state.allFormsData.push(obj);
};
const handleDel = ({id, curItem}) => {
if (state.allFormsData.length > 1) {
// 接口删除
if (curItem.voteStemId) {
api.deleteVoteStem(curItem.voteStemId).then((res) => {
if (res.data.code === 200) {
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;
});
};
const handleSave = () => {
let filterData = restData(state.allFormsData);
if (!checkVal(filterData)) {
return false;
}
api.createStemMessage({
id: state.voteId,
voteStemDtoList: filterData,
}).then((res) => {
message.success(state.voteId ? "修改成功" : "创建成功");
state.voteId = res.data.data.id;
closeDrawer();
});
};
const handleAllCancel = () => {
state.allFormsData = [];
};
const checkVal = (filterData) => {
for (let item of filterData) {
if (!item.voteStemName) {
message.error("题干为必填 请确认");
return false;
}
}
return true;
};
return {
...toRefs(state),
handleTypes,
handleSave,
handleAllCancel,
handleDel,
afterVisibleChange,
closeDrawer,
};
},
};
</script>
<style lang="scss">
.researchadd {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
margin-bottom: 25px;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.main_left {
margin-left: 50px;
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
.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%;
}
}
}
}
.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: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
</style>