fix: 作品分配评委移除后同步数据库并允许清空评委
Made-with: Cursor
This commit is contained in:
parent
df7eae6125
commit
7d7ef9820b
@ -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;
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user