From c7038a588376f792ebea0a253dda13b84d1517dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Tue, 30 Dec 2025 18:02:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(team):=20=E6=B7=BB=E5=8A=A0=E9=9B=86?= =?UTF-8?q?=E4=BD=93/=E5=9B=A2=E9=98=9F=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建martial_team和martial_team_member表 - 添加MartialTeam和MartialTeamMember实体类 - 添加MartialTeamController提供集体CRUD接口 - 支持集体成员关联管理 --- .../buckets/.bloomcycle.bin/xl.meta | Bin 743 -> 743 bytes .../buckets/.usage-cache.bin.bkp/xl.meta | Bin 627 -> 637 bytes .../buckets/.usage-cache.bin/xl.meta | Bin 627 -> 637 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 2359 -> 2359 bytes .../.usage-cache.bin.bkp/xl.meta | Bin 636 -> 636 bytes .../000000-assets/.usage-cache.bin/xl.meta | Bin 636 -> 636 bytes .../assets/.usage-cache.bin.bkp/xl.meta | Bin 575 -> 575 bytes .../buckets/assets/.usage-cache.bin/xl.meta | Bin 575 -> 575 bytes .../controller/MartialTeamController.java | 58 ++++++++ .../martial/mapper/MartialTeamMapper.java | 7 + .../mapper/MartialTeamMemberMapper.java | 7 + .../martial/pojo/dto/TeamSubmitDTO.java | 21 +++ .../martial/pojo/entity/MartialTeam.java | 29 ++++ .../pojo/entity/MartialTeamMember.java | 40 +++++ .../martial/pojo/vo/MartialTeamVO.java | 33 +++++ .../martial/service/IMartialTeamService.java | 32 ++++ .../service/impl/MartialTeamServiceImpl.java | 139 ++++++++++++++++++ 17 files changed, 366 insertions(+) create mode 100644 src/main/java/org/springblade/modules/martial/controller/MartialTeamController.java create mode 100644 src/main/java/org/springblade/modules/martial/mapper/MartialTeamMapper.java create mode 100644 src/main/java/org/springblade/modules/martial/mapper/MartialTeamMemberMapper.java create mode 100644 src/main/java/org/springblade/modules/martial/pojo/dto/TeamSubmitDTO.java create mode 100644 src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeam.java create mode 100644 src/main/java/org/springblade/modules/martial/pojo/entity/MartialTeamMember.java create mode 100644 src/main/java/org/springblade/modules/martial/pojo/vo/MartialTeamVO.java create mode 100644 src/main/java/org/springblade/modules/martial/service/IMartialTeamService.java create mode 100644 src/main/java/org/springblade/modules/martial/service/impl/MartialTeamServiceImpl.java diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index dcf2ebf0fd1628ce1940ea4574eddc429fb19c67..660a52de70a89fd105980563cf1fd8ec3aeddc13 100644 GIT binary patch delta 445 zcmaFP`kZxw2G7_3-*rx}IKpBX_5I956Jvn{<$be`2)c=^|9fgiqslG)iRJZd5H%D3 z*eE1hn5G$-rWvQ28XK7#o2H~B85&rcnp;>}nwcae8zxVVVAQK`N$6-{Y+RC8nv-*s zF<3(+{(x=JAFJD*=30|C+HMZEPCl?XEIs&C@=_CDmn0UIq^2C_VFjtk3|`D5d+L(My5!2_oK)xh+=84`pzIw60l0$s9da)U z>)R0gBXU=N3&FVy8079quRw5ZucM3>2}OSYFQtQ8V$6 zje=#WL2{B|im|0pl8J$#Wm1}niBWQ5qFI`eQA(1Dq2=TVM!ovWD{VO#8<*sj=Hwh@ z3{IL}Z&cb+F0%R5JU@e9*&0IoS(&bHob+ESaW_Y4?~D5jgc-n~WqERGQBi7M3B!`S z)QXa`!V8ucmn0UIq^2C_VFjtk44yYbRy3<*U2`1>-3aazxyo7J;M{o%a=jZB5ZoBK O{)aaZ+!=DMm2Uw(d6TdJ 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 f93b2f0aa2e2d9cc0e9afbd94b05fd8a85935b6a..6f9e44eb796d2af79cf04e73667679a8a752a216 100644 GIT binary patch delta 350 zcmey&@|R_T2G7_3-x==59bs8CRmXjziLt;d@t*I>T&@LsZEpM$l6DWCSRSW-YE?jD zQHf)4W>sqO#ET54mVj75dZ}+nW^U?biB^aq6aUyKm{=HETAC*tC0QmK8z!3>nV1@y zm>8NSC#R&E8Kha5PL5#IvwqQf+@G;=NnUAA&XHGYg^6jPltkR`WhN zCCA6?uHNaMuwpCI6b_B8`hQ&*L>aEKGO%z>KFBClziE|EVsS}mK}upt>Tw=c1|Y}` zUd$u+C5>TqaCT;aM`~hDW?uTCrOt`T8L7={4ZuJ*vA8(3q_|^Ia>j&3#Z{LW9^JE8 zlwT~ksH~V_aY`4G2z1H;1PLksmmIwvh#RIFUZ0My68 iz{yZ)dclByQxU_L2HrgkehT}N62v_CGLA`{@C5)UM2DCF delta 340 zcmey%@|k6V2G5so9dEDk9ARO!viLaB#8@DBi3&?ylE>w35ysiBC+{qpSRSW-U{ye3 zQHf)4W>sqO#ET3EmVj75dZ}+nW^U?biB^aq6aUyKSXvmGCz%_hrKY8rT9})sBpI0} zr5c(Tr6eaCq!}eAO^#sHvz~l@))vObC3&SeIY%DEedSB{s+C)@{#sUgV$xU73teJy z=QsD6EbJ@H+AQ^theKnl{$CdcQHEAlh7iul2N|X6=dbcfEG`KxNJ%V7J(H`qVtJhUsZ{}q zMJ0~GnN_L96E8BHS^{DL>7~9QnYpQ#C0ZedO#EZ2z9h9IG5w~3iG`u1rFpVZl4YW? zVX~Q#iK(H9iJ@t7a!RV1L7Ii>WJ5+Z=Y?hG(vwazoMX?GFJWw4l2@9ObL5p;;nsMD zkYgKO?l(L%qkOiC)x1wm$?-9}t9QC5tk}vlg+pVj{$CdcQHHCm3@lue4>C&CZ(8M( zSX>fXkdj!EdYp%q0SGdK7xTz{Nn=&WXtxsm;q0i;GiBiaQo1 zXG~aBT*a^`znEcBSuw-nlw2TDTva?9WWu7djOh#ulMk&m00Z4i43F+v0F??dv9U6+ p2rkqI>7T^O5TGOJbj*l>HPazpp+x9}W|NQZjC;oEY;Bhl5&-s1kq!U= diff --git a/minio_data/.minio.sys/buckets/.usage.json/xl.meta b/minio_data/.minio.sys/buckets/.usage.json/xl.meta index 36006bc8ab37f2773e6a1003d693e7ed0ceef3ca..a25b3efe247b064c889b07c86e33bf1d38c23685 100644 GIT binary patch delta 167 zcmdlkv|VU|2G7_3-}TjJ9bw5g-#25TiLpTHp*Qd6%la4XTEn|M%j@geiRJZd5H%D3 zM1`d$B^sC+nI)yBm|2(^r5~4T9_LfniwrCJC~kxn&I3p;~UGXzZH`uvtwNe}ESbcl_w)YK`7!B=GTFk++|t4*CCSV@+1xVO#K^!r)x^j&C1qjRx%8yd4Cgi#=v-oKT#{Fs zlXK+dm4j&;6I4EbN}KuU&|xO`r*FOQIIPdpeQDD~6Jr7S3s2@ciRJZd5H%D3 z*eIk~8W|fHT3V)98k?G!n;RsiB$_5A8zq{UC#4#gn;A@wVARvSdGCHYW8;#%(wv+l zFXydhXC delta 175 zcmeyv@`q)D2G5so?GKydkFew%KRIiniLpR&LhQk*_Rjm)Ea{Zd%>AW2vAmuQqGsYB z8wK+uBePUf%VY~Pb4v@Olq56rWOK`86C(rjR1+i9l$6O4jC#6v8Kxg(Y+RC8nv-+n z<&}eJ8xvGMe@dJA=+I#%_or{Y?>Mp+ao#QXFPm|8kCDOT&5TCU^H=#K7MFw;q$HN4 b9_L|Y0D{cmc{5}^Udc^js$e( 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 ac66441275629b17d921c8d305f0da4128f0b72d..794f9f14cff76d8b8df45c134e9c8c55cce54e79 100644 GIT binary patch delta 176 zcmdnbvY%yw2G7_3-xl+y9bs`1-X1^E#8^O|XV0V3i~iT=FS3&UEzUo8VtG9qM9suM zHVP)m#^wfw28o7gmPTeNhDpZBKxB}Znq-!2V3=rRHaUV(Pxngk$488fOY%x{a*nL| z<}O_Pf9ldCK2~O?V+q;Y*6Y7LEvn-eW9&EY=Hia_wUak9YD;fg<&#)k5?YXwSdx02 ahm`>cGJ_ZM$W5wIocxo~iKR0r`3nFzd`BVx delta 176 zcmdnbvY%yw2G5so9kUjGKEiUUXv*=4CdLBUr|O zHOAStyG;(LT;5r$5hceGdgyhu@9WL7`6B#x_wZLt$nu)JnNeGM{wklu;*!vUl*E$M c<2> 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); + } + +}