|
@@ -0,0 +1,313 @@
|
|
|
+<template>
|
|
|
+ <div v-loading="loading" class="venue-reservation">
|
|
|
+ <BackBtn />
|
|
|
+
|
|
|
+ <div class="venue-reservation-container">
|
|
|
+ <div class="venue-reservation__title">场馆预约</div>
|
|
|
+
|
|
|
+ <el-form
|
|
|
+ ref="formRef"
|
|
|
+ :rules="rules"
|
|
|
+ :model="form"
|
|
|
+ class="venue-reservation-form"
|
|
|
+ >
|
|
|
+ <el-form-item label="参观展馆">
|
|
|
+ <div class="vr-ex-flex">
|
|
|
+ <div
|
|
|
+ v-for="item in museumList"
|
|
|
+ :key="item.id"
|
|
|
+ :class="[
|
|
|
+ 'vr-ex-flex__item',
|
|
|
+ form.exhibitionName === item.name && 'active',
|
|
|
+ ]"
|
|
|
+ :style="{ background: `url(${item.thumb})` }"
|
|
|
+ @click="handleExhibition(item)"
|
|
|
+ >
|
|
|
+ <span>{{ item.name }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="venues.length" label="选择场馆">
|
|
|
+ <div class="vr-flex exhibition">
|
|
|
+ <div
|
|
|
+ v-for="str in venues"
|
|
|
+ :key="str"
|
|
|
+ :class="['vr-flex__item', str === form.venues && 'active']"
|
|
|
+ @click="form.venues = str"
|
|
|
+ >
|
|
|
+ {{ str }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="所在单位" prop="organ">
|
|
|
+ <div class="vr-input">
|
|
|
+ <el-input v-model="form.organ" placeholder="请输入内容" />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="参观人员">
|
|
|
+ <div class="vr-visitor">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in visitorList"
|
|
|
+ :key="item.id"
|
|
|
+ class="vr-visitor__item"
|
|
|
+ >
|
|
|
+ <div class="vr-input">
|
|
|
+ <el-input v-model="item.name" placeholder="请输入姓名" />
|
|
|
+ </div>
|
|
|
+ <div class="vr-input">
|
|
|
+ <el-input
|
|
|
+ v-model="item.phone"
|
|
|
+ placeholder="请输入手机号"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="vr-input">
|
|
|
+ <el-input v-model="item.idcard" placeholder="请输入身份证号" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ v-if="item.id !== 0"
|
|
|
+ class="vr-visitor__del"
|
|
|
+ @click="() => visitorList.splice(index, 1)"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="vr-visitor__add" @click="addVisitor" />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="预约时间">
|
|
|
+ <div class="vr-flex">
|
|
|
+ <div
|
|
|
+ v-for="item in dateList"
|
|
|
+ :key="item.value"
|
|
|
+ :class="[
|
|
|
+ 'vr-flex__item',
|
|
|
+ item.value === form.bookDay && 'active',
|
|
|
+ ]"
|
|
|
+ @click="form.bookDay = item.value"
|
|
|
+ >
|
|
|
+ {{ item.label }}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ :class="['vr-flex__item', bookDay === form.bookDay && 'active']"
|
|
|
+ >
|
|
|
+ <SvgIcon name="icon_date" />
|
|
|
+ <el-date-picker
|
|
|
+ v-model="bookDay"
|
|
|
+ format="MM月DD日"
|
|
|
+ placeholder="其他日期"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ :clearable="false"
|
|
|
+ :disabled-date="disabledDate"
|
|
|
+ @focus="bookDay && (form.bookDay = bookDay)"
|
|
|
+ @change="form.bookDay = bookDay"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="预约时段">
|
|
|
+ <div class="vr-flex">
|
|
|
+ <div
|
|
|
+ v-for="str in DEFAULT_TIME"
|
|
|
+ :key="str"
|
|
|
+ :class="['vr-flex__item', str === form.bootTimeScope && 'active']"
|
|
|
+ @click="form.bootTimeScope = str"
|
|
|
+ >
|
|
|
+ {{ str }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <div class="vr-input textarea">
|
|
|
+ <el-input
|
|
|
+ v-model="form.description"
|
|
|
+ resize="none"
|
|
|
+ :rows="3"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入备注"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <div class="vr-submit" @click="submit" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { getExhibitListApi, reservationVenueApi } from "@/api";
|
|
|
+import { CityMuseumItemType } from "@/api/types";
|
|
|
+import { BackBtn, SvgIcon } from "@/components";
|
|
|
+import { formatDate } from "@/utils";
|
|
|
+import { FormInstance, FormRules } from "element-plus";
|
|
|
+import { computed, onActivated, onMounted, reactive, ref, watch } from "vue";
|
|
|
+import { useRouter } from "vue-router";
|
|
|
+import "./index.scss";
|
|
|
+
|
|
|
+type DateType = {
|
|
|
+ label: string;
|
|
|
+ value: string;
|
|
|
+};
|
|
|
+
|
|
|
+let visitorId = 0;
|
|
|
+const router = useRouter();
|
|
|
+const DEFAULT_MUSEUM_ID = [1, 2, 3];
|
|
|
+const curExhibitionId = ref(0);
|
|
|
+const venues = computed(() => {
|
|
|
+ const str = window.museum[curExhibitionId.value];
|
|
|
+ return str ? str.split(",") : [];
|
|
|
+});
|
|
|
+const DEFAULT_TIME = ["08:00-11:30", "14:00-17:30"];
|
|
|
+const DEFAULT_FORM = {
|
|
|
+ bookDay: "",
|
|
|
+ bootTimeScope: DEFAULT_TIME[0],
|
|
|
+ description: "",
|
|
|
+ organ: window.company,
|
|
|
+ venues: "",
|
|
|
+ exhibitionName: "",
|
|
|
+};
|
|
|
+const DEFAULT_VISITOR = {
|
|
|
+ id: visitorId,
|
|
|
+ name: "",
|
|
|
+ idcard: "",
|
|
|
+ phone: "",
|
|
|
+};
|
|
|
+const visitorList = reactive<
|
|
|
+ {
|
|
|
+ id: number;
|
|
|
+ name: string;
|
|
|
+ idcard: string;
|
|
|
+ phone: string;
|
|
|
+ }[]
|
|
|
+>([
|
|
|
+ {
|
|
|
+ ...DEFAULT_VISITOR,
|
|
|
+ },
|
|
|
+]);
|
|
|
+const dateList = ref<DateType[]>([]);
|
|
|
+const museumList = ref<CityMuseumItemType[]>([]);
|
|
|
+const bookDay = ref("");
|
|
|
+const form = reactive({ ...DEFAULT_FORM });
|
|
|
+const rules = reactive<FormRules>({
|
|
|
+ organ: [{ required: true, message: "请填写单位", trigger: "blur" }],
|
|
|
+});
|
|
|
+const loading = ref(false);
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ initDate();
|
|
|
+ getExhibitList();
|
|
|
+});
|
|
|
+
|
|
|
+onActivated(() => {
|
|
|
+ // 清除缓存数据
|
|
|
+ if (museumList.value.length) {
|
|
|
+ Object.assign(form, {
|
|
|
+ ...DEFAULT_FORM,
|
|
|
+ bookDay: dateList.value[0].value,
|
|
|
+ venues: venues.value[0],
|
|
|
+ exhibitionName: museumList.value[0].name,
|
|
|
+ });
|
|
|
+ visitorList.length = 0;
|
|
|
+ visitorList.push({ ...DEFAULT_VISITOR });
|
|
|
+ curExhibitionId.value = museumList.value[0].id;
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+watch(venues, (list) => {
|
|
|
+ form.venues = list[0];
|
|
|
+});
|
|
|
+
|
|
|
+const disabledDate = (time: Date) => {
|
|
|
+ const today = new Date();
|
|
|
+ today.setDate(today.getDate() + 4);
|
|
|
+ return time.getTime() < today.getTime();
|
|
|
+};
|
|
|
+
|
|
|
+const getExhibitList = async () => {
|
|
|
+ loading.value = true;
|
|
|
+ try {
|
|
|
+ const { data } = await getExhibitListApi({
|
|
|
+ pageNum: 0,
|
|
|
+ pageSize: 0,
|
|
|
+ });
|
|
|
+ museumList.value = data.records
|
|
|
+ .filter((item) => DEFAULT_MUSEUM_ID.includes(item.id))
|
|
|
+ .map((item) => ({
|
|
|
+ ...item,
|
|
|
+ thumb: process.env.VUE_APP_BACKEND_URL + item.thumb,
|
|
|
+ }));
|
|
|
+ curExhibitionId.value = museumList.value[0].id;
|
|
|
+ form.exhibitionName = museumList.value[0].name;
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const addVisitor = () => {
|
|
|
+ visitorList.push({
|
|
|
+ id: ++visitorId,
|
|
|
+ name: "",
|
|
|
+ idcard: "",
|
|
|
+ phone: "",
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const initDate = () => {
|
|
|
+ const stack: DateType[] = [];
|
|
|
+ const today = new Date();
|
|
|
+ for (let i = 0; i < 4; i++) {
|
|
|
+ today.setDate(today.getDate() + 1);
|
|
|
+ stack.push({
|
|
|
+ value: formatDate(today),
|
|
|
+ label: `${i === 0 ? "明天" : ""}${formatDate(today, "MM月DD日")}`,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ form.bookDay = stack[0].value;
|
|
|
+ dateList.value = stack;
|
|
|
+};
|
|
|
+
|
|
|
+const submit = async () => {
|
|
|
+ if (!formRef.value || !(await formRef.value.validate())) return;
|
|
|
+
|
|
|
+ for (let i = 0; i < visitorList.length; i++) {
|
|
|
+ const item = visitorList[i];
|
|
|
+ if (!item.name || !item.phone || !item.idcard) {
|
|
|
+ /* eslint-disable */
|
|
|
+ ElMessage({
|
|
|
+ type: "warning",
|
|
|
+ message: `参观人员第${i + 1}条数据请填写完整`,
|
|
|
+ duration: 4000,
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ ...form,
|
|
|
+ exhibitionName: `${form.exhibitionName}${
|
|
|
+ form.venues ? "-" + form.venues : ""
|
|
|
+ }`,
|
|
|
+ contact: visitorList
|
|
|
+ .map((item) => `${item.name}-${item.phone}-${item.idcard}`)
|
|
|
+ .join(","),
|
|
|
+ };
|
|
|
+
|
|
|
+ loading.value = true;
|
|
|
+ try {
|
|
|
+ await reservationVenueApi(params);
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ router.replace({
|
|
|
+ name: "home",
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const handleExhibition = (item: CityMuseumItemType) => {
|
|
|
+ form.exhibitionName = item.name;
|
|
|
+ curExhibitionId.value = item.id;
|
|
|
+};
|
|
|
+</script>
|