From c40ca5b35bcb55f1c0f919bdf7333d68ad3973ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Thu, 8 Jan 2026 16:08:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E9=BB=98=E8=AE=A4=E5=94=AF=E4=B8=80=E6=80=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20&=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E4=BD=8D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 问题1: 设置默认联系人时自动取消其他默认联系人 - 问题3: 新增 /organization-stats API 按单位统计运动员、项目、金额 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .../buckets/.bloomcycle.bin/xl.meta | Bin 743 -> 743 bytes .../buckets/.usage-cache.bin.bkp/xl.meta | Bin 630 -> 637 bytes .../buckets/.usage-cache.bin/xl.meta | Bin 630 -> 637 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 2360 -> 2360 bytes .../.usage-cache.bin.bkp/xl.meta | Bin 636 -> 627 bytes .../000000-assets/.usage-cache.bin/xl.meta | Bin 636 -> 627 bytes .../assets/.usage-cache.bin.bkp/xl.meta | Bin 575 -> 575 bytes .../buckets/assets/.usage-cache.bin/xl.meta | Bin 575 -> 575 bytes .../controller/MartialContactController.java | 14 +- .../MartialRegistrationOrderController.java | 194 +++++++++++++++++- .../martial/pojo/vo/OrganizationStatsVO.java | 69 +++++++ .../service/IMartialContactService.java | 5 + .../impl/MartialContactServiceImpl.java | 32 +++ 13 files changed, 302 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/springblade/modules/martial/pojo/vo/OrganizationStatsVO.java diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index 7b4d10bf0bd6a0bfdceb5bb01b43839c5b68320f..ab2b492c13c43d604f77e2987378cc3a2fe55f8b 100644 GIT binary patch delta 460 zcmaFP`kZxw2G3@;WN9mhBP^e5pZQEQF&6OhS^C=Hvy;KBx${rYyng=e#PWJJh?|A=% zX@+yXi7|DIjZ5-Mb8?O{1{ZRRtiLU06CygL-d6-k*oKBj_j4M|INlGSz~xDRz|U$Dcu$+9{}xUv!4NS&#Sw-DT^ zIxD(c5!{P9#~1H|b5nSAE^=2RxSl#Mvja{e_^mqUwbT&YgE}uN&LOyebzU-?!MUlH d=8g@s5ZqE-r9f!}ccZSf;A8~%t*-Q@A^@oGmE!;a delta 460 zcmaFP`kZxw2G1t0x1xgFM_7KyzG8FwzUhdgY7%P9q zl>rP|mM51M6{Y5tFf7SSttdI`dS-cXNn%k+YD)ca9#)W&%=pBuS|5Xq*Ckgb=cGF4 z=N9Co0;TUT2*4G@8ERj8;E3SnYH##TKyX)TKkHnA;6Bx1*z+CEjaStEUOgYdjn)1T z-3sE?gYAx=sr_Y_JVN@a_Q!&FI5$C1M|bO#)9A;)zOg)g>w@b ebp#bAAh@bfft+)81yiFpnP{#G5y)29H;vzmqg 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 e0040167880de90cf0765a90323915f844ce3647..8a44fce36141dd92537b61821ed393887e698a3d 100644 GIT binary patch delta 334 zcmeyy@|R_T2G3@;q{p}Fj<9U4j^94f#8@EqNHBZnFZax@!j>a9zVLTXERRz^wJIR7 zsKhZivnsWC;zfp2OF%3jz0@}(GdK0JLiGNJhm!y^?rr%UBGEYrTN;9-bOENG? zNij+_O-)HPOH8sfPBuwSvrIIZY{;nQw6N@4deUizb7wmb>oPVj$t%stIr1v=dy~`D zM@;4BuHsgoh41Ki83!kHKbp@K!u{XoyI#RG4vnq)e_a?v8LqN2e3^WJQQG_NDxbvS zlF)*b#FEtGJgf{rkQtx)R_DO72djg#GYdRY6LT{2(hn_lPE5{7ZCbGrCez7bg6E_C~yDTSz;F$&i{(lb`UU0k2 UblKjg;K{x0|CyPLdH+%a0JCL^SpWb4 delta 326 zcmey%@{MJJ2G1t0H{UL_9$~Sb|6OIGiLt=#yMJRstGr^j>CQ8&xg}9Gu{=)w@T!2s zq7uj8%&OGli5D3TF9ETD^itoD%-qz=5*-jjCjK#<9KooTxg@nDG5w}Oin)=AXNJ`a z4v5WtkRrR{sNL~tbJX;czvZ#L`q0zUEWgH$Lu0G{Ul#^ZhPkW^DU%N{N?V^^<&#)k z5?YXwSdx02hm`>cGUF4sYTsCKesyqmW`Rd)VoqjW`k|%HiOCtM&C3#ti&IOAI~FBp zOqi_3q-3{HAH<%t)&LB2FEO_IZCjLIEX&Bm&B4Gf%f+yOLxJn)FUKARg_HxG9Lps3 RaNOL^Q+0lh7~9QnYpQ#B|0F6O#G9SWMrP2oRns0k(Oj&l9FPSYMPpo zYL=K}X`F15oMxG5vasx2deUizbIYdg{L9$5B(F3l=g6zf?@dlqA2F4iyNX+V7QUn7 zWgMK){b)W{2={-R?|KE(I5f8E|8-#yWw^@9@MZD=MrrT6t9%lROF|1$5=&B#^RO}i zL1ujFTb%>T9;^<|&MfdqP0Y#6OFy*KIWajSwRxd_$D-tnNox(jKsT|tIJKmB8HAcF z#-wBllAf@rxatyPtKYUo`Ngt~Oxzp{?6RB;f@c~8`2Rg%c){&5(`9>~f+zQ~|7T`0 J=KV_z004xthx7md delta 315 zcmey%@{MJJ2G1t0H`m%u9$`u5>*StjVl1$9C#PwJhxfLYEq(LLUaSq8SRSW-cvV1R zQHf)4W>sqO#ET4vmw;G6dZ}+nW^U?bi4KS%6aOS7rI;I;n5Lx}r<$1<8<`sz86;Vn zTcjEpnpvcn8zz}pEG#>ho^+bwoasxI8H|lf@=9}Zjy(QbP^ZzXa6oMCgA~~nN9~SJ zo1>wIrD5MDx@Z-rleY?nxv(fTBMp-7+P3b8l)zgB%1)m&CHSv7M7h$Pdd$T z&c(5CDr4i4ywaSUqwH&(tIo$>nwzvjnHpFb8ta)Go0=I~8kt*ezQLHl4gl(fN74WQ 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 dcf83acb5104224ba4cad8d5171e8619973346c9..df9d00f21e2b18173ae857419815016d576a8f46 100644 GIT binary patch delta 326 zcmeyv@|k6V2G3@;r0K_(A7Po>G}mRKiLrp|t;1haMf?i)7s+!thwXbXu{=)wz^Z`6 zq7uj8%&OGli5D3TECI2A^itoD%-qz=5*-jjCjK#1Uy@pqn0`~i!ra`_%*@g}$u!l# z$iOtk+|VK^EzvwBG0iA7%{;|uvLU0I>Q&}07a8BOOs3v`Pl}}=E zNoYYzVoB<89##e*$c#^YtCJ(eF^NeezGG2x#>6f9r3E?pi7AVUs~8sL7c(p>D`r@n zk_#k?tBPj>xf#7~9QnYpQ#B|0F6O#EXyIf79wV@YaBV){)5Q_IxE)Z|1H z!_-8xBvVtfl(Zyc0}BJwB(o%=`>BYqSGtyUtTf}~SvAUXT+Z5W*p|Mr}FAKw6Rt6WY$@>}Aq))H%Nh~f2 zEl5c$Nj=WP$^ZnJ@rhftXUbok#3YijMZdHlCqFTzV^MO(ghj`eP{@W+=~LbXyT+1pw>ZhBE*F 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 b4cf9507b045632af9a4b4898cd8f85d8ae884fb..47a2b17dfffa52d962e5f4811a70fd1912aa8d61 100644 GIT binary patch delta 326 zcmeyv@|k6V2G3@;q`bgKM_BGC%sn>I#8^N^XuGZBf1jSk>U9fWM;jfRSRSW-U{ye3 zQHf)4W>sqO#ET3EmVj75dZ}+nW^U?bi4KS%6aSd1FG(#)OuwmMVQy||W@c%gWSVMV zWMG>Q&}07a8BOOs3v`Pl}}=E zNoYYzVoB<89##e*$c#^YtCJ(eF^NeezGG2x#>6f9r3E?pi7AVUs~8sL7c(p>D`r@n zk_#k?tBPj>xf#pF delta 334 zcmey&@`q)D2G1t0H`6w29bu{4Tpu#g#8_b8`gQwjZQVZZau?Y4wz1ZGVtJhU$yEV~ zMJ0~GnN_L96E8BHTmoVN>7~9QnYpQ#B|0F6O#EXyIf79wV@YaBV){)5Q_IxE)Z|1H z!_-8xBvVtfl(Zyc0}BJwB(o%=%HYB^c|W6?^yyVTiNz(M z1u2OosmFO(8Gs-&K5?t|O!>%BX$}*81;0m|H)M`HZI94&B-~k z=EwK;lkyYx$e&oZx+Q*P$NULBm3o)uHXoe(VcDuOUi+hyH#2HW-(BUCSX>fXkdj!E cdYp%q0SGeVQ{QSoKfpHmC!-U~**L>P09rvx6#xJL delta 176 zcmdnbvY%yw2G1t0H-0iHM_8mE)l8pgVk{u)@XT&!jqjF~0_GJ(+g|*hSYFQtQ8V$6 zjY6tD8uoJ7TuPTTR}~ qs4abZl}}=ENoYYzVoB<89##e*$c#_is;yjCHTfr_6HAkDg)IQ4d`N)+ diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java b/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java index 051472d..717509c 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialContactController.java @@ -14,8 +14,6 @@ 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 @@ -43,16 +41,10 @@ public class MartialContactController extends BladeController { @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); + log.info("Contact submit - id: {}, name: {}, userId: {}, isDefault: {}", + contact.getId(), contact.getName(), userId, contact.getIsDefault()); - if (contact.getId() == null) { - contact.setCreateUser(userId); - contact.setCreateTime(new Date()); - } - contact.setUpdateUser(userId); - contact.setUpdateTime(new Date()); - - return R.data(contactService.saveOrUpdate(contact)); + return R.data(contactService.saveContact(contact, userId)); } @PostMapping("/remove") 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 772b2f6..4eb573d 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialRegistrationOrderController.java @@ -13,21 +13,26 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.modules.martial.pojo.entity.MartialAthlete; import org.springblade.modules.martial.pojo.entity.MartialCompetition; +import org.springblade.modules.martial.pojo.entity.MartialProject; import org.springblade.modules.martial.pojo.entity.MartialRegistrationOrder; import org.springblade.modules.martial.pojo.entity.MartialTeam; import org.springblade.modules.martial.pojo.entity.MartialTeamMember; import org.springblade.modules.martial.pojo.dto.RegistrationSubmitDTO; import org.springblade.modules.martial.pojo.vo.MartialRegistrationOrderVO; +import org.springblade.modules.martial.pojo.vo.OrganizationStatsVO; import org.springblade.modules.martial.service.IMartialAthleteService; import org.springblade.modules.martial.service.IMartialCompetitionService; +import org.springblade.modules.martial.service.IMartialProjectService; import org.springblade.modules.martial.service.IMartialRegistrationOrderService; import org.springblade.modules.martial.service.IMartialTeamService; import org.springblade.modules.martial.mapper.MartialTeamMemberMapper; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @RestController @@ -40,6 +45,7 @@ public class MartialRegistrationOrderController extends BladeController { private final IMartialAthleteService athleteService; private final IMartialTeamService teamService; private final IMartialCompetitionService competitionService; + private final IMartialProjectService projectService; private final MartialTeamMemberMapper teamMemberMapper; @GetMapping("/detail") @@ -60,6 +66,192 @@ public class MartialRegistrationOrderController extends BladeController { return R.data(pages); } + @GetMapping("/organization-stats") + @Operation(summary = "单位统计", description = "按单位统计运动员、项目、金额") + public R> getOrganizationStats(@RequestParam Long competitionId) { + log.info("获取单位统计: competitionId={}", competitionId); + + // 1. Get all athletes for this competition + LambdaQueryWrapper athleteWrapper = new LambdaQueryWrapper<>(); + athleteWrapper.eq(MartialAthlete::getCompetitionId, competitionId) + .eq(MartialAthlete::getIsDeleted, 0); + List athletes = athleteService.list(athleteWrapper); + + if (athletes.isEmpty()) { + return R.data(new ArrayList<>()); + } + + // 2. Get all projects for this competition + Set projectIds = athletes.stream() + .map(MartialAthlete::getProjectId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + final Map projectMap = new HashMap<>(); + if (!projectIds.isEmpty()) { + List projects = projectService.listByIds(projectIds); + projectMap.putAll(projects.stream().collect(Collectors.toMap(MartialProject::getId, p -> p))); + } + + // 3. Get team members for team projects + Set teamIds = athletes.stream() + .filter(a -> { + MartialProject project = projectMap.get(a.getProjectId()); + return project != null && project.getType() != null && project.getType() == 2; + }) + .map(a -> { + // Try to get team ID from team table by team name + LambdaQueryWrapper teamWrapper = new LambdaQueryWrapper<>(); + teamWrapper.eq(MartialTeam::getTeamName, a.getTeamName()) + .eq(MartialTeam::getIsDeleted, 0) + .last("LIMIT 1"); + MartialTeam team = teamService.getOne(teamWrapper, false); + return team != null ? team.getId() : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // Get team members + Map> teamMembersMap = new HashMap<>(); + if (!teamIds.isEmpty()) { + LambdaQueryWrapper memberWrapper = new LambdaQueryWrapper<>(); + memberWrapper.in(MartialTeamMember::getTeamId, teamIds) + .eq(MartialTeamMember::getIsDeleted, 0); + List members = teamMemberMapper.selectList(memberWrapper); + teamMembersMap = members.stream().collect(Collectors.groupingBy(MartialTeamMember::getTeamId)); + } + + // 4. Group by organization and calculate stats + Map orgStatsMap = new LinkedHashMap<>(); + + for (MartialAthlete athlete : athletes) { + String org = athlete.getOrganization(); + if (org == null || org.isEmpty()) { + org = "未知单位"; + } + + OrganizationStatsVO stats = orgStatsMap.computeIfAbsent(org, k -> { + OrganizationStatsVO vo = new OrganizationStatsVO(); + vo.setOrganization(k); + vo.setAthleteCount(0); + vo.setProjectCount(0); + vo.setSingleProjectCount(0); + vo.setTeamProjectCount(0); + vo.setMaleCount(0); + vo.setFemaleCount(0); + vo.setTotalAmount(BigDecimal.ZERO); + vo.setProjectAmounts(new ArrayList<>()); + return vo; + }); + + MartialProject project = projectMap.get(athlete.getProjectId()); + if (project == null) continue; + + // Check if project already counted for this org + boolean projectExists = stats.getProjectAmounts().stream() + .anyMatch(pa -> pa.getProjectId().equals(athlete.getProjectId())); + + if (!projectExists) { + // Add project amount item + OrganizationStatsVO.ProjectAmountItem item = new OrganizationStatsVO.ProjectAmountItem(); + item.setProjectId(project.getId()); + item.setProjectName(project.getProjectName()); + item.setProjectType(project.getType()); + item.setCount(1); + item.setPrice(project.getPrice() != null ? project.getPrice() : BigDecimal.ZERO); + item.setAmount(item.getPrice()); + stats.getProjectAmounts().add(item); + + stats.setProjectCount(stats.getProjectCount() + 1); + if (project.getType() != null && project.getType() == 2) { + stats.setTeamProjectCount(stats.getTeamProjectCount() + 1); + } else { + stats.setSingleProjectCount(stats.getSingleProjectCount() + 1); + } + } else { + // Update count for existing project + stats.getProjectAmounts().stream() + .filter(pa -> pa.getProjectId().equals(athlete.getProjectId())) + .findFirst() + .ifPresent(pa -> { + pa.setCount(pa.getCount() + 1); + pa.setAmount(pa.getPrice().multiply(BigDecimal.valueOf(pa.getCount()))); + }); + } + } + + // 5. Calculate unique athletes and gender counts per organization + for (Map.Entry entry : orgStatsMap.entrySet()) { + String org = entry.getKey(); + OrganizationStatsVO stats = entry.getValue(); + + // Get all athletes for this org + Set uniqueIdCards = new HashSet<>(); + int maleCount = 0; + int femaleCount = 0; + + for (MartialAthlete athlete : athletes) { + String athleteOrg = athlete.getOrganization(); + if (athleteOrg == null || athleteOrg.isEmpty()) athleteOrg = "未知单位"; + if (!athleteOrg.equals(org)) continue; + + MartialProject project = projectMap.get(athlete.getProjectId()); + if (project == null) continue; + + // For individual projects, count the athlete + if (project.getType() == null || project.getType() == 1) { + String idCard = athlete.getIdCard(); + if (idCard != null && !idCard.isEmpty() && !uniqueIdCards.contains(idCard)) { + uniqueIdCards.add(idCard); + if (athlete.getGender() != null && athlete.getGender() == 1) { + maleCount++; + } else if (athlete.getGender() != null && athlete.getGender() == 2) { + femaleCount++; + } + } + } else { + // For team projects, count team members + String teamName = athlete.getTeamName(); + if (teamName != null) { + LambdaQueryWrapper teamWrapper = new LambdaQueryWrapper<>(); + teamWrapper.eq(MartialTeam::getTeamName, teamName) + .eq(MartialTeam::getIsDeleted, 0) + .last("LIMIT 1"); + MartialTeam team = teamService.getOne(teamWrapper, false); + if (team != null && teamMembersMap.containsKey(team.getId())) { + for (MartialTeamMember member : teamMembersMap.get(team.getId())) { + MartialAthlete memberAthlete = athleteService.getById(member.getAthleteId()); + if (memberAthlete != null) { + String idCard = memberAthlete.getIdCard(); + if (idCard != null && !idCard.isEmpty() && !uniqueIdCards.contains(idCard)) { + uniqueIdCards.add(idCard); + if (memberAthlete.getGender() != null && memberAthlete.getGender() == 1) { + maleCount++; + } else if (memberAthlete.getGender() != null && memberAthlete.getGender() == 2) { + femaleCount++; + } + } + } + } + } + } + } + } + + stats.setAthleteCount(uniqueIdCards.size()); + stats.setMaleCount(maleCount); + stats.setFemaleCount(femaleCount); + + // Calculate total amount + BigDecimal totalAmount = stats.getProjectAmounts().stream() + .map(OrganizationStatsVO.ProjectAmountItem::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + stats.setTotalAmount(totalAmount); + } + + return R.data(new ArrayList<>(orgStatsMap.values())); + } + @PostMapping("/submit") @Operation(summary = "提交报名", description = "提交报名订单并关联选手或集体") @Transactional(rollbackFor = Exception.class) diff --git a/src/main/java/org/springblade/modules/martial/pojo/vo/OrganizationStatsVO.java b/src/main/java/org/springblade/modules/martial/pojo/vo/OrganizationStatsVO.java new file mode 100644 index 0000000..596aa78 --- /dev/null +++ b/src/main/java/org/springblade/modules/martial/pojo/vo/OrganizationStatsVO.java @@ -0,0 +1,69 @@ +package org.springblade.modules.martial.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * Organization Statistics VO + */ +@Data +@Schema(description = "单位统计视图对象") +public class OrganizationStatsVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "单位名称") + private String organization; + + @Schema(description = "运动员人数(去重)") + private Integer athleteCount; + + @Schema(description = "项目数量") + private Integer projectCount; + + @Schema(description = "单人项目数") + private Integer singleProjectCount; + + @Schema(description = "集体项目数") + private Integer teamProjectCount; + + @Schema(description = "男运动员数") + private Integer maleCount; + + @Schema(description = "女运动员数") + private Integer femaleCount; + + @Schema(description = "总金额") + private BigDecimal totalAmount; + + @Schema(description = "项目金额明细") + private List projectAmounts; + + @Data + @Schema(description = "项目金额明细") + public static class ProjectAmountItem implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "项目ID") + private Long projectId; + + @Schema(description = "项目名称") + private String projectName; + + @Schema(description = "项目类型(1=单人,2=集体)") + private Integer projectType; + + @Schema(description = "报名人数/集体数") + private Integer count; + + @Schema(description = "单价") + private BigDecimal price; + + @Schema(description = "小计金额") + private BigDecimal amount; + } +} diff --git a/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java b/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java index acbd713..cddb1a3 100644 --- a/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java +++ b/src/main/java/org/springblade/modules/martial/service/IMartialContactService.java @@ -19,4 +19,9 @@ public interface IMartialContactService extends IService { */ MartialContact getContactDetail(Long id); + /** + * Save contact with default uniqueness handling + */ + boolean saveContact(MartialContact contact, Long userId); + } 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 index e94a57a..8475dc2 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialContactServiceImpl.java @@ -1,6 +1,7 @@ package org.springblade.modules.martial.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -10,6 +11,9 @@ 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; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; /** * Contact Service Implementation @@ -35,4 +39,32 @@ public class MartialContactServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(MartialContact::getCreateUser, userId) + .eq(MartialContact::getIsDeleted, 0) + .set(MartialContact::getIsDefault, false); + // Exclude current contact if it's an update + if (contact.getId() != null) { + updateWrapper.ne(MartialContact::getId, contact.getId()); + } + this.update(updateWrapper); + log.info("Cleared default status for user {}'s other contacts", userId); + } + + // Set audit fields + if (contact.getId() == null) { + contact.setCreateUser(userId); + contact.setCreateTime(new Date()); + } + contact.setUpdateUser(userId); + contact.setUpdateTime(new Date()); + + return this.saveOrUpdate(contact); + } + }