浏览代码

feat(system): 新增领奖审核功能

- 添加领奖审核相关的 API 接口和类型定义- 实现领奖审核对话框的展示和数据加载
-优化比赛列表和报名时间的显示
- 新增比赛类型和报名时间的字典数据
fugui001 5 月之前
父节点
当前提交
bc7bd0ea66

+ 63 - 0
src/api/system/business/claims/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ClaimsVO, ClaimsForm, ClaimsQuery } from '@/api/system/business/claims/types';
+
+/**
+ * 查询用户参赛列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listClaims = (query?: ClaimsQuery): AxiosPromise<ClaimsVO[]> => {
+  return request({
+    url: '/business/claims/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询用户参赛详细
+ * @param id
+ */
+export const getClaims = (id: string | number): AxiosPromise<ClaimsVO> => {
+  return request({
+    url: '/business/claims/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增用户参赛
+ * @param data
+ */
+export const addClaims = (data: ClaimsForm) => {
+  return request({
+    url: '/business/claims',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改用户参赛
+ * @param data
+ */
+export const updateClaims = (data: ClaimsForm) => {
+  return request({
+    url: '/business/claims',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除用户参赛
+ * @param id
+ */
+export const delClaims = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/business/claims/' + id,
+    method: 'delete'
+  });
+};

+ 155 - 0
src/api/system/business/claims/types.ts

@@ -0,0 +1,155 @@
+export interface ClaimsVO {
+  /**
+   *
+   */
+  id: string | number;
+
+  /**
+   * 赛事id
+   */
+  tournamentId: string | number;
+
+  /**
+   * 用户id
+   */
+  playerId: string | number;
+
+  /**
+   * 排名
+   */
+  rank: number;
+
+  /**
+   * 实名
+   */
+  playerName: string;
+
+  /**
+   *
+   */
+  phone: string;
+
+  /**
+   * 奖励
+   */
+  rewardJson: string;
+
+  /**
+   * 是否审核
+   */
+  claimed: number;
+
+  /**
+   *
+   */
+  createdAt: string;
+
+  /**
+   *
+   */
+  updatedAt: string;
+}
+
+export interface ClaimsForm extends BaseEntity {
+  /**
+   *
+   */
+  id?: string | number;
+
+  /**
+   * 赛事id
+   */
+  tournamentId?: string | number;
+
+  /**
+   * 用户id
+   */
+  playerId?: string | number;
+
+  /**
+   * 排名
+   */
+  rank?: number;
+
+  /**
+   * 实名
+   */
+  playerName?: string;
+
+  /**
+   *
+   */
+  phone?: string;
+
+  /**
+   * 奖励
+   */
+  rewardJson?: string;
+
+  /**
+   * 是否审核
+   */
+  claimed?: number;
+
+  /**
+   *
+   */
+  createdAt?: string;
+
+  /**
+   *
+   */
+  updatedAt?: string;
+}
+
+export interface ClaimsQuery extends PageQuery {
+  /**
+   * 赛事id
+   */
+  tournamentId?: string | number;
+
+  /**
+   * 用户id
+   */
+  playerId?: string | number;
+
+  /**
+   * 排名
+   */
+  rank?: number;
+
+  /**
+   * 实名
+   */
+  playerName?: string;
+
+  /**
+   *
+   */
+  phone?: string;
+
+  /**
+   * 奖励
+   */
+  rewardJson?: string;
+
+  /**
+   * 是否审核
+   */
+  claimed?: number;
+
+  /**
+   *
+   */
+  createdAt?: string;
+
+  /**
+   *
+   */
+  updatedAt?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 8 - 0
src/api/system/business/tournaments/types.ts

@@ -13,6 +13,11 @@ export interface TournamentsVO {
    */
   startTime: string;
 
+  /**
+   * 比赛开始时间
+   */
+  endTime: string;
+
   /**
    * 游戏类型
    */
@@ -74,6 +79,7 @@ export interface TournamentsVO {
   blindStructuresName?: string;
   itemsName?: string;
   itemsPrizeList?: ItemsPrize[];
+  tournamentsBiId?: string;
 }
 
 export interface TournamentsForm extends BaseEntity {
@@ -228,3 +234,5 @@ export interface TournamentsBindStructuresVO {
   tournamentsName: string;
   allocationStatus: number;
 }
+
+

+ 131 - 7
src/views/system/business/tournaments/index.vue

@@ -114,10 +114,14 @@
               <el-tooltip content="编辑" placement="top">
                 <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row, 'edit')">编辑</el-button>
               </el-tooltip>
-              <el-tooltip content="分配盲注" placement="top">
-                <el-button link type="success" icon="Document" @click="openAssignDialog(scope.row)"> 分配 </el-button>
+              <el-tooltip content="领奖审核" placement="top">
+                <el-button link type="primary" icon="Edit" @click="openAuditDialog(scope.row.id)">领奖审核</el-button>
               </el-tooltip>
 
+              <!--              <el-tooltip content="分配盲注" placement="top">
+                <el-button link type="success" icon="Document" @click="openAssignDialog(scope.row)"> 分配 </el-button>
+              </el-tooltip>-->
+
               <!--            <el-tooltip content="删除" placement="top">
   <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:tournaments:remove']"></el-button>
 </el-tooltip>-->
@@ -219,11 +223,15 @@
           />
         </el-form-item>
 
-        <!-- 报名时间 -->
+        <el-form-item label="比赛类型">
+          <el-select 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-select>
+        </el-form-item>
+
         <el-form-item label="报名时间">
           <el-select v-model="form.signTime" placeholder="请选择" :disabled="dialog.mode === 'view'">
-            <el-option label="比赛前5分钟" :value="5" />
-            <el-option label="比赛前10分钟" :value="10" />
+            <el-option v-for="dict in tournaments_time" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
 
@@ -344,6 +352,64 @@
     <el-dialog v-model="dialogVisible" title="图片预览" width="50%">
       <img :src="previewSrc || iconPreviewUrl || competitionIcon" alt="预览图片" style="max-width: 100%; max-height: 80vh" />
     </el-dialog>
+
+    <el-dialog
+      :title="`${tournamentInfo.name} ${tournamentInfo.tournamentsBiId}`"
+      v-model="auditDialog.visible"
+      width="1000px"
+      append-to-body
+      @close="cancelAudit"
+    >
+      <!-- 查看对局记录按钮 -->
+      <div class="dialog-header-actions">
+        <el-button type="primary">查看对局记录</el-button>
+      </div>
+
+      <!-- 比赛信息展示 -->
+      <div class="tournament-info" v-if="tournamentInfo.id">
+        <p>比赛时间:{{ tournamentInfo.startTime }} ~ {{ tournamentInfo.endTime }}</p>
+        <p>参加人数:{{ tournamentInfo.id }}人</p>
+        <p v-if="tournamentInfo.id">比赛类型:{{ tournamentInfo.id }}</p>
+        <p v-if="tournamentInfo.id">报名条件:{{ tournamentInfo.itemsName }} x {{ tournamentInfo.itemsNum }}</p>
+        <p v-if="tournamentInfo.id">盲注表:{{ tournamentInfo.blindStructuresName }}</p>
+        <p v-if="tournamentInfo.id">报名截止等级:{{ tournamentInfo.lateRegistrationLevel }}</p>
+      </div>
+
+      <!-- 表格内容 -->
+      <el-table :data="auditData" border style="width: 100%">
+        <el-table-column prop="rank" label="排名" align="center"></el-table-column>
+        <el-table-column prop="playerName" label="用户名" align="center"></el-table-column>
+        <el-table-column prop="phone" label="手机" align="center"></el-table-column>
+        <el-table-column label="奖励" align="center">
+          <template #default="scope">
+            <div v-for="(prize, index) in scope.row.rewardVoList" :key="index">{{ prize.itemName }} {{ prize.quantity }}</div>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="claimed" label="状态" align="center"></el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="查看牌局" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">查看牌局</el-button>
+            </el-tooltip>
+            <el-tooltip content="审核" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">审核</el-button>
+            </el-tooltip>
+            <el-tooltip content="移除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">移除</el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 对话框底部按钮 -->
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancelAudit">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -361,10 +427,13 @@ import {
 import { selectItemsSelList } from '@/api/system/business/items';
 import { selectBlindLevelsById } from '@/api/system/business/levels';
 import { selectBlingStructuresInfo } from '@/api/system/business/structures';
+import { listClaims } from '@/api/system/business/claims';
 import { TournamentsVO, TournamentsQuery, TournamentsForm, TournamentsBindStructuresVO } from '@/api/system/business/tournaments/types';
 import { ref } from 'vue';
 import LevelsIndex from '@/views/system/business/levels/index.vue';
+import { ClaimsVO } from '@/api/system/business/claims/types';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { tournaments_type, tournaments_time } = toRefs<any>(proxy?.useDict('tournaments_type', 'tournaments_time'));
 
 const tournamentsList = ref<TournamentsVO[]>([]);
 const buttonLoading = ref(false);
@@ -568,7 +637,7 @@ const initFormData: TournamentsForm = {
   status: undefined,
   createdAt: undefined,
   updatedAt: undefined,
-  signTime: null,
+  signTime: undefined,
   competitionIcon: null,
   itemsId: null,
   itemsNum: null,
@@ -682,8 +751,15 @@ const handleUpdate = async (row?: TournamentsVO, mode: 'edit' | 'view' = 'edit')
 
   const _id = row?.id || ids.value[0];
   const res = await getTournaments(_id);
-
+  // 确保 gameType 是 number 类型
+  const gameType = Number(res.data.gameType);
+  const signTime = Number(res.data.signTime);
+  debugger;
+  // 设置表单数据
   Object.assign(form.value, res.data);
+  form.value.gameType = gameType; // 确保赋值正确
+  form.value.signTime = signTime;
+
   competitionIcon.value = res.data.competitionIcon;
   // 处理奖励表单数据
   const prizeItems = res.data.itemsPrizeList || [];
@@ -943,4 +1019,52 @@ const handleSortChange = ({ prop, order }) => {
     getList();
   }
 };
+
+const auditDialog = ref({
+  visible: false,
+  title: ''
+});
+
+const tournamentInfo = ref<Partial<TournamentsVO>>({
+  id: '',
+  startTime: '',
+  endTime: '',
+  itemsNum: 0,
+  itemsName: '',
+  blindStructureId: 0,
+  blindStructuresName: '',
+  lateRegistrationLevel: 0,
+  tournamentsBiId: ''
+});
+
+const auditData = ref<ClaimsVO[]>([]);
+
+// 模拟打开对话框并获取数据
+const openAuditDialog = async (tournamentId) => {
+  auditDialog.value.visible = true;
+  try {
+    const res = await getTournaments(tournamentId);
+    debugger;
+    if (res.code === 200) {
+      tournamentInfo.value = res.data;
+    }
+    // 创建新的查询参数对象,不影响原始 queryParams
+    const auditQueryParams = {
+      pageNum: 1,
+      pageSize: 10,
+      tournamentId: tournamentId
+    };
+    const res2 = await listClaims(auditQueryParams);
+    auditData.value = res2.rows;
+  } catch (error) {
+    console.error('获取数据失败', error);
+  }
+};
+
+// 关闭对话框
+const cancelAudit = () => {
+  auditDialog.value.visible = false;
+  /*tournamentInfo.value = {};
+  auditData.value = [];*/
+};
 </script>