fix(team): 修复删除选手后集体信息未同步更新的问题

- 删除选手时级联删除集体成员关系
- 集体列表动态计算有效成员数(排除已删除选手)
- 集体详情过滤已删除的选手
This commit is contained in:
2025-12-31 11:37:37 +08:00
parent 19e3d94a33
commit 45758108a8
2 changed files with 55 additions and 1 deletions

View File

@@ -12,7 +12,9 @@ import org.springblade.modules.martial.mapper.MartialAthleteMapper;
import org.springblade.modules.martial.pojo.entity.MartialJudgeInvite; import org.springblade.modules.martial.pojo.entity.MartialJudgeInvite;
import org.springblade.modules.martial.pojo.entity.MartialScheduleAthlete; import org.springblade.modules.martial.pojo.entity.MartialScheduleAthlete;
import org.springblade.modules.martial.pojo.entity.MartialScore; import org.springblade.modules.martial.pojo.entity.MartialScore;
import org.springblade.modules.martial.pojo.entity.MartialTeamMember;
import org.springblade.modules.martial.pojo.vo.MartialAthleteVO; import org.springblade.modules.martial.pojo.vo.MartialAthleteVO;
import org.springblade.modules.martial.mapper.MartialTeamMemberMapper;
import org.springblade.modules.martial.pojo.vo.MiniAthleteAdminVO; import org.springblade.modules.martial.pojo.vo.MiniAthleteAdminVO;
import org.springblade.modules.martial.pojo.vo.MiniAthleteScoreVO; import org.springblade.modules.martial.pojo.vo.MiniAthleteScoreVO;
import org.springblade.modules.martial.service.IMartialAthleteService; import org.springblade.modules.martial.service.IMartialAthleteService;
@@ -24,6 +26,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.io.Serializable;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -45,6 +49,9 @@ public class MartialAthleteServiceImpl extends ServiceImpl<MartialAthleteMapper,
@Autowired @Autowired
private IMartialJudgeInviteService judgeInviteService; private IMartialJudgeInviteService judgeInviteService;
@Autowired
private MartialTeamMemberMapper teamMemberMapper;
/** /**
* 分页查询参赛选手(包含关联字段) * 分页查询参赛选手(包含关联字段)
* *
@@ -57,6 +64,24 @@ public class MartialAthleteServiceImpl extends ServiceImpl<MartialAthleteMapper,
return baseMapper.selectAthleteVOPage(page, athlete); return baseMapper.selectAthleteVOPage(page, athlete);
} }
/**
* Override removeByIds to cascade delete team member relations
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean removeByIds(Collection<?> idList) {
if (idList != null && !idList.isEmpty()) {
// Delete team member relations for these athletes
for (Object id : idList) {
LambdaQueryWrapper<MartialTeamMember> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MartialTeamMember::getAthleteId, id);
teamMemberMapper.delete(wrapper);
log.info("Deleted team member relations for athlete: {}", id);
}
}
return super.removeByIds(idList);
}
/** /**
* Task 2.1: 运动员签到检录 * Task 2.1: 运动员签到检录
* *

View File

@@ -73,6 +73,9 @@ public class MartialTeamServiceImpl extends ServiceImpl<MartialTeamMapper, Marti
.map(team -> { .map(team -> {
MartialTeamVO vo = new MartialTeamVO(); MartialTeamVO vo = new MartialTeamVO();
BeanUtils.copyProperties(team, vo); BeanUtils.copyProperties(team, vo);
// Calculate actual member count (excluding deleted athletes)
int actualMemberCount = getActualMemberCount(team.getId());
vo.setMemberCount(actualMemberCount);
return vo; return vo;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -81,6 +84,29 @@ public class MartialTeamServiceImpl extends ServiceImpl<MartialTeamMapper, Marti
return voPage; return voPage;
} }
/**
* Get actual member count excluding deleted athletes
*/
private int getActualMemberCount(Long teamId) {
LambdaQueryWrapper<MartialTeamMember> memberWrapper = new LambdaQueryWrapper<>();
memberWrapper.eq(MartialTeamMember::getTeamId, teamId);
memberWrapper.eq(MartialTeamMember::getIsDeleted, 0);
List<MartialTeamMember> members = teamMemberMapper.selectList(memberWrapper);
if (members.isEmpty()) {
return 0;
}
List<Long> athleteIds = members.stream()
.map(MartialTeamMember::getAthleteId)
.collect(Collectors.toList());
LambdaQueryWrapper<MartialAthlete> athleteWrapper = new LambdaQueryWrapper<>();
athleteWrapper.in(MartialAthlete::getId, athleteIds);
athleteWrapper.eq(MartialAthlete::getIsDeleted, 0);
return (int) athleteService.count(athleteWrapper);
}
@Override @Override
public MartialTeamVO getTeamDetail(Long id) { public MartialTeamVO getTeamDetail(Long id) {
MartialTeam team = this.getById(id); MartialTeam team = this.getById(id);
@@ -102,7 +128,10 @@ public class MartialTeamServiceImpl extends ServiceImpl<MartialTeamMapper, Marti
.map(MartialTeamMember::getAthleteId) .map(MartialTeamMember::getAthleteId)
.collect(Collectors.toList()); .collect(Collectors.toList());
List<MartialAthlete> athletes = athleteService.listByIds(athleteIds); LambdaQueryWrapper<MartialAthlete> athleteWrapper = new LambdaQueryWrapper<>();
athleteWrapper.in(MartialAthlete::getId, athleteIds);
athleteWrapper.eq(MartialAthlete::getIsDeleted, 0);
List<MartialAthlete> athletes = athleteService.list(athleteWrapper);
Map<Long, MartialAthlete> athleteMap = athletes.stream() Map<Long, MartialAthlete> athleteMap = athletes.stream()
.collect(Collectors.toMap(MartialAthlete::getId, a -> a)); .collect(Collectors.toMap(MartialAthlete::getId, a -> a));