Ver código fonte

feat(gameEvent): 使用赛事编码优化文件导出命名规则

- 在多个页面中引入 useGameEventStore 以获取默认赛事信息
- 将导出文件名从时间戳格式改为包含赛事编码的标准格式
- 优化了运动员、赛事、配置、分组、项目等模块的文件命名规则
- 使文件名更具可识别性,便于用户管理和查找
zhou 3 semanas atrás
pai
commit
ccf18f3b44

+ 4 - 2
src/views/system/gameAthlete/index.vue

@@ -218,8 +218,10 @@ import { GameAthleteVO, GameAthleteQuery, GameAthleteForm } from '@/api/system/g
 import { GameTeamVO } from '@/api/system/gameTeam/types';
 import { GameEventVO } from '@/api/system/gameEvent/types';
 import { globalHeaders } from '@/utils/request';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const { sys_user_sex, game_event_status } = toRefs<any>(proxy?.useDict('sys_user_sex','game_event_status'));
 const defaultEvent = ref<GameEventVO | null>(null); // 默认赛事信息
 
@@ -764,7 +766,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `运动员详情_${new Date().getTime()}.xlsx`
+    `${gameEventStore.defaultEventInfo?.eventCode || ''}_运动员详情.xlsx`
   );
 };
 
@@ -797,7 +799,7 @@ function submitFileForm() {
 
 /** 下载模板操作 */
 const importTemplate = () => {
-  proxy?.download('system/gameAthlete/importTemplate', {}, `game_athlete_template_${new Date().getTime()}.xlsx`);
+  proxy?.download('system/gameAthlete/importTemplate', {}, `${gameEventStore.defaultEventInfo?.eventCode || ''}_运动员导入模板.xlsx`);
 };
 
 onMounted(() => {

+ 2 - 2
src/views/system/gameEvent/RankingBoardPage.vue

@@ -373,7 +373,7 @@ const loadTeamProjectScores = async () => {
     groupMap.set(group.rgId, group.rgName);
   });
   
-  const teamScoreList = (res.rows || []).map(item => {
+  const teamScoreList = (res.data?.tableData?.rows || []).map(item => {
     return {
       ...item,
       classification: '1',
@@ -635,7 +635,7 @@ const refreshPersonalRanking = async () => {
       pageSize: personalDisplayCount.value
     });
     // 接口返回的是分页数据,取 rows
-    const rows = (res.rows || []).map(item => ({ ...item, classification: '0' }));
+    const rows = (res.data?.tableData?.rows || []).map(item => ({ ...item, classification: '0' }));
     
     // 获取当前项目的排序方式
     const currentProject = personalProjectOptions.value.find(p => p.projectId == selectedProjectId.value);

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

@@ -680,7 +680,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `赛事详情_${new Date().getTime()}.xlsx`
+    `赛事列表.xlsx`
   );
 };
 
@@ -691,7 +691,7 @@ const handleDownloadTemplate = (row: GameEventVO) => {
     {
       eventId: row.eventId
     },
-    `event_enroll_template_${new Date().getTime()}.xlsx`
+    `${row.eventCode}_报名表模板.xlsx`
   );
 };
 
@@ -1058,7 +1058,7 @@ const handleWriteArticleDefault = async () => {
 };
 
 const handleExportNumberTableDefault = async () => {
-  await proxy?.download('system/number/export', {}, `号码对照表_${new Date().getTime()}.xlsx`);
+  await proxy?.download('system/number/export', {}, `${gameEventStore.defaultEventInfo?.eventCode || ''}_号码对照表.xlsx`);
 };
 
 // 生成参赛证相关 - 已移动到 BibViewerDialog 组件中

+ 3 - 1
src/views/system/gameEventConfig/index.vue

@@ -142,8 +142,10 @@ import { getDefaultEvent } from '@/api/system/gameEvent';
 import { GameEventConfigVO, GameEventConfigQuery, GameEventConfigForm } from '@/api/system/gameEventConfig/types';
 import { GameEventVO } from '@/api/system/gameEvent/types';
 import { GameEventConfigTypeVO } from '@/api/system/gameEventConfigType/types';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const { game_event_status, game_yes_no } = toRefs<any>(proxy?.useDict('game_event_status', 'game_yes_no'));
 const defaultEvent = ref<GameEventVO | null>(null); // 默认赛事信息
 
@@ -343,7 +345,7 @@ const getConfigTypeList = async () => {
 const handleExport = () => {
   proxy?.download('system/gameEventConfig/export', {
     ...queryParams.value
-  }, `gameEventConfig_${new Date().getTime()}.xlsx`)
+  }, `${gameEventStore.defaultEventInfo?.eventCode || ''}_赛事配置.xlsx`)
 }
 
 onMounted(() => {

+ 3 - 1
src/views/system/gameEventConfigType/index.vue

@@ -130,8 +130,10 @@
 <script setup name="GameEventConfigType" lang="ts">
 import { listGameEventConfigType, getGameEventConfigType, delGameEventConfigType, addGameEventConfigType, updateGameEventConfigType } from '@/api/system/gameEventConfigType';
 import { GameEventConfigTypeVO, GameEventConfigTypeQuery, GameEventConfigTypeForm } from '@/api/system/gameEventConfigType/types';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const { game_yes_no } = toRefs<any>(proxy?.useDict('game_yes_no'));
 
 const gameEventConfigTypeList = ref<GameEventConfigTypeVO[]>([]);
@@ -316,7 +318,7 @@ const handleDelete = async (row?: GameEventConfigTypeVO) => {
 const handleExport = () => {
   proxy?.download('system/gameEventConfigType/export', {
     ...queryParams.value
-  }, `gameEventConfigType_${new Date().getTime()}.xlsx`)
+  }, `${gameEventStore.defaultEventInfo?.eventCode || ''}_赛事配置类型.xlsx`)
 }
 
 onMounted(() => {

+ 3 - 1
src/views/system/gameEventGroup/detail.vue

@@ -123,10 +123,12 @@ import { getGameEventGroup, generateGroups, getGroupResultFromDB } from '@/api/s
 import { getGameEventProject } from '@/api/system/gameEventProject';
 import { GameEventGroupVO } from '@/api/system/gameEventGroup/types';
 import type { ComponentInternalInstance } from 'vue';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const route = useRoute();
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 
 // 分组信息
 const groupInfo = ref<GameEventGroupVO>({} as GameEventGroupVO);
@@ -315,7 +317,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `分组详情_${new Date().getTime()}.xlsx`
+    `${gameEventStore.defaultEventInfo?.eventCode || ''}_${projectName.value}_分组详情.xlsx`
   );
 };
 onUpdated(() => { 

+ 3 - 1
src/views/system/gameEventGroup/index.vue

@@ -279,8 +279,10 @@ import { listGameAthlete, getAthleteCount as getAthleteCountApi } from '@/api/sy
 import AthleteListDialog from '@/components/AthleteListDialog/index.vue';
 import { GameEventGroupVO, GameEventGroupQuery, GameEventGroupForm } from '@/api/system/gameEventGroup/types';
 import { GameEventProjectVO } from '@/api/system/gameEventProject/types';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const router = useRouter();
 
 // 字典数据
@@ -775,7 +777,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `gameEventGroup_${new Date().getTime()}.xlsx`
+    `${gameEventStore.defaultEventInfo?.eventCode || ''}_赛事分组.xlsx`
   );
 };
 

+ 3 - 1
src/views/system/gameEventMenu/index.vue

@@ -254,8 +254,10 @@
 import { listMenu, getMenu, delMenu, addMenu, updateMenu } from '@/api/system/menu';
 import { MenuVO, MenuQuery, MenuForm } from '@/api/system/menu/types';
 import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable'));
 
 const menuList = ref<MenuVO[]>([]);
@@ -432,7 +434,7 @@ const handleDelete = async (row?: MenuVO) => {
 const handleExport = () => {
   proxy?.download('system/menu/export', {
     ...queryParams.value
-  }, `menu_${new Date().getTime()}.xlsx`)
+  }, `${gameEventStore.defaultEventInfo?.eventCode || ''}_赛事菜单.xlsx`)
 }
 
 onMounted(() => {

+ 16 - 3
src/views/system/gameEventProject/index.vue

@@ -21,7 +21,7 @@
       </div>
     </transition>
 
-    <el-card shadow="never">
+    <el-card shadow="never" class="table-card">
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
@@ -47,7 +47,13 @@
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="gameEventProjectList" @selection-change="handleSelectionChange">
+      <el-table 
+        v-loading="loading" 
+        border 
+        :data="gameEventProjectList" 
+        @selection-change="handleSelectionChange"
+        max-height="calc(100vh - 280px)"
+      >
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="序号" align="center" fixed="left" type="index" />
         <el-table-column label="项目id" align="center" fixed="left" prop="projectId" v-if="columns[0].visible" />
@@ -422,6 +428,7 @@ import RefereeGroupDialog from './RefereeGroupDialog.vue';
 import ProjectLibraryDialog from './ProjectLibraryDialog.vue';
 import StatsDetailDialog from './StatsDetailDialog.vue';
 import { ElMessageBox } from 'element-plus';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { game_score_type, game_project_type, game_project_classification, game_round, game_stage, sys_group_sex, game_order_type } = toRefs<any>(proxy?.useDict('game_score_type', 'game_project_type', 'game_project_classification', 'game_round', 'game_stage', 'sys_group_sex', 'game_order_type'));
@@ -716,7 +723,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `项目详情_${new Date().getTime()}.xlsx`
+    `${useGameEventStore().defaultEventInfo?.eventCode || ''}_项目列表.xlsx`
   );
 };
 
@@ -878,4 +885,10 @@ onMounted(() => {
 :deep(.el-form-item__label) {
   font-weight: 500;
 }
+.table-card :deep(.el-card__body) {
+  padding: 10px;
+}
+.el-table {
+  margin-bottom: 10px;
+}
 </style>

+ 1 - 1
src/views/system/gameEventSchedule/index.vue

@@ -407,7 +407,7 @@ const exportSchedule = () => {
   const blob = new Blob([html], { type: 'application/vnd.ms-excel;charset=utf-8' });
   const link = document.createElement('a');
   link.href = URL.createObjectURL(blob);
-  link.download = `赛事日程安排_${defaultEvent.value.eventName}_${parseTime(new Date(), '{y}{m}{d}')}.xls`;
+  link.download = `${defaultEvent.value.eventCode || ''}_赛事日程安排.xls`;
   link.click();
   URL.revokeObjectURL(link.href);
 };

+ 4 - 2
src/views/system/gameReferee/index.vue

@@ -118,8 +118,10 @@
 import { listGameReferee, getGameReferee, delGameReferee, addGameReferee, updateGameReferee, generateRefereeQRCode } from '@/api/system/gameReferee';
 import { getGameEventProject, listGameEventProject, updateGameEventProject } from '@/api/system/gameEventProject';
 import { GameRefereeVO, GameRefereeQuery, GameRefereeForm } from '@/api/system/gameReferee/types';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 
 const gameRefereeList = ref<GameRefereeVOExt[]>([]);
 const buttonLoading = ref(false);
@@ -426,7 +428,7 @@ const handleDownloadQRCode = () => {
   
   const link = document.createElement('a');
   link.href = qrCodeData.value;
-  link.download = `裁判二维码_${currentReferee.value.name}.png`;
+  link.download = `${gameEventStore.defaultEventInfo?.eventCode || ''}_裁判二维码_${currentReferee.value.name}.png`;
   link.click();
   proxy?.$modal.msgSuccess("二维码下载成功");
 };
@@ -435,7 +437,7 @@ const handleDownloadQRCode = () => {
 const handleExport = () => {
   proxy?.download('system/gameReferee/export', {
     ...queryParams
-  }, `gameReferee_${new Date().getTime()}.xlsx`)
+  }, `${gameEventStore.defaultEventInfo?.eventCode || ''}_裁判列表.xlsx`)
 }
 
 onMounted(() => {

+ 1 - 1
src/views/system/gameScore/gameScoreBonus.vue

@@ -354,7 +354,7 @@ const exportBonusData = async () => {
         data: JSON.stringify(bonusDataList.value),
         projects: JSON.stringify(bonusProjectList.value)
       },
-      `总成绩排名表_${new Date().toLocaleDateString()}.xlsx`
+      `${gameEventStore.defaultEventInfo?.eventCode || ''}_总成绩排名表.xlsx`
     );
     
     proxy?.$modal.msgSuccess("导出成功");

+ 1 - 1
src/views/system/gameScore/index.vue

@@ -736,7 +736,7 @@ const exportScoresNames = async () => {
     };
 
     // 文件名动态调整
-    let fileName = `成绩详情表`;
+    let fileName = `${gameEventStore.defaultEventInfo?.eventCode || ''}_成绩详情表`;
     if (topN > 0) fileName += `_前${topN}名`;
     if (ids.value.length == 0) fileName += `_全部项目`;
     fileName += '.xlsx';

+ 4 - 2
src/views/system/gameTeam/index.vue

@@ -189,8 +189,10 @@ import { listGameEventProject } from '@/api/system/gameEventProject';
 import { GameTeamVO, GameTeamQuery, GameTeamForm } from '@/api/system/gameTeam/types';
 import { GameEventProjectVO } from '@/api/system/gameEventProject/types';
 import { globalHeaders } from '@/utils/request';
+import { useGameEventStore } from '@/store/modules/gameEvent';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const gameEventStore = useGameEventStore();
 const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));
 
 const gameTeamList = ref<GameTeamVO[]>([]);
@@ -442,7 +444,7 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `队伍详情_${new Date().getTime()}.xlsx`
+    `${gameEventStore.defaultEventInfo?.eventCode || ''}_队伍详情.xlsx`
   );
 };
 
@@ -475,7 +477,7 @@ function submitFileForm() {
 
 /** 下载模板操作 */
 const importTemplate = () => {
-  proxy?.download('system/gameTeam/importTemplate', {}, `参赛队伍_${new Date().getTime()}.xlsx`);
+  proxy?.download('system/gameTeam/importTemplate', {}, `${gameEventStore.defaultEventInfo?.eventCode || ''}_队伍导入模板.xlsx`);
 };
 
 onMounted(() => {

+ 1 - 1
src/views/system/rankGroup/index.vue

@@ -258,7 +258,7 @@ const handleDelete = async (row: RankGroupVO) => {
 const handleExport = () => {
   proxy?.download('system/rankGroup/export', {
     ...queryParams.value
-  }, `组别_${new Date().getTime()}.xlsx`)
+  }, `${gameEventStore.defaultEventInfo?.eventCode || ''}_排名分组.xlsx`)
 };
 
 onMounted(() => {