fix: 作品分配评委移除后同步数据库并允许清空评委

Made-with: Cursor
This commit is contained in:
zhonghua 2026-04-08 11:30:54 +08:00
parent df7eae6125
commit 7d7ef9820b
2 changed files with 38 additions and 8 deletions

View File

@ -26,6 +26,7 @@ import com.competition.modules.sys.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
@ -51,13 +52,42 @@ public class ContestReviewServiceImpl implements IContestReviewService {
// ====== 作品分配 ======
@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> assignWork(Long contestId, Long workId, List<Long> judgeIds, Long creatorId) {
log.info("分配作品赛事ID{}作品ID{},评委数:{}", contestId, workId, judgeIds.size());
if (judgeIds == null) {
judgeIds = Collections.emptyList();
}
// 去重后保持顺序作为本次期望的评委集合
List<Long> desiredOrder = new ArrayList<>(new LinkedHashSet<>(judgeIds));
Set<Long> desired = new HashSet<>(desiredOrder);
log.info("分配作品同步赛事ID{}作品ID{},期望评委数:{}", contestId, workId, desired.size());
// 1. 取消已分配但不在本次列表中的评委仅删除未评分的分配行
LambdaQueryWrapper<BizContestWorkJudgeAssignment> existWrapper = new LambdaQueryWrapper<>();
existWrapper.eq(BizContestWorkJudgeAssignment::getContestId, contestId);
existWrapper.eq(BizContestWorkJudgeAssignment::getWorkId, workId);
List<BizContestWorkJudgeAssignment> existing = assignmentMapper.selectList(existWrapper);
int removed = 0;
for (BizContestWorkJudgeAssignment a : existing) {
if (desired.contains(a.getJudgeId())) {
continue;
}
LambdaQueryWrapper<BizContestWorkScore> scoreWrapper = new LambdaQueryWrapper<>();
scoreWrapper.eq(BizContestWorkScore::getAssignmentId, a.getId());
scoreWrapper.eq(BizContestWorkScore::getValidState, 1);
if (scoreMapper.selectCount(scoreWrapper) > 0) {
throw BusinessException.of(ErrorCode.BAD_REQUEST, "部分评委已提交评分,无法取消其分配,请先处理评分记录");
}
assignmentMapper.deleteById(a.getId());
removed++;
}
int created = 0;
int skipped = 0;
for (Long judgeId : judgeIds) {
for (Long judgeId : desiredOrder) {
// 检查是否已分配
LambdaQueryWrapper<BizContestWorkJudgeAssignment> dupWrapper = new LambdaQueryWrapper<>();
dupWrapper.eq(BizContestWorkJudgeAssignment::getContestId, contestId);
@ -81,10 +111,11 @@ public class ContestReviewServiceImpl implements IContestReviewService {
created++;
}
log.info("作品分配完成,新建:{},跳过:{}", created, skipped);
log.info("作品分配完成,移除:{}新建:{},跳过(已存在){}", removed, created, skipped);
Map<String, Object> result = new LinkedHashMap<>();
result.put("workId", workId);
result.put("removed", removed);
result.put("created", created);
result.put("skipped", skipped);
return result;

View File

@ -227,8 +227,7 @@
<div class="drawer-footer">
<a-space>
<a-button @click="handleAssignDrawerClose">取消</a-button>
<a-button type="primary" :loading="assignLoading" :disabled="selectedJudgeRows.length === 0"
@click="handleConfirmAssign">
<a-button type="primary" :loading="assignLoading" @click="handleConfirmAssign">
确定
</a-button>
</a-space>
@ -576,10 +575,10 @@ const handleJudgeTableChange = (pag: any) => {
fetchJudgeList()
}
//
//
const handleConfirmAssign = async () => {
if (selectedJudgeRows.value.length === 0) {
message.warning("请选择评委")
if (isBatchAssign.value && selectedJudgeRows.value.length === 0) {
message.warning("批量分配至少选择一名评委")
return
}