Browse Source

feat(business): 新增业务配置管理功能

- 新增客服电话、微信、赞助商电话等配置项
- 支持多条联系方式的动态增删改查
- 提供配置列表查询与导出功能
- 实现配置详情查看与编辑功能
- 添加配置删除与批量删除操作
- 集成下载地址配置管理- 完善表单验证规则与交互逻辑
- 优化用户界面与操作体验
fugui001 1 tháng trước cách đây
mục cha
commit
c347a72b63
33 tập tin đã thay đổi với 1370 bổ sung154 xóa
  1. 63 0
      src/api/system/business/businessConfig/index.ts
  2. 100 0
      src/api/system/business/businessConfig/types.ts
  3. 6 5
      src/api/system/business/config/index.ts
  4. 4 0
      src/api/system/business/config/types.ts
  5. 22 0
      src/api/system/business/tournaments/index.ts
  6. 1 0
      src/api/system/business/tournaments/types.ts
  7. 1 0
      src/api/system/business/tournamentsTemplate/types.ts
  8. 19 0
      src/api/system/business/versionManagement/index.ts
  9. 14 1
      src/views/system/business/apiUsers/index.vue
  10. 379 0
      src/views/system/business/businessConfig/index.vue
  11. 5 5
      src/views/system/business/category/index.vue
  12. 22 5
      src/views/system/business/checkRecord/index.vue
  13. 4 4
      src/views/system/business/complaints/index.vue
  14. 26 18
      src/views/system/business/config/index.vue
  15. 206 0
      src/views/system/business/downloads/indexDownloadPreview.vue
  16. 6 6
      src/views/system/business/handHistory/index.vue
  17. 4 4
      src/views/system/business/messages/index.vue
  18. 5 5
      src/views/system/business/ofService/index.vue
  19. 88 37
      src/views/system/business/participants/index.vue
  20. 3 4
      src/views/system/business/pic/index.vue
  21. 258 0
      src/views/system/business/playerItems/index.vue
  22. 6 6
      src/views/system/business/policy/index.vue
  23. 2 2
      src/views/system/business/products/index.vue
  24. 5 5
      src/views/system/business/receivers/index.vue
  25. 9 7
      src/views/system/business/rechargeTop/index.vue
  26. 6 6
      src/views/system/business/scheme/index.vue
  27. 8 9
      src/views/system/business/staticTop/index.vue
  28. 2 2
      src/views/system/business/structures/index.vue
  29. 9 7
      src/views/system/business/toolsLog/index.vue
  30. 60 9
      src/views/system/business/tournaments/index.vue
  31. 23 3
      src/views/system/business/tournamentsTemplate/index.vue
  32. 3 3
      src/views/system/business/userToolsLog/index.vue
  33. 1 1
      src/views/system/business/versionManagement/index.vue

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BusinessConfigVO, BusinessConfigForm, BusinessConfigQuery } from '@/api/system/business/businessConfig/types';
+
+/**
+ * 查询需求业务配置列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBusinessConfig = (query?: BusinessConfigQuery): AxiosPromise<BusinessConfigVO[]> => {
+  return request({
+    url: '/business/businessConfig/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询需求业务配置详细
+ * @param id
+ */
+export const getBusinessConfig = (id: string | number): AxiosPromise<BusinessConfigVO> => {
+  return request({
+    url: '/business/businessConfig/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增需求业务配置
+ * @param data
+ */
+export const addBusinessConfig = (data: BusinessConfigForm) => {
+  return request({
+    url: '/business/businessConfig',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改需求业务配置
+ * @param data
+ */
+export const updateBusinessConfig = (data: BusinessConfigForm) => {
+  return request({
+    url: '/business/businessConfig',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除需求业务配置
+ * @param id
+ */
+export const delBusinessConfig = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/business/businessConfig/' + id,
+    method: 'delete'
+  });
+};

+ 100 - 0
src/api/system/business/businessConfig/types.ts

@@ -0,0 +1,100 @@
+export interface BusinessConfigVO {
+  /**
+   *
+   */
+  id: string | number;
+
+  /**
+   * 客服电话
+   */
+  kfIphone: string;
+
+  /**
+   * 客服微信
+   */
+  wechat: string;
+
+  /**
+   * 赞助商电话
+   */
+  zzIphone: string;
+
+  /**
+   * 下载地址
+   */
+  downUrl: string;
+
+}
+
+export interface BusinessConfigForm extends BaseEntity {
+  /**
+   *
+   */
+  id?: string | number;
+
+  /**
+   * 客服电话
+   */
+  kfIphone?: string;
+
+  /**
+   * 客服微信
+   */
+  wechat?: string;
+
+  /**
+   * 赞助商电话
+   */
+  zzIphone?: string;
+
+  /**
+   * 下载地址
+   */
+  downUrl?: string;
+
+  /**
+   * 客服电话列表
+   */
+  kfIphoneList?: string[];
+
+  /**
+   * 客服微信列表
+   */
+  wechatList?: string[];
+
+  /**
+   * 赞助商电话列表
+   */
+  zzIphoneList?: string[];
+}
+
+export interface BusinessConfigQuery extends PageQuery {
+
+  /**
+   * 客服电话
+   */
+  kfIphone?: string;
+
+  /**
+   * 客服微信
+   */
+  wechat?: string;
+
+  /**
+   * 赞助商电话
+   */
+  zzIphone?: string;
+
+  /**
+   * 下载地址
+   */
+  downUrl?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 6 - 5
src/api/system/business/config/index.ts

@@ -131,12 +131,13 @@ export const startScheduleConfig = (id: string | number): AxiosPromise<ConfigVO>
 };
 
 /**
- * 生成未来七天数据
- * @param id
+ * 生成未来指定天数的数据
+ * @param days 天数
  */
-export const generateMatchesForNextSevenDays = (id: string | number): AxiosPromise<ConfigVO> => {
+export const generateMatchesForNextDays = (days: number, configId: string | number): AxiosPromise<ConfigVO> => {
   return request({
-    url: '/business/job/generateMatchesForNextSevenDays',
-    method: 'post'
+    url: '/business/job/generateMatchesForNextDays',
+    method: 'post',
+    params: { days, configId } // 添加 configId 参数传递
   });
 };

+ 4 - 0
src/api/system/business/config/types.ts

@@ -45,6 +45,8 @@ export interface ConfigVO {
   updatedAt: string;
 
   execTimes: string;
+
+  generateDay?: number;
 }
 
 export interface ConfigForm extends BaseEntity {
@@ -101,6 +103,8 @@ export interface ConfigForm extends BaseEntity {
   repeatTypes?: string[]; // 👈 新增:用于存储多选的重复类型
 
   execTimes?: string[]; // 👈 新增:用于时间
+
+  generateDay?: string;
 }
 
 export interface ConfigQuery extends PageQuery {

+ 22 - 0
src/api/system/business/tournaments/index.ts

@@ -136,3 +136,25 @@ export const getStatisticsPageList = (query?: TournamentsQuery): AxiosPromise<To
     params: query
   });
 };
+
+/**
+ * 恢复比赛
+ * @param id
+ */
+export const recoverTournament = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/business/tournaments/recoverTournament/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 粉碎删除
+ * @param id
+ */
+export const deleteRelationTournament = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/business/tournaments/deleteRelationTournament/' + id,
+    method: 'delete'
+  });
+};

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

@@ -165,6 +165,7 @@ export interface TournamentsForm extends BaseEntity {
   delayCardNum?: string;
   delayCardTime?: string;
   competitionBg?: string;
+  minPlayers?: number;
 }
 
 export interface ItemsPrize {

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

@@ -162,6 +162,7 @@ export interface TournamentsForm extends BaseEntity {
 
   delayCardNum?: number;
   delayCardTime?: number;
+  minPlayers?: number;
 }
 
 export interface ItemsPrize {

+ 19 - 0
src/api/system/business/versionManagement/index.ts

@@ -61,3 +61,22 @@ export const delVersionManagement = (id: string | number | Array<string | number
     method: 'delete'
   });
 };
+/**
+ * 获取App版本管理
+ * @param id
+ */
+export const getMaxNewAppVersion = () => {
+  return request({
+    url: '/business/versionManagement/getMaxNewAppVersion',
+    method: 'get'
+  });
+};
+/**
+ * 苹果下载
+ */
+export const downloadAppIosUrl = () => {
+  return request({
+    url: '/business/versionManagement/downloadAppIosUrl',
+    method: 'get'
+  });
+};

+ 14 - 1
src/views/system/business/apiUsers/index.vue

@@ -137,6 +137,10 @@
               <el-tooltip content="查看流水" placement="top">
                 <el-button link type="primary" icon="View" @click="viewPointsLog(scope.row)" v-hasPermi="['business:user:edit']">查看流水</el-button>
               </el-tooltip>
+
+              <el-tooltip content="查看道具" placement="top">
+                <el-button link type="primary" icon="View" @click="viewPointsBag(scope.row)" v-hasPermi="['business:user:edit']">查看道具</el-button>
+              </el-tooltip>
             </div>
           </template>
         </el-table-column>
@@ -666,7 +670,16 @@ const viewPointsLog = (row: UserVO) => {
     }
   });
 };
-
+const viewPointsBag = (row: UserVO) => {
+  // 跳转到积分流水页面,并传递用户ID作为查询参数
+  router.push({
+    path: '/service/playerItems',
+    query: {
+      userId: row.id,
+      t: Date.now() // 添加时间戳确保URL变化,触发页面刷新
+    }
+  });
+};
 // 弹窗状态和表单数据
 const editPhoneDialog = reactive({
   visible: false,

+ 379 - 0
src/views/system/business/businessConfig/index.vue

@@ -0,0 +1,379 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="客服电话" prop="kfIphone">
+              <el-input v-model="queryParams.kfIphone" placeholder="请输入客服电话" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客服微信" prop="wechat">
+              <el-input v-model="queryParams.wechat" placeholder="请输入客服微信" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:businessConfig:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:businessConfig:edit']"
+              >修改</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:businessConfig:remove']"
+              >删除</el-button
+            >
+          </el-col>
+          <!--          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:businessConfig:export']">导出</el-button>
+          </el-col>-->
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="businessConfigList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="编号" align="center" prop="id" v-if="true" />
+        <el-table-column label="客服电话" align="center" prop="kfIphoneList">
+          <template #default="scope">
+            <div v-if="scope.row.kfIphoneList && scope.row.kfIphoneList.length > 0">
+              <div v-for="(item, index) in scope.row.kfIphoneList" :key="index" class="phone-item">
+                {{ item }}
+              </div>
+            </div>
+            <div v-else>暂无数据</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="客服微信" align="center" prop="wechatList">
+          <template #default="scope">
+            <div v-if="scope.row.wechatList && scope.row.wechatList.length > 0">
+              <div v-for="(item, index) in scope.row.wechatList" :key="index" class="phone-item">
+                {{ item }}
+              </div>
+            </div>
+            <div v-else>暂无数据</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="赞助商电话" align="center" prop="zzIphoneList">
+          <template #default="scope">
+            <div v-if="scope.row.zzIphoneList && scope.row.zzIphoneList.length > 0">
+              <div v-for="(item, index) in scope.row.zzIphoneList" :key="index" class="phone-item">
+                {{ item }}
+              </div>
+            </div>
+            <div v-else>暂无数据</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="下载地址" align="center" prop="downUrl" />
+        <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)" v-hasPermi="['business:businessConfig:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button
+                link
+                type="primary"
+                icon="Delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['business:businessConfig:remove']"
+              ></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改需求业务配置对话框-->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="businessConfigFormRef" :model="form" :rules="rules" label-width="80px">
+        <!-- 客服电话 -->
+        <el-form-item label="客服电话" prop="kfIphoneList">
+          <div class="dynamic-input-container">
+            <div v-for="(item, index) in form.kfIphoneList" :key="index" class="input-item">
+              <el-input v-model="form.kfIphoneList[index]" placeholder="请输入客服电话" style="width: 200px; margin-right: 10px" />
+              <el-button type="danger" size="small" @click="removeItem('kfIphoneList', index)" style="margin-top: 5px"> 删除 </el-button>
+            </div>
+            <el-button type="primary" size="small" @click="addItem('kfIphoneList')" style="margin-top: 5px"> 添加 </el-button>
+          </div>
+        </el-form-item>
+
+        <!-- 客服微信 -->
+        <el-form-item label="客服微信" prop="wechatList">
+          <div class="dynamic-input-container">
+            <div v-for="(item, index) in form.wechatList" :key="index" class="input-item">
+              <el-input v-model="form.wechatList[index]" placeholder="请输入客服微信" style="width: 200px; margin-right: 10px" />
+              <el-button type="danger" size="small" @click="removeItem('wechatList', index)" style="margin-top: 5px"> 删除 </el-button>
+            </div>
+            <el-button type="primary" size="small" @click="addItem('wechatList')" style="margin-top: 5px"> 添加 </el-button>
+          </div>
+        </el-form-item>
+
+        <!-- 赞助商电话 -->
+        <el-form-item label="赞助商电话" prop="zzIphoneList">
+          <div class="dynamic-input-container">
+            <div v-for="(item, index) in form.zzIphoneList" :key="index" class="input-item">
+              <el-input v-model="form.zzIphoneList[index]" placeholder="请输入赞助商电话" style="width: 200px; margin-right: 10px" />
+              <el-button type="danger" size="small" @click="removeItem('zzIphoneList', index)" style="margin-top: 5px"> 删除 </el-button>
+            </div>
+            <el-button type="primary" size="small" @click="addItem('zzIphoneList')" style="margin-top: 5px"> 添加 </el-button>
+          </div>
+        </el-form-item>
+        <!-- 下载地址 -->
+        <el-form-item label="下载地址" prop="downUrl">
+          <el-input v-model="form.downUrl" placeholder="请输入下载地址" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="BusinessConfig" lang="ts">
+import {
+  listBusinessConfig,
+  getBusinessConfig,
+  delBusinessConfig,
+  addBusinessConfig,
+  updateBusinessConfig
+} from '@/api/system/business/businessConfig';
+import { BusinessConfigVO, BusinessConfigQuery, BusinessConfigForm } from '@/api/system/business/businessConfig/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const businessConfigList = ref<BusinessConfigVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const businessConfigFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: BusinessConfigForm = {
+  id: undefined,
+  kfIphone: undefined,
+  wechat: undefined,
+  zzIphone: undefined,
+  downUrl: undefined
+};
+const data = reactive<PageData<BusinessConfigForm, BusinessConfigQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    kfIphone: undefined,
+    wechat: undefined,
+    zzIphone: undefined,
+    downUrl: undefined,
+    params: {}
+  },
+  rules: {
+    id: [{ required: true, message: '不能为空', trigger: 'blur' }],
+    kfIphoneList: [
+      {
+        required: true,
+        message: '至少需要填写一个客服电话',
+        trigger: 'blur'
+      },
+      {
+        validator: (rule: any, value: string[], callback: (error?: Error | string) => void) => {
+          if (!value || value.length === 0) {
+            callback(new Error('至少需要填写一个客服电话'));
+          } else {
+            // 验证每个电话号码是否为空
+            const emptyItems = value.filter((item) => !item || item.trim() === '');
+            if (emptyItems.length > 0) {
+              callback(new Error('客服电话不能为空'));
+            } else {
+              callback();
+            }
+          }
+        },
+        trigger: 'blur'
+      }
+    ],
+    wechatList: [
+      {
+        required: true,
+        message: '至少需要填写一个客服微信',
+        trigger: 'blur'
+      },
+      {
+        validator: (rule: any, value: string[], callback: (error?: Error | string) => void) => {
+          if (!value || value.length === 0) {
+            callback(new Error('至少需要填写一个客服微信'));
+          } else {
+            const emptyItems = value.filter((item) => !item || item.trim() === '');
+            if (emptyItems.length > 0) {
+              callback(new Error('客服微信不能为空'));
+            } else {
+              callback();
+            }
+          }
+        },
+        trigger: 'blur'
+      }
+    ],
+    zzIphoneList: [
+      {
+        required: true,
+        message: '至少需要填写一个赞助商电话',
+        trigger: 'blur'
+      },
+      {
+        validator: (rule: any, value: string[], callback: (error?: Error | string) => void) => {
+          if (!value || value.length === 0) {
+            callback(new Error('至少需要填写一个赞助商电话'));
+          } else {
+            const emptyItems = value.filter((item) => !item || item.trim() === '');
+            if (emptyItems.length > 0) {
+              callback(new Error('赞助商电话不能为空'));
+            } else {
+              callback();
+            }
+          }
+        },
+        trigger: 'blur'
+      }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询需求业务配置列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listBusinessConfig(queryParams.value);
+  businessConfigList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  businessConfigFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: BusinessConfigVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加';
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: BusinessConfigVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getBusinessConfig(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  businessConfigFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateBusinessConfig(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addBusinessConfig(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: BusinessConfigVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delBusinessConfig(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'business/businessConfig/export',
+    {
+      ...queryParams.value
+    },
+    `businessConfig_${new Date().getTime()}.xlsx`
+  );
+};
+// 添加新项
+const addItem = (field: string) => {
+  if (!form.value[field]) {
+    form.value[field] = [];
+  }
+  form.value[field].push('');
+};
+
+// 删除项
+const removeItem = (field: string, index: number) => {
+  form.value[field].splice(index, 1);
+};
+onMounted(() => {
+  getList();
+});
+</script>
+

+ 5 - 5
src/views/system/business/category/index.vue

@@ -23,15 +23,15 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:category:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:category:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:category:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:category:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:category:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:category:remove']"
               >删除</el-button
             >
           </el-col>
@@ -57,10 +57,10 @@
         <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)" v-hasPermi="['system:category:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:category:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:category:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:category:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 22 - 5
src/views/system/business/checkRecord/index.vue

@@ -11,10 +11,27 @@
           <el-form label-width="80px" size="default">
             <el-form-item label="选择商品">
               <el-radio-group v-model="data2.leftForm.selectedItem">
-                <el-radio label="1001">三湘杯资格卡</el-radio>
+                <el-radio label="1002">附赛资格卡</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1001">三湘杯主赛ABCD(任选)邀请函</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1003">三湘杯总决赛邀请函(A组)</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1004">三湘杯总决赛邀请函(B组)</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1005">三湘杯总决赛邀请函(C组)</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1006">三湘杯总决赛邀请函(D组)</el-radio>
+              </el-radio-group>
+              <el-radio-group v-model="data2.leftForm.selectedItem">
+                <el-radio label="1007">三湘杯总决赛邀请函(ABCD组任选)</el-radio>
               </el-radio-group>
             </el-form-item>
-
             <el-form-item label="核销数量">
               <el-input-number v-model="data2.leftForm.num" :min="1" placeholder="请输入数量" class="w-full" />
             </el-form-item>
@@ -77,7 +94,7 @@
         <el-card shadow="never">
           <!-- 在这里添加导出按钮 -->
           <div class="mb-3 flex justify-start">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:checkRecord:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
           </div>
 
           <el-table v-loading="loading" border :data="checkRecordList" @selection-change="handleSelectionChange">
@@ -314,7 +331,7 @@ watch(
 );
 // 类型定义(建议补充)
 interface LeftSideForm {
-  selectedItem: '1001'; // 👈 设置默认选中 '1001'(即“三湘杯资格卡”)
+  selectedItem: ''; // 👈 设置默认选中 '1001'(即“三湘杯资格卡”)
   num: number | null; // 核销数量
   searchUserKeyword: string; // 搜索用户关键词
 }
@@ -329,7 +346,7 @@ interface UserItemVO {
 }
 
 const initLeftFormData: LeftSideForm = {
-  selectedItem: '1001', // ✅ 直接赋值
+  selectedItem: '', // ✅ 直接赋值
   num: null,
   searchUserKeyword: ''
 };

+ 4 - 4
src/views/system/business/complaints/index.vue

@@ -84,18 +84,18 @@
         <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="View" @click="handleSeeRank(scope.row)" v-hasPermi="['system:complaints:edit']">
+              <el-button link type="primary" icon="View" @click="handleSeeRank(scope.row)" v-hasPermi="['business:complaints:query']">
                 查看比赛结果
               </el-button>
             </el-tooltip>
             <!-- status 为 1:显示“处理”按钮 -->
             <el-tooltip v-if="scope.row.status === 1" content="处理" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:complaints:edit']"> 处理 </el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:complaints:edit']"> 处理 </el-button>
             </el-tooltip>
 
             <!-- status 为 2 或 3:显示“查看处理结果”按钮 -->
             <el-tooltip v-else content="处理结果" placement="top">
-              <el-button link type="primary" icon="View" @click="handleUpdate2(scope.row)" v-hasPermi="['system:complaints:edit']">
+              <el-button link type="primary" icon="View" @click="handleUpdate2(scope.row)" v-hasPermi="['business:complaints:edit']">
                 处理结果
               </el-button>
             </el-tooltip>
@@ -464,7 +464,7 @@ const handleViewHistory = (row: ComplaintsVO) => {
   const playerIdStr = playerId != null ? String(playerId) : '';
 
   proxy?.$router.push({
-    path: '/business/history',
+    path: '/service/history',
     query: {
       tournamentId: String(tournamentId),
       playerId: playerIdStr

+ 26 - 18
src/views/system/business/config/index.vue

@@ -36,18 +36,18 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">新增投放方案</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:config:add']">新增投放方案</el-button>
           </el-col>
           <router-link to="/tournament/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 type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:config:remove']"
               >删除</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:config:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:config:export']">导出</el-button>
           </el-col>-->
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -55,7 +55,7 @@
 
       <el-table v-loading="loading" border :data="configList" @selection-change="handleSelectionChange">
         <!--        <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="id" v-if="true" width="80px;" />
         <el-table-column label="比赛名" align="center" prop="name" />
         <el-table-column label="比赛Logo" align="center">
           <template #default="scope">
@@ -106,7 +106,7 @@
           <template #default="scope">
             <!-- 查看按钮 -->
             <el-tooltip content="查看" placement="top">
-              <el-button link type="primary" size="small" @click="handleUpdate(scope.row, 'view')" v-hasPermi="['system:config:edit']">
+              <el-button link type="primary" size="small" @click="handleUpdate(scope.row, 'view')" v-hasPermi="['business:config:edit']">
                 <el-icon><View /></el-icon>
                 查看
               </el-button>
@@ -114,7 +114,7 @@
 
             <!-- 投放配置按钮 -->
             <el-tooltip content="投放配置" placement="top">
-              <el-button link type="success" size="small" @click="handleUpdate(scope.row, 'edit')" v-hasPermi="['system:config:edit']">
+              <el-button link type="success" size="small" @click="handleUpdate(scope.row, 'edit')" v-hasPermi="['business:config:edit']">
                 <el-icon><Setting /></el-icon>
                 投放配置
               </el-button>
@@ -125,7 +125,7 @@
             <template v-if="scope.row.enabled">
               <!-- 已启用,显示:停止按钮 -->
               <el-tooltip content="停止" placement="top">
-                <el-button link type="warning" size="small" @click="handleStop(scope.row)" v-hasPermi="['system:config:remove']">
+                <el-button link type="warning" size="small" @click="handleStop(scope.row)" v-hasPermi="['business:config:remove']">
                   <el-icon><VideoPause /></el-icon> 停止
                 </el-button>
               </el-tooltip>
@@ -133,7 +133,7 @@
             <template v-else>
               <!-- 已禁用,显示:开始按钮 -->
               <el-tooltip content="开始" placement="top">
-                <el-button link type="success" size="small" @click="handleStart(scope.row)" v-hasPermi="['system:config:add']">
+                <el-button link type="success" size="small" @click="handleStart(scope.row)" v-hasPermi="['business:config:add']">
                   <el-icon><VideoPlay /></el-icon> 开始
                 </el-button>
               </el-tooltip>
@@ -141,7 +141,7 @@
 
             <!-- 删除按钮 -->
             <el-tooltip content="删除" placement="top">
-              <el-button link type="danger" size="small" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']">
+              <el-button link type="danger" size="small" @click="handleDelete(scope.row)" v-hasPermi="['business:config:remove']">
                 <el-icon><Delete /></el-icon>
                 删除
               </el-button>
@@ -153,7 +153,7 @@
                 type="success"
                 size="small"
                 @click="handleGenerateMatchesForNextSevenDays(scope.row)"
-                v-hasPermi="['system:config:remove']"
+                v-hasPermi="['business:config:remove']"
               >
                 <el-icon><VideoPlay /></el-icon>
                 生成
@@ -209,15 +209,17 @@
             <el-button v-if="mode !== 'view' && index !== 0" type="primary" @click="removeReward(index)" size="small"> - </el-button>
           </div>
         </el-form-item>
-
+        <el-form-item label="调度天数" prop="generateDay">
+          <el-input v-model="form.generateDay" placeholder="请输入调度天数" :disabled="mode === 'view'" />
+        </el-form-item>
         <!-- 创建方案 -->
-        <el-form-item label="创建方案" prop="creationSchemeCode">
+        <!--        <el-form-item label="创建方案" prop="creationSchemeCode">
           <div style="display: flex; align-items: center">
             <el-select v-model="form.creationSchemeCode" :disabled="mode === 'view'" placeholder="选择创建方案" style="width: 200px">
               <el-option v-for="item in itemOptionsSchemeList" :key="item.id" :label="item.label" :value="item.code" />
             </el-select>
           </div>
-        </el-form-item>
+        </el-form-item>-->
       </el-form>
 
       <!-- 底部按钮 -->
@@ -245,7 +247,8 @@ import {
   updateScheduleConfig,
   deleteScheduleConfig,
   stopScheduleConfig,
-  startScheduleConfig, generateMatchesForNextSevenDays
+  startScheduleConfig,
+  generateMatchesForNextDays
 } from '@/api/system/business/config';
 import { selectAllCreationSchemesAllList } from '@/api/system/business/scheme';
 import { ConfigVO, ConfigQuery, ConfigForm } from '@/api/system/business/config/types';
@@ -299,7 +302,8 @@ const data = reactive<PageData<ConfigForm, ConfigQuery>>({
     id: [{ required: true, message: '不能为空', trigger: 'blur' }],
     templateId: [{ required: true, message: '模板ID不能为空', trigger: 'blur' }],
     startDate: [{ required: true, message: '开始日期不能为空', trigger: 'blur' }],
-    endDate: [{ required: true, message: '结束日期不能为空', trigger: 'blur' }]
+    endDate: [{ required: true, message: '结束日期不能为空', trigger: 'blur' }],
+    generateDay: [{ required: true, message: '调度天数不能为空', trigger: 'blur' }]
   }
 });
 
@@ -413,11 +417,15 @@ const handleDelete = async (row?: ConfigVO) => {
   await getList();
 };
 
-/** 删除按钮操作 */
+/**
+ * 生成配置天数数据
+ * @param row
+ */
 const handleGenerateMatchesForNextSevenDays = async (row?: ConfigVO) => {
   const _ids = row?.id || ids.value;
   await proxy?.$modal.confirm('是否确认生成对应赛事数据项?').finally(() => (loading.value = false));
-  await generateMatchesForNextSevenDays(null);
+  // 使用 row.generateDay 作为 days 参数传递
+  await generateMatchesForNextDays(row.generateDay || 7, row.id); // 默认7天
   proxy?.$modal.msgSuccess('生成成功');
   await getList();
 };
@@ -442,7 +450,7 @@ const handleStart = async (row?: ConfigVO) => {
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download(
-    'system/config/export',
+    'business/config/export',
     {
       ...queryParams.value
     },

+ 206 - 0
src/views/system/business/downloads/indexDownloadPreview.vue

@@ -0,0 +1,206 @@
+<template>
+  <div class="app-download-page">
+    <el-card class="download-card">
+<!--      <div class="app-header">
+        <div class="app-logo-placeholder">
+          <i class="el-icon-mobile"></i>
+        </div>
+        <h1>{{ downloadInfo.appName }}</h1>
+        <p class="app-description">{{ downloadInfo.appDescription }}</p>
+      </div>-->
+
+      <div class="download-section">
+        <h2>立即下载</h2>
+        <div class="download-buttons">
+          <el-button type="primary" class="download-btn android-btn" @click="downloadAndroid" :loading="loading.android">
+            <i class="el-icon-mobile"></i>
+            Android下载
+          </el-button>
+          <el-button type="success" class="download-btn ios-btn" @click="downloadIOS" :loading="loading.ios">
+            <i class="el-icon-apple"></i>
+            iOS下载
+          </el-button>
+        </div>
+        <div style=" margin-top: 15px;
+            padding: 12px;
+            background-color: #fffbe6;
+            border: 1px solid #ffe58f;
+            border-radius: 4px;
+            text-align: center;
+            font-size: 13px;
+            line-height: 1.5;
+            color: #8c8c8c;
+            max-width: 500px;
+            margin-left: auto;
+            margin-right: auto;">
+          <p>我已知晓内测应用的来源,并同意自行承担下载此APP所带来的一切风险</p>
+          <p>应用仅供内部测试,请谨慎辨别下载</p>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue';
+import { downloadAppIosUrl, getMaxNewAppVersion } from '@/api/system/business/versionManagement';
+// 下载信息
+import request from '@/utils/request';
+const downloadInfo = ref({
+  androidUrl: '',
+  iosUrl: '',
+  appName: '超级应用',
+  appDescription: '一款功能强大、界面美观的移动应用程序,为您提供便捷的服务体验'
+});
+
+// 加载状态
+const loading = ref({
+  android: false,
+  ios: false
+});
+
+// 获取下载信息
+const fetchDownloadInfo = async () => {
+  try {
+    // 获取版本信息
+    const versionResponse = await getMaxNewAppVersion();
+    downloadInfo.value = {
+      ...downloadInfo.value,
+      ...versionResponse.data
+    };
+  } catch (error) {
+    console.error('获取下载信息失败:', error);
+    // 使用默认值
+  }
+};
+
+// Android下载
+const downloadAndroid = () => {
+  if (downloadInfo.value.androidUrl) {
+    loading.value.android = true;
+    window.open(downloadInfo.value.androidUrl, '_blank');
+    setTimeout(() => {
+      loading.value.android = false;
+    }, 1000);
+  }
+};
+
+// iOS下载
+const downloadIOS = () => {
+  if (downloadInfo.value.iosUrl) {
+    loading.value.ios = true;
+    window.open(downloadInfo.value.iosUrl, '_blank');
+    setTimeout(() => {
+      loading.value.ios = false;
+    }, 1000);
+  }
+};
+
+onMounted(() => {
+  fetchDownloadInfo();
+});
+</script>
+
+<style scoped>
+.app-download-page {
+  padding: 20px;
+  max-width: 1200px;
+  margin: 0 auto;
+}
+
+.download-card {
+  border-radius: 10px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+}
+
+.app-header {
+  text-align: center;
+  padding: 20px 0;
+  border-bottom: 1px solid #eee;
+}
+
+.app-logo-placeholder {
+  width: 100px;
+  height: 100px;
+  margin: 0 auto 20px;
+  border-radius: 50%;
+  background-color: #409eff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 48px;
+  color: white;
+}
+
+.app-header h1 {
+  font-size: 32px;
+  color: #333;
+  margin-bottom: 10px;
+}
+
+.app-description {
+  font-size: 18px;
+  color: #666;
+  max-width: 600px;
+  margin: 0 auto;
+}
+
+.download-section {
+  padding: 30px 0;
+  text-align: center;
+}
+
+.download-section h2 {
+  font-size: 28px;
+  margin-bottom: 30px;
+  color: #333;
+}
+
+.download-buttons {
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  flex-wrap: wrap;
+}
+
+.download-btn {
+  padding: 15px 30px;
+  font-size: 18px;
+  border-radius: 50px;
+}
+
+.android-btn {
+  background-color: #3ddc84;
+  border-color: #3ddc84;
+}
+
+.android-btn:hover {
+  background-color: #2fc973;
+  border-color: #2fc973;
+}
+
+.ios-btn {
+  background-color: #000;
+  border-color: #000;
+}
+
+.ios-btn:hover {
+  background-color: #333;
+  border-color: #333;
+}
+
+@media (max-width: 768px) {
+  .app-download-page {
+    padding: 10px;
+  }
+
+  .download-buttons {
+    flex-direction: column;
+    align-items: center;
+  }
+
+  .download-btn {
+    width: 80%;
+  }
+}
+</style>

+ 6 - 6
src/views/system/business/handHistory/index.vue

@@ -17,20 +17,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:handHistory:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:handHistory:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:handHistory:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:handHistory:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:handHistory:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:handHistory:remove']"
               >删除</el-button
             >
           </el-col>
 <!--          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:handHistory:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:handHistory:export']">导出</el-button>
           </el-col>-->
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -43,10 +43,10 @@
         <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)" v-hasPermi="['system:handHistory:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:handHistory:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:handHistory:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:handHistory:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 4 - 4
src/views/system/business/messages/index.vue

@@ -23,20 +23,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:messages:add']">发送新消息</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:messages:add']">发送新消息</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:messages:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:messages:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:messages:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:messages:remove']"
               >删除</el-button
             >
           </el-col>
 <!--          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:messages:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:messages:export']">导出</el-button>
           </el-col>-->
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>

+ 5 - 5
src/views/system/business/ofService/index.vue

@@ -26,15 +26,15 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:ofService:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:ofService:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:ofService:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:ofService:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:ofService:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:ofService:remove']"
               >删除</el-button
             >
           </el-col>
@@ -65,10 +65,10 @@
         <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)" v-hasPermi="['system:ofService:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:ofService:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:ofService:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:ofService:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 88 - 37
src/views/system/business/participants/index.vue

@@ -4,38 +4,64 @@
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="报名用户" prop="userName">
-              <el-input
-                v-model="queryParams.userName"
-                style="width: 300px; min-width: 300px"
-                placeholder="请输入报名用户"
+            <!--            <el-form-item label="赛事" prop="tournamentId">
+              <el-select
+                v-model="queryParams.tournamentId"
+                placeholder="请选择赛事"
                 clearable
-                @keyup.enter="handleQuery"
-              />
-            </el-form-item>
-            <el-form-item label="手机号" prop="mobile">
-              <el-input
-                v-model="queryParams.mobile"
+                filterable
                 style="width: 300px; min-width: 300px"
-                placeholder="请输入手机号"
-                clearable
-                @keyup.enter="handleQuery"
-              />
-            </el-form-item>
-            <el-form-item label="报名时间" prop="registrationTime">
-              <el-date-picker
-                clearable
-                style="width: 240px"
-                v-model="queryParams.registrationTime"
-                type="date"
-                value-format="YYYY-MM-DD"
-                placeholder="请选择报名时间"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
+                @change="handleQuery"
+              >
+                <el-option v-for="tournament in tournamentOptions" :key="tournament.id" :label="tournament.name" :value="tournament.id" />
+              </el-select>
+            </el-form-item>-->
+
+            <el-row :gutter="10" class="mb8">
+              <el-form-item label="赛事ID" prop="userName">
+                <el-input
+                  v-model="queryParams.tournamentId"
+                  style="width: 300px; min-width: 300px"
+                  placeholder="请输入赛事ID"
+                  clearable
+                  @keyup.enter="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="报名用户" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  style="width: 300px; min-width: 300px"
+                  placeholder="请输入报名用户"
+                  clearable
+                  @keyup.enter="handleQuery"
+                />
+              </el-form-item>
+            </el-row>
+            <el-row :gutter="10" class="mb8">
+              <el-form-item label="手机号" prop="mobile">
+                <el-input
+                  v-model="queryParams.mobile"
+                  style="width: 300px; min-width: 300px"
+                  placeholder="请输入手机号"
+                  clearable
+                  @keyup.enter="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="报名时间" prop="registrationTime">
+                <el-date-picker
+                  clearable
+                  style="width: 300px"
+                  v-model="queryParams.registrationTime"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+                  placeholder="请选择报名时间"
+                />
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+              </el-form-item>
+            </el-row>
           </el-form>
         </el-card>
       </div>
@@ -45,16 +71,16 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <!--          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:participants:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:participants:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:participants:edit']">修改</el-button>
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:participants:edit']">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:participants:remove']">删除</el-button>
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:participants:remove']">删除</el-button>
           </el-col>-->
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:participants:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:participants:export']">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -82,6 +108,9 @@
 <script setup name="Participants" lang="ts">
 import { listParticipants } from '@/api/system/business/participants';
 import { ParticipantsVO, ParticipantsQuery, ParticipantsForm } from '@/api/system/business/participants/types';
+// 引入赛事相关的 API
+import { listTournaments } from '@/api/system/business/tournaments';
+import { TournamentsVO } from '@/api/system/business/tournaments/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -93,7 +122,8 @@ const ids = ref<Array<string | number>>([]);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
-
+// 添加赛事选项数据
+const tournamentOptions = ref<TournamentsVO[]>([]);
 const queryFormRef = ref<ElFormInstance>();
 const participantsFormRef = ref<ElFormInstance>();
 
@@ -177,6 +207,10 @@ const handleQuery = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
   queryFormRef.value?.resetFields();
+  // 设置默认报名时间为当天
+  const today = new Date();
+  const formattedDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
+  queryParams.value.registrationTime = formattedDate;
   handleQuery();
 };
 
@@ -186,7 +220,7 @@ const handleSelectionChange = (selection: ParticipantsVO[]) => {
   single.value = selection.length != 1;
   multiple.value = !selection.length;
 };
-
+import { parseTime } from '@/utils/dateUtils';
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download(
@@ -194,11 +228,28 @@ const handleExport = () => {
     {
       ...queryParams.value
     },
-    `用户报名记录${new Date().getTime()}.xlsx`
+    `用户报名记录${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
   );
 };
+/** 查询赛事列表 */
+const getTournamentList = async () => {
+  try {
+    const res = await listTournaments({
+      pageNum: 1,
+      pageSize: 1000 // 获取足够多的赛事数据
+    });
+    tournamentOptions.value = res.rows;
+  } catch (error) {
+    console.error('获取赛事列表失败:', error);
+  }
+};
 
 onMounted(() => {
+  // 设置默认报名时间为当天
+  const today = new Date();
+  const formattedDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
+  queryParams.value.registrationTime = formattedDate;
+  // getTournamentList(); // 获取赛事列表
   getList();
 });
 </script>

+ 3 - 4
src/views/system/business/pic/index.vue

@@ -26,13 +26,13 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:pic:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:pic:add']">新增</el-button>
           </el-col>
           <!--          <el-col :span="1.5">
             <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:pic:edit']">修改</el-button>
           </el-col>-->
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:pic:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:pic:remove']"
               >删除</el-button
             >
           </el-col>
@@ -75,7 +75,7 @@
               <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:pic:edit']"></el-button>
             </el-tooltip>-->
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:pic:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:pic:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>
@@ -203,7 +203,6 @@ const handleUpdate = async (row?: PicVO) => {
   dialog.title = '修改';
 };
 
-/** 提交按钮 */
 /** 提交按钮 */
 const submitForm = () => {
   picFormRef.value?.validate(async (valid: boolean) => {

+ 258 - 0
src/views/system/business/playerItems/index.vue

@@ -0,0 +1,258 @@
+<template>
+  <div class="p-2">
+<!--    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="" prop="playerId">
+              <el-input v-model="queryParams.playerId" placeholder="请输入" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="" prop="itemId">
+              <el-input v-model="queryParams.itemId" placeholder="请输入" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="道具数量" prop="quantity">
+              <el-input v-model="queryParams.quantity" placeholder="请输入道具数量" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>-->
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+<!--          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:items:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:items:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:items:remove']"
+              >删除</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:items:export']">导出</el-button>
+          </el-col>-->
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="itemsList">
+        <el-table-column label="" align="center" prop="id" v-if="false" />
+        <el-table-column label="用户ID" align="center" prop="playerId" />
+        <el-table-column label="道具名称" align="center" prop="itemName" />
+        <el-table-column label="道具数量" align="center" prop="quantity" />
+<!--        <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)" v-hasPermi="['system:items:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:items:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>-->
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改【请填写功能名称】对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="itemsFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="" prop="playerId">
+          <el-input v-model="form.playerId" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="" prop="itemId">
+          <el-input v-model="form.itemId" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="道具数量" prop="quantity">
+          <el-input v-model="form.quantity" placeholder="请输入道具数量" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Items" lang="ts">
+import { listItems, getItems, delItems, addItems, updateItems } from '@/api/system/playerItems';
+import { ItemsVO, ItemsQuery, ItemsForm } from '@/api/system/playerItems/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const itemsList = ref<ItemsVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const itemsFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: ItemsForm = {
+  id: undefined,
+  playerId: undefined,
+  itemId: undefined,
+  quantity: undefined
+};
+const data = reactive<PageData<ItemsForm, ItemsQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    playerId: undefined,
+    itemId: undefined,
+    quantity: undefined,
+    params: {}
+  },
+  rules: {
+    id: [{ required: true, message: '不能为空', trigger: 'blur' }],
+    playerId: [{ required: true, message: '不能为空', trigger: 'blur' }],
+    itemId: [{ required: true, message: '不能为空', trigger: 'blur' }],
+    quantity: [{ required: true, message: '道具数量不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询【请填写功能名称】列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listItems(queryParams.value);
+  itemsList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  itemsFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: ItemsVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加【请填写功能名称】';
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: ItemsVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getItems(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改【请填写功能名称】';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  itemsFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateItems(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addItems(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: ItemsVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delItems(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'business/playerItems/export',
+    {
+      ...queryParams.value
+    },
+    `playerItems${new Date().getTime()}.xlsx`
+  );
+};
+// 监听路由参数变化
+
+const route = useRoute(); // 获取 route 实例
+onMounted(() => {
+  // 检查路由参数中是否有 userId
+  if (route.query.userId) {
+    // 设置查询条件中的 userId
+    queryParams.value.playerId = route.query.userId as string;
+    // 自动执行查询
+    getList();
+  } else {
+    getList();
+  }
+});
+// 监听路由参数变化
+watch(
+  () => route.query,
+  (newQuery, oldQuery) => {
+    // 当查询参数发生变化时,重新加载数据
+    if (newQuery.userId) {
+      queryParams.value.playerId = newQuery.userId as string;
+      // 重置分页
+      queryParams.value.pageNum = 1;
+      getList();
+    }
+  },
+  { deep: true }
+);
+</script>

+ 6 - 6
src/views/system/business/policy/index.vue

@@ -20,20 +20,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:policy:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:policy:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:policy:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:policy:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:policy:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:policy:remove']"
               >删除</el-button
             >
           </el-col>
           <!--          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:policy:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:policy:export']">导出</el-button>
           </el-col>-->
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -55,10 +55,10 @@
         <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)" v-hasPermi="['system:policy:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:policy:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:policy:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:policy:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 2 - 2
src/views/system/business/products/index.vue

@@ -73,10 +73,10 @@
         <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)" v-hasPermi="['system:products:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:products:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:products:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:products:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 5 - 5
src/views/system/business/receivers/index.vue

@@ -20,15 +20,15 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:receivers:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:receivers:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:receivers:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:receivers:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:receivers:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:receivers:remove']"
               >删除</el-button
             >
           </el-col>
@@ -56,10 +56,10 @@
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-tooltip content="修改" v-if="scope.row.messageTypeCode == 'SYSTEM'" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:receivers:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:receivers:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:receivers:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:receivers:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 9 - 7
src/views/system/business/rechargeTop/index.vue

@@ -20,9 +20,9 @@
     </transition>
 
     <el-card shadow="never">
-      <!--      <template #header>
+       <template #header>
         <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
+<!--          <el-col :span="1.5">
             <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:order:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
@@ -30,13 +30,13 @@
           </el-col>
           <el-col :span="1.5">
             <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:order:remove']">删除</el-button>
-          </el-col>
+          </el-col>-->
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:order:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
-      </template>-->
+      </template>
 
       <el-table v-loading="loading" border :data="orderList">
         <el-table-column label="编号" width="60" align="center">
@@ -180,16 +180,18 @@ const resetQuery = () => {
   handleQuery();
 };
 
+import { parseTime } from '@/utils/dateUtils';
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download(
-    'system/order/export',
+    'business/order/exportPayStatisticsPageList',
     {
       ...queryParams.value
     },
-    `order_${new Date().getTime()}.xlsx`
+    `充值流水统计${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
   );
 };
+
 import { useRoute } from 'vue-router';
 const route = useRoute();
 onMounted(() => {

+ 6 - 6
src/views/system/business/scheme/index.vue

@@ -35,20 +35,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:scheme:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['business:scheme:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:scheme:edit']"
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['business:scheme:edit']"
               >修改</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:scheme:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:scheme:remove']"
               >删除</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:scheme:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['business:scheme:export']">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -66,10 +66,10 @@
         <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)" v-hasPermi="['system:scheme:edit']"></el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:scheme:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:scheme:remove']"></el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:scheme:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 8 - 9
src/views/system/business/staticTop/index.vue

@@ -32,15 +32,14 @@
     </transition>
 
     <el-card shadow="never">
-<!--      <template #header>
+      <template #header>
         <el-row :gutter="10" class="mb8">
-
-&lt;!&ndash;          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tournaments:export']">导出</el-button>
-          </el-col>&ndash;&gt;
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+          </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
-      </template>-->
+      </template>
 
       <el-table v-loading="loading" border :data="tournamentsList">
         <!-- 序号列 -->
@@ -216,15 +215,15 @@ const handleSelectionChange = (selection: TournamentsVO[]) => {
   single.value = selection.length != 1;
   multiple.value = !selection.length;
 };
-
+import { parseTime } from '@/utils/dateUtils';
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download(
-    'system/tournaments/export',
+    'business/tournaments/exportStatisticsPageList',
     {
       ...queryParams.value
     },
-    `tournaments_${new Date().getTime()}.xlsx`
+    `赛事统计${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
   );
 };
 // 获取奖励提示内容

+ 2 - 2
src/views/system/business/structures/index.vue

@@ -31,7 +31,7 @@
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:structures:remove']"
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
               >删除</el-button
             >
           </el-col>
@@ -76,7 +76,7 @@
               <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:structures:remove']"></el-button>
             </el-tooltip>
             <el-tooltip content="查看" placement="top">
-              <el-button link type="primary" icon="View" @click="handleViewLevels(scope.row)" v-hasPermi="['business:levels:view']"></el-button>
+              <el-button link type="primary" icon="View" @click="handleViewLevels(scope.row)" v-hasPermi="['business:structures:query']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>

+ 9 - 7
src/views/system/business/toolsLog/index.vue

@@ -68,9 +68,9 @@
     </transition>
 
     <el-card shadow="never">
-      <!--      <template #header>
+      <template #header>
         <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
+<!--          <el-col :span="1.5">
             <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:itemsLog:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
@@ -82,13 +82,13 @@
             <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:itemsLog:remove']"
               >删除</el-button
             >
-          </el-col>
+          </el-col>-->
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:itemsLog:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
-      </template>-->
+      </template>
 
       <el-table v-loading="loading" border :data="itemsLogList" @selection-change="handleSelectionChange">
         <el-table-column label="编号" width="60" align="center">
@@ -210,16 +210,18 @@ const handleSelectionChange = (selection: ItemsLogVO[]) => {
   multiple.value = !selection.length;
 };
 
+import { parseTime } from '@/utils/dateUtils';
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download(
-    'system/itemsLog/export',
+    'business/itemsLog/exportSanXiangCardStatisticsPageList',
     {
       ...queryParams.value
     },
-    `itemsLog_${new Date().getTime()}.xlsx`
+    `三湘杯参赛资格统计${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
   );
 };
+
 // 下拉选项数据 selectBlingStructuresInfo
 const itemOptions = ref<{ id: number; label: string }[]>([]);
 

+ 60 - 9
src/views/system/business/tournaments/index.vue

@@ -14,6 +14,8 @@
 
             <el-form-item label="比赛状态" prop="gameType">
               <el-select aria-required="true" v-model="queryParams.status" placeholder="请选择" :disabled="dialog.mode === 'view'">
+                <!-- 添加"全部"选项 -->
+                <el-option :value="null" :label="'全部'" />
                 <el-option v-for="dict in tournaments_status" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
               </el-select>
             </el-form-item>
@@ -138,7 +140,7 @@
             <span v-else>—</span>
           </template>
         </el-table-column>
-
+        <el-table-column label="最小参赛人数" align="center" prop="minPlayers" />
         <el-table-column label="状态" align="center">
           <template #default="scope">
             <span
@@ -170,6 +172,16 @@
               <el-tooltip content="复制" placement="top" v-hasPermi="['business:tournaments:copy']">
                 <el-button link type="primary" icon="Files" @click="handleCopy(scope.row)"> 复制 </el-button>
               </el-tooltip>
+<!--              <el-tooltip content="恢复" placement="top">
+                <el-button link type="primary" icon="Files" @click="handleRecoverTournament(scope.row)" v-hasPermi="['business:tournaments:query']"
+                  >恢复</el-button
+                >
+              </el-tooltip>-->
+              <el-tooltip content="粉碎删除" placement="top">
+                <el-button link type="primary" icon="Delete" @click="deleteAllData(scope.row)" v-hasPermi="['business:tournaments:query']"
+                  >粉碎删除</el-button
+                >
+              </el-tooltip>
             </div>
             <div class="operation-buttons-vertical" v-else>
               <el-tooltip content="查看" placement="top" v-hasPermi="['business:tournaments:query']">
@@ -177,27 +189,28 @@
               </el-tooltip>
 
               <el-tooltip content="删除" v-if="scope.row.status === 0 && scope.row.isDelete != true" placement="top">
-                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:tournaments:remove']"
+                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:tournaments:query']"
                   >删除</el-button
                 >
               </el-tooltip>
-              <el-tooltip content="编辑" v-if="scope.row.status === 0" placement="top" v-hasPermi="['business:tournaments:edit']">
+
+              <el-tooltip content="编辑" v-if="scope.row.status === 0" placement="top" v-hasPermi="['business:tournaments:query']">
                 <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row, 'edit')">编辑</el-button>
               </el-tooltip>
 
-              <el-tooltip content="复制" placement="top" v-hasPermi="['business:tournaments:copy']">
+              <el-tooltip content="复制" placement="top" v-hasPermi="['business:tournaments:query']">
                 <el-button link type="primary" icon="Files" @click="handleCopy(scope.row)"> 复制 </el-button>
               </el-tooltip>
 
-              <el-tooltip content="牌局复盘" placement="top" v-hasPermi="['business:tournaments:copy']">
+              <el-tooltip content="牌局复盘" placement="top" v-hasPermi="['business:tournaments:query']">
                 <el-button link type="primary" icon="DocumentChecked" @click="handleViewPublicHistory(scope.row)"> 牌局复盘 </el-button>
               </el-tooltip>
 
-              <el-tooltip content="领奖审核" placement="top" v-hasPermi="['business:tournaments:audit']">
+              <el-tooltip content="领奖审核" placement="top" v-hasPermi="['business:tournaments:query']">
                 <el-button link type="primary" icon="DocumentChecked" @click="openAuditDialog(scope.row.id, 'audit')">领奖审核</el-button>
               </el-tooltip>
 
-              <el-tooltip content="关闭" v-if="scope.row.status === 1" placement="top" v-hasPermi="['business:tournaments:closeSendTournament']">
+              <el-tooltip content="关闭" v-if="scope.row.status === 1" placement="top" v-hasPermi="['business:tournaments:query']">
                 <el-button link type="primary" icon="Close" @click="closeSendTournamentOperate(scope.row)">关闭</el-button>
               </el-tooltip>
             </div>
@@ -433,7 +446,9 @@
         <el-form-item label="延迟卡数量" prop="delayCardNum">
           <el-input v-model="form.delayCardNum" placeholder="请输入延迟卡数量" :disabled="dialog.mode === 'view'" />
         </el-form-item>
-
+        <el-form-item label="最小参赛人数" prop="minPlayers">
+          <el-input v-model="form.minPlayers" 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">
@@ -623,7 +638,9 @@ import {
   getSelectTournamentBlindStructuresList,
   assignTournamentBlindStructures,
   uploadTournament,
-  closeSendTournament
+  closeSendTournament,
+  recoverTournament,
+  deleteRelationTournament
 } from '@/api/system/business/tournaments';
 import { selectItemsSelList } from '@/api/system/business/items';
 import { selectBlindLevelsById } from '@/api/system/business/levels';
@@ -973,6 +990,22 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
         },
         trigger: 'blur'
       }
+    ],
+    minPlayers: [
+      { required: false, message: '最小参赛人数不能为空', trigger: 'blur' },
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const num = Number(value);
+          if (!/^\d+$/.test(value)) {
+            callback(new Error('只能输入正整数'));
+          } else if (num < 0 || num > 999) {
+            callback(new Error('最小参赛人数必须在0-999之间'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
     ]
   }
 });
@@ -1143,6 +1176,24 @@ const handleDelete = async (row?: TournamentsVO) => {
   await getList();
 };
 
+/** 恢复比赛按钮操作 */
+const handleRecoverTournament = async (row?: TournamentsVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认恢复比赛ID为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await recoverTournament(_ids);
+  proxy?.$modal.msgSuccess('恢复成功');
+  await getList();
+};
+
+/** 删除按钮操作 */
+const deleteAllData = async (row?: TournamentsVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除比赛ID为"' + _ids + '"的所有关联数据项?').finally(() => (loading.value = false));
+  await deleteRelationTournament(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
 /** 删除按钮操作 */
 const closeSendTournamentOperate = async (row?: TournamentsVO) => {
   // 1. 获取要关闭的 ID 列表

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

@@ -103,7 +103,7 @@
             <span v-else>—</span>
           </template>
         </el-table-column>
-
+        <el-table-column label="最小参赛人数" align="center" prop="minPlayers" />
         <el-table-column label="状态" align="center" prop="statusText" />
         <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
           <template #default="scope">
@@ -310,6 +310,10 @@
           <el-input v-model="form.delayCardNum" placeholder="请输入延迟卡数量" :disabled="dialog.mode === 'view'" />
         </el-form-item>
 
+        <el-form-item label="最小参赛人数" prop="minPlayers">
+          <el-input v-model="form.minPlayers" 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">
@@ -548,7 +552,6 @@ const handleBlindStructureChange = async (value: number) => {
       itemOptionsStructuresLevel.value = list;
       // 判断当前选择的 lateRegistrationLevel 是否在新列表中
       const currentLevel = data.form.lateRegistrationLevel;
-      debugger;
       if (currentLevel && !list.some((item) => item.id === currentLevel)) {
         data.form.lateRegistrationLevel = null;
       }
@@ -650,7 +653,8 @@ const initFormData: TournamentsForm = {
   blindStructureId: null,
   itemsPrizeList: [],
   delayCardNum: 4,
-  delayCardTime: 15
+  delayCardTime: 15,
+  minPlayers: 5
 };
 const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
   form: { ...initFormData },
@@ -758,6 +762,22 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
         },
         trigger: 'blur'
       }
+    ],
+    minPlayers: [
+      { required: false, message: '最小参赛人数不能为空', trigger: 'blur' },
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const num = Number(value);
+          if (!/^\d+$/.test(value)) {
+            callback(new Error('只能输入正整数'));
+          } else if (num < 0 || num > 999) {
+            callback(new Error('最小参赛人数必须在0-999之间'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'blur'
+      }
     ]
   }
 });

+ 3 - 3
src/views/system/business/userToolsLog/index.vue

@@ -60,9 +60,9 @@
             <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:itemsLog:remove']"
               >删除</el-button
             >
-          </el-col>-->
+          </el-col> v-hasPermi="['business:itemsLog:export']"-->
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:itemsLog:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -76,7 +76,7 @@
         </el-table-column>
         <el-table-column label="用户名" align="center" prop="userName" />
         <el-table-column label="手机号" align="center" prop="phone" />
-<!--        <el-table-column label="参赛数" align="center" prop="tournamentCount" />
+        <!--        <el-table-column label="参赛数" align="center" prop="tournamentCount" />
         <el-table-column label="充值次数" align="center" prop="payOrderCount" />
         <el-table-column label="充值总金额" align="center" prop="payOrderAmount" />-->
         <el-table-column label="道具名称" align="center" prop="itemName" />

+ 1 - 1
src/views/system/business/versionManagement/index.vue

@@ -140,7 +140,7 @@
               :file-list="fileList"
               :auto-upload="false"
               :limit="1"
-              accept=".apk"
+              accept=".apk,.ipa"
             >
               <template #trigger>
                 <el-button type="primary">点击选择</el-button>