|
|
@@ -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>
|