From 84c10785890029c16e92ced943298920bd1a709c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Tue, 11 Aug 2026 23:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A3=81=E5=88=A4=E5=BA=93=EF=BC=8C=E8=A3=81?= =?UTF-8?q?=E5=88=A4=E6=8A=A5=E5=90=8D=E4=B8=8E=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/match/event.js | 7 +- src/api/match/eventarrangement.js | 4 +- src/api/match/judgeassignment.js | 8 ++ src/api/match/referee.js | 7 ++ src/api/match/scorerule.js | 2 + .../match/manage/JudgeAssignmentPanel.vue | 80 ++++++++++++++++ .../match/manage/Steps/Step3ProjectConfig.vue | 29 +++++- src/views/match/manage/dialog.vue | 9 +- src/views/match/manage/work.vue | 23 ++++- src/views/match/project/index.vue | 16 +++- src/views/match/referee/index.vue | 92 +++++++++++++++++++ 11 files changed, 266 insertions(+), 11 deletions(-) create mode 100644 src/api/match/judgeassignment.js create mode 100644 src/api/match/referee.js create mode 100644 src/api/match/scorerule.js create mode 100644 src/views/match/manage/JudgeAssignmentPanel.vue create mode 100644 src/views/match/referee/index.vue diff --git a/src/api/match/event.js b/src/api/match/event.js index f648124..dfd817b 100644 --- a/src/api/match/event.js +++ b/src/api/match/event.js @@ -91,7 +91,8 @@ export const eventPagePost = (data) => { * }>, * registrationLimit: { * individualProjectLimit: number, - * teamProjectLimit: number + * teamProjectLimit: number, + * refereeLimit: number * }, * feeConfig: { * chargeMode: string, @@ -139,7 +140,7 @@ export const eventDetailGet = (id) => { * @param {string} [data.customConfigJson] - 自定义配置JSON * @param {Array} data.units - 参与单位列表 * @param {Array} data.projects - 项目列表 - * @param {Object} data.registrationLimit - 限报配置 + * @param {Object} data.registrationLimit - 限报配置(含个人/团队项目限报数、裁判限报数) * @param {Object} data.feeConfig - 费用配置 */ export const eventPost = (data) => { @@ -172,7 +173,7 @@ export const eventPost = (data) => { * @param {string} [data.customConfigJson] - 自定义配置JSON * @param {Array} data.units - 参与单位列表 * @param {Array} data.projects - 项目列表 - * @param {Object} data.registrationLimit - 限报配置 + * @param {Object} data.registrationLimit - 限报配置(含个人/团队项目限报数、裁判限报数) * @param {Object} data.feeConfig - 费用配置 */ export const eventPut = (data) => { diff --git a/src/api/match/eventarrangement.js b/src/api/match/eventarrangement.js index fc213bf..7b7f62d 100644 --- a/src/api/match/eventarrangement.js +++ b/src/api/match/eventarrangement.js @@ -81,4 +81,6 @@ export const eventarrangementDeleteDelete = (data) => { */ export const eventarrangementSetstatusPatch = (data) => { return http.patch('/eventarrangement/setstatus', data); -}; \ No newline at end of file +}; + +export const eventarrangementConfirmPost = (eventid) => http.post(`/eventarrangement/confirm/${eventid}`); diff --git a/src/api/match/judgeassignment.js b/src/api/match/judgeassignment.js new file mode 100644 index 0000000..604289d --- /dev/null +++ b/src/api/match/judgeassignment.js @@ -0,0 +1,8 @@ +import { http } from '../../utils/request'; +export const judgeApplicationsGet = (eventId) => http.get(`/judgeassignment/applications/${eventId}`); +export const judgeApplicationDelete = (id) => http.delete('/judgeassignment/applications', { data: { id } }); +export const judgeAssignmentBoardGet = (eventId) => http.get(`/judgeassignment/board/${eventId}`); +export const judgeCandidatesGet = (eventId, sessionId) => http.get(`/judgeassignment/candidates/${eventId}/${sessionId}`); +export const judgeAssignmentSavePost = (data) => http.post('/judgeassignment/save', data); +export const judgeAssignmentSubmitPost = (data) => http.post('/judgeassignment/submit', data); +export const judgeRegistrationCodePost = (eventId) => http.post(`/judgeassignment/registration-code/${eventId}`); diff --git a/src/api/match/referee.js b/src/api/match/referee.js new file mode 100644 index 0000000..7e27516 --- /dev/null +++ b/src/api/match/referee.js @@ -0,0 +1,7 @@ +import { http } from '../../utils/request'; + +export const refereePageGet = (params) => http.get('/referee/page', { params }); +export const refereeAddPost = (data) => http.post('/referee', data); +export const refereeUpdatePost = (data) => http.put('/referee', data); +export const refereeDelete = (id) => http.delete('/referee/delete', { data: { id } }); +export const refereeAuditPost = (data) => http.post('/referee/audit', data); diff --git a/src/api/match/scorerule.js b/src/api/match/scorerule.js new file mode 100644 index 0000000..3d41c5f --- /dev/null +++ b/src/api/match/scorerule.js @@ -0,0 +1,2 @@ +import { http } from '../../utils/request'; +export const scoreRuleListGet = () => http.get('/scorerule/list'); diff --git a/src/views/match/manage/JudgeAssignmentPanel.vue b/src/views/match/manage/JudgeAssignmentPanel.vue new file mode 100644 index 0000000..a6d19d5 --- /dev/null +++ b/src/views/match/manage/JudgeAssignmentPanel.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/views/match/manage/Steps/Step3ProjectConfig.vue b/src/views/match/manage/Steps/Step3ProjectConfig.vue index 56f013f..bfb6490 100644 --- a/src/views/match/manage/Steps/Step3ProjectConfig.vue +++ b/src/views/match/manage/Steps/Step3ProjectConfig.vue @@ -141,6 +141,21 @@ {{ localFormData.registrationLimit.teamProjectLimit }} +
+
+ * + 裁判限报配置 +
+ + + + + {{ localFormData.registrationLimit.refereeLimit }} +
@@ -200,7 +215,7 @@ const isOnlyIndividual = computed(() => { const formRef = ref(null); const localFormData = ref({ projects: [], - registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1 }, + registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1, refereeLimit: 1 }, }); const genderList = ref(['全部', '男', '女']) @@ -332,7 +347,12 @@ const isSyncingFromParent = ref(false); const normalizeFromParent = async (v) => { isSyncingFromParent.value = true; - localFormData.value.registrationLimit = v?.registrationLimit ?? { individualProjectLimit: 1, teamProjectLimit: 1 }; + const parentLimit = v?.registrationLimit ?? {}; + localFormData.value.registrationLimit = { + individualProjectLimit: parentLimit.individualProjectLimit ?? 1, + teamProjectLimit: parentLimit.teamProjectLimit ?? 1, + refereeLimit: parentLimit.refereeLimit ?? 1, + }; localFormData.value.projects = (v?.projects ?? []).map((p) => ({ ...p, limitCount: p?.limitCount ?? 0, @@ -382,6 +402,7 @@ watch( const rules = computed(() => { const baseRules = { 'registrationLimit.individualProjectLimit': [{ required: true, message: '请填写个人项目限报数', trigger: 'change' }], + 'registrationLimit.refereeLimit': [{ required: true, message: '请填写裁判限报数', trigger: 'change' }], }; // 只有在不是仅允许个人报名时,才添加团队项目限报数的验证 if (!isOnlyIndividual.value) { @@ -492,6 +513,10 @@ defineExpose({ validate }); gap: 12px; } +.limit-summary__card--full { + grid-column: 1 / -1; +} + .limit-summary__label { font-weight: 600; color: var(--el-text-color-primary); diff --git a/src/views/match/manage/dialog.vue b/src/views/match/manage/dialog.vue index da118af..7ec9af4 100644 --- a/src/views/match/manage/dialog.vue +++ b/src/views/match/manage/dialog.vue @@ -171,6 +171,7 @@ const formData = ref({ registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1, + refereeLimit: 1, }, canEditProject: true, // 是否可以编辑项目(有报名记录时不能编辑) }, @@ -242,7 +243,11 @@ const openDialog = async (id) => { formData.value.units = { units: d.units ?? [] }; formData.value.projectConfig = { projects: d.projects ?? [], - registrationLimit: d.registrationLimit ?? { individualProjectLimit: 1, teamProjectLimit: 1 }, + registrationLimit: { + individualProjectLimit: d.registrationLimit?.individualProjectLimit ?? 1, + teamProjectLimit: d.registrationLimit?.teamProjectLimit ?? 1, + refereeLimit: d.registrationLimit?.refereeLimit ?? 1, + }, canEditProject: d.canEditProject ?? true, }; // 完全覆盖 feeConfig,不要保留旧数据 @@ -382,7 +387,7 @@ const handleReset = () => { formData.value.units = { units: [] }; formData.value.projectConfig = { projects: [], - registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1 }, + registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1, refereeLimit: 1 }, }; formData.value.feeConfig = { chargeMode: 0, diff --git a/src/views/match/manage/work.vue b/src/views/match/manage/work.vue index a5230b8..b8659bc 100644 --- a/src/views/match/manage/work.vue +++ b/src/views/match/manage/work.vue @@ -164,9 +164,13 @@
预览 导出 + 确认编排
+ + + @@ -343,7 +347,7 @@ import { ref, reactive, computed, onMounted, watch, nextTick, h } from 'vue'; import { ElMessage, ElMessageBox } from 'element-plus'; import { Check, View, Download, Rank, Warning } from '@element-plus/icons-vue'; import { eventDetailGet } from '/@/api/match/event'; -import { eventarrangementListGet, eventarrangementPut, eventarrangementExportPost, eventarrangementPreviewPost } from '/@/api/match/eventarrangement'; +import { eventarrangementListGet, eventarrangementPut, eventarrangementExportPost, eventarrangementPreviewPost, eventarrangementConfirmPost } from '/@/api/match/eventarrangement'; import { eventregistrationPagePost, eventregistrationBatchauditPost, eventregistrationMaterialurlsPost, eventregistrationStatsGet, eventregistrationExportPost } from '/@/api/match/eventregistration'; import { eventscorePageathletePost, eventscorePagecoachleaderPost, eventscoreImportscorePost, eventscoreDownloadtemplateGet, eventscoreExportcertificatePost, eventscoreIssuecertificatePost, eventscoreGetCertificateDetailGet, eventscoreIssuepointsPost } from '/@/api/match/eventscore'; import { certificateListGet } from '/@/api/match/certificate'; @@ -352,6 +356,7 @@ import Step2Units from './Steps/Step2Units.vue'; import Step3ProjectConfig from './Steps/Step3ProjectConfig.vue'; import Step4FeeConfig from './Steps/Step4FeeConfig.vue'; import CheckinManager from './CheckinManager.vue'; +import JudgeAssignmentPanel from './JudgeAssignmentPanel.vue'; import ProTable from '/@/components/ProTable/index.vue'; import PreviewImage from '/@/components/PreviewImage/index.vue'; import Sortable from 'sortablejs'; @@ -432,6 +437,7 @@ const formData = ref({ registrationLimit: { individualProjectLimit: 1, teamProjectLimit: 1, + refereeLimit: 1, }, }, // 步骤4:费用与账户配置 @@ -491,7 +497,11 @@ const openDialog = async (id) => { formData.value.units = { units: d.units ?? [] }; formData.value.projectConfig = { projects: d.projects ?? [], - registrationLimit: d.registrationLimit ?? { individualProjectLimit: 1, teamProjectLimit: 1 }, + registrationLimit: { + individualProjectLimit: d.registrationLimit?.individualProjectLimit ?? 1, + teamProjectLimit: d.registrationLimit?.teamProjectLimit ?? 1, + refereeLimit: d.registrationLimit?.refereeLimit ?? 1, + }, }; formData.value.feeConfig = { ...formData.value.feeConfig, ...(d.feeConfig ?? {}) }; console.log('formData.value', formData.value); @@ -849,6 +859,15 @@ const onSave = async () => { } } +const confirmArrangement = async () => { + await ElMessageBox.confirm('确认编排后需继续完成裁判分配,是否继续?', '重要提示', { type: 'warning', confirmButtonText: '继续' }); + const settingsWithSortIndex = eventlist.value.map((item,index)=>({ProjectId:item.projectId||item.id,VenueCount:item.venueCount,SortIndex:index+1})); + const saveRes = await eventarrangementPut({eventId:initParam.value.id,settings:settingsWithSortIndex}); + if(!saveRes.succeeded) return; + const res = await eventarrangementConfirmPost(initParam.value.id); + if(res.succeeded) ElMessage.success(`编排已确认:${res.data.sessionCount}个场次,${res.data.entryCount}条出场记录`); +} + //export default { const downloadByBlob = (blob, filename = '赛事编排.xlsx') => { const url = window.URL.createObjectURL(blob); diff --git a/src/views/match/project/index.vue b/src/views/match/project/index.vue index ee8c21e..102f452 100644 --- a/src/views/match/project/index.vue +++ b/src/views/match/project/index.vue @@ -142,6 +142,12 @@ + + + + + + @@ -234,6 +240,7 @@ 秒 + @@ -250,12 +257,15 @@ + +