| ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java | ●●●●● patch | view | raw | blame | history | |
| ruoyi-admin/src/main/java/com/ruoyi/im/util/UserPolicyUtils.java | ●●●●● patch | view | raw | blame | history | |
| ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java | ●●●●● patch | view | raw | blame | history | |
| ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/SubordinateInformationDto.java | ●●●●● patch | view | raw | blame | history | |
| ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserTeamAndPositionOut.java | ●●●●● patch | view | raw | blame | history |
ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -3,6 +3,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; @@ -14,10 +15,15 @@ import com.ruoyi.im.dto.RegisterDto; import com.ruoyi.im.service.InsuranceProductService; import com.ruoyi.im.service.MedicalInsuranceAccountService; import com.ruoyi.im.service.UserPolicyService; import com.ruoyi.im.service.impl.InsurancePositionServiceImpl; import com.ruoyi.im.util.SymmetricCryptoUtil; import com.ruoyi.im.util.UserPolicyUtils; import com.ruoyi.im.util.ValidatorUtil; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.dto.SubordinateInformationDto; import com.ruoyi.system.domain.out.UserOut; import com.ruoyi.system.domain.out.UserTeamAndPositionOut; import com.ruoyi.system.domain.vo.UserAccountUpdateVo; import com.ruoyi.system.service.GroupWelcomeConfigService; import com.ruoyi.system.service.ISysUserService; @@ -29,6 +35,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -42,6 +49,7 @@ import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping("/im/api") @@ -64,6 +72,12 @@ @Autowired MedicalInsuranceAccountService medicalInsuranceAccountService; @Autowired UserPolicyService userPolicyService; @Autowired InsurancePositionServiceImpl insurancePositionService; @Value("${file.upload-dir}") @@ -290,4 +304,55 @@ return Result.error("获取失败,请稍后再试!"); } } /** * 获取用户团队和职位 */ @GetMapping("/getUserTeamAndPosition") public Result getUserTeamAndPosition(@RequestParam("account") String account) { UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<>(UserAccount.class).eq(UserAccount::getCloudMessageAccount, account)); if(ObjectUtil.isEmpty(userAccount)){ return Result.error("账号不存在!"); } //查询当前用户的下级 List<UserAccount> userAccountList = userAccountService.list(new LambdaQueryWrapper<UserAccount>() .eq(UserAccount::getInvitationAccount, userAccount.getAccount()) ); UserTeamAndPositionOut userTeamAndPositionOut = new UserTeamAndPositionOut(); if(CollectionUtils.isEmpty(userAccountList)){ return Result.success(userTeamAndPositionOut); } List<Integer> idList = userAccountList.stream() .map(UserAccount::getId) .collect(Collectors.toList()); List<UserPolicy> userPolicyList = userPolicyService.list(new LambdaQueryWrapper<>(UserPolicy.class) .in(UserPolicy::getUserId, idList) ); List<SubordinateInformationDto> informationDtos = new ArrayList<>(); userAccountList.forEach(f->{ userTeamAndPositionOut.setSubordinateNumber(userAccountList.size()); SubordinateInformationDto subordinateInformationDto = new SubordinateInformationDto(); subordinateInformationDto.setName(StringUtils.isEmpty(f.getNickname()) ? f.getAccount() : f.getNickname()); subordinateInformationDto.setPhone(f.getAccount()); subordinateInformationDto.setKycStatus(f.getKycStatus()); subordinateInformationDto.setIsActivate(UserPolicyUtils.hasActivePolicyForUser(userPolicyList,f.getId())); informationDtos.add(subordinateInformationDto); }); long activeNumber = UserPolicyUtils.countActivePolicies(userPolicyList); userTeamAndPositionOut.setInsureNumber(activeNumber); List<InsurancePosition> positions = insurancePositionService.list(); positions.forEach(f->{ if(userPolicyList.size() >= f.getNumberPeople()){ userTeamAndPositionOut.setPosition(f.getPosition()); userTeamAndPositionOut.setSalary(f.getSalary()); } }); userTeamAndPositionOut.setInsurancePosition(positions); userTeamAndPositionOut.setSubordinateInformation(informationDtos); return Result.success(userTeamAndPositionOut); } } ruoyi-admin/src/main/java/com/ruoyi/im/util/UserPolicyUtils.java
New file @@ -0,0 +1,118 @@ package com.ruoyi.im.util; import com.ruoyi.system.domain.UserPolicy; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class UserPolicyUtils { /** * 查询指定用户是否有生效保单 * @param userPolicyList 保单列表 * @param userId 用户ID * @return 是否有生效保单 */ public static Boolean hasActivePolicyForUser(List<UserPolicy> userPolicyList, Integer userId) { if (userPolicyList == null || userPolicyList.isEmpty() || userId == null) { return false; } return userPolicyList.stream() .filter(policy -> policy != null && policy.getUserId() != null && policy.getPolicyStatus() != null) .filter(policy -> userId.equals(policy.getUserId())) .anyMatch(policy -> UserPolicy.PolicyStatus.ACTIVE.equals(policy.getPolicyStatus())); } /** * 统计生效保单数量 * @param userPolicyList 保单列表 * @return 生效保单数量 */ public static long countActivePolicies(List<UserPolicy> userPolicyList) { if (userPolicyList == null || userPolicyList.isEmpty()) { return 0L; } return userPolicyList.stream() .filter(policy -> policy != null && policy.getPolicyStatus() != null) .filter(policy -> UserPolicy.PolicyStatus.ACTIVE.equals(policy.getPolicyStatus())) .count(); } /** * 获取所有生效保单列表 * @param userPolicyList 保单列表 * @return 生效保单列表 */ public static List<UserPolicy> getActivePolicies(List<UserPolicy> userPolicyList) { if (userPolicyList == null || userPolicyList.isEmpty()) { return new ArrayList<>(); } return userPolicyList.stream() .filter(policy -> policy != null && policy.getPolicyStatus() != null) .filter(policy -> UserPolicy.PolicyStatus.ACTIVE.equals(policy.getPolicyStatus())) .collect(Collectors.toList()); } /** * 统计各种状态的保单数量 * @param userPolicyList 保单列表 * @return 包含各种状态数量的Map */ public static Map<UserPolicy.PolicyStatus, Long> countPoliciesByStatus(List<UserPolicy> userPolicyList) { if (userPolicyList == null || userPolicyList.isEmpty()) { return new HashMap<>(); } return userPolicyList.stream() .filter(policy -> policy != null && policy.getPolicyStatus() != null) .collect(Collectors.groupingBy( UserPolicy::getPolicyStatus, Collectors.counting() )); } /** * 检查用户是否有生效保单 * @param userPolicyList 用户保单列表 * @return 是否有生效保单 */ public static boolean hasActivePolicy(List<UserPolicy> userPolicyList) { if (userPolicyList == null || userPolicyList.isEmpty()) { return false; } return userPolicyList.stream() .anyMatch(policy -> policy != null && policy.getPolicyStatus() != null && UserPolicy.PolicyStatus.ACTIVE.equals(policy.getPolicyStatus())); } /** * 统计用户生效保单的总保额 * @param userPolicyList 用户保单列表 * @return 总保额 */ public static BigDecimal sumActivePolicyCoverage(List<UserPolicy> userPolicyList) { if (userPolicyList == null || userPolicyList.isEmpty()) { return BigDecimal.ZERO; } return userPolicyList.stream() .filter(policy -> policy != null && policy.getPolicyStatus() != null && UserPolicy.PolicyStatus.ACTIVE.equals(policy.getPolicyStatus()) && policy.getCoverageAmount() != null) .map(UserPolicy::getCoverageAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); } } ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java
@@ -42,7 +42,6 @@ // 邀请码 private String invitationCode; // 邀请人账号 private String invitationAccount; ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/SubordinateInformationDto.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.system.domain.dto; import lombok.Data; /** * @program: ruoyiim * @description: * @create: 2025-09-22 15:40 **/ @Data public class SubordinateInformationDto { //姓名 private String name; //手机号 private String phone; //实名状态:0 认证中 1 已认证 2 未实名 private Integer kycStatus = 2; //是否激活 false 未激活 true 已激活 private Boolean isActivate = false; } ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserTeamAndPositionOut.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.system.domain.out; import com.ruoyi.system.domain.InsurancePosition; import com.ruoyi.system.domain.dto.SubordinateInformationDto; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** * @program: ruoyiim * @description: * @create: 2025-09-22 15:22 **/ @Data public class UserTeamAndPositionOut { //下级数量 private Integer subordinateNumber = 0; //投保人数 private Long insureNumber = 0L; //职位 private String position = "普通员工"; //每月工资 private BigDecimal salary = BigDecimal.ZERO; //职位层级 private List<InsurancePosition> insurancePosition; //-------------------我的下级------------- private List<SubordinateInformationDto> subordinateInformation; }