浏览代码

feat(business): 增加延迟卡时间与数量配置及校验规则

- 在 tournamentsTemplate 表单中新增“延迟卡时间”和“延迟卡数量”输入项
- 添加对应的表单验证规则,限制延迟卡时间在10-15秒之间,数量在1-99之间
- 调整比赛类型下拉选项,过滤掉值为'1'的选项
- 优化报名条件项布局并增强 itemsNum 输入校验- 修改 history 页面展示更多按钮样式并增加默认显示条目数至20条- 配置页面调整自动比赛模板按钮位置并注释删除功能列
fugui001 3 月之前
父节点
当前提交
336015300a

+ 3 - 0
src/api/system/business/tournamentsTemplate/types.ts

@@ -157,6 +157,9 @@ export interface TournamentsForm extends BaseEntity {
   competitionIcon?: string;
   itemsPrizeList?: ItemsPrize[];
   robotCount: number;
+
+  delayCardNum?: number;
+  delayCardTime?: number;
 }
 
 export interface ItemsPrize {

+ 4 - 5
src/views/system/business/config/index.vue

@@ -35,12 +35,12 @@
     <el-card shadow="never">
       <template #header>
         <el-row :gutter="10" class="mb8">
-          <router-link to="/business/tournamentsTemplate">
-            <el-button type="success" plain icon="Edit">自动比赛模版</el-button>
-          </router-link>
           <el-col :span="1.5">
             <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">新增投放方案</el-button>
           </el-col>
+          <router-link to="/business/tournamentsTemplate">
+            <el-button type="success" plain icon="Edit">自动比赛模版</el-button>
+          </router-link>
           <!--          <el-col :span="1.5">
             <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:config:remove']"
               >删除</el-button
@@ -54,9 +54,8 @@
       </template>
 
       <el-table v-loading="loading" border :data="configList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
+<!--        <el-table-column type="selection" width="55" align="center" />-->
         <el-table-column label="" align="center" prop="id" v-if="false" />
-
         <el-table-column label="比赛名" align="center" prop="name" />
         <el-table-column label="比赛Logo" align="center">
           <template #default="scope">

+ 15 - 6
src/views/system/business/history/index.vue

@@ -44,7 +44,7 @@
       <el-scrollbar>
         <div class="card-container">
           <div
-            v-for="(table, index) in tableData.slice(0, showMore ? tableData.length : 6)"
+            v-for="(table, index) in tableData.slice(0, showMore ? tableData.length : 20)"
             :key="index"
             class="table-card"
             :class="{ 'selected': selectedTableId === table.tableId }"
@@ -53,8 +53,13 @@
             {{ table.tableId }}
           </div>
         </div>
-        <div v-if="tableData.length > 6" class="more-button-container">
-          <el-button @click="showMore = !showMore" size="small">
+        <div v-if="tableData.length > 20" class="more-button-container">
+          <el-button
+            @click="showMore = !showMore"
+            size="small"
+            type="primary"
+            style="background-color: #409eff; border-color: #409eff; color: white; font-weight: bold; padding: 8px 16px"
+          >
             {{ showMore ? '收起' : '更多' }}
           </el-button>
         </div>
@@ -63,7 +68,7 @@
       <el-scrollbar>
         <div class="card-container">
           <div
-            v-for="(table, index) in tableNumberData.slice(0, showMoreNumber ? tableNumberData.length : 6)"
+            v-for="(table, index) in tableNumberData.slice(0, showMoreNumber ? tableNumberData.length : 20)"
             :key="index"
             class="table-card2"
             :class="{ 'selected': selectedTableHandNumberId === table.handNumber }"
@@ -72,8 +77,12 @@
             {{ table.handNumber }}
           </div>
         </div>
-        <div v-if="tableNumberData.length > 6" class="more-button-container">
-          <el-button @click="showMoreNumber = !showMoreNumber" size="small">
+        <div v-if="tableNumberData.length > 20" class="more-button-container">
+          <el-button
+            @click="showMoreNumber = !showMoreNumber"
+            size="small"
+            style="background-color: #409eff; border-color: #409eff; color: white; font-weight: bold; padding: 8px 16px"
+          >
             {{ showMoreNumber ? '收起' : '更多' }}
           </el-button>
         </div>

+ 106 - 6
src/views/system/business/tournamentsTemplate/index.vue

@@ -181,7 +181,13 @@
 
         <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" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+            <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-select>
         </el-form-item>
 
@@ -193,11 +199,14 @@
 
         <!-- 报名条件 -->
         <el-form-item label="报名条件" prop="itemsId">
-          <div style="display: flex; align-items: center; gap: 10px">
-            <el-select v-model="form.itemsId" placeholder="请选择道具类型" :disabled="dialog.mode === 'view'">
+          <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" />
             </el-select>
-            <el-input v-model="form.itemsNum" :min="1" placeholder="数量" :disabled="dialog.mode === 'view'" />
+
+            <el-form-item prop="itemsNum" style="margin-bottom: 0; flex: 1">
+              <el-input v-model.number="form.itemsNum" placeholder="数量" :disabled="dialog.mode === 'view'" style="width: 100%" />
+            </el-form-item>
           </div>
         </el-form-item>
 
@@ -238,6 +247,15 @@
           <el-input v-model="form.robotCount" placeholder="请输入机器人数" :disabled="dialog.mode === 'view'" />
         </el-form-item>
 
+        <el-form-item label="延迟卡时间" prop="delayCardTime">
+          <el-input v-model="form.delayCardTime" placeholder="请输入延迟卡时间" :disabled="dialog.mode === 'view'" />
+        </el-form-item>
+
+        <el-form-item label="延迟卡数量" prop="delayCardNum">
+          <el-input v-model="form.delayCardNum" placeholder="请输入延迟卡数量" :disabled="dialog.mode === 'view'" />
+        </el-form-item>
+
+
         <!-- 奖励内容 -->
         <el-form-item label="奖励内容">
           <div v-for="(reward, index) in formPrize.rewards" :key="index" style="display: flex; align-items: center; margin-bottom: 8px">
@@ -549,7 +567,9 @@ const initFormData: TournamentsForm = {
   itemsId: null,
   itemsNum: null,
   blindStructureId: null,
-  itemsPrizeList: []
+  itemsPrizeList: [],
+  delayCardNum: 4,
+  delayCardTime: 15
 };
 const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
   form: { ...initFormData },
@@ -577,7 +597,87 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     lateRegistrationLevel: [{ required: true, message: '截止报名级别不能为空', trigger: 'change' }],
     signTime: [{ required: true, message: '报名时间不能为空', trigger: 'change' }],
     itemsId: [{ required: true, message: '报名条件不能为空', trigger: 'change' }],
-    blindStructureId: [{ required: true, message: '盲注表不能为空', trigger: 'change' }]
+    blindStructureId: [{ required: true, message: '盲注表不能为空', trigger: 'change' }],
+    startingChips: [
+      { required: true, message: '起始记分牌数量不能为空', trigger: 'blur' },
+      {
+        validator: (rule, value, callback) => {
+          // 检查是否为字符串类型且包含非数字字符
+          if (typeof value === 'string' && !/^\d+$/.test(value)) {
+            callback(new Error('起始记分牌数量必须为数字'));
+            return;
+          }
+
+          const num = Number(value);
+          if (isNaN(num) || num <= 0) {
+            callback(new Error('起始记分牌数量必须大于0'));
+          } else if (!Number.isInteger(num)) {
+            callback(new Error('起始记分牌数量必须为整数'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
+    ],
+    itemsNum: [
+      { required: true, message: '数量不能为空', trigger: 'blur' },
+      {
+        validator: (rule, value, callback) => {
+          // 检查是否为字符串类型且包含非数字字符
+          if (typeof value === 'string' && !/^\d+$/.test(value)) {
+            callback(new Error('数量必须为正整数'));
+            return;
+          }
+
+          const num = Number(value);
+          if (isNaN(num) || num <= 0) {
+            callback(new Error('数量必须大于0'));
+          } else if (!Number.isInteger(num)) {
+            callback(new Error('数量必须为整数'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
+    ],
+    delayCardTime: [
+      { required: false, message: '延迟卡时间不能为空', trigger: 'blur' },
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const num = Number(value);
+          if (!value) {
+            callback(new Error('请输入延迟卡时间'));
+          } else if (!/^\d+$/.test(value)) {
+            callback(new Error('只能输入正整数'));
+          } else if (num < 10 || num > 15) {
+            callback(new Error('延迟卡时间必须在10-15秒之间'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
+    ],
+    delayCardNum: [
+      { required: false, message: '延迟卡数量不能为空', trigger: 'blur' },
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const num = Number(value);
+          if (!value) {
+            callback(new Error('请输入延迟卡数量'));
+          } else if (!/^\d+$/.test(value)) {
+            callback(new Error('只能输入正整数'));
+          } else if (num < 1 || num > 99) {
+            callback(new Error('延迟卡数量必须在1-99之间'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
+    ]
   }
 });