瀏覽代碼

fix(tournaments): 修复比赛类型为3时的报名条件验证问题

- 移除比赛类型选项中的过滤条件,显示所有类型选项
- 为报名条件字段添加条件渲染,当比赛类型为'3'时不显示
- 添加自定义验证器,当比赛类型为'3'时跳过报名条件验证
- 为数量字段添加条件验证,当比赛类型为'3'时跳过验证
- 添加监听器,当比赛类型变为'3'时清空报名条件和数量字段
- 修复模板页面中的相同验证问题
- 移除调试代码并优化取消按钮逻辑
fugui001 1 月之前
父節點
當前提交
b39064c4e9
共有 2 個文件被更改,包括 89 次插入37 次删除
  1. 42 14
      src/views/system/business/tournaments/index.vue
  2. 47 23
      src/views/system/business/tournamentsTemplate/index.vue

+ 42 - 14
src/views/system/business/tournaments/index.vue

@@ -298,13 +298,7 @@
         </el-form-item>
         <el-form-item label="比赛类型" prop="gameType">
           <el-select aria-required="true" v-model="form.gameType" placeholder="请选择" :disabled="dialog.mode === 'view'">
-            <el-option
-              v-for="dict in tournaments_type.filter((item) => item.value !== '1')"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            >
-            </el-option>
+            <el-option v-for="dict in tournaments_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
           </el-select>
         </el-form-item>
         <!-- 赛事名称 -->
@@ -580,7 +574,7 @@
         <el-form-item label="起始记分牌数量" prop="startingChips">
           <el-input v-model="form.startingChips" placeholder="请输入起始记分牌数量" :disabled="dialog.mode === 'view'" />
         </el-form-item>
-        <el-form-item label="报名条件" prop="itemsId">
+        <el-form-item label="报名条件" prop="itemsId" v-if="form.gameType !== '3'">
           <div style="display: flex; align-items: center; gap: 10px; width: 100%">
             <el-select v-model="form.itemsId" placeholder="请选择道具类型" :disabled="dialog.mode === 'view'" style="flex: 1">
               <el-option v-for="item in itemOptions" :key="item.id" :label="item.label" :value="item.id" />
@@ -1077,7 +1071,26 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     qualifierType: [{ required: true, message: '晋级条件类型不能为空', trigger: 'change' }],
     lateRegistrationLevel: [{ required: true, message: '截止报名级别不能为空', trigger: 'change' }],
     signTime: [{ required: true, message: '报名时间不能为空', trigger: 'change' }],
-    itemsId: [{ required: true, message: '报名条件不能为空', trigger: 'change' }],
+    itemsId: [
+      {
+        required: true,
+        message: '报名条件不能为空',
+        trigger: 'change',
+        validator: (rule: any, value: any, callback: any) => {
+          // 如果 gameType 为 3,则不进行校验
+          if (data.form.gameType === '3') {
+            callback();
+            return;
+          }
+          // 其他情况执行默认校验
+          if (!value) {
+            callback(new Error('报名条件不能为空'));
+          } else {
+            callback();
+          }
+        }
+      }
+    ],
     blindStructureId: [{ required: true, message: '盲注等级不能为空', trigger: 'change' }],
     startingChips: [
       { required: true, message: '起始记分牌数量不能为空', trigger: 'blur' },
@@ -1102,9 +1115,17 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
       }
     ],
     itemsNum: [
-      { required: true, message: '数量不能为空', trigger: 'blur' },
       {
-        validator: (rule, value, callback) => {
+        required: true,
+        message: '数量不能为空',
+        trigger: 'blur',
+        validator: (rule: any, value: any, callback: any) => {
+          // 如果 gameType 为 3,则不进行校验
+          if (data.form.gameType === '3') {
+            callback();
+            return;
+          }
+
           // 检查是否为字符串类型且包含非数字字符
           if (typeof value === 'string' && !/^\d+$/.test(value)) {
             callback(new Error('数量必须为正整数'));
@@ -1119,8 +1140,7 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
           } else {
             callback();
           }
-        },
-        trigger: 'blur'
+        }
       }
     ],
     delayCardTime: [
@@ -1575,7 +1595,15 @@ function initSelectedRows() {
     assignForm.selectedIds = [selected.blindStructuresId];
   }
 }
-
+watch(
+  () => form.value.gameType,
+  (newVal) => {
+    if (newVal === '3') {
+      form.value.itemsId = null;
+      form.value.itemsNum = null;
+    }
+  }
+);
 watch(
   () => assignList.value,
   (newVal) => {

+ 47 - 23
src/views/system/business/tournamentsTemplate/index.vue

@@ -167,13 +167,7 @@
         </el-form-item>
         <el-form-item label="比赛类型" prop="gameType">
           <el-select aria-required="true" v-model="form.gameType" placeholder="请选择" :disabled="dialog.mode === 'view'">
-            <el-option
-              v-for="dict in tournaments_type.filter((item) => item.value !== '1')"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            >
-            </el-option>
+            <el-option v-for="dict in tournaments_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
           </el-select>
         </el-form-item>
         <!-- 赛事名称 -->
@@ -279,6 +273,7 @@
               multiple
               collapse-tags
               collapse-tags-tooltip
+              :multiple-limit="1"
             >
               <el-option v-for="item in itemOptionsTagList" :key="item.id" :label="item.label" :value="item.id" />
             </el-select>
@@ -293,6 +288,7 @@
               style="width: 200px"
               :disabled="dialog.mode === 'view'"
               multiple
+              :multiple-limit="1"
               collapse-tags
               collapse-tags-tooltip
             >
@@ -422,7 +418,7 @@
           <el-input v-model="form.startingChips" placeholder="请输入起始记分牌数量" :disabled="dialog.mode === 'view'" />
         </el-form-item>
         <!-- 报名条件 -->
-        <el-form-item label="报名条件" prop="itemsId">
+        <el-form-item label="报名条件" prop="itemsId" v-if="form.gameType !== '3'">
           <div style="display: flex; align-items: center; gap: 10px; width: 100%">
             <el-select v-model="form.itemsId" placeholder="请选择道具类型" :disabled="dialog.mode === 'view'" style="flex: 1">
               <el-option v-for="item in itemOptions" :key="item.id" :label="item.label" :value="item.id" />
@@ -527,18 +523,13 @@
     <el-dialog :title="generateDialog.title" v-model="generateDialog.visible" width="400px" append-to-body>
       <el-form ref="generateFormRef" :model="generateForm" :rules="generateRules" label-width="80px">
         <el-form-item label="开始时间" prop="beginTime">
-          <el-date-picker
-            v-model="generateForm.beginTime"
-            type="datetime"
-            placeholder="请选择开始时间"
-            value-format="YYYY-MM-DD HH:mm:ss"
-          />
+          <el-date-picker v-model="generateForm.beginTime" type="datetime" placeholder="请选择开始时间" value-format="YYYY-MM-DD HH:mm:ss" />
         </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" @click="submitGenerateForm">生成</el-button>
-          <el-button @click="cancelGenerate">取消</el-button>
+          <el-button @click="generateDialog.visible = false">取消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -838,7 +829,26 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     qualifierType: [{ required: true, message: '晋级条件类型不能为空', trigger: 'change' }],
     lateRegistrationLevel: [{ required: true, message: '截止报名级别不能为空', trigger: 'change' }],
     signTime: [{ required: true, message: '报名时间不能为空', trigger: 'change' }],
-    itemsId: [{ required: true, message: '报名条件不能为空', trigger: 'change' }],
+    itemsId: [
+      {
+        required: true,
+        message: '报名条件不能为空',
+        trigger: 'change',
+        validator: (rule: any, value: any, callback: any) => {
+          // 如果 gameType 为 3,则不进行校验
+          if (data.form.gameType === '3') {
+            callback();
+            return;
+          }
+          // 其他情况执行默认校验
+          if (!value) {
+            callback(new Error('报名条件不能为空'));
+          } else {
+            callback();
+          }
+        }
+      }
+    ],
     blindStructureId: [{ required: true, message: '盲注表不能为空', trigger: 'change' }],
     startingChips: [
       { required: true, message: '起始记分牌数量不能为空', trigger: 'blur' },
@@ -863,9 +873,17 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
       }
     ],
     itemsNum: [
-      { required: true, message: '数量不能为空', trigger: 'blur' },
       {
-        validator: (rule, value, callback) => {
+        required: true,
+        message: '数量不能为空',
+        trigger: 'blur',
+        validator: (rule: any, value: any, callback: any) => {
+          // 如果 gameType 为 3,则不进行校验
+          if (data.form.gameType === '3') {
+            callback();
+            return;
+          }
+
           // 检查是否为字符串类型且包含非数字字符
           if (typeof value === 'string' && !/^\d+$/.test(value)) {
             callback(new Error('数量必须为正整数'));
@@ -880,8 +898,7 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
           } else {
             callback();
           }
-        },
-        trigger: 'blur'
+        }
       }
     ],
     delayCardTime: [
@@ -1272,7 +1289,16 @@ watch(
     }
   }
 );
-
+// 监听 gameType 变化,当值为 '3' 时清空 itemsId 和 itemsNum
+watch(
+  () => form.value.gameType,
+  (newVal) => {
+    if (newVal === '3') {
+      form.value.itemsId = null;
+      form.value.itemsNum = null;
+    }
+  }
+);
 const handleIconChange = async (file) => {
   const index = fileList.value.findIndex((f) => f.uid === file.uid);
   fileList.value = [];
@@ -1591,7 +1617,6 @@ const generateRules = {
 };
 // 新增:处理生成按钮点击
 const generateTournamentByTemplate2 = (row: TournamentsVO) => {
-  debugger;
   generateForm.templateId = row.id as number;
   generateDialog.visible = true;
   generateDialog.title = '生成赛事';
@@ -1604,7 +1629,6 @@ const submitGenerateForm = () => {
         // 调试:打印 templateId 值
         console.log('templateId:', generateForm.templateId);
         console.log('beginTime:', generateForm.beginTime);
-        debugger;
         // 调用后端接口
         await generateTournamentByTemplate({
           templateId: generateForm.templateId,