瀏覽代碼

赛事专区和旅游

wengan01 1 周之前
父節點
當前提交
b925dd3e1f
共有 2 個文件被更改,包括 67 次插入59 次删除
  1. 36 28
      src/views/system/business/levels/index.vue
  2. 31 31
      src/views/system/physical/blindLevels/index.vue

+ 36 - 28
src/views/system/business/levels/index.vue

@@ -53,7 +53,7 @@
 
         <el-table v-loading="loading" border :data="levelsList" @selection-change="handleSelectionChange" row-key="id" :row-class-name="tableRowClassName">
           <el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
-          <el-table-column label="显示级别" align="center" width="120">
+          <el-table-column label="等级" align="center" width="120">
             <template #default="scope">
               <span v-if="scope.row.isBreak === 1" style="color: #e6a23c; font-weight: bold">{{ getDisplayLevel(scope.row) }}</span>
               <span v-else>{{ getDisplayLevel(scope.row) }}</span>
@@ -95,7 +95,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="休息级别" align="center" width="120">
+          <el-table-column label="是否休息" align="center" width="120">
             <template #default="scope">
               <el-select v-model="scope.row.isBreak" size="small" style="width: 100px">
                 <el-option label="否" :value="0" />
@@ -103,7 +103,7 @@
               </el-select>
             </template>
           </el-table-column>
-          <el-table-column label="休息分钟" align="center" width="120">
+          <el-table-column label="休息时长" align="center" width="120">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text :disabled="scope.row.isBreak !== 1" @click="stepValue(scope.row, 'breakDurationMinutes', -1)">−</el-button>
@@ -112,6 +112,15 @@
               </div>
             </template>
           </el-table-column>
+          <el-table-column label="展示顺序" align="center" width="120">
+            <template #default="scope">
+              <div class="stepper-cell">
+                <el-button size="small" text @click="stepValue(scope.row, 'displayOrder', -1)">−</el-button>
+                <span class="stepper-value">{{ scope.row.displayOrder ?? 0 }}</span>
+                <el-button size="small" text @click="stepValue(scope.row, 'displayOrder', 1)">+</el-button>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
             <template #default="scope">
               <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
@@ -322,8 +331,8 @@ const data = reactive<PageData<LevelsForm, LevelsQuery>>({
     breakDurationMinutes: undefined,
     displayOrder: undefined,
     params: {},
-    // ✅ 核心修复:强制按levelNumber升序排序,解决插入后位置错乱和重复ID问题
-    orderByColumn: 'levelNumber',
+    // 按展示顺序字段排序(级别不参与排序)
+    orderByColumn: 'displayOrder',
     isAsc: 'asc'
   },
   rules: {
@@ -341,29 +350,20 @@ const { queryParams, form, rules } = toRefs(data);
 const getList = async () => {
   loading.value = true;
   const res = await listLevels(queryParams.value);
-  // 确保 isBreak 为数字类型,避免 select 显示 false/true,并按 levelNumber 升序排序
-  // 统一排序逻辑:与线下盲注表保持一致,按级别编号排序而非ID排序
+  // 确保 isBreak 为数字类型,避免 select 显示 false/true,按展示顺序字段排序(级别不参与排序)
   levelsList.value = (res.rows || [])
     .map((item: any) => ({
       ...item,
       isBreak: item.isBreak === true || item.isBreak === 1 ? 1 : 0
     }))
-    .sort((a, b) => {
-      const levelA = a.levelNumber || 0;
-      const levelB = b.levelNumber || 0;
-      return levelA - levelB;
-    });
+    .sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
   total.value = res.total;
   loading.value = false;
 };
 
-/** 独立排序方法:用于插入和保存后重新排序 */
-const sortListByLevelNumber = () => {
-  levelsList.value.sort((a, b) => {
-    const levelA = a.levelNumber || 0;
-    const levelB = b.levelNumber || 0;
-    return levelA - levelB;
-  });
+/** 独立排序方法:按展示顺序字段排序(用于插入和保存后重新排序) */
+const sortListByDisplayOrder = () => {
+  levelsList.value.sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
 };
 
 /** 计算显示级别:休息行不占级别,非休息行连续计算(如:1、2、休息(第2级后)、3、4...) */
@@ -559,7 +559,7 @@ const submitFileForm = () => {
 };
 
 /** 行内步进器增减(步长=1) */
-const stepValue = (row: LevelsVO, field: 'smallBlind' | 'bigBlind' | 'ante' | 'durationMinutes' | 'breakDurationMinutes', delta: number) => {
+const stepValue = (row: LevelsVO, field: 'smallBlind' | 'bigBlind' | 'ante' | 'durationMinutes' | 'breakDurationMinutes' | 'displayOrder', delta: number) => {
   const val = (row[field] as number) || 0;
   (row as any)[field] = Math.max(0, val + delta);
 };
@@ -579,7 +579,8 @@ const validateRows = (): string[] => {
 
   levelsList.value.forEach((row) => {
     const errors: string[] = [];
-    if (!row.levelNumber || row.levelNumber <= 0) {
+    // 休息行不占级别(级别为0),跳过级别编号校验
+    if (row.isBreak !== 1 && (!row.levelNumber || row.levelNumber <= 0)) {
       errors.push(`级别${row.levelNumber || '?'}:级别编号不能为空`);
     }
     if (row.smallBlind === null || row.smallBlind === undefined || row.smallBlind < 0) {
@@ -637,8 +638,11 @@ const handleInsertAfter = async (row: LevelsVO) => {
     const idx = levelsList.value.findIndex((r) => r.id === row.id);
     if (idx !== -1) {
       levelsList.value.splice(idx + 1, 0, { ...newLevel, id: Date.now(), _isNew: true } as any);
-      // 按levelNumber排序确保顺序正确
-      sortListByLevelNumber();
+      // 按行顺序重排展示顺序,再按展示顺序排序确保顺序正确
+      levelsList.value.forEach((item, index) => {
+        item.displayOrder = index + 1;
+      });
+      sortListByDisplayOrder();
     }
 
     proxy?.$modal.msgSuccess(`成功在第${row.levelNumber}级后插入第${newLevelNumber}级`);
@@ -678,12 +682,12 @@ const handleBatchSave = async () => {
       }
     });
 
-    // 拉取全部数据(不分页,强制按levelNumber排序)
+    // 拉取全部数据(不分页,强制按展示顺序排序)
     const allRes = await listLevels({
       ...queryParams.value,
       pageNum: 1,
       pageSize: 9999999,
-      orderByColumn: 'levelNumber',
+      orderByColumn: 'displayOrder',
       isAsc: 'asc'
     });
     let allRows: LevelsVO[] = (allRes.rows || []).map((item: any) => ({
@@ -717,11 +721,15 @@ const handleBatchSave = async () => {
       }
     });
 
-    // ✅ 保存前自动修正levelNumber,确保连续且不重复
-    allRows.sort((a, b) => (a.levelNumber || 0) - (b.levelNumber || 0));
+    // ✅ 保存前按展示顺序排序(级别不参与排序);自动修正级别:休息行为0不占级别,正式级别连续递增
+    allRows.sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
     let expectedLevel = 1;
     allRows.forEach((row) => {
-      row.levelNumber = expectedLevel++;
+      if (row.isBreak === 1) {
+        row.levelNumber = 0;
+      } else {
+        row.levelNumber = expectedLevel++;
+      }
     });
 
     console.log('💾 准备保存的数据:', allRows); // 调试日志

+ 31 - 31
src/views/system/physical/blindLevels/index.vue

@@ -53,13 +53,13 @@
 
         <el-table v-loading="loading" border :data="blindLevelsList" @selection-change="handleSelectionChange" row-key="id" :row-class-name="tableRowClassName">
           <el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
-          <el-table-column label="显示级别" align="center" width="120">
+          <el-table-column label="等级" align="center" width="120">
             <template #default="scope">
               <span v-if="scope.row.isBreak === 1" style="color: #e6a23c; font-weight: bold">{{ getDisplayLevel(scope.row) }}</span>
               <span v-else>{{ getDisplayLevel(scope.row) }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="小盲" align="center">
+          <el-table-column label="小盲预置分" align="center">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text @click="stepValue(scope.row, 'smallBlind', -1)">−</el-button>
@@ -68,7 +68,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="大盲" align="center">
+          <el-table-column label="大盲预置分" align="center">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text @click="stepValue(scope.row, 'bigBlind', -1)">−</el-button>
@@ -77,7 +77,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="前" align="center">
+          <el-table-column label="前置预置分" align="center">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text @click="stepValue(scope.row, 'ante', -1)">−</el-button>
@@ -86,7 +86,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="盲注分钟" align="center" width="140">
+          <el-table-column label="升级时间" align="center" width="140">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text @click="stepValue(scope.row, 'durationMinutes', -1)">−</el-button>
@@ -95,7 +95,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="休息级别" align="center" width="120">
+          <el-table-column label="是否休息" align="center" width="120">
             <template #default="scope">
               <el-select v-model="scope.row.isBreak" size="small" style="width: 100px">
                 <el-option label="否" :value="0" />
@@ -103,7 +103,7 @@
               </el-select>
             </template>
           </el-table-column>
-          <el-table-column label="休息分钟" align="center" width="120">
+          <el-table-column label="休息时长" align="center" width="120">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text :disabled="scope.row.isBreak !== 1" @click="stepValue(scope.row, 'breakDurationMinutes', -1)">−</el-button>
@@ -112,7 +112,7 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="名次" align="center" width="120">
+          <el-table-column label="展示顺序" align="center" width="120">
             <template #default="scope">
               <div class="stepper-cell">
                 <el-button size="small" text @click="stepValue(scope.row, 'displayOrder', -1)">−</el-button>
@@ -324,8 +324,8 @@ const data = reactive<PageData<BlindLevelsForm, BlindLevelsQuery>>({
     breakDurationMinutes: undefined,
     displayOrder: undefined,
     params: {},
-    // ✅ 核心修复:强制按levelNumber升序排序,解决插入后位置错乱问题
-    orderByColumn: 'levelNumber',
+    // 按展示顺序字段排序(级别不参与排序)
+    orderByColumn: 'displayOrder',
     isAsc: 'asc'
   },
   rules: {
@@ -343,28 +343,20 @@ const { queryParams, form, rules } = toRefs(data);
 const getList = async () => {
   loading.value = true;
   const res = await listBlindLevels(queryParams.value);
-  // 确保 isBreak 为数字类型,避免 select 显示 false/true,并按 levelNumber 升序排序
-  // 统一排序逻辑:与线下盲注表保持一致,按级别编号排序而非ID排序
+  // 确保 isBreak 为数字类型,避免 select 显示 false/true,按展示顺序字段排序(级别不参与排序)
   blindLevelsList.value = (res.rows || [])
     .map((item: any) => ({
       ...item,
       isBreak: item.isBreak === true || item.isBreak === 1 ? 1 : 0
     }))
-    .sort((a, b) => {
-      const levelA = a.levelNumber || 0;
-      const levelB = b.levelNumber || 0;
-      return levelA - levelB;
-    });
+    .sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
   total.value = res.total;
   loading.value = false;
 };
 
-const sortListByLevelNumber = () => {
-  blindLevelsList.value.sort((a, b) => {
-    const levelA = a.levelNumber || 0;
-    const levelB = b.levelNumber || 0;
-    return levelA - levelB;
-  });
+/** 独立排序方法:按展示顺序字段排序(用于插入和保存后重新排序) */
+const sortListByDisplayOrder = () => {
+  blindLevelsList.value.sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
 };
 
 /** 计算显示级别:休息行不占级别,非休息行连续计算(如:1、2、休息(第2级后)、3、4...) */
@@ -580,7 +572,8 @@ const validateRows = (): string[] => {
 
   blindLevelsList.value.forEach((row) => {
     const errors: string[] = [];
-    if (!row.levelNumber || row.levelNumber <= 0) {
+    // 休息行不占级别(级别为0),跳过级别编号校验
+    if (row.isBreak !== 1 && (!row.levelNumber || row.levelNumber <= 0)) {
       errors.push(`级别${row.levelNumber || '?'}:级别编号不能为空`);
     }
     if (row.smallBlind === null || row.smallBlind === undefined || row.smallBlind < 0) {
@@ -638,8 +631,11 @@ const handleInsertAfter = async (row: BlindLevelsVO) => {
     const idx = blindLevelsList.value.findIndex((r) => r.id === row.id);
     if (idx !== -1) {
       blindLevelsList.value.splice(idx + 1, 0, { ...newLevel, id: Date.now(), _isNew: true } as any);
-      // 按levelNumber排序确保顺序正确
-      sortListByLevelNumber();
+      // 按行顺序重排展示顺序,再按展示顺序排序确保顺序正确
+      blindLevelsList.value.forEach((item, index) => {
+        item.displayOrder = index + 1;
+      });
+      sortListByDisplayOrder();
     }
 
     proxy?.$modal.msgSuccess(`成功在第${row.levelNumber}级后插入第${newLevelNumber}级`);
@@ -679,12 +675,12 @@ const handleBatchSave = async () => {
       }
     });
 
-    // 拉取全部数据(不分页,强制按levelNumber排序)
+    // 拉取全部数据(不分页,强制按展示顺序排序)
     const allRes = await listBlindLevels({
       ...queryParams.value,
       pageNum: 1,
       pageSize: 9999999,
-      orderByColumn: 'levelNumber',
+      orderByColumn: 'displayOrder',
       isAsc: 'asc'
     });
     let allRows: BlindLevelsVO[] = (allRes.rows || []).map((item: any) => ({
@@ -718,11 +714,15 @@ const handleBatchSave = async () => {
       }
     });
 
-    // ✅ 保存前自动修正levelNumber,确保连续且不重复
-    allRows.sort((a, b) => (a.levelNumber || 0) - (b.levelNumber || 0));
+    // ✅ 保存前按展示顺序排序(级别不参与排序);自动修正级别:休息行为0不占级别,正式级别连续递增
+    allRows.sort((a, b) => (a.displayOrder || 0) - (b.displayOrder || 0));
     let expectedLevel = 1;
     allRows.forEach((row) => {
-      row.levelNumber = expectedLevel++;
+      if (row.isBreak === 1) {
+        row.levelNumber = 0;
+      } else {
+        row.levelNumber = expectedLevel++;
+      }
     });
 
     console.log('💾 准备保存的数据:', allRows); // 调试日志