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

573 lines
15 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-active"
width="800"
title="添加活动"
placement="right"
>
<div class="drawerMain" v-if="visible">
<div class="header">
<div class="headerTitle">{{ formData.id ? "编辑" : "添加" }}活动</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="formData.info.activityName"
style="width: 400px; 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="btnbox">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</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">
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
:placeholder="durationText"
v-model:value="formData.info.activityDuration"
/>
<span style="color: #999999; margin-left: 8px">分钟</span>
</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">
<a-input
v-model:value="formData.info.activityAddress"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动地点"
maxlength="100"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">活动公告</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityNotice"
placeholder="请输入活动公告"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">活动说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.activityExplain"
placeholder="请输入活动说明"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考勤设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn">
<div class="btntext">签到</div>
</div>
</div>
<div class="setbox">
<div class="timerbox">
<span>活动开始前</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.beforeSignIn"
/>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
<div class="timerbox">
<span>活动开始后</span>
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="formData.info.afterSignIn"
/>
<span style="color: #999999; margin-left: 8px"
>分钟允许签到</span
>
</div>
</div>
</div>
</div>
<div class="main_item" style="height: 40px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
<div class="btnbox"></div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import { computed, defineEmits, defineProps, ref, reactive } from "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 visible = ref(false);
const formData = ref({
info: {
activityName: "",
activityNotice: "",
activityStartTime: "",
activityEndTime: "",
activityDuration: "",
activityAddress: "",
activityExplain: "",
beforeSignIn: "",
afterSignIn: "",
},
});
const emit = defineEmits(["refresh"]);
const dateTime = ref([]);
const rulesRef = ref({
activityName: [
{
required: true,
message: "请输入活动名称",
},
],
activityNotice: [
{
required: true,
message: "请输入活动公告",
},
],
activityStartTime: [
{
required: true,
message: "请输入活动开始时间",
},
],
activityEndTime: [
{
required: true,
message: "请输入活动结束时间",
},
],
// activityDuration: [
// {
// required: true,
// message: '请输入持续时间',
// },
// ],
activityAddress: [
{
required: true,
message: "请输入活动地址",
},
],
});
let validate = Form.useForm(formData.value.info, rulesRef).validate;
const durationText = computed(() =>
dateTime.value?.length
? dayjs(dateTime.value[1]).diff(dayjs(dateTime.value[0]), "minute")
: "请输入持续时间"
);
const closeDrawer = () => {
visible.value = false;
dateTime.value = [];
// formData.reset();
formData.value.info = {
activityName: "",
activityNotice: "",
activityStartTime: "",
activityEndTime: "",
activityDuration: "",
activityAddress: "",
activityExplain: "",
beforeSignIn: "",
afterSignIn: "",
};
};
function timeChange(time, timeStr) {
formData.value.info.activityStartTime = timeStr[0];
formData.value.info.activityEndTime = timeStr[1];
// formData.value.activityDuration || (formData.value.activityDuration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
}
const disabledDate = (current) => {
return current && current < dayjs().startOf("day");
};
async function confirm() {
// debugger
await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过");
});
if (dayjs().isAfter(dayjs(formData.value.info.activityEndTime))) {
message.warning("活动结束时间不能小于当前时间");
return;
}
// 专业力ID
formData.value.growthId = props.growId;
// 任务类型
formData.value.taskType = props.type;
// 必修/选修
formData.value.type = props.activeKey;
// 任务名称
formData.value.taskName = formData.value.info.activityName;
// 任务时长
if (!formData.value.info.activityDuration) {
formData.value.info.activityDuration = durationText.value;
formData.value.duration = durationText.value;
} else {
formData.value.duration = formData.value.info.activityDuration;
}
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();
});
return;
}
function openDrawer(row) {
row && (formData.value = reactive(row));
row &&
(dateTime.value = [
dayjs(row.info.activityStartTime, "YYYY-MM-DD HH:mm"),
dayjs(row.info.activityEndTime, "YYYY-MM-DD HH:mm"),
]);
row && (validate = Form.useForm(formData.value.info, rulesRef).validate);
visible.value = true;
}
defineExpose({ openDrawer });
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.growth-active > .ant-drawer-content-wrapper {
min-width: 800px !important;
width: 800px !important;
}
.growth-active {
.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;
.ant-input {
height: 88px;
width: 384px;
border-radius: 8px;
}
.ant-picker {
border-radius: 8px;
}
.main_left {
margin-top: 0px;
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;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 400px;
.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: 5px;
cursor: pointer;
}
.qdbtn,
.qtbtn {
width: 75px;
height: 24px;
background: rgba(56, 139, 225, 0.16);
border-radius: 2px;
border: 1px solid #387df7;
display: flex;
align-items: center;
justify-content: center;
.btntext {
color: #387df7;
}
}
.setbox {
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 22px;
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>