Browse Source

feat(physical): 新增裁判配置功能并重构相关API

- 新增裁判配置页面,支持待配置和已配置裁判的双向选择
- 添加裁判编辑功能,可修改职务和工作年限信息
- 重构裁判职务关联API,支持批量绑定和查询功能
- 添加裁判职务选择列表API接口
- 更新裁判职务关联类型定义,增加裁判图片、编号、姓名等字段
- 添加权限标识从system调整为physical前缀
- 优化表格显示,增加裁判图片预览功能
- 添加调试信息和错误处理机制
fugui001 1 month ago
parent
commit
274eb7e7b0

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ItemsVO, ItemsForm, ItemsQuery } from '@/api/system/playerItems/types';
+
+/**
+ * 查询【请填写功能名称】列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listItems = (query?: ItemsQuery): AxiosPromise<ItemsVO[]> => {
+  return request({
+    url: '/business/playerItems/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询【请填写功能名称】详细
+ * @param id
+ */
+export const getItems = (id: string | number): AxiosPromise<ItemsVO> => {
+  return request({
+    url: '/business/playerItems/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增【请填写功能名称】
+ * @param data
+ */
+export const addItems = (data: ItemsForm) => {
+  return request({
+    url: '/business/playerItems',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改【请填写功能名称】
+ * @param data
+ */
+export const updateItems = (data: ItemsForm) => {
+  return request({
+    url: '/business/playerItems',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除【请填写功能名称】
+ * @param id
+ */
+export const delItems = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/business/playerItems/' + id,
+    method: 'delete'
+  });
+};

+ 65 - 0
src/api/system/business/playerItems/types.ts

@@ -0,0 +1,65 @@
+export interface ItemsVO {
+  /**
+   *
+   */
+  id: string | number;
+
+  /**
+   *
+   */
+  playerId: string | number;
+
+  /**
+   *
+   */
+  itemId: string | number;
+
+  /**
+   * 道具数量
+   */
+  quantity: number;
+}
+
+export interface ItemsForm extends BaseEntity {
+  /**
+   *
+   */
+  id?: string | number;
+
+  /**
+   *
+   */
+  playerId?: string | number;
+
+  /**
+   *
+   */
+  itemId?: string | number;
+
+  /**
+   * 道具数量
+   */
+  quantity?: number;
+}
+
+export interface ItemsQuery extends PageQuery {
+  /**
+   *
+   */
+  playerId?: string | number;
+
+  /**
+   *
+   */
+  itemId?: string | number;
+
+  /**
+   * 道具数量
+   */
+  quantity?: number;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 7 - 0
src/api/system/physical/judgePosition/index.ts

@@ -1,6 +1,7 @@
 import request from '@/utils/request';
 import { AxiosPromise } from 'axios';
 import { JudgePositionVO, JudgePositionForm, JudgePositionQuery } from '@/api/system/physical/judgePosition/types';
+import { StoreVO } from '@/api/system/physical/store/types';
 
 /**
  * 查询职务管理列表
@@ -61,3 +62,9 @@ export const delJudgePosition = (id: string | number | Array<string | number>) =
     method: 'delete'
   });
 };
+export const selectJudgePositionSelList = (): AxiosPromise<StoreVO> => {
+  return request({
+    url: '/physical/judgePosition/selectJudgePositionSelList',
+    method: 'get'
+  });
+};

+ 12 - 0
src/api/system/physical/judgePositionRelation/index.ts

@@ -60,3 +60,15 @@ export const delJudgePositionRelation = (id: string | number | Array<string | nu
     method: 'delete'
   });
 };
+export const getSelectPendingJudge = (): AxiosPromise<JudgePositionRelationVO> => {
+  return request({
+    url: '/physical/judgePositionRelation/selectPendingJudge',
+    method: 'get'
+  });
+};
+export const getSelectUseIngByJudge = (): AxiosPromise<JudgePositionRelationVO> => {
+  return request({
+    url: '/physical/judgePositionRelation/selectUseIngByJudge',
+    method: 'get'
+  });
+};

+ 9 - 0
src/api/system/physical/judgePositionRelation/types.ts

@@ -13,6 +13,11 @@ export interface JudgePositionRelationVO {
    * 职务ID,可为空(表示暂未分配)
    */
   positionId: string | number;
+
+  peopleIconUrl: string | number;
+  judgeNumber: string | number;
+  name: string | number;
+  workYears: string | number;
 }
 
 export interface JudgePositionRelationForm extends BaseEntity {
@@ -30,6 +35,10 @@ export interface JudgePositionRelationForm extends BaseEntity {
    * 职务ID,可为空(表示暂未分配)
    */
   positionId?: string | number;
+
+  judgeIdList: (string | number)[];
+
+  workYears?: string | number;
 }
 
 export interface JudgePositionRelationQuery extends PageQuery {

+ 47 - 47
src/views/system/business/playerItems/index.vue

@@ -1,44 +1,44 @@
 <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>-->
+    <!--    <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>-->
+          <!--          <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>
@@ -48,16 +48,16 @@
         <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-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" />
@@ -86,8 +86,8 @@
 </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';
+import { listItems, getItems, delItems, addItems, updateItems } from '@/api/system/business/playerItems';
+import { ItemsVO, ItemsQuery, ItemsForm } from '@/api/system/business/playerItems/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 267 - 23
src/views/system/physical/judgePositionRelation/index.vue

@@ -20,10 +20,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:judgePositionRelation:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['physical:judgePositionRelation:add']">配置裁判</el-button>
           </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:judgePositionRelation:edit']"
+<!--          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="Edit"
+              :disabled="single"
+              @click="handleUpdate()"
+              v-hasPermi="['physical:judgePositionRelation:edit']"
               >修改</el-button
             >
           </el-col>
@@ -34,24 +40,39 @@
               icon="Delete"
               :disabled="multiple"
               @click="handleDelete()"
-              v-hasPermi="['system:judgePositionRelation:remove']"
+              v-hasPermi="['physical:judgePositionRelation:remove']"
               >删除</el-button
             >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:judgePositionRelation:export']"
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['physical:judgePositionRelation:export']"
               >导出</el-button
             >
-          </el-col>
+          </el-col>-->
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
       </template>
 
       <el-table v-loading="loading" border :data="judgePositionRelationList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="主键ID" align="center" prop="id" v-if="true" />
-        <el-table-column label="裁判ID" align="center" prop="judgeId" />
-        <el-table-column label="职务ID,可为空" align="center" prop="positionId" />
+        <el-table-column label="编号" align="center" prop="id" v-if="true" />
+        <el-table-column label="裁判图片" align="center" width="90">
+          <template #default="scope">
+            <el-image
+              v-if="scope.row.peopleIconUrl"
+              :src="scope.row.peopleIconUrl"
+              style="width: 40px; height: 40px; border-radius: 4px; cursor: zoom-in"
+              :preview-src-list="[scope.row.peopleIconUrl]"
+              :preview-teleported="true"
+              fit="cover"
+            />
+            <span v-else></span>
+          </template>
+        </el-table-column>
+        <el-table-column label="裁判编号" align="center" prop="judgeNumber" />
+        <el-table-column label="裁判姓名" align="center" prop="judgeName" />
+        <el-table-column label="裁判职务" align="center" prop="positionName" />
+        <el-table-column label="工作年限" align="center" prop="workYears" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
             <el-tooltip content="修改" placement="top">
@@ -60,7 +81,7 @@
                 type="primary"
                 icon="Edit"
                 @click="handleUpdate(scope.row)"
-                v-hasPermi="['system:judgePositionRelation:edit']"
+                v-hasPermi="['physical:judgePositionRelation:edit']"
               ></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
@@ -69,7 +90,7 @@
                 type="primary"
                 icon="Delete"
                 @click="handleDelete(scope.row)"
-                v-hasPermi="['system:judgePositionRelation:remove']"
+                v-hasPermi="['physical:judgePositionRelation:remove']"
               ></el-button>
             </el-tooltip>
           </template>
@@ -79,19 +100,60 @@
       <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="judgePositionRelationFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="裁判ID" prop="judgeId">
-          <el-input v-model="form.judgeId" placeholder="请输入裁判ID" />
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
+      <div class="transfer-container">
+        <!-- 左侧:待配置裁判 -->
+        <div class="transfer-panel">
+          <h4>待配置裁判</h4>
+          <el-table ref="leftTableRef" :data="pendingJudges" @selection-change="handleLeftSelectionChange" border height="300">
+            <el-table-column type="selection" width="55" />
+            <el-table-column prop="judgeNumber" label="裁判编号" />
+            <el-table-column prop="name" label="裁判姓名" />
+            <el-table-column prop="workYears" label="工作年限" />
+          </el-table>
+        </div>
+
+        <!-- 中间操作按钮 -->
+        <div class="transfer-buttons">
+          <el-button type="primary" icon="Right" @click="moveRight" :disabled="!leftSelected.length"></el-button>
+          <el-button type="primary" icon="Left" @click="moveLeft" :disabled="!rightSelected.length">←</el-button>
+        </div>
+
+        <!-- 右侧:已配置裁判 -->
+        <div class="transfer-panel">
+          <h4>已配置裁判</h4>
+          <el-table ref="rightTableRef" :data="usedJudges" @selection-change="handleRightSelectionChange" border height="300">
+            <el-table-column type="selection" width="55" />
+            <el-table-column prop="judgeNumber" label="裁判编号" />
+            <el-table-column prop="name" label="裁判姓名" />
+            <el-table-column prop="workYears" label="工作年限" />
+          </el-table>
+        </div>
+      </div>
+
+      <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>
+    <!-- 裁判编辑对话框 -->
+    <el-dialog :title="editDialog.title" v-model="editDialog.visible" width="500px" append-to-body>
+      <el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="80px">
+        <el-form-item label="职务选择" prop="positionId">
+          <el-select v-model="editForm.positionId" placeholder="请选择职务">
+            <el-option v-for="item in positionOptions" :key="item.id" :label="item.label" :value="item.id" />
+          </el-select>
         </el-form-item>
-        <el-form-item label="职务ID,可为空" prop="positionId">
-          <el-input v-model="form.positionId" placeholder="请输入职务ID,可为空" />
+        <el-form-item label="工作年限" prop="workYears">
+          <el-input-number v-model="editForm.workYears" :min="0" :max="100" controls-position="right" />
         </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>
+          <el-button type="primary" @click="submitEditForm">保存</el-button>
+          <el-button @click="cancelEdit">取消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -104,8 +166,11 @@ import {
   getJudgePositionRelation,
   delJudgePositionRelation,
   addJudgePositionRelation,
-  updateJudgePositionRelation
+  updateJudgePositionRelation,
+  getSelectPendingJudge,
+  getSelectUseIngByJudge
 } from '@/api/system/physical/judgePositionRelation';
+import { selectJudgePositionSelList } from '@/api/system/physical/judgePosition';
 import { JudgePositionRelationVO, JudgePositionRelationQuery, JudgePositionRelationForm } from '@/api/system/physical/judgePositionRelation/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -193,7 +258,7 @@ const handleSelectionChange = (selection: JudgePositionRelationVO[]) => {
 const handleAdd = () => {
   reset();
   dialog.visible = true;
-  dialog.title = '添加裁判职务关联(支持待配置状态)';
+  dialog.title = '裁判配置';
 };
 
 /** 修改按钮操作 */
@@ -202,11 +267,15 @@ const handleUpdate = async (row?: JudgePositionRelationVO) => {
   const _id = row?.id || ids.value[0];
   const res = await getJudgePositionRelation(_id);
   Object.assign(form.value, res.data);
-  dialog.visible = true;
-  dialog.title = '修改裁判职务关联(支持待配置状态)';
+  editForm.workYears = res.data.workYears;
+  editForm.id = res.data.id;
+  editForm.judgeId = res.data.judgeId;
+  editForm.positionId = res.data.positionId;
+  editDialog.visible = true;
 };
 
 /** 提交按钮 */
+/*
 const submitForm = () => {
   judgePositionRelationFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
@@ -222,6 +291,7 @@ const submitForm = () => {
     }
   });
 };
+*/
 
 /** 删除按钮操作 */
 const handleDelete = async (row?: JudgePositionRelationVO) => {
@@ -245,5 +315,179 @@ const handleExport = () => {
 
 onMounted(() => {
   getList();
+  loadPendingJudges();
+  loadUsedJudges();
+  loadPositionOptions();
 });
+// 新增状态
+// 状态定义
+const pendingJudges = ref<JudgePositionRelationVO[]>([]);
+const usedJudges = ref<JudgePositionRelationVO[]>([]);
+const leftSelected = ref<JudgePositionRelationVO[]>([]);
+const rightSelected = ref<JudgePositionRelationVO[]>([]);
+
+// 加载待配置裁判
+const loadPendingJudges = async () => {
+  const res = await getSelectPendingJudge();
+  pendingJudges.value = Array.isArray(res.data) ? res.data : [];
+};
+
+// 加载已配置裁判
+const loadUsedJudges = async () => {
+  const res = await getSelectUseIngByJudge();
+  usedJudges.value = Array.isArray(res.data) ? res.data : [];
+};
+// 选择变化处理
+const handleLeftSelectionChange = (selection: any[]) => {
+  leftSelected.value = selection;
+};
+
+const handleRightSelectionChange = (selection: any[]) => {
+  rightSelected.value = selection;
+};
+
+// 移动按钮
+const moveRight = () => {
+  const selected = leftSelected.value;
+  usedJudges.value.push(...selected);
+  pendingJudges.value = pendingJudges.value.filter((item) => !selected.includes(item));
+  leftSelected.value = [];
+};
+
+const moveLeft = () => {
+  const selected = rightSelected.value;
+  pendingJudges.value.push(...selected);
+  usedJudges.value = usedJudges.value.filter((item) => !selected.includes(item));
+  rightSelected.value = [];
+};
+
+// 提交时只提交右侧数据
+const submitForm = async () => {
+  if (!usedJudges.value.length) {
+    proxy?.$modal.msgError('请至少选择一个裁判');
+    return;
+  }
+
+  buttonLoading.value = true;
+  try {
+    // 示例:假设接口是批量绑定
+    // 在调用前添加调试信息
+    console.log(
+      '准备传递的裁判ID列表:',
+      usedJudges.value.map((j) => j.id)
+    );
+    console.log('裁判数量:', usedJudges.value.length);
+    debugger;
+    await addJudgePositionRelation({
+      judgeIdList: usedJudges.value.map((j) => j.id)
+    });
+    proxy?.$modal.msgSuccess('操作成功');
+    dialog.visible = false;
+    await getList();
+  } catch (err) {
+    proxy?.$modal.msgError('操作失败');
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+// 编辑对话框相关状态
+const editDialog = reactive({
+  visible: false,
+  title: '裁判编辑'
+});
+
+const editForm = reactive({
+  id: undefined,
+  positionId: undefined,
+  workYears: undefined,
+  judgeId: undefined
+});
+
+const editFormRef = ref<ElFormInstance>();
+const editRules = {
+  positionId: [{ required: true, message: '请选择职务', trigger: 'change' }],
+  workYears: [{ required: true, message: '请输入工作年限', trigger: 'blur' }]
+};
+const positionOptions = ref<{ id: number; label: string }[]>([]);
+const loadPositionOptions = async () => {
+  try {
+    const res = await selectJudgePositionSelList();
+    if (res.code === 200) {
+      // 使用 unknown 中间类型进行类型转换
+      const data = res.data as unknown as { id: number; name: string }[];
+      const list = [];
+      for (let i = 0; i < data.length; i++) {
+        const item = data[i];
+        list.push({
+          id: item.id,
+          label: item.name
+        });
+      }
+      positionOptions.value = list;
+    } else {
+      alert('加载失败:' + res.msg);
+    }
+  } catch (error) {
+    console.error('请求出错:', error);
+  }
+};
+// 取消编辑
+const cancelEdit = () => {
+  editDialog.visible = false;
+};
+// 提交编辑表单
+const submitEditForm = () => {
+  editFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      try {
+        // 转换数据格式
+        const updateData = {
+          id: editForm.id,
+          positionId: editForm.positionId,
+          workYears: editForm.workYears,
+          judgeId: editForm.judgeId,
+          judgeIdList: [] // 添加必需的字段,可以为空数组
+        };
+        await updateJudgePositionRelation(updateData);
+        proxy?.$modal.msgSuccess('编辑成功');
+        editDialog.visible = false;
+        await getList();
+      } catch (err) {
+        proxy?.$modal.msgError('编辑失败');
+      }
+    }
+  });
+};
 </script>
+<style>
+.transfer-container {
+  display: flex;
+  gap: 20px;
+  align-items: flex-start;
+}
+
+.transfer-panel {
+  flex: 1;
+  min-width: 300px;
+  max-width: 350px;
+}
+
+.transfer-buttons {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  gap: 10px;
+  height: 300px; /* 与表格高度一致 */
+  width: 60px; /* 固定宽度,避免拉伸 */
+  align-items: center; /* 水平居中按钮 */
+}
+.transfer-buttons .el-button {
+  width: 50px;
+  height: 40px;
+  padding: 0;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+</style>