Files
fe-manage/src/components/growthpath/GrowthEval.vue
Pengxiansen 76a7070020 提交
2025-02-24 20:24:27 +08:00

507 lines
12 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>
<div @click="openDrawer()">
<slot></slot>
</div>
<a-drawer
:visible="visible"
class="drawerStyle growth-eval"
width="800"
title="添加测评"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
{{ title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<template v-if="step == 1">
<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="formData.info.evaluationName"
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" @click="selectEval">
<button class="checkEval">
{{ formData.info.evaluationTypeName ? "修改" : "选择" }}测评
</button>
<div
v-if="formData.info.evaluationTypeName"
style="margin-left: 20px"
>
<a-tag closable @close="delTag" color="processing">
<span style="font-size: 14px; line-height: 33px">{{
formData.info.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="{ format: 'HH:mm' }"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
@change="timeChange"
: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="formData.info.evaluationExplain"
placeholder="请输入测评说明"
style="width: 400px"
allowClear
:rows="6"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</template>
<div v-show="step == 2">
<EvList
:selectId="formData.info.evaluationTypeId"
ref="EvListRef"
@confirm="selectEvalConfirm"
>
</EvList>
</div>
</div>
</a-drawer>
</template>
<script setup>
import { defineEmits, defineProps, ref, computed } from "vue";
import EvList from "./EvList.vue";
import { Form, message } from "ant-design-vue";
import dayjs from "dayjs";
import { useResetRef } from "@/utils/useCommon";
import { saveTask } from "@/api/growthpath";
const props = defineProps({
type: Number,
// 选秀2 必修1
activeKey: String,
growId: String,
});
// 步骤数
const step = ref(1);
// 弹框标题
const title = computed(() => {
if (step.value == 1) {
return formData.value.id ? "编辑测评" : "添加测评";
} else if (step.value == 2) {
return "选择测评";
}
});
// 选择测评
const selectEval = () => {
step.value = 2;
};
// 选择测评完毕
const selectEvalConfirm = (data) => {
step.value = step.value - 1;
formData.value.info.evaluationTypeId = data.id;
formData.value.info.evaluationTypeName = data.title;
};
const visible = ref(false);
const formData = useResetRef({
info: {
evaluationName: "",
evaluationTypeId: "",
evaluationTypeName: "",
evaluationExplain: "",
evaluationStartTime: "",
evaluationEndTime: "",
},
});
const emit = defineEmits(["refresh"]);
const dateTime = ref([]);
const rulesRef = ref({
evaluationName: [
{
required: true,
message: "请输入测评名称",
},
],
evaluationTypeId: [
{
required: true,
message: "请选择测评",
},
],
evaluationTypeName: [
{
required: true,
message: "请选择测评",
},
],
});
let validate = Form.useForm(formData.value.info, rulesRef).validate;
const closeDrawer = () => {
if (step.value > 1) {
step.value = step.value - 1;
} else {
visible.value = false;
dateTime.value = [];
formData.reset();
formData.value.info = {};
}
};
const range = (start, end) => {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
};
function timeChange(time, timeStr) {
formData.value.info.evaluationStartTime = timeStr[0];
formData.value.info.evaluationEndTime = timeStr[1];
}
const disabledDate = (current) => {
return current && current < dayjs().startOf("day");
};
const disabledRangeTime = () => ({
// disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56],
});
function delTag() {
formData.value.info.evaluationTypeId = "";
formData.value.info.evaluationTypeName = "";
}
async function confirm() {
await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过");
});
// 专业力ID
formData.value.growthId = props.growId;
// 任务类型
formData.value.taskType = props.type;
// 必修/选修
formData.value.type = props.activeKey;
// 任务名称
formData.value.taskName = formData.value.info.evaluationName;
saveTask(formData.value).then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else {
message.error(res.msg);
}
closeDrawer();
});
}
function openDrawer(row) {
row && (formData.value = row);
row &&
(dateTime.value = [
dayjs(row.info.evaluationStartTime, "YYYY-MM-DD HH:mm"),
dayjs(row.info.evaluationEndTime, "YYYY-MM-DD HH:mm"),
]);
row && (validate = Form.useForm(formData.value.info, rulesRef).validate);
visible.value = true;
}
defineExpose({ openDrawer });
</script>
<style lang="scss" scoped>
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.growth-eval > .ant-drawer-content-wrapper {
min-width: 800px !important;
width: 800px !important;
}
.growth-eval {
.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: 0px;
padding-right: 0px;
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;
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>