diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index dcf2ebf..660a52d 100644 Binary files a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta and b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta index f93b2f0..6f9e44e 100644 Binary files a/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta index b5bca56..c2fb79e 100644 Binary files a/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage.json/xl.meta b/minio_data/.minio.sys/buckets/.usage.json/xl.meta index 36006bc..a25b3ef 100644 Binary files a/minio_data/.minio.sys/buckets/.usage.json/xl.meta and b/minio_data/.minio.sys/buckets/.usage.json/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta index 9af19a7..de2ff05 100644 Binary files a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta index b7532b2..26ddd8b 100644 Binary files a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta index ac66441..794f9f1 100644 Binary files a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta index bda6750..85b590e 100644 Binary files a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta differ diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialTeamController.java b/src/main/java/org/springblade/modules/martial/controller/MartialTeamController.java new file mode 100644 index 0000000..a019301 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/controller/MartialTeamController.java @@ -0,0 +1,58 @@ +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.modules.martial.pojo.dto.TeamSubmitDTO; +import org.springblade.modules.martial.pojo.entity.MartialTeam; +import org.springblade.modules.martial.pojo.vo.MartialTeamVO; +import org.springblade.modules.martial.service.IMartialTeamService; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/martial/team") +@Tag(name = "集体管理", description = "集体/团队接口") +public class MartialTeamController extends BladeController { + + private final IMartialTeamService teamService; + + @GetMapping("/list") + @Operation(summary = "分页列表", description = "获取当前用户的集体列表") + public R> list(Query query) { + Long userId = AuthUtil.getUserId(); + IPage pages = teamService.getTeamList(userId, query.getCurrent(), query.getSize()); + return R.data(pages); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "获取集体详情") + public R detail(@RequestParam Long id) { + return R.data(teamService.getTeamDetail(id)); + } + + @PostMapping("/submit") + @Operation(summary = "保存", description = "新增或修改集体") + public R submit(@RequestBody TeamSubmitDTO dto) { + MartialTeam team = new MartialTeam(); + team.setTeamName(dto.getTeamName()); + team.setRemark(dto.getRemark()); + + boolean result = teamService.saveTeamWithMembers(team, dto.getMemberIds()); + return R.data(result); + } + + @PostMapping("/remove") + @Operation(summary = "删除", description = "删除集体") + public R remove(@RequestParam Long id) { + return R.data(teamService.removeTeamWithMembers(id)); + } + +} diff --git a/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMapper.java b/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMapper.java new file mode 100644 index 0000000..7348f7a --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMapper.java @@ -0,0 +1,7 @@ +package org.springblade.modules.martial.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.modules.martial.pojo.entity.MartialTeam; + +public interface MartialTeamMapper extends BaseMapper { +} diff --git a/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMemberMapper.java b/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMemberMapper.java new file mode 100644 index 0000000..3163f17 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/mapper/MartialTeamMemberMapper.java @@ -0,0 +1,7 @@ +package org.springblade.modules.martial.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.modules.martial.pojo.entity.MartialTeamMember; + +public interface MartialTeamMemberMapper extends BaseMapper { +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/dto/TeamSubmitDTO.java b/src/main/java/org/springblade/modules/martial/pojo/dto/TeamSubmitDTO.java new file mode 100644 index 0000000..71273ec --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/dto/TeamSubmitDTO.java @@ -0,0 +1,21 @@ +package org.springblade.modules.martial.pojo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "集体提交DTO") +public class TeamSubmitDTO { + + @Schema(description = "集体名称") + private String teamName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "成员ID列表") + private List memberIds; + +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeam.java b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeam.java new file mode 100644 index 0000000..e8dd14d --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeam.java @@ -0,0 +1,29 @@ +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; + +/** + * 集体/团队实体类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("martial_team") +@Schema(description = "集体/团队") +public class MartialTeam extends TenantEntity { + + private static final long serialVersionUID = 1L; + + @Schema(description = "集体名称") + private String teamName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "成员数量") + private Integer memberCount; + +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeamMember.java b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeamMember.java new file mode 100644 index 0000000..488e866 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeamMember.java @@ -0,0 +1,40 @@ +package org.springblade.modules.martial.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 集体成员关联实体类 + */ +@Data +@TableName("martial_team_member") +@Schema(description = "集体成员关联") +public class MartialTeamMember implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Long id; + + @Schema(description = "集体ID") + private Long teamId; + + @Schema(description = "选手ID") + private Long athleteId; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "是否删除") + private Integer isDeleted; + + @Schema(description = "租户ID") + private String tenantId; + +} diff --git a/src/main/java/org/springblade/modules/martial/pojo/vo/MartialTeamVO.java b/src/main/java/org/springblade/modules/martial/pojo/vo/MartialTeamVO.java new file mode 100644 index 0000000..6ba3e6b --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/vo/MartialTeamVO.java @@ -0,0 +1,33 @@ +package org.springblade.modules.martial.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.modules.martial.pojo.entity.MartialTeam; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "集体视图对象") +public class MartialTeamVO extends MartialTeam { + + private static final long serialVersionUID = 1L; + + @Schema(description = "成员列表") + private List members; + + @Data + @Schema(description = "成员信息") + public static class MemberInfo { + @Schema(description = "选手ID") + private Long id; + + @Schema(description = "选手姓名") + private String name; + + @Schema(description = "身份证号") + private String idCard; + } + +} diff --git a/src/main/java/org/springblade/modules/martial/service/IMartialTeamService.java b/src/main/java/org/springblade/modules/martial/service/IMartialTeamService.java new file mode 100644 index 0000000..b1a6562 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/service/IMartialTeamService.java @@ -0,0 +1,32 @@ +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.MartialTeam; +import org.springblade.modules.martial.pojo.vo.MartialTeamVO; + +import java.util.List; + +public interface IMartialTeamService extends IService { + + /** + * Save team with members + */ + boolean saveTeamWithMembers(MartialTeam team, List memberIds); + + /** + * Get team list with member count + */ + IPage getTeamList(Long createUser, Integer current, Integer size); + + /** + * Get team detail with members + */ + MartialTeamVO getTeamDetail(Long id); + + /** + * Remove team and its members + */ + boolean removeTeamWithMembers(Long id); + +} diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialTeamServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialTeamServiceImpl.java new file mode 100644 index 0000000..e4e6e2d --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialTeamServiceImpl.java @@ -0,0 +1,139 @@ +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 org.springblade.modules.martial.mapper.MartialTeamMapper; +import org.springblade.modules.martial.mapper.MartialTeamMemberMapper; +import org.springblade.modules.martial.pojo.entity.MartialAthlete; +import org.springblade.modules.martial.pojo.entity.MartialTeam; +import org.springblade.modules.martial.pojo.entity.MartialTeamMember; +import org.springblade.modules.martial.pojo.vo.MartialTeamVO; +import org.springblade.modules.martial.service.IMartialAthleteService; +import org.springblade.modules.martial.service.IMartialTeamService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@AllArgsConstructor +public class MartialTeamServiceImpl extends ServiceImpl implements IMartialTeamService { + + private final MartialTeamMemberMapper teamMemberMapper; + private final IMartialAthleteService athleteService; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean saveTeamWithMembers(MartialTeam team, List memberIds) { + team.setMemberCount(memberIds != null ? memberIds.size() : 0); + boolean saved = this.save(team); + + if (saved && memberIds != null && !memberIds.isEmpty()) { + for (Long athleteId : memberIds) { + MartialTeamMember member = new MartialTeamMember(); + member.setTeamId(team.getId()); + member.setAthleteId(athleteId); + member.setCreateTime(LocalDateTime.now()); + member.setIsDeleted(0); + member.setTenantId("000000"); + teamMemberMapper.insert(member); + } + } + + return saved; + } + + @Override + public IPage getTeamList(Long createUser, Integer current, Integer size) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MartialTeam::getCreateUser, createUser); + wrapper.orderByDesc(MartialTeam::getCreateTime); + + IPage page = new Page<>(current, size); + IPage teamPage = this.page(page, wrapper); + + IPage voPage = new Page<>(current, size, teamPage.getTotal()); + + if (teamPage.getRecords().isEmpty()) { + voPage.setRecords(new ArrayList<>()); + return voPage; + } + + List voList = teamPage.getRecords().stream() + .map(team -> { + MartialTeamVO vo = new MartialTeamVO(); + BeanUtils.copyProperties(team, vo); + return vo; + }) + .collect(Collectors.toList()); + + voPage.setRecords(voList); + return voPage; + } + + @Override + public MartialTeamVO getTeamDetail(Long id) { + MartialTeam team = this.getById(id); + if (team == null) { + return null; + } + + MartialTeamVO vo = new MartialTeamVO(); + BeanUtils.copyProperties(team, vo); + + // Get members + LambdaQueryWrapper memberWrapper = new LambdaQueryWrapper<>(); + memberWrapper.eq(MartialTeamMember::getTeamId, id); + memberWrapper.eq(MartialTeamMember::getIsDeleted, 0); + List teamMembers = teamMemberMapper.selectList(memberWrapper); + + if (!teamMembers.isEmpty()) { + List athleteIds = teamMembers.stream() + .map(MartialTeamMember::getAthleteId) + .collect(Collectors.toList()); + + List athletes = athleteService.listByIds(athleteIds); + Map athleteMap = athletes.stream() + .collect(Collectors.toMap(MartialAthlete::getId, a -> a)); + + List members = teamMembers.stream() + .map(tm -> { + MartialTeamVO.MemberInfo info = new MartialTeamVO.MemberInfo(); + MartialAthlete athlete = athleteMap.get(tm.getAthleteId()); + if (athlete != null) { + info.setId(athlete.getId()); + info.setName(athlete.getPlayerName()); + info.setIdCard(athlete.getIdCard()); + } + return info; + }) + .filter(info -> info.getId() != null) + .collect(Collectors.toList()); + + vo.setMembers(members); + } + + return vo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeTeamWithMembers(Long id) { + // Delete members first + LambdaQueryWrapper memberWrapper = new LambdaQueryWrapper<>(); + memberWrapper.eq(MartialTeamMember::getTeamId, id); + teamMemberMapper.delete(memberWrapper); + + // Delete team + return this.removeById(id); + } + +}