From 29e9fb4e0a0f1fe081ec8dffbd40e70d699dd381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Mon, 5 Jan 2026 15:10:27 +0800 Subject: [PATCH] feat: add contact management and judge project assignment features - Add MartialContact entity, mapper, service, and controller for contact management - Add updateProjects endpoint to MartialJudgeInviteController for project assignment - Fix MartialRegistrationOrderController for multi-project registration - Update MartialJudgeInviteVO with projects field Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .../controller/MartialContactController.java | 64 +++++++++++++ .../MartialJudgeInviteController.java | 20 ++++ .../MartialRegistrationOrderController.java | 92 ++++++++++--------- .../martial/mapper/MartialContactMapper.java | 13 +++ .../martial/pojo/entity/MartialContact.java | 41 +++++++++ .../martial/pojo/vo/MartialJudgeInviteVO.java | 11 +++ .../service/IMartialContactService.java | 22 +++++ .../impl/MartialContactServiceImpl.java | 38 ++++++++ .../MartialRegistrationOrderServiceImpl.java | 46 ++++++---- 9 files changed, 290 insertions(+), 57 deletions(-) create mode 100644 src/main/java/org/springblade/modules/martial/controller/MartialContactController.java create mode 100644 src/main/java/org/springblade/modules/martial/mapper/MartialContactMapper.java create mode 100644 src/main/java/org/springblade/modules/martial/pojo/entity/MartialContact.java create mode 100644 src/main/java/org/springblade/modules/martial/service/IMartialContactService.java create mode 100644 src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java b/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java new file mode 100644 index 0000000..051472d --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java @@ -0,0 +1,64 @@ +package org.springblade.modules.martial.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.modules.martial.pojo.entity.MartialContact; +import org.springblade.modules.martial.service.IMartialContactService; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/martial/contact") +@Tag(name = "联系人管理", description = "联系人接口") +public class MartialContactController extends BladeController { + + private final IMartialContactService contactService; + + @GetMapping("/list") + @Operation(summary = "分页列表", description = "获取当前用户的联系人列表") + public R> list(Query query) { + Long userId = AuthUtil.getUserId(); + IPage pages = contactService.getContactList(userId, query.getCurrent(), query.getSize()); + return R.data(pages); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "获取联系人详情") + public R detail(@RequestParam Long id) { + return R.data(contactService.getContactDetail(id)); + } + + @PostMapping("/submit") + @Operation(summary = "保存", description = "新增或修改联系人") + public R submit(@RequestBody MartialContact contact) { + Long userId = AuthUtil.getUserId(); + log.info("Contact submit - id: {}, name: {}, userId: {}", contact.getId(), contact.getName(), userId); + + if (contact.getId() == null) { + contact.setCreateUser(userId); + contact.setCreateTime(new Date()); + } + contact.setUpdateUser(userId); + contact.setUpdateTime(new Date()); + + return R.data(contactService.saveOrUpdate(contact)); + } + + @PostMapping("/remove") + @Operation(summary = "删除", description = "删除联系人") + public R remove(@RequestParam String ids) { + return R.data(contactService.removeByIds(Func.toLongList(ids))); + } + +} diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java b/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java index 58cae52..2fa726f 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java @@ -224,4 +224,24 @@ public class MartialJudgeInviteController extends BladeController { // 使用EasyExcel或POI导出 } + + /** + * 更新邀请的项目分配 + */ + @PutMapping("/updateProjects") + @Operation(summary = "更新项目分配", description = "更新裁判邀请的项目分配") + public R updateProjects(@RequestBody java.util.Map params) { + Long inviteId = Long.valueOf(params.get("inviteId").toString()); + String projects = params.get("projects").toString(); + + MartialJudgeInvite invite = judgeInviteService.getById(inviteId); + if (invite == null) { + return R.fail("邀请记录不存在"); + } + + invite.setProjects(projects); + boolean success = judgeInviteService.updateById(invite); + return success ? R.success("更新成功") : R.fail("更新失败"); + } + } diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java b/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java index f093f77..926b32d 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java @@ -1,7 +1,6 @@ package org.springblade.modules.martial.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -25,7 +24,6 @@ import org.springblade.modules.martial.mapper.MartialTeamMemberMapper; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; - import java.util.List; @Slf4j @@ -84,7 +82,6 @@ public class MartialRegistrationOrderController extends BladeController { List athleteIds = Func.toLongList(dto.getAthleteIds()); List teamIds = Func.toLongList(dto.getTeamIds()); List projectIds = Func.toLongList(dto.getProjectIds()); - Long firstProjectId = projectIds.isEmpty() ? null : projectIds.get(0); // Determine if this is a team registration boolean isTeamRegistration = !teamIds.isEmpty(); @@ -105,7 +102,7 @@ public class MartialRegistrationOrderController extends BladeController { log.info("订单创建成功,订单ID: {}", orderId); if (isTeamRegistration) { - // Handle team registration + // Handle team registration - create record for each team and each project for (Long teamId : teamIds) { MartialTeam team = teamService.getById(teamId); if (team == null) { @@ -113,47 +110,60 @@ public class MartialRegistrationOrderController extends BladeController { continue; } - // Get team members - LambdaQueryWrapper memberWrapper = new LambdaQueryWrapper<>(); - memberWrapper.eq(MartialTeamMember::getTeamId, teamId); - memberWrapper.eq(MartialTeamMember::getIsDeleted, 0); - List members = teamMemberMapper.selectList(memberWrapper); - - // Create a martial_athlete record for the team - MartialAthlete teamAthlete = new MartialAthlete(); - teamAthlete.setOrderId(orderId); - teamAthlete.setCompetitionId(dto.getCompetitionId()); - teamAthlete.setProjectId(firstProjectId); - teamAthlete.setTeamName(team.getTeamName()); - teamAthlete.setPlayerName(team.getTeamName()); - teamAthlete.setOrganization(team.getTeamName()); - teamAthlete.setRegistrationStatus(1); // Auto confirm after payment - teamAthlete.setCompetitionStatus(0); - teamAthlete.setCreateUser(AuthUtil.getUserId()); - teamAthlete.setCreateTime(new java.util.Date()); - teamAthlete.setTenantId("000000"); - teamAthlete.setIsDeleted(0); - teamAthlete.setStatus(1); - - athleteService.save(teamAthlete); - log.info("创建集体参赛记录: teamName={}, athleteId={}", team.getTeamName(), teamAthlete.getId()); + // Create a record for each project + for (Long projectId : projectIds) { + MartialAthlete teamAthlete = new MartialAthlete(); + teamAthlete.setOrderId(orderId); + teamAthlete.setCompetitionId(dto.getCompetitionId()); + teamAthlete.setProjectId(projectId); + teamAthlete.setTeamName(team.getTeamName()); + teamAthlete.setPlayerName(team.getTeamName()); + teamAthlete.setOrganization(team.getTeamName()); + teamAthlete.setRegistrationStatus(1); + teamAthlete.setCompetitionStatus(0); + teamAthlete.setCreateUser(AuthUtil.getUserId()); + teamAthlete.setCreateTime(new java.util.Date()); + teamAthlete.setTenantId("000000"); + teamAthlete.setIsDeleted(0); + teamAthlete.setStatus(1); + + athleteService.save(teamAthlete); + log.info("创建集体参赛记录: teamName={}, projectId={}", team.getTeamName(), projectId); + } } } else { - // Handle individual registration - if (!athleteIds.isEmpty()) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(MartialAthlete::getId, athleteIds) - .set(MartialAthlete::getOrderId, orderId) - .set(MartialAthlete::getCompetitionId, dto.getCompetitionId()); - - if (firstProjectId != null) { - updateWrapper.set(MartialAthlete::getProjectId, firstProjectId); + // Handle individual registration - create record for each athlete and each project + for (Long athleteId : athleteIds) { + MartialAthlete existingAthlete = athleteService.getById(athleteId); + if (existingAthlete == null) { + log.warn("选手不存在: {}", athleteId); + continue; } - // Auto confirm after payment - updateWrapper.set(MartialAthlete::getRegistrationStatus, 1); - boolean updated = athleteService.update(updateWrapper); - log.info("更新选手关联,选手数量: {}, 更新结果: {}", athleteIds.size(), updated); + // Create a record for each project + for (Long projectId : projectIds) { + MartialAthlete newRecord = new MartialAthlete(); + newRecord.setOrderId(orderId); + newRecord.setCompetitionId(dto.getCompetitionId()); + newRecord.setProjectId(projectId); + newRecord.setPlayerName(existingAthlete.getPlayerName()); + newRecord.setGender(existingAthlete.getGender()); + newRecord.setIdCard(existingAthlete.getIdCard()); + newRecord.setIdCardType(existingAthlete.getIdCardType()); + newRecord.setContactPhone(existingAthlete.getContactPhone()); + newRecord.setOrganization(existingAthlete.getOrganization()); + newRecord.setTeamName(existingAthlete.getTeamName()); + newRecord.setRegistrationStatus(1); + newRecord.setCompetitionStatus(0); + newRecord.setCreateUser(AuthUtil.getUserId()); + newRecord.setCreateTime(new java.util.Date()); + newRecord.setTenantId("000000"); + newRecord.setIsDeleted(0); + newRecord.setStatus(1); + + athleteService.save(newRecord); + log.info("创建选手参赛记录: playerName={}, projectId={}", existingAthlete.getPlayerName(), projectId); + } } } diff --git a/src/main/java/org/springblade/modules/martial/mapper/MartialContactMapper.java b/src/main/java/org/springblade/modules/martial/mapper/MartialContactMapper.java new file mode 100644 index 0000000..b3218d2 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/mapper/MartialContactMapper.java @@ -0,0 +1,13 @@ +package org.springblade.modules.martial.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springblade.modules.martial.pojo.entity.MartialContact; + +/** + * Contact Mapper + */ +@Mapper +public interface MartialContactMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/entity/MartialContact.java b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialContact.java new file mode 100644 index 0000000..ac88727 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialContact.java @@ -0,0 +1,41 @@ +package org.springblade.modules.martial.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +/** + * Contact entity + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("martial_contact") +@Schema(description = "联系人") +public class MartialContact extends TenantEntity { + + private static final long serialVersionUID = 1L; + + @Schema(description = "证件类型") + private String idType; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "证件号码") + private String idCard; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "地址") + private String address; + + @Schema(description = "是否默认联系人") + private Boolean isDefault; + +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/vo/MartialJudgeInviteVO.java b/src/main/java/org/springblade/modules/martial/pojo/vo/MartialJudgeInviteVO.java index 78517c9..66b0a38 100644 --- a/src/main/java/org/springblade/modules/martial/pojo/vo/MartialJudgeInviteVO.java +++ b/src/main/java/org/springblade/modules/martial/pojo/vo/MartialJudgeInviteVO.java @@ -80,4 +80,15 @@ public class MartialJudgeInviteVO extends MartialJudgeInvite { @Schema(description = "场地名称") private String venueName; + /** + * 获取场地名称 + * 总裁(referee_type=3)显示全部场地 + */ + public String getVenueName() { + if (this.getRefereeType() != null && this.getRefereeType() == 3) { + return "全部场地"; + } + return venueName; + } + } diff --git a/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java b/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java new file mode 100644 index 0000000..acbd713 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java @@ -0,0 +1,22 @@ +package org.springblade.modules.martial.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springblade.modules.martial.pojo.entity.MartialContact; + +/** + * Contact Service Interface + */ +public interface IMartialContactService extends IService { + + /** + * Get contact list by user + */ + IPage getContactList(Long userId, Integer current, Integer size); + + /** + * Get contact detail + */ + MartialContact getContactDetail(Long id); + +} diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java new file mode 100644 index 0000000..e94a57a --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java @@ -0,0 +1,38 @@ +package org.springblade.modules.martial.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.modules.martial.mapper.MartialContactMapper; +import org.springblade.modules.martial.pojo.entity.MartialContact; +import org.springblade.modules.martial.service.IMartialContactService; +import org.springframework.stereotype.Service; + +/** + * Contact Service Implementation + */ +@Slf4j +@Service +@AllArgsConstructor +public class MartialContactServiceImpl extends ServiceImpl implements IMartialContactService { + + @Override + public IPage getContactList(Long userId, Integer current, Integer size) { + Page page = new Page<>(current, size); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MartialContact::getCreateUser, userId); + wrapper.eq(MartialContact::getIsDeleted, 0); + wrapper.orderByDesc(MartialContact::getIsDefault); + wrapper.orderByDesc(MartialContact::getCreateTime); + return this.page(page, wrapper); + } + + @Override + public MartialContact getContactDetail(Long id) { + return this.getById(id); + } + +} diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialRegistrationOrderServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialRegistrationOrderServiceImpl.java index 7977045..e4549d0 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialRegistrationOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialRegistrationOrderServiceImpl.java @@ -152,18 +152,25 @@ public class MartialRegistrationOrderServiceImpl extends ServiceImpl athleteList = athletes.stream() - .map(athlete -> { - MartialRegistrationOrderVO.AthleteInfo info = new MartialRegistrationOrderVO.AthleteInfo(); - info.setId(athlete.getId()); - info.setPlayerName(athlete.getPlayerName()); - info.setGender(athlete.getGender()); - info.setIdCard(athlete.getIdCard()); - return info; - }) + .collect(Collectors.toMap( + MartialAthlete::getPlayerName, + athlete -> { + MartialRegistrationOrderVO.AthleteInfo info = new MartialRegistrationOrderVO.AthleteInfo(); + info.setId(athlete.getId()); + info.setPlayerName(athlete.getPlayerName()); + info.setGender(athlete.getGender()); + info.setIdCard(athlete.getIdCard()); + return info; + }, + (existing, replacement) -> existing + )) + .values() + .stream() .collect(Collectors.toList()); vo.setAthleteList(athleteList); @@ -242,18 +249,25 @@ public class MartialRegistrationOrderServiceImpl extends ServiceImpl athleteList = athletes.stream() - .map(athlete -> { - MartialRegistrationOrderVO.AthleteInfo info = new MartialRegistrationOrderVO.AthleteInfo(); - info.setId(athlete.getId()); - info.setPlayerName(athlete.getPlayerName()); - info.setGender(athlete.getGender()); - info.setIdCard(athlete.getIdCard()); - return info; - }) + .collect(Collectors.toMap( + MartialAthlete::getPlayerName, + athlete -> { + MartialRegistrationOrderVO.AthleteInfo info = new MartialRegistrationOrderVO.AthleteInfo(); + info.setId(athlete.getId()); + info.setPlayerName(athlete.getPlayerName()); + info.setGender(athlete.getGender()); + info.setIdCard(athlete.getIdCard()); + return info; + }, + (existing, replacement) -> existing + )) + .values() + .stream() .collect(Collectors.toList()); vo.setAthleteList(athleteList);