|
@@ -80,7 +80,8 @@
|
|
|
<el-table-column label="每组用时(分钟)" align="center" prop="duration" v-if="columns[8].visible" />
|
|
|
<el-table-column label="比赛时间" align="center" v-if="columns[9].visible">
|
|
|
<template #default="scope">
|
|
|
- {{ scope.row.beginTime }} - {{ scope.row.endTime }}
|
|
|
+ {{ formatFullDateTime(scope.row.beginTime) }} ~ {{ formatFullDateTime(scope.row.endTime) }}
|
|
|
+ <!-- {{ scope.row.beginTime }} ~ {{ scope.row.endTime }} -->
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="成员性别" align="center" prop="memberGender" v-if="columns[10].visible">
|
|
@@ -202,22 +203,29 @@
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="组别开始时间" prop="beginTime">
|
|
|
- <el-time-picker
|
|
|
+ <el-date-picker
|
|
|
v-model="form.beginTime"
|
|
|
- placeholder="选择开始时间"
|
|
|
- format="HH:mm"
|
|
|
- value-format="HH:mm"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="请选择开始时间"
|
|
|
+ format="YYYY-MM-DD HH:mm:ss"
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
style="width: 100%"
|
|
|
:disabled="!form.projectId"
|
|
|
+ :disabled-date="disabledDate"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
- </el-col>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="预计结束时间" prop="endTime">
|
|
|
- <el-input v-model="calculatedEndTime" placeholder="自动计算" disabled style="width: 100%" />
|
|
|
+ <el-form-item label="组别结束时间" prop="endTime">
|
|
|
+ <el-input
|
|
|
+ v-model="calculatedEndTime"
|
|
|
+ placeholder="自动计算"
|
|
|
+ disabled
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
@@ -359,6 +367,29 @@ const getProjectNameByProjectId = (projectId: string | number) => {
|
|
|
return project?.projectName || '';
|
|
|
};
|
|
|
|
|
|
+// 根据项目ID获取项目开始时间
|
|
|
+const getProjectStartTimeByProjectId = (projectId: string | number) => {
|
|
|
+ if (!projectId) return '';
|
|
|
+ const project = projectList.value.find(p => p.projectId === projectId);
|
|
|
+ if (project && project.startTime) {
|
|
|
+ try {
|
|
|
+ const startDate = new Date(project.startTime);
|
|
|
+ if (!isNaN(startDate.getTime())) {
|
|
|
+ const year = startDate.getFullYear();
|
|
|
+ const month = String(startDate.getMonth() + 1).padStart(2, '0');
|
|
|
+ const day = String(startDate.getDate()).padStart(2, '0');
|
|
|
+ const hours = String(startDate.getHours()).padStart(2, '0');
|
|
|
+ const minutes = String(startDate.getMinutes()).padStart(2, '0');
|
|
|
+ const seconds = String(startDate.getSeconds()).padStart(2, '0');
|
|
|
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('项目开始时间解析失败:', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return '';
|
|
|
+};
|
|
|
+
|
|
|
// 计算预计结束时间
|
|
|
const calculatedEndTime = computed(() => {
|
|
|
if (!form.value.beginTime || !form.value.duration || !form.value.includeGroupNum) {
|
|
@@ -366,16 +397,19 @@ const calculatedEndTime = computed(() => {
|
|
|
}
|
|
|
|
|
|
const beginTime = new Date(form.value.beginTime);
|
|
|
+ if (isNaN(beginTime.getTime())) return '';
|
|
|
+
|
|
|
const totalMinutes = form.value.duration * form.value.includeGroupNum;
|
|
|
const endTime = new Date(beginTime.getTime() + totalMinutes * 60 * 1000);
|
|
|
|
|
|
- return endTime.toLocaleString('zh-CN', {
|
|
|
- month: '2-digit',
|
|
|
- day: '2-digit',
|
|
|
- hour: '2-digit',
|
|
|
- minute: '2-digit',
|
|
|
- hour12: false
|
|
|
- });
|
|
|
+ const year = endTime.getFullYear();
|
|
|
+ const month = String(endTime.getMonth() + 1).padStart(2, '0');
|
|
|
+ const day = String(endTime.getDate()).padStart(2, '0');
|
|
|
+ const hours = String(endTime.getHours()).padStart(2, '0');
|
|
|
+ const minutes = String(endTime.getMinutes()).padStart(2, '0');
|
|
|
+ const seconds = String(endTime.getSeconds()).padStart(2, '0');
|
|
|
+
|
|
|
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
});
|
|
|
|
|
|
// 禁用日期(限制在项目时间范围内)
|
|
@@ -388,7 +422,36 @@ const disabledDate = (time: Date) => {
|
|
|
const projectEnd = new Date(project.endTime);
|
|
|
|
|
|
// 禁用项目时间范围外的日期
|
|
|
- return time < projectStart || time > projectEnd;
|
|
|
+ return time <= projectStart || time >= projectEnd;
|
|
|
+};
|
|
|
+
|
|
|
+// 格式化完整日期时间
|
|
|
+const formatFullDateTime = (dateTime: string | null | undefined): string => {
|
|
|
+ if (!dateTime) return '-';
|
|
|
+
|
|
|
+ // 增加对空字符串的检查
|
|
|
+ if (dateTime === '') return '-';
|
|
|
+
|
|
|
+ let date: Date;
|
|
|
+ try {
|
|
|
+ // 尝试解析时间字符串
|
|
|
+ date = new Date(dateTime);
|
|
|
+ if (isNaN(date.getTime())) {
|
|
|
+ return '-';
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('时间格式化失败:', error);
|
|
|
+ return '-';
|
|
|
+ }
|
|
|
+
|
|
|
+ const year = date.getFullYear();
|
|
|
+ const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
|
+ const day = String(date.getDate()).padStart(2, '0');
|
|
|
+ const hours = String(date.getHours()).padStart(2, '0');
|
|
|
+ const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
|
+ const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
|
+
|
|
|
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
};
|
|
|
|
|
|
/** 查询赛事分组列表 */
|
|
@@ -481,6 +544,12 @@ const handleAdd = () => {
|
|
|
// 获取项目列表
|
|
|
nextTick(() => {
|
|
|
getProjectList();
|
|
|
+ // 监听项目选择变化,设置默认开始时间
|
|
|
+ watch(() => form.value.projectId, (newProjectId) => {
|
|
|
+ if (newProjectId && !form.value.beginTime) {
|
|
|
+ form.value.beginTime = getProjectStartTimeByProjectId(newProjectId);
|
|
|
+ }
|
|
|
+ });
|
|
|
});
|
|
|
};
|
|
|
|
|
@@ -499,6 +568,44 @@ const handleUpdate = async (row?: GameEventGroupVO) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 处理时间字段的回显,增加安全检查
|
|
|
+ if (res.data.beginTime) {
|
|
|
+ try {
|
|
|
+ // 尝试解析时间字符串
|
|
|
+ const date = new Date(res.data.beginTime);
|
|
|
+ if (!isNaN(date.getTime())) {
|
|
|
+ // 如果解析成功,转换为正确的格式
|
|
|
+ form.value.beginTime = formatFullDateTime(date.toString());
|
|
|
+ // form.value.beginTime = date.toISOString().replace('T', ' ');
|
|
|
+ } else {
|
|
|
+ // 如果解析失败,设置为默认值
|
|
|
+ console.warn('开始时间格式无效:', res.data.beginTime);
|
|
|
+ form.value.beginTime = '';
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('开始时间解析失败:', error);
|
|
|
+ form.value.beginTime = '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (res.data.endTime) {
|
|
|
+ try {
|
|
|
+ // 尝试解析时间字符串
|
|
|
+ const date = new Date(res.data.endTime);
|
|
|
+ if (!isNaN(date.getTime())) {
|
|
|
+ // 如果解析成功,转换为正确的格式
|
|
|
+ form.value.endTime = formatFullDateTime(date.toString());
|
|
|
+ } else {
|
|
|
+ // 如果解析失败,设置为默认值
|
|
|
+ console.warn('结束时间格式无效:', res.data.endTime);
|
|
|
+ form.value.endTime = '';
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('结束时间解析失败:', error);
|
|
|
+ form.value.endTime = '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
dialog.visible = true;
|
|
|
dialog.title = '修改赛事分组';
|
|
|
// 获取项目列表
|
|
@@ -521,36 +628,64 @@ const submitForm = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 自动计算结束时间
|
|
|
+ // 自动计算结束时间并赋值
|
|
|
if (form.value.beginTime && form.value.duration && form.value.includeGroupNum) {
|
|
|
- const beginTime = new Date(`2000-01-01 ${form.value.beginTime}`);
|
|
|
- const totalMinutes = form.value.duration * form.value.includeGroupNum;
|
|
|
- const endTime = new Date(beginTime.getTime() + totalMinutes * 60 * 1000);
|
|
|
- form.value.endTime = endTime.toTimeString().slice(0, 5);
|
|
|
+ try {
|
|
|
+ const beginTime = new Date(form.value.beginTime);
|
|
|
+ if (isNaN(beginTime.getTime())) {
|
|
|
+ proxy?.$modal.msgError('开始时间格式无效');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const totalMinutes = form.value.duration * form.value.includeGroupNum;
|
|
|
+ const endTime = new Date(beginTime.getTime() + totalMinutes * 60 * 1000);
|
|
|
+
|
|
|
+ const year = endTime.getFullYear();
|
|
|
+ const month = String(endTime.getMonth() + 1).padStart(2, '0');
|
|
|
+ const day = String(endTime.getDate()).padStart(2, '0');
|
|
|
+ const hours = String(endTime.getHours()).padStart(2, '0');
|
|
|
+ const minutes = String(endTime.getMinutes()).padStart(2, '0');
|
|
|
+ const seconds = String(endTime.getSeconds()).padStart(2, '0');
|
|
|
+
|
|
|
+ form.value.endTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
+ } catch (error) {
|
|
|
+ proxy?.$modal.msgError('计算结束时间失败');
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 验证时间范围
|
|
|
if (form.value.beginTime && form.value.endTime) {
|
|
|
- const beginTime = new Date(form.value.beginTime);
|
|
|
- const endTime = new Date(form.value.endTime);
|
|
|
-
|
|
|
- if (beginTime >= endTime) {
|
|
|
- proxy?.$modal.msgError('组别结束时间必须晚于开始时间');
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 验证组别时间是否在项目时间范围内
|
|
|
- if (form.value.projectId) {
|
|
|
- const selectedProject = projectList.value.find(p => p.projectId === form.value.projectId);
|
|
|
- if (selectedProject && selectedProject.startTime && selectedProject.endTime) {
|
|
|
- const projectStart = new Date(selectedProject.startTime);
|
|
|
- const projectEnd = new Date(selectedProject.endTime);
|
|
|
+ try {
|
|
|
+ const beginTime = new Date(form.value.beginTime);
|
|
|
+ const endTime = new Date(form.value.endTime);
|
|
|
+
|
|
|
+ if (isNaN(beginTime.getTime()) || isNaN(endTime.getTime())) {
|
|
|
+ proxy?.$modal.msgError('时间格式无效');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (beginTime >= endTime) {
|
|
|
+ proxy?.$modal.msgError('组别结束时间必须晚于开始时间');
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (beginTime < projectStart || endTime > projectEnd) {
|
|
|
- proxy?.$modal.msgError('组别比赛时间必须在项目比赛时间范围内');
|
|
|
- return;
|
|
|
+ // 验证组别时间是否在项目时间范围内
|
|
|
+ if (form.value.projectId) {
|
|
|
+ const selectedProject = projectList.value.find(p => p.projectId === form.value.projectId);
|
|
|
+ if (selectedProject && selectedProject.startTime && selectedProject.endTime) {
|
|
|
+ const projectStart = new Date(selectedProject.startTime);
|
|
|
+ const projectEnd = new Date(selectedProject.endTime);
|
|
|
+
|
|
|
+ if (beginTime <= projectStart || endTime >= projectEnd) {
|
|
|
+ proxy?.$modal.msgError('组别比赛时间必须在项目比赛时间范围内');
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ } catch (error) {
|
|
|
+ proxy?.$modal.msgError('时间验证失败');
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
|