|
|
@@ -130,28 +130,213 @@
|
|
|
</el-dialog>
|
|
|
|
|
|
<!-- 预览弹窗 -->
|
|
|
- <el-dialog title="预览" v-model="previewVisible" width="70%" append-to-body>
|
|
|
- <div style="max-height: 500px; overflow-y: auto">
|
|
|
- <el-table :data="previewData" border v-if="previewData.length > 0">
|
|
|
- <!-- 使用动态表头 -->
|
|
|
- <el-table-column v-for="(header, index) in previewHeaders" :key="index" :label="header">
|
|
|
+ <el-dialog title="盲注等级预览" v-model="previewVisible" width="90%" append-to-body>
|
|
|
+ <el-table :data="previewData" border style="width: 100%">
|
|
|
+ <el-table-column label="显示级别" width="80" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.$index + 1 }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="名称" width="150" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.name }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="小盲" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.smallBlind }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="大盲" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.bigBlind }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="前注" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.ante }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="盲注分钟" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.durationMinutes }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="休息级别" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.isBreak ? '是' : '否' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="休息分钟" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.row.breakDurationMinutes }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="closePreview">关 闭</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <el-dialog v-model="levelsDialogVisible" title="盲注等级列表" width="95%" append-to-body>
|
|
|
+ <!-- 搜索表单 -->
|
|
|
+ <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
+ <div v-show="showLevelSearch" class="mb-[10px]">
|
|
|
+ <el-form :inline="true">
|
|
|
+ <el-form-item label="等级">
|
|
|
+ <el-input v-model="levelQueryParams.levelNumber" placeholder="请输入等级" clearable @input="handleLevelQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="小盲">
|
|
|
+ <el-input v-model="levelQueryParams.smallBlind" placeholder="请输入小盲" clearable @input="handleLevelQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="大盲">
|
|
|
+ <el-input v-model="levelQueryParams.bigBlind" placeholder="请输入大盲" clearable @input="handleLevelQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="前注">
|
|
|
+ <el-input v-model="levelQueryParams.ante" placeholder="请输入前注" clearable @input="handleLevelQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="盲注分钟">
|
|
|
+ <el-input v-model="levelQueryParams.durationMinutes" placeholder="请输入盲注分钟" clearable @input="handleLevelQuery" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </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="handleAddLevel">新增</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button type="success" plain icon="Edit" :disabled="levelSingle" @click="handleUpdateLevel">修改</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button type="danger" plain icon="Delete" :disabled="levelMultiple" @click="handleDeleteLevel">删除</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button type="warning" plain icon="Download" @click="handleExportLevel">导出</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="18" style="text-align: right;">
|
|
|
+ <el-tooltip content="显示搜索" placement="top">
|
|
|
+ <el-button circle icon="Search" @click="showLevelSearch = !showLevelSearch" />
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip content="刷新" placement="top">
|
|
|
+ <el-button circle icon="Refresh" @click="handleRefreshLevel" />
|
|
|
+ </el-tooltip>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 可编辑表格 -->
|
|
|
+ <el-table :data="levelEditableData" style="width: 100%" v-loading="loading" class="custom-table" @selection-change="handleLevelSelectionChange">
|
|
|
+ <el-table-column type="selection" width="55" align="center" />
|
|
|
+ <el-table-column label="显示级别" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span v-if="!scope.row.isBreak">{{ (levelQueryParams.pageNum - 1) * levelQueryParams.pageSize + scope.$index + 1 }}</span>
|
|
|
+ <el-tag v-else type="info" size="small">休息</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="名称" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input v-model="scope.row.remark" placeholder="级别名称(可选)" size="small" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="小盲" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input-number v-model="scope.row.smallBlind" :min="0" size="small" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="大盲" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input-number v-model="scope.row.bigBlind" :min="0" size="small" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="前注" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input-number v-model="scope.row.ante" :min="0" size="small" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="盲注分钟" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input-number v-model="scope.row.durationMinutes" :min="0" size="small" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="休息级别" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-select v-model="scope.row.isBreak" size="small" style="width: 100%">
|
|
|
+ <el-option label="否" :value="0" />
|
|
|
+ <el-option label="是" :value="1" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="休息分钟" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input-number v-model="scope.row.breakDurationMinutes" :min="0" size="small" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" align="center" width="150">
|
|
|
<template #default="scope">
|
|
|
- {{ scope.row[index] }}
|
|
|
+ <div class="operation-buttons">
|
|
|
+ <el-button link type="primary" size="small" @click="handleInsertLevelRow(scope.$index)">
|
|
|
+ <el-icon><Grid /></el-icon> 插入
|
|
|
+ </el-button>
|
|
|
+ <el-button link type="danger" size="small" @click="handleDeleteLevelRow(scope.$index)">
|
|
|
+ <el-icon><Delete /></el-icon>
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
- <p v-else>暂无数据可预览</p>
|
|
|
- </div>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <pagination v-show="levelTotal > 0" :total="levelTotal" v-model:page="levelQueryParams.pageNum" v-model:limit="levelQueryParams.pageSize" @pagination="handleLevelPagination" />
|
|
|
+ </el-card>
|
|
|
+
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button @click="closePreview">关 闭</el-button>
|
|
|
+ <el-button @click="levelsDialogVisible = false">关 闭</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <el-dialog v-model="levelsDialogVisible" title="盲注等级列表" width="80%">
|
|
|
- <!-- 使用 component 动态加载目标组件 -->
|
|
|
- <levels-index :blind-structure-id="dialogParams.blindStructureId" :name="dialogParams.name" />
|
|
|
+ <!-- 盲注等级编辑弹窗 -->
|
|
|
+ <el-dialog v-model="levelEditDialogVisible" :title="levelEditForm.id ? '修改盲注等级' : '新增盲注等级'" width="500px" append-to-body>
|
|
|
+ <el-form ref="levelEditFormRef" :model="levelEditForm" label-width="100px">
|
|
|
+ <el-form-item label="名称">
|
|
|
+ <el-input v-model="levelEditForm.remark" placeholder="级别名称(可选)" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="小盲">
|
|
|
+ <el-input-number v-model="levelEditForm.smallBlind" :min="0" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="大盲">
|
|
|
+ <el-input-number v-model="levelEditForm.bigBlind" :min="0" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="前注">
|
|
|
+ <el-input-number v-model="levelEditForm.ante" :min="0" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="盲注分钟">
|
|
|
+ <el-input-number v-model="levelEditForm.durationMinutes" :min="0" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="休息级别">
|
|
|
+ <el-select v-model="levelEditForm.isBreak" style="width: 100%">
|
|
|
+ <el-option label="否" :value="0" />
|
|
|
+ <el-option label="是" :value="1" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="休息分钟">
|
|
|
+ <el-input-number v-model="levelEditForm.breakDurationMinutes" :min="0" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="levelEditDialogVisible = false">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitLevelEditForm">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -165,9 +350,9 @@ import {
|
|
|
updateBlindStructures,
|
|
|
downloadImportTemplate
|
|
|
} from '@/api/system/physical/blindStructures';
|
|
|
+import { listBlindLevels, addBlindLevels, updateBlindLevels } from '@/api/system/physical/blindLevels';
|
|
|
import { BlindStructuresVO, BlindStructuresQuery, BlindStructuresForm } from '@/api/system/physical/blindStructures/types';
|
|
|
import * as XLSX from 'xlsx';
|
|
|
-import LevelsIndex from '@/views/system/physical/blindLevels/index.vue';
|
|
|
|
|
|
// ✅ 引入 parseTime
|
|
|
import { parseTime } from '@/utils/dateUtils';
|
|
|
@@ -184,6 +369,35 @@ const total = ref(0);
|
|
|
// 控制 Dialog 是否显示
|
|
|
const levelsDialogVisible = ref(false);
|
|
|
|
|
|
+// 盲注等级可编辑表格数据
|
|
|
+const levelEditableData = ref<any[]>([]);
|
|
|
+
|
|
|
+// 盲注等级查询参数
|
|
|
+const levelQueryParams = ref({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ blindStructureId: null,
|
|
|
+ levelNumber: undefined,
|
|
|
+ smallBlind: undefined,
|
|
|
+ bigBlind: undefined,
|
|
|
+ ante: undefined,
|
|
|
+ durationMinutes: undefined
|
|
|
+});
|
|
|
+
|
|
|
+// 盲注等级分页总数
|
|
|
+const levelTotal = ref(0);
|
|
|
+
|
|
|
+// 盲注等级选中状态
|
|
|
+const levelIds = ref<Array<string | number>>([]);
|
|
|
+const levelSingle = ref(true);
|
|
|
+const levelMultiple = ref(true);
|
|
|
+const showLevelSearch = ref(true);
|
|
|
+
|
|
|
+// 盲注等级编辑弹窗
|
|
|
+const levelEditDialogVisible = ref(false);
|
|
|
+const levelEditForm = ref<any>({});
|
|
|
+const levelEditFormRef = ref<ElFormInstance>();
|
|
|
+
|
|
|
// 传递给子组件的参数
|
|
|
const dialogParams = ref({
|
|
|
blindStructureId: null,
|
|
|
@@ -411,9 +625,10 @@ const handleFileRemove = (file) => {
|
|
|
|
|
|
// 预览数据
|
|
|
const previewData = ref<any[]>([]);
|
|
|
-const previewHeaders = ref<string[]>([]); // 新增表头数组
|
|
|
-const previewVisible = ref(false); // 控制预览弹窗
|
|
|
-// 打开预览弹窗并解析文件
|
|
|
+const previewHeaders = ref<string[]>([]);
|
|
|
+const previewVisible = ref(false);
|
|
|
+
|
|
|
+// 打开预览弹窗并解析文件
|
|
|
const openPreview = () => {
|
|
|
if (fileList.value.length === 0) {
|
|
|
return;
|
|
|
@@ -435,7 +650,7 @@ const openPreview = () => {
|
|
|
|
|
|
// 获取表头(第二行)
|
|
|
const headerRow = XLSX.utils.decode_range(worksheet['!ref']).e.r + 1;
|
|
|
- const headerRange = `A2:E2`; // 假设最多5列
|
|
|
+ const headerRange = `A2:E2`;
|
|
|
const headerCells = XLSX.utils.decode_range(headerRange);
|
|
|
previewHeaders.value = [];
|
|
|
for (let C = headerCells.s.c; C <= headerCells.e.c; ++C) {
|
|
|
@@ -447,8 +662,9 @@ const openPreview = () => {
|
|
|
}
|
|
|
|
|
|
// 获取数据(第三行开始)
|
|
|
- const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, range: 1 }); // 从第3行开始读取
|
|
|
+ const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, range: 1 });
|
|
|
previewData.value = jsonData;
|
|
|
+
|
|
|
previewVisible.value = true;
|
|
|
};
|
|
|
reader.readAsArrayBuffer(file);
|
|
|
@@ -469,9 +685,463 @@ const formatBlindLevel = (blindLevels) => {
|
|
|
const ante = firstLevel.ante ?? 0;
|
|
|
return `${smallBlind}/${bigBlind} ${ante}`;
|
|
|
};
|
|
|
-const handleViewLevels = (row) => {
|
|
|
+const handleViewLevels = async (row) => {
|
|
|
+ console.log('=== handleViewLevels 被调用 ===');
|
|
|
+ console.log('row:', row);
|
|
|
+
|
|
|
dialogParams.value.blindStructureId = row.id;
|
|
|
dialogParams.value.name = row.name;
|
|
|
+
|
|
|
+ console.log('dialogParams:', dialogParams.value);
|
|
|
+
|
|
|
+ // 重置查询参数
|
|
|
+ levelQueryParams.value = {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ blindStructureId: row.id,
|
|
|
+ levelNumber: undefined,
|
|
|
+ smallBlind: undefined,
|
|
|
+ bigBlind: undefined,
|
|
|
+ ante: undefined,
|
|
|
+ durationMinutes: undefined
|
|
|
+ };
|
|
|
+
|
|
|
+ // 加载盲注等级数据
|
|
|
+ await getLevelList();
|
|
|
+
|
|
|
levelsDialogVisible.value = true;
|
|
|
+ console.log('levelsDialogVisible 已设置为 true');
|
|
|
+ console.log('=== handleViewLevels 执行完毕 ===');
|
|
|
+};
|
|
|
+
|
|
|
+// 计算显示级别
|
|
|
+const getLevelDisplayLevel = (index: number) => {
|
|
|
+ // 计算当前行之前的非休息级别数量(当前页内)
|
|
|
+ let currentPageNonBreakCount = 0;
|
|
|
+ for (let i = 0; i < index; i++) {
|
|
|
+ if (!levelEditableData.value[i].isBreak) {
|
|
|
+ currentPageNonBreakCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 基础级别 = (页码-1) * 每页条数 + 当前页内的非休息级别计数
|
|
|
+ const baseLevel = (levelQueryParams.value.pageNum - 1) * levelQueryParams.value.pageSize + currentPageNonBreakCount;
|
|
|
+
|
|
|
+ // 如果当前行不是休息级别,则加1
|
|
|
+ return levelEditableData.value[index].isBreak ? 0 : baseLevel + 1;
|
|
|
+};
|
|
|
+
|
|
|
+/** 保存当前行(插入按钮) */
|
|
|
+const handleInsertLevelRow = async (index: number) => {
|
|
|
+ try {
|
|
|
+ loading.value = true;
|
|
|
+ const currentRow = levelEditableData.value[index];
|
|
|
+
|
|
|
+ // 确保 blindStructureId 存在
|
|
|
+ if (!currentRow.blindStructureId) {
|
|
|
+ currentRow.blindStructureId = dialogParams.value.blindStructureId;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentRow.id) {
|
|
|
+ // 更新已有数据
|
|
|
+ await updateBlindLevels(currentRow);
|
|
|
+ proxy?.$modal.msgSuccess('保存成功');
|
|
|
+ } else {
|
|
|
+ // 新增数据
|
|
|
+ await addBlindLevels(currentRow);
|
|
|
+ proxy?.$modal.msgSuccess('新增成功');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 刷新数据
|
|
|
+ const res = await listBlindLevels({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 1000,
|
|
|
+ blindStructureId: dialogParams.value.blindStructureId
|
|
|
+ });
|
|
|
+ levelEditableData.value = res.rows.map((item: any) => ({
|
|
|
+ ...item,
|
|
|
+ isBreak: item.isBreak || 0
|
|
|
+ }));
|
|
|
+ } catch (error) {
|
|
|
+ console.error('保存失败:', error);
|
|
|
+ proxy?.$modal.msgError('保存失败');
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 删除行 */
|
|
|
+const handleDeleteLevelRow = async (index: number) => {
|
|
|
+ const row = levelEditableData.value[index];
|
|
|
+ if (row.id) {
|
|
|
+ // 已有数据,需要确认删除
|
|
|
+ await proxy?.$modal.confirm('是否确认删除该行数据?');
|
|
|
+ const { delBlindLevels } = await import('@/api/system/physical/blindLevels');
|
|
|
+ await delBlindLevels(row.id);
|
|
|
+ proxy?.$modal.msgSuccess('删除成功');
|
|
|
+ }
|
|
|
+ levelEditableData.value.splice(index, 1);
|
|
|
+};
|
|
|
+
|
|
|
+/** 获取盲注等级列表 */
|
|
|
+const getLevelList = async () => {
|
|
|
+ loading.value = true;
|
|
|
+ try {
|
|
|
+ const params: any = {
|
|
|
+ pageNum: levelQueryParams.value.pageNum,
|
|
|
+ pageSize: levelQueryParams.value.pageSize,
|
|
|
+ blindStructureId: dialogParams.value.blindStructureId
|
|
|
+ };
|
|
|
+
|
|
|
+ // 添加搜索条件(只添加有值的条件)
|
|
|
+ if (levelQueryParams.value.levelNumber !== undefined && levelQueryParams.value.levelNumber !== '') {
|
|
|
+ params.levelNumber = levelQueryParams.value.levelNumber;
|
|
|
+ }
|
|
|
+ if (levelQueryParams.value.smallBlind !== undefined && levelQueryParams.value.smallBlind !== '') {
|
|
|
+ params.smallBlind = levelQueryParams.value.smallBlind;
|
|
|
+ }
|
|
|
+ if (levelQueryParams.value.bigBlind !== undefined && levelQueryParams.value.bigBlind !== '') {
|
|
|
+ params.bigBlind = levelQueryParams.value.bigBlind;
|
|
|
+ }
|
|
|
+ if (levelQueryParams.value.ante !== undefined && levelQueryParams.value.ante !== '') {
|
|
|
+ params.ante = levelQueryParams.value.ante;
|
|
|
+ }
|
|
|
+ if (levelQueryParams.value.durationMinutes !== undefined && levelQueryParams.value.durationMinutes !== '') {
|
|
|
+ params.durationMinutes = levelQueryParams.value.durationMinutes;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('=== 盲注等级列表请求参数 ===');
|
|
|
+ console.log('params:', params);
|
|
|
+
|
|
|
+ const res = await listBlindLevels(params);
|
|
|
+ console.log('API返回数据:', res);
|
|
|
+ console.log('res.rows:', res.rows);
|
|
|
+ console.log('res.total:', res.total);
|
|
|
+
|
|
|
+ const rows = res.rows || [];
|
|
|
+ levelEditableData.value = rows.map((item: any) => ({
|
|
|
+ ...item,
|
|
|
+ isBreak: item.isBreak || 0
|
|
|
+ }));
|
|
|
+ levelTotal.value = res.total || 0;
|
|
|
+
|
|
|
+ console.log('levelEditableData长度:', levelEditableData.value.length);
|
|
|
+ console.log('levelTotal:', levelTotal.value);
|
|
|
+ } catch (error) {
|
|
|
+ console.error('加载数据失败:', error);
|
|
|
+ proxy?.$modal.msgError('加载数据失败');
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 盲注等级搜索 */
|
|
|
+const handleLevelQuery = () => {
|
|
|
+ levelQueryParams.value.pageNum = 1;
|
|
|
+ getLevelList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 盲注等级分页 */
|
|
|
+const handleLevelPagination = (data: { page: number; limit: number }) => {
|
|
|
+ levelQueryParams.value.pageNum = data.page;
|
|
|
+ levelQueryParams.value.pageSize = data.limit;
|
|
|
+ getLevelList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 盲注等级重置搜索 */
|
|
|
+const resetLevelQuery = () => {
|
|
|
+ levelQueryParams.value = {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ blindStructureId: dialogParams.value.blindStructureId,
|
|
|
+ levelNumber: undefined,
|
|
|
+ smallBlind: undefined,
|
|
|
+ bigBlind: undefined,
|
|
|
+ ante: undefined,
|
|
|
+ durationMinutes: undefined
|
|
|
+ };
|
|
|
+ getLevelList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 刷新按钮:仅刷新表格,不清空搜索条件 */
|
|
|
+const handleRefreshLevel = () => {
|
|
|
+ getLevelList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 盲注等级多选 */
|
|
|
+const handleLevelSelectionChange = (selection: any[]) => {
|
|
|
+ levelIds.value = selection.map((item) => item.id);
|
|
|
+ levelSingle.value = selection.length != 1;
|
|
|
+ levelMultiple.value = !selection.length;
|
|
|
+};
|
|
|
+
|
|
|
+/** 新增盲注等级 */
|
|
|
+const handleAddLevel = () => {
|
|
|
+ levelEditForm.value = {
|
|
|
+ id: undefined,
|
|
|
+ blindStructureId: dialogParams.value.blindStructureId,
|
|
|
+ levelNumber: undefined,
|
|
|
+ smallBlind: undefined,
|
|
|
+ bigBlind: undefined,
|
|
|
+ ante: undefined,
|
|
|
+ durationMinutes: undefined,
|
|
|
+ isBreak: 0,
|
|
|
+ breakDurationMinutes: undefined,
|
|
|
+ remark: ''
|
|
|
+ };
|
|
|
+ levelEditDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+/** 修改盲注等级 */
|
|
|
+const handleUpdateLevel = async () => {
|
|
|
+ if (levelIds.value.length === 0) {
|
|
|
+ proxy?.$modal.msgWarning('请选择要修改的数据');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取选中的数据
|
|
|
+ const selectedRow = levelEditableData.value.find((item) => item.id === levelIds.value[0]);
|
|
|
+ if (!selectedRow) {
|
|
|
+ proxy?.$modal.msgWarning('未找到选中的数据');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开编辑弹窗
|
|
|
+ levelEditDialogVisible.value = true;
|
|
|
+ levelEditForm.value = { ...selectedRow };
|
|
|
+};
|
|
|
+
|
|
|
+/** 提交盲注等级编辑表单 */
|
|
|
+const submitLevelEditForm = async () => {
|
|
|
+ try {
|
|
|
+ loading.value = true;
|
|
|
+ if (levelEditForm.value.id) {
|
|
|
+ await updateBlindLevels(levelEditForm.value);
|
|
|
+ proxy?.$modal.msgSuccess('修改成功');
|
|
|
+ } else {
|
|
|
+ await addBlindLevels(levelEditForm.value);
|
|
|
+ proxy?.$modal.msgSuccess('新增成功');
|
|
|
+ }
|
|
|
+ levelEditDialogVisible.value = false;
|
|
|
+ await getLevelList();
|
|
|
+ } catch (error) {
|
|
|
+ console.error('操作失败:', error);
|
|
|
+ proxy?.$modal.msgError('操作失败');
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/** 删除盲注等级 */
|
|
|
+const handleDeleteLevel = async () => {
|
|
|
+ if (levelIds.value.length === 0) {
|
|
|
+ proxy?.$modal.msgWarning('请选择要删除的数据');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ await proxy?.$modal.confirm('是否确认删除选中的数据项?');
|
|
|
+ const { delBlindLevels } = await import('@/api/system/physical/blindLevels');
|
|
|
+ await delBlindLevels(levelIds.value);
|
|
|
+ proxy?.$modal.msgSuccess('删除成功');
|
|
|
+ getLevelList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 导出盲注等级 */
|
|
|
+const handleExportLevel = () => {
|
|
|
+ proxy?.download(
|
|
|
+ 'physical/blindLevels/export',
|
|
|
+ {
|
|
|
+ ...levelQueryParams.value,
|
|
|
+ blindStructureId: dialogParams.value.blindStructureId
|
|
|
+ },
|
|
|
+ `盲注等级${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
|
|
|
+ );
|
|
|
};
|
|
|
</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.editable-table-container {
|
|
|
+ padding: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.table-header-info {
|
|
|
+ margin-bottom: 15px;
|
|
|
+ padding: 10px;
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.info-text {
|
|
|
+ font-size: 13px;
|
|
|
+ color: #606266;
|
|
|
+}
|
|
|
+
|
|
|
+.editable-table {
|
|
|
+ margin-bottom: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.table-footer-actions {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ gap: 15px;
|
|
|
+ margin-top: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 去掉表格竖线,只保留横线 */
|
|
|
+:deep(.custom-table .el-table__inner-wrapper::before) {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-table__row td) {
|
|
|
+ border-right: none;
|
|
|
+ border-left: none;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-table__header th) {
|
|
|
+ border-right: none;
|
|
|
+ border-left: none;
|
|
|
+ background-color: transparent;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #606266;
|
|
|
+ font-size: 13px;
|
|
|
+ padding: 12px 0;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-table__row) {
|
|
|
+ border-bottom: 1px solid #ebeef5;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-table__row:last-child) {
|
|
|
+ border-bottom: none;
|
|
|
+}
|
|
|
+
|
|
|
+/* 表格输入框样式优化 - 无边框设计 */
|
|
|
+:deep(.custom-table .el-input__wrapper) {
|
|
|
+ box-shadow: none;
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border-radius: 4px;
|
|
|
+ padding: 0 10px;
|
|
|
+ transition: all 0.3s;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input__wrapper:hover) {
|
|
|
+ background-color: #e8eaf0;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input__wrapper.is-focus) {
|
|
|
+ background-color: #fff;
|
|
|
+ box-shadow: 0 0 0 1px #409eff inset;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input) {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input__inner) {
|
|
|
+ text-align: center !important;
|
|
|
+ font-size: 13px;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+/* 数字输入框样式 */
|
|
|
+:deep(.custom-table .el-input-number) {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input-number .el-input__wrapper) {
|
|
|
+ padding: 0 28px 0 10px;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input-number .el-input__inner) {
|
|
|
+ text-align: center !important;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-input-number__decrease),
|
|
|
+:deep(.custom-table .el-input-number__increase) {
|
|
|
+ background-color: transparent;
|
|
|
+ border: none;
|
|
|
+}
|
|
|
+
|
|
|
+/* 下拉框样式 */
|
|
|
+:deep(.custom-table .el-select .el-input__wrapper) {
|
|
|
+ box-shadow: none;
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border-radius: 4px;
|
|
|
+ padding: 0 10px;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-select .el-input__wrapper:hover) {
|
|
|
+ background-color: #e8eaf0;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-select .el-input__wrapper.is-focus) {
|
|
|
+ background-color: #fff;
|
|
|
+ box-shadow: 0 0 0 1px #409eff inset;
|
|
|
+}
|
|
|
+
|
|
|
+/* 操作按钮样式 - 图标按钮 */
|
|
|
+:deep(.custom-table .el-button--small.is-link) {
|
|
|
+ padding: 6px 10px;
|
|
|
+ border-radius: 6px;
|
|
|
+ font-size: 12px;
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 4px;
|
|
|
+ transition: all 0.3s;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-button--small.is-link:hover) {
|
|
|
+ transform: scale(1.05);
|
|
|
+}
|
|
|
+
|
|
|
+/* 插入按钮样式 */
|
|
|
+:deep(.custom-table .el-button--primary.is-link) {
|
|
|
+ background-color: rgba(64, 158, 255, 0.1);
|
|
|
+ color: #409eff;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-button--primary.is-link:hover) {
|
|
|
+ background-color: rgba(64, 158, 255, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+/* 删除按钮样式 */
|
|
|
+:deep(.custom-table .el-button--danger.is-link) {
|
|
|
+ background-color: rgba(245, 108, 108, 0.1);
|
|
|
+ color: #f56c6c;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.custom-table .el-button--danger.is-link:hover) {
|
|
|
+ background-color: rgba(245, 108, 108, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+/* 表格行悬停效果 */
|
|
|
+:deep(.custom-table .el-table__row:hover) {
|
|
|
+ background-color: #fafafa;
|
|
|
+}
|
|
|
+
|
|
|
+/* 单元格内边距 */
|
|
|
+:deep(.custom-table .el-table__row td) {
|
|
|
+ padding: 10px 0;
|
|
|
+}
|
|
|
+
|
|
|
+/* 复选框列优化 */
|
|
|
+:deep(.custom-table .el-table-column--selection .cell) {
|
|
|
+ padding-left: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 操作按钮容器 - 横向排列 */
|
|
|
+:deep(.operation-buttons) {
|
|
|
+ display: flex !important;
|
|
|
+ flex-direction: row !important;
|
|
|
+ align-items: center !important;
|
|
|
+ justify-content: center !important;
|
|
|
+ gap: 8px !important;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.operation-buttons .el-button) {
|
|
|
+ margin: 0 !important;
|
|
|
+}
|
|
|
+</style>
|