|
|
@ -4,28 +4,32 @@ import cn.hutool.core.bean.BeanUtil; |
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import cn.hutool.core.lang.Snowflake; |
|
|
|
import com.ccsens.mt.bean.dto.CompeteDto; |
|
|
|
import com.ccsens.mt.bean.po.CompeteCompany; |
|
|
|
import com.ccsens.mt.bean.po.CompeteCompanyExample; |
|
|
|
import com.ccsens.mt.bean.po.CompetePlayer; |
|
|
|
import com.ccsens.mt.bean.po.*; |
|
|
|
import com.ccsens.mt.bean.vo.CompeteVo; |
|
|
|
import com.ccsens.mt.persist.dao.CompetePlayerDao; |
|
|
|
import com.ccsens.mt.persist.dao.CompeteTeamDao; |
|
|
|
import com.ccsens.mt.persist.dao.CompeteTimeDao; |
|
|
|
import com.ccsens.mt.persist.mapper.CompeteCompanyMapper; |
|
|
|
import com.ccsens.mt.persist.mapper.*; |
|
|
|
import com.ccsens.mt.util.Constant; |
|
|
|
import com.ccsens.util.CodeEnum; |
|
|
|
import com.ccsens.util.RedisKeyManager; |
|
|
|
import com.ccsens.util.RedisUtil; |
|
|
|
import com.ccsens.util.*; |
|
|
|
import com.ccsens.util.bean.dto.QueryDto; |
|
|
|
import com.ccsens.util.exception.BaseException; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Propagation; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.io.IOException; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
/** |
|
|
|
* @author 逗 |
|
|
|
*/ |
|
|
|
@Slf4j |
|
|
|
@Service |
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) |
|
|
|
public class CompeteService implements ICompeteService{ |
|
|
|
@Resource |
|
|
|
private CompeteTimeDao competeTimeDao; |
|
|
@ -35,6 +39,19 @@ public class CompeteService implements ICompeteService{ |
|
|
|
private CompeteCompanyMapper competeCompanyMapper; |
|
|
|
@Resource |
|
|
|
private Snowflake snowflake; |
|
|
|
@Resource |
|
|
|
private CompeteTeamDao competeTeamDao; |
|
|
|
@Resource |
|
|
|
private CompetePlayerDao competePlayerDao; |
|
|
|
@Resource |
|
|
|
private CompeteTeamMemberMapper competeTeamMemberMapper; |
|
|
|
@Resource |
|
|
|
private CompeteProjectMapper competeProjectMapper; |
|
|
|
@Resource |
|
|
|
private CompeteProjectPlayerMapper competeProjectPlayerMapper; |
|
|
|
@Resource |
|
|
|
private CompeteGroupMapper competeGroupMapper; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 查看第几届 |
|
|
@ -141,8 +158,75 @@ public class CompeteService implements ICompeteService{ |
|
|
|
* 提交选择的比赛项目 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public CompeteVo.CompetePlayerInfo saveCompeteProject(QueryDto<CompeteDto.CompeteProject> params) { |
|
|
|
return null; |
|
|
|
public CompeteVo.CompetePlayerInfo saveCompeteProject(QueryDto<CompeteDto.CompeteProject> params) throws IOException { |
|
|
|
|
|
|
|
CompeteProject project = competeProjectMapper.selectByPrimaryKey(params.getParam().getCompeteProjectId()); |
|
|
|
log.info("项目信息:{}", project); |
|
|
|
if (project == null) { |
|
|
|
throw new BaseException(CodeEnum.PARAM_ERROR); |
|
|
|
} |
|
|
|
CompetePlayer player = getPlayer(params.getUserId()); |
|
|
|
|
|
|
|
|
|
|
|
if (project.getTeam() == Constant.Compete.TEAM_NO) { |
|
|
|
// 个人赛
|
|
|
|
long joinedNum = competeTeamDao.countTiwnTeam(player.getId(), params.getParam().getCompeteTimeId()); |
|
|
|
log.info("个人赛参赛数量:{}", joinedNum); |
|
|
|
if (joinedNum >= Constant.Compete.TIWN_MAX_NUM) { |
|
|
|
throw new BaseException(CodeEnum.JOINED_MORE); |
|
|
|
} |
|
|
|
CompeteProjectPlayer projectPlayer = new CompeteProjectPlayer(); |
|
|
|
projectPlayer.setId(snowflake.nextId()); |
|
|
|
projectPlayer.setPlayerId(player.getId()); |
|
|
|
projectPlayer.setProjectId(project.getId()); |
|
|
|
projectPlayer.setCompeteTimeId(params.getParam().getCompeteTimeId()); |
|
|
|
projectPlayer.setGenderGroup(player.getGender()); |
|
|
|
projectPlayer.setCertificate(params.getParam().getCertificate()); |
|
|
|
competeProjectPlayerMapper.insertSelective(projectPlayer); |
|
|
|
|
|
|
|
} else { |
|
|
|
// 团体赛
|
|
|
|
pageJoinedTeam(project, player, params.getParam().getCompeteTimeId(), null ,false); |
|
|
|
// 创建团队
|
|
|
|
CompeteTeam team = new CompeteTeam(); |
|
|
|
team.setId(snowflake.nextId()); |
|
|
|
team.setCreator(player.getId()); |
|
|
|
team.setProjectId(project.getId()); |
|
|
|
team.setCompeteTimeId(params.getParam().getCompeteTimeId()); |
|
|
|
team.setCertificate(params.getParam().getCertificate()); |
|
|
|
team.setGenderGroup(player.getGender()); |
|
|
|
String qrCode = PropUtil.signUpUrl + "home"; |
|
|
|
String qrCodeVisit = QrCodeUtil.urlToQRCode(qrCode, PropUtil.path + "qrCode"); |
|
|
|
team.setQrCode(qrCodeVisit); |
|
|
|
competeTeamDao.insertSelective(team); |
|
|
|
// 加入团队
|
|
|
|
CompeteTeamMember teamMember = new CompeteTeamMember(); |
|
|
|
teamMember.setId(snowflake.nextId()); |
|
|
|
teamMember.setPlayerId(player.getId()); |
|
|
|
teamMember.setCompeteTeamId(team.getId()); |
|
|
|
teamMember.setCaptain(Constant.Compete.TEAM_LEADER_YES); |
|
|
|
competeTeamMemberMapper.insertSelective(teamMember); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CompeteGroup group = competeGroupMapper.selectByPrimaryKey(player.getCompeteGroupId()); |
|
|
|
CompeteCompany company = competeCompanyMapper.selectByPrimaryKey(player.getCompanyId()); |
|
|
|
CompeteVo.CompetePlayerInfo info = new CompeteVo.CompetePlayerInfo(player, group, company,getCompeteProjectAll(params.getUserId(), params.getParam().getCompeteTimeId())); |
|
|
|
|
|
|
|
|
|
|
|
log.info("{}参加返回:{}", params.getUserId(), info); |
|
|
|
return info; |
|
|
|
} |
|
|
|
|
|
|
|
private CompetePlayer getPlayer(Long userId) { |
|
|
|
CompetePlayerExample playerExample = new CompetePlayerExample(); |
|
|
|
playerExample.createCriteria().andUserIdEqualTo(userId); |
|
|
|
List<CompetePlayer> players = competePlayerDao.selectByExample(playerExample); |
|
|
|
if (CollectionUtil.isEmpty(players)) { |
|
|
|
throw new BaseException(CodeEnum.BASE_INFO_LACK); |
|
|
|
} |
|
|
|
return players.get(0); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -150,7 +234,24 @@ public class CompeteService implements ICompeteService{ |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public CompeteVo.CompeteProjectAllByUser queryCompeteProjectAllByUser(QueryDto<CompeteDto.CompeteTime> params) { |
|
|
|
return null; |
|
|
|
log.info("查看本人所有参赛的项目:{}", params); |
|
|
|
return getCompeteProjectAll(params.getUserId(), params.getParam().getCompeteTimeId()); |
|
|
|
} |
|
|
|
|
|
|
|
private CompeteVo.CompeteProjectAllByUser getCompeteProjectAll(Long userId, Long competeTimeId){ |
|
|
|
List<CompeteVo.CompeteTiwnProject> competeTiwnProjects = competeTeamDao.queryTiwn(userId, competeTimeId); |
|
|
|
List<CompeteVo.CompeteTeamProject> competeTeamProjects = competeTeamDao.queryTeam(userId, competeTimeId); |
|
|
|
//封装队员信息和总队员数
|
|
|
|
competeTeamProjects.forEach(team -> { |
|
|
|
List<CompeteVo.CompeteTeamProjectMember> members = competeTeamDao.queryMembers(team.getTeamId()); |
|
|
|
team.setMembers(members); |
|
|
|
team.setMemberNums(members.size()); |
|
|
|
}); |
|
|
|
|
|
|
|
CompeteVo.CompeteProjectAllByUser compete = new CompeteVo.CompeteProjectAllByUser(); |
|
|
|
compete.setCompeteTiwnProjects(competeTiwnProjects); |
|
|
|
compete.setCompeteTeamProjects(competeTeamProjects); |
|
|
|
return compete; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -158,7 +259,7 @@ public class CompeteService implements ICompeteService{ |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public String getQrCodeByTeamId(QueryDto<CompeteDto.CompeteProjectPlayer> params) { |
|
|
|
return null; |
|
|
|
return competeTeamDao.getQrCodeByTeamId(params.getParam().getProjectPlayerId()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -166,14 +267,105 @@ public class CompeteService implements ICompeteService{ |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public CompeteVo.GetPlayerInfo getCompetePlayerInfo(QueryDto params) { |
|
|
|
return null; |
|
|
|
return competePlayerDao.getInfo(params.getUserId()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 扫码加入团队 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public CompeteVo.CompeteTeamProject joinCompeteGroup(QueryDto params) { |
|
|
|
return null; |
|
|
|
public CompeteVo.CompeteTeamProject joinCompeteGroup(QueryDto<CompeteDto.CompeteGroup> params) { |
|
|
|
|
|
|
|
log.info("扫码加入团队:{}", params); |
|
|
|
CompetePlayer player = getPlayer(params.getUserId()); |
|
|
|
|
|
|
|
CompeteTeam team = competeTeamDao.selectByPrimaryKey(params.getParam().getId()); |
|
|
|
log.info("团队信息:{}", team); |
|
|
|
if (team == null) { |
|
|
|
throw new BaseException(CodeEnum.PARAM_ERROR); |
|
|
|
} |
|
|
|
// 查找队长信息
|
|
|
|
CompetePlayer creator = competePlayerDao.selectByPrimaryKey(team.getCreator()); |
|
|
|
// 项目信息
|
|
|
|
CompeteProject project = competeProjectMapper.selectByPrimaryKey(team.getProjectId()); |
|
|
|
// 判断是否已加入其他团队
|
|
|
|
pageJoinedTeam(project, player, team.getCompeteTimeId(), creator, true); |
|
|
|
// 判断团队人数
|
|
|
|
CompeteTeamMemberExample teamMemberExample = new CompeteTeamMemberExample(); |
|
|
|
teamMemberExample.createCriteria().andCompeteTeamIdEqualTo(team.getId()); |
|
|
|
long memberNum = competeTeamMemberMapper.countByExample(teamMemberExample); |
|
|
|
log.info("已加入团队人数:{}", memberNum); |
|
|
|
if (project.getMemberMax() != null && memberNum >= project.getMemberMax()) { |
|
|
|
log.info("团队人数:{}已达到最大人数:{}", memberNum, project.getMemberMax()); |
|
|
|
throw new BaseException(CodeEnum.TEAM_MEMBER_MORE); |
|
|
|
} |
|
|
|
// 加入团队
|
|
|
|
CompeteTeamMember teamMember = new CompeteTeamMember(); |
|
|
|
teamMember.setId(snowflake.nextId()); |
|
|
|
teamMember.setPlayerId(player.getId()); |
|
|
|
teamMember.setCompeteTeamId(team.getId()); |
|
|
|
competeTeamMemberMapper.insertSelective(teamMember); |
|
|
|
if (team.getGenderGroup() != Constant.Compete.GENDER_GROUP_MIX && team.getGenderGroup().byteValue() != player.getGender().byteValue()) { |
|
|
|
log.info("选手性别{}和团队性别组{}不一致,修改为混合", player.getGender(), team.getGenderGroup()); |
|
|
|
CompeteTeam updateTeam = new CompeteTeam(); |
|
|
|
updateTeam.setId(team.getId()); |
|
|
|
updateTeam.setGenderGroup(Constant.Compete.GENDER_GROUP_MIX); |
|
|
|
competeTeamDao.updateByPrimaryKeySelective(updateTeam); |
|
|
|
} |
|
|
|
|
|
|
|
// 查询分组信息
|
|
|
|
List<CompeteVo.CompeteTeamProjectMember> members = competeTeamDao.queryMembers(team.getId()); |
|
|
|
CompeteProject parent = null; |
|
|
|
if (project.getParentId() != null && project.getParentId() != 0L) { |
|
|
|
parent = competeProjectMapper.selectByPrimaryKey(project.getParentId()); |
|
|
|
} |
|
|
|
|
|
|
|
CompeteVo.CompeteTeamProject teamProject = new CompeteVo.CompeteTeamProject(team, Constant.Compete.TEAM_LEADER_NO, project, parent == null ? "" : parent.getName(), members); |
|
|
|
return teamProject; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 判断是否已加入其他团队 |
|
|
|
* @param project 项目信息 |
|
|
|
* @param competeTimeId 比赛ID |
|
|
|
* @param player 选手信息 |
|
|
|
* @param creator 队长信息 |
|
|
|
*/ |
|
|
|
private void pageJoinedTeam(CompeteProject project, CompetePlayer player, Long competeTimeId, CompetePlayer creator, boolean pageLeader) { |
|
|
|
long joinedTeam = 0; |
|
|
|
if (project.getJoinRule() == Constant.Compete.PROJECT_JOIN_RULE_GROUP_LIMIT) { |
|
|
|
// 同单位同组别
|
|
|
|
// 1.与队长同单位且同组别
|
|
|
|
if (pageLeader) { |
|
|
|
if (!player.getCompanyId().equals(creator.getCompanyId())) { |
|
|
|
log.info("单位不一样:{},{}",player.getCompanyId(), creator.getCompanyId()); |
|
|
|
throw new BaseException(CodeEnum.TEAM_COMPANY_NOT_SAME); |
|
|
|
} |
|
|
|
if (player.getCompeteGroupId().longValue() != creator.getCompeteGroupId().longValue()) { |
|
|
|
log.info("组别不一样:{},{}",player.getCompanyId(), creator.getCompanyId()); |
|
|
|
throw new BaseException(CodeEnum.TEAM_GROUP_NOT_SAME); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//2.只能参加项目下的一个团队
|
|
|
|
joinedTeam = competeTeamDao.countJoinTeam(project.getId(), player.getId(), competeTimeId); |
|
|
|
log.info("{}参加{}比赛的{}同组别项目数:{}", player.getId(), competeTimeId, project.getId(), joinedTeam); |
|
|
|
|
|
|
|
} else if (project.getJoinRule() == Constant.Compete.PROJECT_JOIN_RULE_GROUP_NOT_LIMIT) { |
|
|
|
// 同单位不限组别
|
|
|
|
// 1.用户与队长同单位
|
|
|
|
if (pageLeader) { |
|
|
|
if (!player.getCompanyId().equals(creator.getCompanyId())) { |
|
|
|
log.info("单位不一样:{},{}", player.getCompanyId(), creator.getCompanyId()); |
|
|
|
throw new BaseException(CodeEnum.TEAM_COMPANY_NOT_SAME); |
|
|
|
} |
|
|
|
} |
|
|
|
// 2.只能加入一个项目的一个团队
|
|
|
|
joinedTeam = competeTeamDao.countJoinProject(player.getId(), competeTimeId); |
|
|
|
log.info("{}参加{}比赛的不限组别项目数:{}", player.getId(), competeTimeId, joinedTeam); |
|
|
|
} |
|
|
|
if (joinedTeam > 0) { |
|
|
|
throw new BaseException(CodeEnum.JOINED_SAME); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|