瀏覽代碼

refactor(GameNavigator): 更新日期时间格式和组件逻辑

- 将创建时间的格式从 `formatDate` 更改为 `formatDateTime`。
- 在活动类型中,将 `el-radio` 的 `value` 属性更改为 `label` 属性,并使用 `Number(dict.value)` 作为值。
- 注释掉创建时间相关的 `el-row` 组件。
- 更新 `formatDateTime` 函数以自定义年月日之间的分隔符。

refactor(GameEvent): 更新时间显示格式

- 将开始时间、结束时间、创建时间和更新时间的显示格式从 `{y}-{m}-{d}` 更改为 `{y}-{m}-{d} {h}:{i}:{s}`。

refactor(GameEventGroup): 更新时间相关逻辑和格式

- 更新比赛时间的显示格式为 `formatFullDateTime`。
- 将组别开始时间的 `el-time-picker` 更改为 `el-date-picker`,并添加 `type="datetime"` 和 `disabled-date` 属性。
- 添加 `getProjectStartTimeByProjectId` 函数以根据项目ID获取项目开始时间。
- 更新 `calculatedEndTime` 计算逻辑以返回完整的日期时间格式。
- 更新 `disabledDate` 函数以禁用项目时间范围外的日期。
- 添加 `formatFullDateTime` 函数以格式化完整日期时间。
- 监听项目选择变化,设置默认开始时间。
- 处理时间字段的回显,增加安全检查。
- 更新提交表单时的时间验证逻辑。

refactor(GameEventProject): 更新时间显示格式

- 将开始时间和结束时间的显示格式从 `{y}-{m}-{d}` 更改为 `{y}-{m}-{d} {h}:{i}:{s}`。
zhou 4 周之前
父節點
當前提交
708e9e207a

+ 13 - 12
src/views/system/common/nav/components/GameNavigator.vue

@@ -97,7 +97,7 @@
               </div>
               <div class="create-time">
                 <span class="label">创建时间:</span>
-                <span class="value">{{ formatDate(scope.row.createTime) }}</span>
+                <span class="value">{{ formatDateTime(scope.row.createTime) }}</span>
               </div>
             </div>
           </template>
@@ -145,7 +145,7 @@
           <el-col :span="18">
             <el-form-item label="活动类型" prop="activityType">
               <el-radio-group v-model="form.activityType">
-                <el-radio v-for="dict in game_activity_type" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
+                <el-radio v-for="dict in game_activity_type" :key="dict.value" :label="Number(dict.value)">{{ dict.label }} </el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -201,7 +201,7 @@
           <el-input v-model="form.appId" placeholder="请输入对方小程序的AppID" />
         </el-form-item>
 
-        <el-row :gutter="20">
+        <!-- <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="创建时间">
               <el-date-picker
@@ -226,7 +226,7 @@
               />
             </el-form-item>
           </el-col>
-        </el-row>
+        </el-row> -->
 
         <el-form-item label="状态" prop="status">
           <el-radio-group v-model="form.status">
@@ -448,14 +448,15 @@ function formatDateTime(date: string | Date | null | undefined): string {
   if (!date) return '-';
   const d = new Date(date);
   if (isNaN(d.getTime())) return '-';
-  return d.toLocaleString('zh-CN', {
-    year: 'numeric',
-    month: '2-digit',
-    day: '2-digit',
-    hour: '2-digit',
-    minute: '2-digit',
-    second: '2-digit'
-  });
+  // 使用自定义格式确保年月日之间以-分隔
+  const year = d.getFullYear();
+  const month = String(d.getMonth() + 1).padStart(2, '0');
+  const day = String(d.getDate()).padStart(2, '0');
+  const hours = String(d.getHours()).padStart(2, '0');
+  const minutes = String(d.getMinutes()).padStart(2, '0');
+  const seconds = String(d.getSeconds()).padStart(2, '0');
+  
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
 }
 
 // 格式化日期为查询格式 (YYYY-MM-DD)

+ 4 - 4
src/views/system/gameEvent/index.vue

@@ -125,12 +125,12 @@
         </el-table-column>
         <el-table-column label="开始时间" align="center" prop="startTime" width="180" v-if="columns[6].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="结束时间" align="center" prop="endTime" width="180" v-if="columns[7].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="赛事链接" align="center" prop="eventUrlUrl" width="100" v-if="columns[8].visible">
@@ -151,12 +151,12 @@
         </el-table-column>
         <el-table-column label="创建时间" align="center" prop="createTime" width="180" v-if="columns[12].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="更新时间" align="center" prop="updateTime" width="180" v-if="columns[13].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="状态" align="center" prop="status" v-if="columns[14].visible">

+ 173 - 38
src/views/system/gameEventGroup/index.vue

@@ -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;
         }
       }
 

+ 2 - 2
src/views/system/gameEventProject/index.vue

@@ -69,12 +69,12 @@
         </el-table-column>
         <el-table-column label="开始时间" align="center" prop="startTime" width="180" v-if="columns[6].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="结束时间" align="center" prop="endTime" width="180" v-if="columns[7].visible">
           <template #default="scope">
-            <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
+            <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
         <el-table-column label="裁判组" align="center" prop="refereeGroup" v-if="columns[8].visible">