From fbba46986e98abe68cd2460d1ed2e296cc4ad269 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 04 六月 2026 16:04:46 +0800
Subject: [PATCH] 会议的参会人员改为用户管理的数据选择及其他页面的回显
---
src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue | 844 ++++++++++++++++++++++++++++---------------------------
1 files changed, 432 insertions(+), 412 deletions(-)
diff --git a/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue b/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
index b2fb88d..f083574 100644
--- a/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
+++ b/src/views/collaborativeApproval/notificationManagement/meetApplication/index.vue
@@ -1,18 +1,17 @@
<template>
<div>
-
<!-- 鐢宠绫诲瀷閫夋嫨 -->
<el-card class="type-card">
<div class="type-selector">
- <div
- v-for="type in applicationTypes"
- :key="type.value"
- class="type-item"
- :class="{ active: currentType === type.value }"
- @click="changeType(type.value)"
- >
+ <div v-for="type in applicationTypes"
+ :key="type.value"
+ class="type-item"
+ :class="{ active: currentType === type.value }"
+ @click="changeType(type.value)">
<div class="type-icon">
- <el-icon :size="24"><component :is="type.icon"/></el-icon>
+ <el-icon :size="24">
+ <component :is="type.icon" />
+ </el-icon>
</div>
<div class="type-info">
<div class="type-name">{{ type.name }}</div>
@@ -21,491 +20,512 @@
</div>
</div>
</el-card>
-
<!-- 浼氳鐢宠琛ㄥ崟 -->
<el-card>
<div class="form-header">
<h3>{{ getCurrentTypeName() }}鐢宠</h3>
</div>
-
- <el-form
- ref="meetingFormRef"
- :model="meetingForm"
- :rules="rules"
- label-width="100px"
- >
+ <el-form ref="meetingFormRef"
+ :model="meetingForm"
+ :rules="rules"
+ label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="浼氳涓婚" prop="title">
- <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁富棰�"/>
+ <el-form-item label="浼氳涓婚"
+ prop="title">
+ <el-input v-model="meetingForm.title"
+ placeholder="璇疯緭鍏ヤ細璁富棰�" />
</el-form-item>
</el-col>
</el-row>
-
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="浼氳瀹�" prop="roomId">
- <el-select v-model="meetingForm.roomId" placeholder="璇烽�夋嫨浼氳瀹�" style="width: 100%">
- <el-option
- v-for="room in meetingRooms"
- :key="room.id"
- :label="`${room.name} (${room.location})`"
- :value="room.id"
- />
+ <el-form-item label="浼氳瀹�"
+ prop="roomId">
+ <el-select v-model="meetingForm.roomId"
+ placeholder="璇烽�夋嫨浼氳瀹�"
+ style="width: 100%">
+ <el-option v-for="room in meetingRooms"
+ :key="room.id"
+ :label="`${room.name} (${room.location})`"
+ :value="room.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="涓绘寔浜�" prop="host">
- <el-input v-model="meetingForm.host" placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕"/>
+ <el-form-item label="涓绘寔浜�"
+ prop="host">
+ <el-input v-model="meetingForm.host"
+ placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕" />
</el-form-item>
</el-col>
</el-row>
-
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="浼氳鏃ユ湡" prop="meetingDate">
- <el-date-picker
- v-model="meetingForm.meetingDate"
- type="date"
- placeholder="璇烽�夋嫨浼氳鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- :disabled-date="disabledDate"
- style="width: 100%"
- />
+ <el-form-item label="浼氳鏃ユ湡"
+ prop="meetingDate">
+ <el-date-picker v-model="meetingForm.meetingDate"
+ type="date"
+ placeholder="璇烽�夋嫨浼氳鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ :disabled-date="disabledDate"
+ style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 绌哄垪锛屼繚鎸佸竷灞� -->
</el-col>
</el-row>
-
<el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
- <el-select
- v-model="meetingForm.startTime"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- >
- <el-option
- v-for="time in startTimeOptions"
- :key="time.value"
- :label="time.label"
- :value="time.value"
- />
+ <el-form-item label="寮�濮嬫椂闂�"
+ prop="startTime">
+ <el-select v-model="meetingForm.startTime"
+ placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+ style="width: 100%">
+ <el-option v-for="time in startTimeOptions"
+ :key="time.value"
+ :label="time.label"
+ :value="time.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="缁撴潫鏃堕棿" prop="endTime">
- <el-select
- v-model="meetingForm.endTime"
- placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
- style="width: 100%"
- >
- <el-option
- v-for="time in endTimeOptions"
- :key="time.value"
- :label="time.label"
- :value="time.value"
- />
+ <el-form-item label="缁撴潫鏃堕棿"
+ prop="endTime">
+ <el-select v-model="meetingForm.endTime"
+ placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+ style="width: 100%">
+ <el-option v-for="time in endTimeOptions"
+ :key="time.value"
+ :label="time.label"
+ :value="time.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
-
- <el-form-item label="鍙備細浜哄憳" prop="participants">
- <el-select
- v-model="meetingForm.participants"
- multiple
- filterable
- placeholder="璇烽�夋嫨鍙備細浜哄憳"
- style="width: 100%"
- >
- <el-option
- v-for="person in employees"
- :key="person.id"
- :label="`${person.staffName}${person.postName ? ` (${person.postName})` : ''}`"
- :value="person.id"
- />
+ <el-form-item label="鍙備細浜哄憳"
+ prop="participants">
+ <el-select v-model="meetingForm.participants"
+ multiple
+ filterable
+ placeholder="璇烽�夋嫨鍙備細浜哄憳"
+ style="width: 100%">
+ <el-option v-for="user in users"
+ :key="user.userId"
+ :label="user.deptNames ? `${user.nickName} (${user.deptNames})` : user.nickName"
+ :value="user.userId" />
</el-select>
</el-form-item>
-
- <el-form-item label="浼氳璇存槑" prop="description">
- <el-input
- v-model="meetingForm.description"
- type="textarea"
- :rows="4"
- placeholder="璇疯緭鍏ヤ細璁鏄�"
- />
+ <el-form-item label="浼氳璇存槑"
+ prop="description">
+ <el-input v-model="meetingForm.description"
+ type="textarea"
+ :rows="4"
+ placeholder="璇疯緭鍏ヤ細璁鏄�" />
</el-form-item>
</el-form>
-
<div class="form-footer">
<el-button @click="resetForm">閲嶇疆</el-button>
- <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+ <el-button type="primary"
+ @click="submitForm">鎻愪氦</el-button>
</div>
</el-card>
</div>
</template>
<script setup>
-import {ref, reactive, onMounted, computed, watch} from 'vue'
-import {ElMessage} from 'element-plus'
-import {Plus, Document, Promotion, Bell} from '@element-plus/icons-vue'
-import {getRoomEnum, saveMeetingApplication} from '@/api/collaborativeApproval/meeting.js'
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+ import { ref, reactive, onMounted, computed, watch } from "vue";
+ import { ElMessage } from "element-plus";
+ import { Plus, Document, Promotion, Bell } from "@element-plus/icons-vue";
+ import {
+ getRoomEnum,
+ saveMeetingApplication,
+ } from "@/api/collaborativeApproval/meeting.js";
+ import { userListNoPageByTenantId } from "@/api/system/user.js";
-// 褰撳墠鐢宠绫诲瀷
-const currentType = ref('department') // approval: 瀹℃壒娴佺▼, department: 閮ㄩ棬绾�, notification: 閫氱煡鍙戝竷
+ // 褰撳墠鐢宠绫诲瀷
+ const currentType = ref("department"); // approval: 瀹℃壒娴佺▼, department: 閮ㄩ棬绾�, notification: 閫氱煡鍙戝竷
-// 鐢宠绫诲瀷閫夐」
-const applicationTypes = ref([
- {
- value: 'approval',
- name: '瀹℃壒娴佺▼浼氳',
- desc: '闇�瑕佺粡杩囧绾у鎵圭殑浼氳鐢宠',
- icon: Document
- },
- {
- value: 'department',
- name: '閮ㄩ棬绾т細璁�',
- desc: '閮ㄩ棬鍐呴儴浼氳鐢宠娴佺▼',
- icon: Promotion
- },
- {
- value: 'notification',
- name: '浼氳閫氱煡',
- desc: '鏃犻渶瀹℃壒鐩存帴鍙戝竷鐨勪細璁�氱煡',
- icon: Bell
- }
-])
+ // 鐢宠绫诲瀷閫夐」
+ const applicationTypes = ref([
+ {
+ value: "approval",
+ name: "瀹℃壒娴佺▼浼氳",
+ desc: "闇�瑕佺粡杩囧绾у鎵圭殑浼氳鐢宠",
+ icon: Document,
+ },
+ {
+ value: "department",
+ name: "閮ㄩ棬绾т細璁�",
+ desc: "閮ㄩ棬鍐呴儴浼氳鐢宠娴佺▼",
+ icon: Promotion,
+ },
+ {
+ value: "notification",
+ name: "浼氳閫氱煡",
+ desc: "鏃犻渶瀹℃壒鐩存帴鍙戝竷鐨勪細璁�氱煡",
+ icon: Bell,
+ },
+ ]);
-// 琛ㄥ崟鏁版嵁
-const meetingForm = reactive({
- title: '',
- type: '',
- roomId: '',
- host: '',
- meetingDate: '',
- startTime: '',
- endTime: '',
- participants: [],
- description: ''
-})
+ // 琛ㄥ崟鏁版嵁
+ const meetingForm = reactive({
+ title: "",
+ type: "",
+ roomId: "",
+ host: "",
+ meetingDate: "",
+ startTime: "",
+ endTime: "",
+ participants: [],
+ description: "",
+ });
-// 琛ㄥ崟寮曠敤
-const meetingFormRef = ref(null)
+ // 琛ㄥ崟寮曠敤
+ const meetingFormRef = ref(null);
-// 浼氳瀹ゅ垪琛�
-const meetingRooms = ref([])
+ // 浼氳瀹ゅ垪琛�
+ const meetingRooms = ref([]);
-// 鍛樺伐鍒楄〃
-const employees = ref([])
+ // 鐢ㄦ埛鍒楄〃锛堢郴缁熺鐞�-鐢ㄦ埛绠$悊锛�
+ const users = ref([]);
-// 鏃堕棿閫夐」锛堜互鍗婂皬鏃朵负闂撮殧锛�
-const timeOptions = ref([])
+ // 鏃堕棿閫夐」锛堜互鍗婂皬鏃朵负闂撮殧锛�
+ const timeOptions = ref([]);
-const getTimeInMinutes = (time) => {
- if (!time) return -1
- const [hour, minute] = time.split(':').map(Number)
- return hour * 60 + minute
-}
+ const getTimeInMinutes = time => {
+ if (!time) return -1;
+ const [hour, minute] = time.split(":").map(Number);
+ return hour * 60 + minute;
+ };
-const isToday = (dateText) => {
- if (!dateText) return false
- const [year, month, day] = dateText.split('-').map(Number)
- const now = new Date()
- return year === now.getFullYear() && month === now.getMonth() + 1 && day === now.getDate()
-}
+ const isToday = dateText => {
+ if (!dateText) return false;
+ const [year, month, day] = dateText.split("-").map(Number);
+ const now = new Date();
+ return (
+ year === now.getFullYear() &&
+ month === now.getMonth() + 1 &&
+ day === now.getDate()
+ );
+ };
-const validateStartTime = (_rule, value, callback) => {
- if (!value) {
- callback()
- return
- }
-
- if (isToday(meetingForm.meetingDate)) {
- const now = new Date()
- const currentMinutes = now.getHours() * 60 + now.getMinutes()
- if (getTimeInMinutes(value) > currentMinutes) {
- callback(new Error('褰撳ぉ寮�濮嬫椂闂翠笉鑳芥櫄浜庡綋鍓嶆椂闂�'))
- return
+ const validateStartTime = (_rule, value, callback) => {
+ if (!value) {
+ callback();
+ return;
}
- }
- callback()
-}
-
-const validateEndTime = (_rule, value, callback) => {
- if (!value || !meetingForm.startTime) {
- callback()
- return
- }
-
- if (getTimeInMinutes(value) <= getTimeInMinutes(meetingForm.startTime)) {
- callback(new Error('缁撴潫鏃堕棿蹇呴』澶т簬寮�濮嬫椂闂�'))
- return
- }
-
- callback()
-}
-
-// 琛ㄥ崟鏍¢獙瑙勫垯
-const rules = {
- title: [{required: true, message: '璇疯緭鍏ヤ細璁富棰�', trigger: 'blur'}],
- roomId: [{required: true, message: '璇烽�夋嫨浼氳瀹�', trigger: 'change'}],
- host: [{required: true, message: '璇疯緭鍏ヤ富鎸佷汉', trigger: 'blur'}],
- meetingDate: [{required: true, message: '璇烽�夋嫨浼氳鏃ユ湡', trigger: 'change'}],
- startTime: [
- {required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'},
- {validator: validateStartTime, trigger: 'change'}
- ],
- endTime: [
- {required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'},
- {validator: validateEndTime, trigger: 'change'}
- ],
- participants: [{required: true, message: '璇烽�夋嫨鍙備細浜哄憳', trigger: 'change'}]
-}
-
-const startTimeOptions = computed(() => {
- if (!isToday(meetingForm.meetingDate)) {
- return timeOptions.value
- }
- const now = new Date()
- const currentMinutes = now.getHours() * 60 + now.getMinutes()
- return timeOptions.value.filter(item => getTimeInMinutes(item.value) <= currentMinutes)
-})
-
-const endTimeOptions = computed(() => {
- if (!meetingForm.startTime) {
- return timeOptions.value
- }
- const startMinutes = getTimeInMinutes(meetingForm.startTime)
- return timeOptions.value.filter(item => getTimeInMinutes(item.value) > startMinutes)
-})
-
-// 鍒濆鍖栨椂闂撮�夐」
-const initTimeOptions = () => {
- const options = []
- const now = new Date()
- const currentHour = now.getHours()
- const currentMinute = now.getMinutes()
- // meetingDate 鏄� "yyyy-MM-dd"
- const meetingDate = new Date(meetingForm.meetingDate)
-
- const isSameDay =
- now.getFullYear() === meetingDate.getFullYear() &&
- now.getMonth() === meetingDate.getMonth() &&
- now.getDate() === meetingDate.getDate()
-
- console.log('鏄惁鍚屼竴澶�:', isSameDay)
- for (let hour = 8; hour <= 18; hour++) {
- // 寮�濮嬫椂闂村繀椤绘櫄浜庡綋鍓嶆椂闂�
- if (hour < currentHour && isSameDay) {
- continue
+ if (isToday(meetingForm.meetingDate)) {
+ const now = new Date();
+ const currentMinutes = now.getHours() * 60 + now.getMinutes();
+ if (getTimeInMinutes(value) > currentMinutes) {
+ callback(new Error("褰撳ぉ寮�濮嬫椂闂翠笉鑳芥櫄浜庡綋鍓嶆椂闂�"));
+ return;
+ }
}
- if (hour === currentHour && currentMinute > 30 && isSameDay) {
- continue
- }
- // 姣忎釜灏忔椂娣诲姞涓や釜閫夐」锛氭暣鐐瑰拰鍗婄偣
- options.push({
- value: `${hour.toString().padStart(2, '0')}:00`,
- label: `${hour.toString().padStart(2, '0')}:00`
- })
- if (hour < 18) { // 18:00涔嬪悗娌℃湁鍗婄偣閫夐」
+ callback();
+ };
+
+ const validateEndTime = (_rule, value, callback) => {
+ if (!value || !meetingForm.startTime) {
+ callback();
+ return;
+ }
+
+ if (getTimeInMinutes(value) <= getTimeInMinutes(meetingForm.startTime)) {
+ callback(new Error("缁撴潫鏃堕棿蹇呴』澶т簬寮�濮嬫椂闂�"));
+ return;
+ }
+
+ callback();
+ };
+
+ // 琛ㄥ崟鏍¢獙瑙勫垯
+ const rules = {
+ title: [{ required: true, message: "璇疯緭鍏ヤ細璁富棰�", trigger: "blur" }],
+ roomId: [{ required: true, message: "璇烽�夋嫨浼氳瀹�", trigger: "change" }],
+ host: [{ required: true, message: "璇疯緭鍏ヤ富鎸佷汉", trigger: "blur" }],
+ meetingDate: [
+ { required: true, message: "璇烽�夋嫨浼氳鏃ユ湡", trigger: "change" },
+ ],
+ startTime: [
+ { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
+ { validator: validateStartTime, trigger: "change" },
+ ],
+ endTime: [
+ { required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change" },
+ { validator: validateEndTime, trigger: "change" },
+ ],
+ participants: [
+ { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" },
+ ],
+ };
+
+ const startTimeOptions = computed(() => {
+ if (!isToday(meetingForm.meetingDate)) {
+ return timeOptions.value;
+ }
+ const now = new Date();
+ const currentMinutes = now.getHours() * 60 + now.getMinutes();
+ return timeOptions.value.filter(
+ item => getTimeInMinutes(item.value) <= currentMinutes
+ );
+ });
+
+ const endTimeOptions = computed(() => {
+ if (!meetingForm.startTime) {
+ return timeOptions.value;
+ }
+ const startMinutes = getTimeInMinutes(meetingForm.startTime);
+ return timeOptions.value.filter(
+ item => getTimeInMinutes(item.value) > startMinutes
+ );
+ });
+
+ // 鍒濆鍖栨椂闂撮�夐」
+ const initTimeOptions = () => {
+ const options = [];
+ const now = new Date();
+ const currentHour = now.getHours();
+ const currentMinute = now.getMinutes();
+ // meetingDate 鏄� "yyyy-MM-dd"
+ const meetingDate = new Date(meetingForm.meetingDate);
+
+ const isSameDay =
+ now.getFullYear() === meetingDate.getFullYear() &&
+ now.getMonth() === meetingDate.getMonth() &&
+ now.getDate() === meetingDate.getDate();
+
+ console.log("鏄惁鍚屼竴澶�:", isSameDay);
+ for (let hour = 8; hour <= 18; hour++) {
+ // 寮�濮嬫椂闂村繀椤绘櫄浜庡綋鍓嶆椂闂�
+ if (hour < currentHour && isSameDay) {
+ continue;
+ }
+ if (hour === currentHour && currentMinute > 30 && isSameDay) {
+ continue;
+ }
+ // 姣忎釜灏忔椂娣诲姞涓や釜閫夐」锛氭暣鐐瑰拰鍗婄偣
options.push({
- value: `${hour.toString().padStart(2, '0')}:30`,
- label: `${hour.toString().padStart(2, '0')}:30`
- })
+ value: `${hour.toString().padStart(2, "0")}:00`,
+ label: `${hour.toString().padStart(2, "0")}:00`,
+ });
+
+ if (hour < 18) {
+ // 18:00涔嬪悗娌℃湁鍗婄偣閫夐」
+ options.push({
+ value: `${hour.toString().padStart(2, "0")}:30`,
+ label: `${hour.toString().padStart(2, "0")}:30`,
+ });
+ }
}
- }
- timeOptions.value = options
-}
+ timeOptions.value = options;
+ };
-watch(() => meetingForm.meetingDate, () => {
- if (meetingForm.startTime && !startTimeOptions.value.some(item => item.value === meetingForm.startTime)) {
- meetingForm.startTime = ''
- }
- if (meetingForm.endTime && !endTimeOptions.value.some(item => item.value === meetingForm.endTime)) {
- meetingForm.endTime = ''
- }
- if (meetingForm.startTime) {
- meetingFormRef.value?.validateField('startTime')
- }
- if (meetingForm.endTime) {
- meetingFormRef.value?.validateField('endTime')
- }
- initTimeOptions()
-})
-
-watch(() => meetingForm.startTime, () => {
- if (meetingForm.endTime && getTimeInMinutes(meetingForm.endTime) <= getTimeInMinutes(meetingForm.startTime)) {
- meetingForm.endTime = ''
- }
- if (meetingForm.endTime) {
- meetingFormRef.value?.validateField('endTime')
- }
-
-})
-
-// 绂佺敤鏃ユ湡锛堢鐢ㄤ粖澶╀箣鍓嶇殑鏃ユ湡锛�
-const disabledDate = (time) => {
- // 绂佺敤浠婂ぉ涔嬪墠鐨勬棩鏈�
- return time.getTime() < Date.now() - 86400000
-}
-
-// 鍒囨崲鐢宠绫诲瀷
-const changeType = (type) => {
- currentType.value = type
-}
-
-// 鑾峰彇褰撳墠绫诲瀷鍚嶇О
-const getCurrentTypeName = () => {
- const type = applicationTypes.value.find(t => t.value === currentType.value)
- return type ? type.name : ''
-}
-
-// 閲嶇疆琛ㄥ崟
-const resetForm = () => {
- meetingFormRef.value?.resetFields()
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- meetingFormRef.value?.validate((valid) => {
- if (valid) {
-
- let formData = {...meetingForm}
- formData.applicationType = currentType.value
- formData.startTime = `${meetingForm.meetingDate} ${meetingForm.startTime}:00`
- formData.endTime = `${meetingForm.meetingDate} ${meetingForm.endTime}:00`
- formData.participants = JSON.stringify(formData.participants)
- console.log(formData)
- saveMeetingApplication(formData).then(() => {
-
- // 妯℃嫙鎻愪氦鎿嶄綔
- ElMessage.success(`${getCurrentTypeName()}鎻愪氦鎴愬姛`)
-
- // 鏍规嵁涓嶅悓绫诲瀷鎵ц涓嶅悓鎿嶄綔
- switch (currentType.value) {
- case 'approval':
- ElMessage.info('浼氳宸叉彁浜ゅ鎵规祦绋�')
- break
- case 'department':
- ElMessage.info('閮ㄩ棬绾т細璁敵璇峰凡鎻愪氦')
- break
- case 'notification':
- ElMessage.info('浼氳閫氱煡宸插彂甯�')
- break
- }
- resetForm()
- })
-
+ watch(
+ () => meetingForm.meetingDate,
+ () => {
+ if (
+ meetingForm.startTime &&
+ !startTimeOptions.value.some(item => item.value === meetingForm.startTime)
+ ) {
+ meetingForm.startTime = "";
+ }
+ if (
+ meetingForm.endTime &&
+ !endTimeOptions.value.some(item => item.value === meetingForm.endTime)
+ ) {
+ meetingForm.endTime = "";
+ }
+ if (meetingForm.startTime) {
+ meetingFormRef.value?.validateField("startTime");
+ }
+ if (meetingForm.endTime) {
+ meetingFormRef.value?.validateField("endTime");
+ }
+ initTimeOptions();
}
- })
-}
+ );
-// 椤甸潰鍔犺浇鏃跺垵濮嬪寲
-onMounted(() => {
- initTimeOptions()
- getRoomEnum().then(res => {
- meetingRooms.value = res.data
- })
- staffOnJobListPage({
- current: -1,
- size: -1,
- staffState: 1
- }).then(res => {
- employees.value = res.data.records.sort((a, b) => (a.postName || '').localeCompare(b.postName || ''))
- })
-})
+ watch(
+ () => meetingForm.startTime,
+ () => {
+ if (
+ meetingForm.endTime &&
+ getTimeInMinutes(meetingForm.endTime) <=
+ getTimeInMinutes(meetingForm.startTime)
+ ) {
+ meetingForm.endTime = "";
+ }
+ if (meetingForm.endTime) {
+ meetingFormRef.value?.validateField("endTime");
+ }
+ }
+ );
+
+ // 绂佺敤鏃ユ湡锛堢鐢ㄤ粖澶╀箣鍓嶇殑鏃ユ湡锛�
+ const disabledDate = time => {
+ // 绂佺敤浠婂ぉ涔嬪墠鐨勬棩鏈�
+ return time.getTime() < Date.now() - 86400000;
+ };
+
+ // 鍒囨崲鐢宠绫诲瀷
+ const changeType = type => {
+ currentType.value = type;
+ };
+
+ // 鑾峰彇褰撳墠绫诲瀷鍚嶇О
+ const getCurrentTypeName = () => {
+ const type = applicationTypes.value.find(t => t.value === currentType.value);
+ return type ? type.name : "";
+ };
+
+ // 閲嶇疆琛ㄥ崟
+ const resetForm = () => {
+ meetingFormRef.value?.resetFields();
+ };
+
+ // 鎻愪氦琛ㄥ崟
+ const submitForm = () => {
+ meetingFormRef.value?.validate(valid => {
+ if (valid) {
+ let formData = { ...meetingForm };
+ formData.applicationType = currentType.value;
+ formData.startTime = `${meetingForm.meetingDate} ${meetingForm.startTime}:00`;
+ formData.endTime = `${meetingForm.meetingDate} ${meetingForm.endTime}:00`;
+ formData.participants = JSON.stringify(formData.participants);
+ console.log(formData);
+ saveMeetingApplication(formData).then(() => {
+ // 妯℃嫙鎻愪氦鎿嶄綔
+ ElMessage.success(`${getCurrentTypeName()}鎻愪氦鎴愬姛`);
+
+ // 鏍规嵁涓嶅悓绫诲瀷鎵ц涓嶅悓鎿嶄綔
+ switch (currentType.value) {
+ case "approval":
+ ElMessage.info("浼氳宸叉彁浜ゅ鎵规祦绋�");
+ break;
+ case "department":
+ ElMessage.info("閮ㄩ棬绾т細璁敵璇峰凡鎻愪氦");
+ break;
+ case "notification":
+ ElMessage.info("浼氳閫氱煡宸插彂甯�");
+ break;
+ }
+ resetForm();
+ });
+ }
+ });
+ };
+
+ // 椤甸潰鍔犺浇鏃跺垵濮嬪寲
+ onMounted(() => {
+ initTimeOptions();
+ getRoomEnum().then(res => {
+ meetingRooms.value = res.data;
+ });
+ userListNoPageByTenantId().then(res => {
+ const list = Array.isArray(res?.data) ? res.data : [];
+ users.value = list
+ .map(item => ({
+ userId: item?.userId,
+ nickName:
+ item?.nickName || item?.userName || String(item?.userId ?? ""),
+ deptNames: item?.deptNames || "",
+ }))
+ .filter(
+ item =>
+ item.userId !== null && item.userId !== undefined && item.nickName
+ )
+ .sort((a, b) => String(a.nickName).localeCompare(String(b.nickName)));
+ });
+ });
</script>
<style scoped>
-.app-container {
- padding: 20px;
-}
+ .app-container {
+ padding: 20px;
+ }
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
+ .page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ }
-.page-header h2 {
- margin: 0;
- color: #303133;
-}
+ .page-header h2 {
+ margin: 0;
+ color: #303133;
+ }
-.type-card {
- margin-bottom: 20px;
-}
+ .type-card {
+ margin-bottom: 20px;
+ }
-.type-selector {
- display: flex;
- gap: 20px;
-}
+ .type-selector {
+ display: flex;
+ gap: 20px;
+ }
-.type-item {
- flex: 1;
- display: flex;
- align-items: center;
- padding: 20px;
- border: 1px solid #ebeef5;
- border-radius: 8px;
- cursor: pointer;
- transition: all 0.3s;
-}
+ .type-item {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ padding: 20px;
+ border: 1px solid #ebeef5;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s;
+ }
-.type-item:hover {
- border-color: #409eff;
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
+ .type-item:hover {
+ border-color: #409eff;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ }
-.type-item.active {
- border-color: #409eff;
- background-color: #ecf5ff;
-}
+ .type-item.active {
+ border-color: #409eff;
+ background-color: #ecf5ff;
+ }
-.type-icon {
- margin-right: 15px;
- color: #409eff;
-}
+ .type-icon {
+ margin-right: 15px;
+ color: #409eff;
+ }
-.type-name {
- font-size: 16px;
- font-weight: 500;
- color: #303133;
- margin-bottom: 5px;
-}
+ .type-name {
+ font-size: 16px;
+ font-weight: 500;
+ color: #303133;
+ margin-bottom: 5px;
+ }
-.type-desc {
- font-size: 14px;
- color: #909399;
-}
+ .type-desc {
+ font-size: 14px;
+ color: #909399;
+ }
-.form-header {
- margin-bottom: 20px;
- padding-bottom: 15px;
- border-bottom: 1px solid #ebeef5;
-}
+ .form-header {
+ margin-bottom: 20px;
+ padding-bottom: 15px;
+ border-bottom: 1px solid #ebeef5;
+ }
-.form-header h3 {
- margin: 0;
- color: #303133;
-}
+ .form-header h3 {
+ margin: 0;
+ color: #303133;
+ }
-.form-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid #ebeef5;
-}
+ .form-footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+ margin-top: 30px;
+ padding-top: 20px;
+ border-top: 1px solid #ebeef5;
+ }
</style>
--
Gitblit v1.9.3