diff --git a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/dto/UserDetailQueryDto.java b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/dto/UserDetailQueryDto.java index 6bf59eda6..3896c1c59 100644 --- a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/dto/UserDetailQueryDto.java +++ b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/dto/UserDetailQueryDto.java @@ -8,6 +8,7 @@ import lombok.Data; */ @Data public class UserDetailQueryDto { + /** * 流量渠道类型:0-全部,1-流量团队,2-直播导流 */ @@ -17,6 +18,7 @@ public class UserDetailQueryDto { * 平台号 */ private String erbanNo; + /** * 手机号 */ @@ -26,14 +28,17 @@ public class UserDetailQueryDto { * 起始日期 */ private String startDate; + /** * 结束日期 */ private String endDate; + /** * 第几页 */ private Integer pageNumber = 1; + /** * 每页大小 */ @@ -43,4 +48,19 @@ public class UserDetailQueryDto { * 地区ID */ private Integer partitionId; + + /** + * 注册类型 + */ + private Integer loginType; + + /** + * 是否充值 + */ + private Integer isCharge; + + /** + * 首进房ID + */ + private Long firstRoomErBanNo; } \ No newline at end of file diff --git a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDeatilVo.java b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDetailVo.java similarity index 73% rename from accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDeatilVo.java rename to accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDetailVo.java index e181a6a87..990750216 100644 --- a/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDeatilVo.java +++ b/accompany-admin/accompany-admin-sdk/src/main/java/com/accompany/admin/vo/stats/UserDetailVo.java @@ -4,6 +4,7 @@ import com.accompany.common.annotation.FieldComment; import com.accompany.core.vo.BaseVo; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -11,42 +12,49 @@ import java.util.Date; * 用户明细 */ @Data -public class UserDeatilVo extends BaseVo { +public class UserDetailVo extends BaseVo { /*-----------------------------用户表信息------------------------*/ /** * 用户uid */ @FieldComment("uid") public Long uid; + /** * 用户平台号 */ @FieldComment("平台号") public Long erbanNo; + /** * 昵称 */ @FieldComment("昵称") public String nick; + /** * 新增时间 */ @FieldComment("新增时间") public Date createTime; + /** * 新增渠道 */ @FieldComment("新增渠道") public String channel; + /** * 设备信息 */ @FieldComment("设备信息") public String model; + /** * 是否有同设备 */ public Boolean newDevice; + /** * 邀请码 */ @@ -71,31 +79,73 @@ public class UserDeatilVo extends BaseVo { @FieldComment("ip") public String registerIp; /*-----------------------------邀请码表信息------------------------*/ + /** * 邀请码信息:邀请码+组名 */ @FieldComment("邀请码信息") public String inviteCodeinfo; /*-----------------------------流量渠道------------------------*/ + /** * 流量渠道:引流团队新增/直播导流新增 */ @FieldComment("流量渠道") public String flowChannel; /*-----------------------------首冲情况------------------------*/ + /** * 首冲情况:充值日期+充值金额 */ @FieldComment("首充情况") public String firstChargeInfo; + /** + * 是否有同设备 + */ @FieldComment("是否有同设备") public String newDeviceStr; /** - * 地区 + * 分区 */ - @FieldComment("地区") + @FieldComment("分区") public String partitionDesc; + /** + * 国家 + */ + @FieldComment("国家") + public String lastLoginRegion; + + /** + * 性别 + */ + @FieldComment("性别") + public String genderStr; + + /** + * 是否充值 + */ + @FieldComment("是否充值") + public String isChargeStr; + + /** + * 充值金额 + */ + @FieldComment("充值金额") + public BigDecimal chargeAmount; + + /** + * 首进房ID + */ + @FieldComment("首进房ID") + public Long firstRoomErBanNo; + + /** + * 注册类型 + */ + @FieldComment("注册类型") + public String loginTypeStr; + } \ No newline at end of file diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/ChargeRecordAdminMapper.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/ChargeRecordAdminMapper.java index caa7d533d..6064caff7 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/ChargeRecordAdminMapper.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/ChargeRecordAdminMapper.java @@ -17,7 +17,23 @@ public interface ChargeRecordAdminMapper extends BaseMapper { List listFisrChargeRecordByUids(@Param("uids") List uids); - List getCountryGoldDetail(@Param("startTime")Date startTime, @Param("endTime")Date endTime); + List getCountryGoldDetail(@Param("startTime") Date startTime, @Param("endTime") Date endTime); - List getPartitionGoldDetail(@Param("partitionId")Integer partitionId, @Param("startTime")Date startTime, @Param("endTime")Date endTime); + List getPartitionGoldDetail(@Param("partitionId") Integer partitionId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 充值统计 + * @param uidList + * @return + */ + List getChargeCount(@Param("uidList") List uidList); + + /** + * 充值金额 + * @param uidList + * @param startTime + * @param endTime + * @return + */ + List getChargeAmount(@Param("uidList") List uidList, @Param("startTime") String startTime, @Param("endTime") String endTime); } diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/UserMapperExpand.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/UserMapperExpand.java index 08d937f66..b946e7dee 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/UserMapperExpand.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/mapper/UserMapperExpand.java @@ -2,7 +2,7 @@ package com.accompany.admin.mapper; import com.accompany.admin.dto.UserDetailQueryDto; import com.accompany.admin.vo.UsersVo; -import com.accompany.admin.vo.stats.UserDeatilVo; +import com.accompany.admin.vo.stats.UserDetailVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -29,19 +29,19 @@ public interface UserMapperExpand { List selectChannelList(); /*用户明细全部分页查询*/ - List userDetailList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); + List userDetailList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); /*用户明细直播导流分页查询*/ - List userLiveDetailList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); + List userLiveDetailList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); /*用户明细流量团队分页查询*/ - List userDetailFlowTeamList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); + List userDetailFlowTeamList(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); /*用户明细直播导流分页查询*/ - List userLiveDetailListV2(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); + List userLiveDetailListV2(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); /*用户明细流量团队分页查询*/ - List userDetailFlowTeamListV2(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); + List userDetailFlowTeamListV2(@Param("userDetailQueryDto") UserDetailQueryDto userDetailQueryDto); /** * 获取用户地区 diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/statistic/StatsUserDetailAdminService.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/statistic/StatsUserDetailAdminService.java index 5a2a2178b..38595562f 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/statistic/StatsUserDetailAdminService.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/statistic/StatsUserDetailAdminService.java @@ -4,13 +4,15 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.accompany.admin.dto.UserDetailQueryDto; +import com.accompany.admin.mapper.ChargeRecordAdminMapper; import com.accompany.admin.mapper.UserMapperExpand; import com.accompany.admin.service.base.BaseService; import com.accompany.admin.service.room.RoomVisitorService; import com.accompany.admin.vo.flowteam.FlowTeamConfVO; -import com.accompany.admin.vo.stats.UserDeatilVo; +import com.accompany.admin.vo.stats.UserDetailVo; import com.accompany.business.dto.flow.FlowTeamMemberBaseDto; import com.accompany.business.model.FirstChargeRewardRecord; +import com.accompany.business.model.UserInRoomRecord; import com.accompany.business.model.room.RoomVisitor; import com.accompany.business.model.room.RoomVisitorUserDict; import com.accompany.business.mybatismapper.UserInRoomRecordMapper; @@ -27,9 +29,12 @@ import com.accompany.common.utils.DateTimeUtil; import com.accompany.common.utils.StringUtils; import com.accompany.core.exception.AdminServiceException; import com.accompany.core.model.AccountLoginRecord; +import com.accompany.core.mybatismapper.AccountLoginRecordMapperExpand; import com.accompany.core.mybatismapper.UsersMapper; import com.accompany.core.service.SysConfService; import com.accompany.core.service.common.JedisLockService; +import com.accompany.payment.model.ChargeRecord; +import com.accompany.sharding.mapper.UserInOutRoomRecordMapper; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; @@ -42,12 +47,16 @@ import com.xuanyin.flowteam.mapper.FlowTeamMemberInviteUserMapper; import com.xuanyin.flowteam.model.FlowTeamGroup; import com.xuanyin.flowteam.model.FlowTeamInfo; import com.xuanyin.flowteam.model.FlowTeamMemberInviteUser; + import javax.validation.constraints.NotNull; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StopWatch; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -56,312 +65,163 @@ public class StatsUserDetailAdminService extends BaseService { @Autowired private UserMapperExpand userMapperExpand; + @Autowired private UserInRoomRecordMapper userInRoomRecordMapper; - @Autowired - private SysConfService sysConfService; - @Autowired - private FirstChargeRewardRecordService firstChargeRewardRecordService; - @Autowired - private FlowTeamMemberBaseMapper flowTeamMemberBaseMapper; - @Autowired - private RoomVisitorService roomVisitorService; - @Autowired - private UserLoginService userLoginService; - @Autowired - private RoomVisitorUserDictMapper roomVisitorUserDictMapper; - @Autowired - private RoomVisitorMapper roomVisitorMapper; - @Autowired - private UsersMapper usersMapper; - @Autowired - private JedisLockService jedisLockService; @Autowired private FlowTeamInfoMapper flowTeamInfoMapper; @Autowired private FlowTeamMemberInviteUserMapper flowTeamMemberInviteUserMapper; + @Autowired private FlowTeamGroupMapper flowTeamGroupMapper; - public PageInfo userDetailList(UserDetailQueryDto userDetailQueryDto) { - if (userDetailQueryDto.getStartDate() == null || userDetailQueryDto.getEndDate() == null) { + @Autowired + private FlowTeamMemberBaseMapper flowTeamMemberBaseMapper; + + @Autowired + private RoomVisitorUserDictMapper roomVisitorUserDictMapper; + + @Autowired + private RoomVisitorMapper roomVisitorMapper; + + @Autowired + private ChargeRecordAdminMapper chargeRecordAdminMapper; + + @Autowired + private UsersMapper usersMapper; + + @Autowired + private AccountLoginRecordMapperExpand accountLoginRecordMapperExpand; + + @Autowired + private SysConfService sysConfService; + + @Autowired + private FirstChargeRewardRecordService firstChargeRewardRecordService; + + @Autowired + private RoomVisitorService roomVisitorService; + + @Autowired + private UserLoginService userLoginService; + + @Autowired + private JedisLockService jedisLockService; + + public PageInfo userDetailList(UserDetailQueryDto query) { + String startDate = query.getStartDate(); + String endDate = query.getEndDate(); + if (startDate == null || endDate == null) { throw new AdminServiceException(BusiStatus.PARAMERROR); } - //检查引流场次用户关系对应表有没有数据,没有进行初始化 - initRoomVisitorUserDict(); - - if (userDetailQueryDto.getFlowChannelType().equals(Byte.valueOf((byte) 1))) { - return this.userDetailFlowTeamList(userDetailQueryDto); - } - if(userDetailQueryDto.getFlowChannelType().equals(Byte.valueOf((byte) 2))) { - return this.userLiveDetailListV2(userDetailQueryDto); - } - - return allUserDetail(userDetailQueryDto); - } - - /** - * 直播导流分页查询 - * @param userDetailQueryDto - * @return - */ - public PageInfo userLiveDetailList(UserDetailQueryDto userDetailQueryDto) { - StopWatch stopWatch = new StopWatch(); - stopWatch.start("liveFlow"); - PageHelper.startPage(userDetailQueryDto.getPageNumber(), userDetailQueryDto.getPageSize()); - PageInfo pageInfo = new PageInfo(userMapperExpand.userLiveDetailList(userDetailQueryDto)); - - List userDeatilVoList = pageInfo.getList(); - if (CollectionUtils.isEmpty(userDeatilVoList)) return pageInfo; - // - Map chargeMap = getFirstChargeRewardRecordMap(userDeatilVoList); - - //获取直播导流相关场次 - Map> rvMap = getLiveMap(userDeatilVoList); - userDeatilVoList.forEach(userDeatilVo -> { - Long uid = userDeatilVo.getUid(); - Long inviteUid = userDeatilVo.getInviteUid(); - List visitorList = rvMap.get(inviteUid); - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - dealFlowChannel(userDeatilVo, visitorList); - - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - - //判断是否为新设备 - if (!StringUtils.isEmpty(userDeatilVo.getDeviceId())) { - userDeatilVo.setNewDevice(this.isNewDevice(userDeatilVo.getUid(), userDeatilVo.getDeviceId())); + Byte flowChannelType = query.getFlowChannelType(); + switch (flowChannelType) { + //流量团队 + case 1: { + break; } - - //处理首充信息 - FirstChargeRewardRecord rewardRecord = chargeMap.get(uid); - if (rewardRecord == null) { - userDeatilVo.setFirstChargeInfo("未充值"); - }else { - double amount = ((double) rewardRecord.getAmount()) / 100; - - String chargeStr = "%s 首充:%s元"; - userDeatilVo.setFirstChargeInfo(String.format(chargeStr, DateTimeUtil.convertDate(rewardRecord.getCreateTime()), amount)); + //直播导流 + case 2: { + //检查引流场次用户关系对应表有没有数据,没有进行初始化 + initRoomVisitorUserDict(); + break; } - }); - stopWatch.stop(); - logger.info("直播导流查询耗时信息:{}", stopWatch.prettyPrint()); + default: { + + } + } + String YES_ZH = "是"; + String NO_ZH = "否"; + Integer pageNumber = query.getPageNumber(); + Integer pageSize = query.getPageSize(); + PageHelper.startPage(pageNumber, pageSize); + PageInfo pageInfo = new PageInfo<>(userMapperExpand.userDetailList(query)); + List records = pageInfo.getList(); + if (CollectionUtil.isNotEmpty(records)) { + List uidList = records.stream().map(UserDetailVo::getUid).collect(Collectors.toList()); + //是否充值 + Map chargeCountMap = null; + List chargeCounts = chargeRecordAdminMapper.getChargeCount(uidList); + if (CollectionUtil.isNotEmpty(chargeCounts)) { + chargeCountMap = chargeCounts.stream().collect(Collectors.toMap(ChargeRecord::getUid, ChargeRecord::getAmount, (v1, v2) -> v1)); + } + //充值金额 + Map chargeAmountMap = null; + List chargeAmounts = chargeRecordAdminMapper.getChargeAmount(uidList, startDate, endDate); + if (CollectionUtil.isNotEmpty(chargeAmounts)) { + chargeAmountMap = chargeAmounts.stream().collect(Collectors.toMap(ChargeRecord::getUid, ChargeRecord::getAmount, (v1, v2) -> v1)); + } + //首进房ID + Map firstRoomMap = null; + List firstRooms = userInRoomRecordMapper.getFirstRoom(uidList); + if (CollectionUtil.isNotEmpty(firstRooms)) { + firstRoomMap = firstRooms.stream().collect(Collectors.toMap(UserInRoomRecord::getUid, UserInRoomRecord::getRoomuid)); + } + //注册类型 + Map loginTypeMap = null; + List loginTypes = accountLoginRecordMapperExpand.getLoginType(uidList); + if (CollectionUtil.isNotEmpty(loginTypes)) { + loginTypeMap = loginTypes.stream().collect(Collectors.toMap(AccountLoginRecord::getUid, AccountLoginRecord::getLoginType, (v1, v2) -> v1)); + } + for (UserDetailVo record : records) { + Long uid = record.getUid(); + String inviteCode = record.getInviteCode(); + record.setInviteCodeinfo(inviteCode); + //是否充值 + String isChargeStr = NO_ZH; + if (CollectionUtil.isNotEmpty(chargeCountMap) && chargeCountMap.containsKey(uid)) { + Long chargeCount = chargeCountMap.get(uid); + if (chargeCount > 0) { + isChargeStr = YES_ZH; + } + } + record.setIsChargeStr(isChargeStr); + //充值金额 + BigDecimal chargeAmount = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(chargeAmountMap) && chargeAmountMap.containsKey(uid)) { + chargeAmount = BigDecimal.valueOf(chargeAmountMap.get(uid)).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } + record.setChargeAmount(chargeAmount); + //首进房ID + Long firstRoomErBanNo = null; + if (CollectionUtil.isNotEmpty(firstRoomMap) && firstRoomMap.containsKey(uid)) { + firstRoomErBanNo = firstRoomMap.get(uid); + } + record.setFirstRoomErBanNo(firstRoomErBanNo); + //注册类型 + String loginTypeStr = null; + if (CollectionUtil.isNotEmpty(loginTypeMap) && loginTypeMap.containsKey(uid)) { + Byte loginType = loginTypeMap.get(uid); + switch (loginType) { + case 3: { + loginTypeStr = "手机号注册"; + break; + } + case 5: { + loginTypeStr = "APPLE注册"; + break; + } + case 8: { + loginTypeStr = "GOOGLE注册"; + break; + } + case 9: { + loginTypeStr = "LINE注册"; + break; + } + } + } + record.setLoginTypeStr(loginTypeStr); + record.setNewDevice(isNewDevice(uid, record.getDeviceId())); + setInviteCodeInfo(record); + } + } return pageInfo; } - /** - * 直播导流分页查询 - * @param userDetailQueryDto - * @return - */ - public PageInfo userLiveDetailListV2(UserDetailQueryDto userDetailQueryDto) { - StopWatch stopWatch = new StopWatch(); - stopWatch.start("liveFlow"); - PageHelper.startPage(userDetailQueryDto.getPageNumber(), userDetailQueryDto.getPageSize()); - PageInfo pageInfo = new PageInfo(userMapperExpand.userLiveDetailListV2(userDetailQueryDto)); - - List userDeatilVoList = pageInfo.getList(); - if (CollectionUtils.isEmpty(userDeatilVoList)) return pageInfo; - // - Map chargeMap = getFirstChargeRewardRecordMap(userDeatilVoList); - - List uidList = userDeatilVoList.stream().map(userDeatilVo -> userDeatilVo.getUid()).collect(Collectors.toList()); - - - QueryWrapper userDictQueryWrapper = new QueryWrapper<>(); - userDictQueryWrapper.lambda().in(RoomVisitorUserDict::getUid, uidList); - List userDictList = roomVisitorUserDictMapper.selectList(userDictQueryWrapper); - - Map userDictMap = userDictList.stream().collect(Collectors.toMap(RoomVisitorUserDict::getUid, RoomVisitorUserDict::getRoomVisitorId)); - - - List roomVisitorIdList = userDictList.stream().map(RoomVisitorUserDict::getRoomVisitorId).distinct().collect(Collectors.toList()); - List roomVisitorList = (List) roomVisitorService.listByIds(roomVisitorIdList); - Map roomVisitorMap = Maps.uniqueIndex(roomVisitorList, RoomVisitor::getId); - - userDeatilVoList.forEach(userDeatilVo -> { - Long uid = userDeatilVo.getUid(); - - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - - Long roomVisitorId = Optional.ofNullable(userDictMap.get(userDeatilVo.getUid())).orElse(-100l); - RoomVisitor roomVisitor = Optional.ofNullable(roomVisitorMap.get(roomVisitorId)).orElse(new RoomVisitor()); - userDeatilVo.setFlowChannel("直播导流新增" + StrUtil.SPACE + roomVisitor.getRecordId()); - - - //判断是否为新设备 - if (!StringUtils.isEmpty(userDeatilVo.getDeviceId())) { - userDeatilVo.setNewDevice(this.isNewDevice(userDeatilVo.getUid(), userDeatilVo.getDeviceId())); - } - - //处理首充信息 - FirstChargeRewardRecord rewardRecord = chargeMap.get(uid); - if (rewardRecord == null) { - userDeatilVo.setFirstChargeInfo("未充值"); - }else { - double amount = ((double) rewardRecord.getAmount()) / 100; - - String chargeStr = "%s 首充:%s元"; - userDeatilVo.setFirstChargeInfo(String.format(chargeStr, DateTimeUtil.convertDate(rewardRecord.getCreateTime()), amount)); - } - }); - stopWatch.stop(); - logger.info("直播导流查询耗时信息:{}", stopWatch.prettyPrint()); - return pageInfo; - } - - - /** - * 流量团队分页查询 - * @param userDetailQueryDto - * @return - */ - public PageInfo userDetailFlowTeamList(UserDetailQueryDto userDetailQueryDto) { - StopWatch stopWatch = new StopWatch(); - stopWatch.start("flowTeam"); - PageHelper.startPage(userDetailQueryDto.getPageNumber(), userDetailQueryDto.getPageSize()); - PageInfo pageInfo = new PageInfo<>(userMapperExpand.userDetailFlowTeamListV2(userDetailQueryDto)); - - List userDeatilVoList = pageInfo.getList(); - if (CollectionUtils.isEmpty(userDeatilVoList)) return pageInfo; - - // - Map chargeMap = getFirstChargeRewardRecordMap(userDeatilVoList); - //<邀请码,组名> - Map teamNameMap = getTeamNameMap(userDeatilVoList); - userDeatilVoList.forEach(userDeatilVo -> { - Long uid = userDeatilVo.getUid(); - //针对流量团队:处理引流小组名称信息 - setInviteCodeInfo(userDeatilVo); - - //判断是否为新设备 - if (!StringUtils.isEmpty(userDeatilVo.getDeviceId())) { - userDeatilVo.setNewDevice(this.isNewDevice(userDeatilVo.getUid(), userDeatilVo.getDeviceId())); - } - - //处理首充信息 - FirstChargeRewardRecord rewardRecord = chargeMap.get(uid); - if (rewardRecord == null) { - userDeatilVo.setFirstChargeInfo("未充值"); - }else { - Long amount = rewardRecord.getAmount() / 100; - - String chargeStr = "%s 首充:%s元"; - userDeatilVo.setFirstChargeInfo(String.format(chargeStr, DateTimeUtil.convertDate(rewardRecord.getCreateTime()), amount)); - } - - userDeatilVo.setFlowChannel("流量团队新增"); - }); - stopWatch.stop(); - logger.info("流量团队查询耗时信息:{}", stopWatch.prettyPrint()); - return pageInfo; - } - - - /** - * 获取首充相关 - * @param userDeatilVoList - * @return - */ - private Map getFirstChargeRewardRecordMap(List userDeatilVoList) { - List uidList = userDeatilVoList.stream().map(userDeatilVo -> userDeatilVo.getUid()).collect(Collectors.toList()); - - //首充信息 - QueryWrapper queryWrapper= new QueryWrapper<>(); - queryWrapper.lambda().in(FirstChargeRewardRecord::getUid, uidList); - List chargeList = firstChargeRewardRecordService.list(queryWrapper); - //保险起见去重处理 - - Map chargeMap = new HashMap<>(); - if (!CollectionUtils.isEmpty(chargeList)) { - chargeList = chargeList.stream().filter(distinctByKey(FirstChargeRewardRecord::getUid)).collect(Collectors.toList()); - chargeMap = Maps.uniqueIndex(chargeList, FirstChargeRewardRecord::getUid); - } - return chargeMap; - } - - - /** - * - * @param userDeatilVoList - * @return Map:存放邀请码和对应的组名 - */ - @NotNull - private Map getTeamNameMap(List userDeatilVoList) { - List inviteCodeList = userDeatilVoList.stream().map(userDeatilVo -> userDeatilVo.getInviteCode()).filter(inviteCode -> !BlankUtil.isBlank(inviteCode)).distinct().collect(Collectors.toList()); - Map teamNameMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - if (!CollectionUtils.isEmpty(inviteCodeList)) { - String configStr = sysConfService.getDefaultSysConfValueById(Constant.SysConfId.FLOW_TEAM_MANAGE, "{}"); - FlowTeamConfVO flowTeamConfVO = JSONObject.parseObject(configStr, FlowTeamConfVO.class); - List teamsList = flowTeamConfVO.getTeams(); - Map teamMap = teamsList.stream().collect(Collectors.toMap(FlowTeamConfVO.TeamItem::getTeamId, FlowTeamConfVO.TeamItem::getTeamName)); - - List teamMemberBaseDtoList = flowTeamMemberBaseMapper.queryInviteCodeAndTeam(inviteCodeList); - - if (!CollectionUtils.isEmpty(teamMemberBaseDtoList)) { - teamMemberBaseDtoList = teamMemberBaseDtoList.stream().filter(distinctByKey(FlowTeamMemberBaseDto::getInviteCode)).collect(Collectors.toList()); - teamMemberBaseDtoList = teamMemberBaseDtoList.stream().map(teamMemberDto -> { - teamMemberDto.setTeamName(teamMap.get(teamMemberDto.getTeamId())); - return teamMemberDto; - }).collect(Collectors.toList()); - - Map teamNameMapData = Maps.uniqueIndex(teamMemberBaseDtoList, FlowTeamMemberBaseDto::getInviteCode); - teamNameMap.putAll(teamNameMapData); - } - } - return teamNameMap; - } - - - - public void dealFlowChannel(UserDeatilVo userDeatilVo, List visitorList) { - if (userDeatilVo.getInviteUid() == null || CollectionUtils.isEmpty(visitorList)) return; - - //查询对应的场次id - List recordList = userInRoomRecordMapper.queryRecordId(userDeatilVo.getUid(), userDeatilVo.getInviteUid()); - if (!CollectionUtils.isEmpty(recordList)) { - userDeatilVo.setFlowChannel("直播导流新增" + StrUtil.SPACE + recordList.get(0)); - } - } - - public void checkFlowTeam(UserDeatilVo userDeatilVo, Map teamNameMap, Map> rvMap) { - if (BlankUtil.isBlank(userDeatilVo.getInviteCode())) return; - String inviteCode = userDeatilVo.getInviteCode(); - //检查邀请码是否为空->检查是否属于流量团队有效邀请码->检查是否属于直播导流 - if (teamNameMap.containsKey(inviteCode)) { - FlowTeamMemberBaseDto flowTeamMemberBaseDto = teamNameMap.get(inviteCode); - if (userDeatilVo.getCreateTime().getTime() > flowTeamMemberBaseDto.getCreateTime().getTime()) { - String teamName = flowTeamMemberBaseDto.getTeamName(); - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode() + (teamName == null ? "" : StrUtil.SPACE + teamName)); - userDeatilVo.setFlowChannel("流量团队新增"); - return; - } - - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - } - - //检查是否为直播导流相关邀请码 - Long inviteUid = userDeatilVo.getInviteUid(); - List visitorList = rvMap.get(inviteUid); - dealFlowChannel(userDeatilVo, visitorList); - - } - - private Map> getLiveMap(List userDeatilVoList) { - List inviteUidList = userDeatilVoList.stream().map(userDeatilVo -> userDeatilVo.getInviteUid()).filter(inviteUid -> inviteUid != null).distinct().collect(Collectors.toList()); - List roomVisitorList = roomVisitorService.queryRoomVisitorByUidList(inviteUidList); - - //获取直播导流对应的场次 - Map> rvMap = new HashMap<>(); - if (!CollectionUtils.isEmpty(roomVisitorList)) { - rvMap = roomVisitorList.stream().collect(Collectors.groupingBy(RoomVisitor::getUid)); - } - - Map> finalRvMap = rvMap; - return finalRvMap; - } - /** * 检查是否新设备 * @@ -371,11 +231,7 @@ public class StatsUserDetailAdminService extends BaseService { */ private boolean isNewDevice(Long uid, String deviceId) { AccountLoginRecord record = this.userLoginService.getDeviceFirstLoginRecordV2(uid, deviceId); - if (record == null) { - return true; - } - - return false; + return record == null; } @@ -383,53 +239,38 @@ public class StatsUserDetailAdminService extends BaseService { //用户进房加锁 String lockKey = RedisKey.room_visitor_user_dict_lock.getKey(); String lockVal = jedisLockService.lock(lockKey); - if (StringUtils.isEmpty(lockVal)) { //拿不到锁暂不考虑 throw new AdminServiceException(BusiStatus.SERVERBUSY); } - StopWatch stw = new StopWatch(); stw.start(); try { QueryWrapper queryWrapper = new QueryWrapper<>(); Integer count = roomVisitorUserDictMapper.selectCount(queryWrapper); if (count != null && count > 0) return; - - QueryWrapper visitorQuery = new QueryWrapper<>(); visitorQuery.lambda().orderByAsc(RoomVisitor::getStartTime); List roomVisitorList = roomVisitorMapper.selectList(visitorQuery); - if (CollectionUtils.isEmpty(roomVisitorList)) return; - - - //Map roomVisitorMap = Maps.uniqueIndex(roomVisitorList, RoomVisitor::getId); - - - for (RoomVisitor rvisitor : roomVisitorList) { + for (RoomVisitor roomVisitor : roomVisitorList) { //查询此时间段完善信息的用户 - List userUidList = usersMapper.queryRoomVisitorSectionUser(rvisitor.getStartTime(), rvisitor.getEndTime()); + List userUidList = usersMapper.queryRoomVisitorSectionUser(roomVisitor.getStartTime(), roomVisitor.getEndTime()); if (CollectionUtils.isEmpty(userUidList)) continue; //查询对应此时间段内进房的非机器人用户 - List inRoomRecordUidList = userInRoomRecordMapper.queryRoomVisitorSectionRecord(userUidList, rvisitor.getUid(), rvisitor.getStartTime(), rvisitor.getEndTime()); - + List inRoomRecordUidList = userInRoomRecordMapper.queryRoomVisitorSectionRecord(userUidList, roomVisitor.getUid(), roomVisitor.getStartTime(), roomVisitor.getEndTime()); if (CollectionUtils.isEmpty(inRoomRecordUidList)) continue; - List dictUidList = roomVisitorUserDictMapper.queryUidByUidList(inRoomRecordUidList); - if (!CollectionUtils.isEmpty(dictUidList)) { inRoomRecordUidList = (List) CollectionUtil.disjunction(inRoomRecordUidList, dictUidList); } - if (CollectionUtil.isEmpty(inRoomRecordUidList)) continue; - inRoomRecordUidList = inRoomRecordUidList.stream().distinct().collect(Collectors.toList()); //组装写入 inRoomRecordUidList.forEach(uid -> { RoomVisitorUserDict userDict = new RoomVisitorUserDict(); userDict.setUid(uid); - userDict.setRoomVisitorId(rvisitor.getId()); + userDict.setRoomVisitorId(roomVisitor.getId()); roomVisitorUserDictMapper.insert(userDict); }); } @@ -439,155 +280,52 @@ public class StatsUserDetailAdminService extends BaseService { } finally { jedisLockService.unlock(lockKey, lockVal); } - - - stw.stop(); logger.info("初始化直播引流用户耗时:{}", stw.prettyPrint()); } - - public PageInfo allUserDetail(UserDetailQueryDto userDetailQueryDto) { - StopWatch stopWatch = new StopWatch(); - stopWatch.start("user_detail"); - PageHelper.startPage(userDetailQueryDto.getPageNumber(), userDetailQueryDto.getPageSize()); - PageInfo pageInfo = new PageInfo(userMapperExpand.userDetailList(userDetailQueryDto)); - - List userDeatilVoList = pageInfo.getList(); - if (CollectionUtils.isEmpty(userDeatilVoList)) return pageInfo; - - // - Map chargeMap = getFirstChargeRewardRecordMap(userDeatilVoList); - //<邀请码,组名> - //Map teamNameMap = getTeamNameMap(userDeatilVoList); - - userDeatilVoList.forEach(userDeatilVo -> { - Long uid = userDeatilVo.getUid(); - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - //检查邀请码是否为空->检查是否属于流量团队有效邀请码->检查是否属于直播导流 - checkFlowTeamV3(userDeatilVo); - - //判断是否为新设备 - if (!StringUtils.isEmpty(userDeatilVo.getDeviceId())) { - userDeatilVo.setNewDevice(this.isNewDevice(userDeatilVo.getUid(), userDeatilVo.getDeviceId())); - } - - //处理首充信息 - FirstChargeRewardRecord rewardRecord = chargeMap.get(uid); - if (rewardRecord == null) { - userDeatilVo.setFirstChargeInfo("未充值"); - }else { - Long amount = rewardRecord.getAmount() / 100; - - String chargeStr = "%s 首充:%s元"; - userDeatilVo.setFirstChargeInfo(String.format(chargeStr, DateTimeUtil.convertDate(rewardRecord.getCreateTime()), amount)); - } - }); - - stopWatch.stop(); - logger.info("用户明细耗时信息:{}", stopWatch.prettyPrint()); - return pageInfo; - } - - public void checkFlowTeamV2(UserDeatilVo userDeatilVo, Map teamNameMap) { - if (! BlankUtil.isBlank(userDeatilVo.getInviteCode())) { - String inviteCode = userDeatilVo.getInviteCode(); - //检查邀请码是否为空->检查是否属于流量团队有效邀请码->检查是否属于直播导流 - if (teamNameMap.containsKey(inviteCode)) { - FlowTeamMemberBaseDto flowTeamMemberBaseDto = teamNameMap.get(inviteCode); - if (userDeatilVo.getCreateTime().getTime() > flowTeamMemberBaseDto.getCreateTime().getTime()) { - String teamName = flowTeamMemberBaseDto.getTeamName(); - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode() + (teamName == null ? "" : StrUtil.SPACE + teamName)); - userDeatilVo.setFlowChannel("流量团队新增"); - return; - } - - //userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode()); - } - } - - //检查是否为直播导流相关 - QueryWrapper userDictQueryWrapper = new QueryWrapper<>(); - userDictQueryWrapper.lambda().eq(RoomVisitorUserDict::getUid, userDeatilVo.getUid()); - RoomVisitorUserDict roomVisitorUserDict = roomVisitorUserDictMapper.selectOne(userDictQueryWrapper); - - if (roomVisitorUserDict == null) return; - - RoomVisitor roomVisitor = roomVisitorService.getById(roomVisitorUserDict.getRoomVisitorId()); - if(roomVisitor == null) return; - userDeatilVo.setFlowChannel("直播导流新增" + StrUtil.SPACE + roomVisitor.getRecordId()); - - } - - - public HashMap exportUserDetailList(UserDetailQueryDto userDetailQueryDto) { if (userDetailQueryDto.getStartDate() == null || userDetailQueryDto.getEndDate() == null) { throw new AdminServiceException(BusiStatus.PARAMERROR); } - Integer diffNum = DateTimeUtil.diffDayByDate(DateTimeUtil.convertStrToDate(userDetailQueryDto.getStartDate(), DateTimeUtil.DEFAULT_DATE_PATTERN), DateTimeUtil.convertStrToDate(userDetailQueryDto.getEndDate(), DateTimeUtil.DEFAULT_DATE_PATTERN)); + int diffNum = DateTimeUtil.diffDayByDate(Objects.requireNonNull(DateTimeUtil.convertStrToDate(userDetailQueryDto.getStartDate(), DateTimeUtil.DEFAULT_DATE_PATTERN)), Objects.requireNonNull(DateTimeUtil.convertStrToDate(userDetailQueryDto.getEndDate(), DateTimeUtil.DEFAULT_DATE_PATTERN))); if (diffNum > 31) throw new AdminServiceException(BusiStatus.EXPORT_DATA_BEYOND_LIMIT); - PageInfo pageInfo = this.userDetailList(userDetailQueryDto); - List userDeatilVoList = pageInfo.getList(); - if (!CollectionUtils.isEmpty(userDeatilVoList)) { - userDeatilVoList.forEach(userDeatilVo -> { - if(userDeatilVo.getNewDevice() == null) userDeatilVo.setNewDeviceStr("-"); - else if (userDeatilVo.getNewDevice()) userDeatilVo.setNewDeviceStr("否"); - else userDeatilVo.setNewDeviceStr("是"); + PageInfo pageInfo = this.userDetailList(userDetailQueryDto); + List userDetailVoList = pageInfo.getList(); + if (!CollectionUtils.isEmpty(userDetailVoList)) { + userDetailVoList.forEach(userDetailVo -> { + if (userDetailVo.getNewDevice() == null) userDetailVo.setNewDeviceStr("-"); + else if (userDetailVo.getNewDevice()) userDetailVo.setNewDeviceStr("否"); + else userDetailVo.setNewDeviceStr("是"); }); } HashMap data = new HashMap<>(); - data.put("rows", userDeatilVoList); + data.put("rows", userDetailVoList); return data; } - - public void checkFlowTeamV3(UserDeatilVo userDeatilVo) { - Boolean flag = setInviteCodeInfo(userDeatilVo); - if (flag) return; - //检查是否为直播导流相关 - QueryWrapper userDictQueryWrapper = new QueryWrapper<>(); - userDictQueryWrapper.lambda().eq(RoomVisitorUserDict::getUid, userDeatilVo.getUid()); - RoomVisitorUserDict roomVisitorUserDict = roomVisitorUserDictMapper.selectOne(userDictQueryWrapper); - - if (roomVisitorUserDict == null) return; - - RoomVisitor roomVisitor = roomVisitorService.getById(roomVisitorUserDict.getRoomVisitorId()); - if(roomVisitor == null) return; - userDeatilVo.setFlowChannel("直播导流新增" + StrUtil.SPACE + roomVisitor.getRecordId()); - - } - - public Boolean setInviteCodeInfo(UserDeatilVo userDeatilVo) { - if (BlankUtil.isBlank(userDeatilVo.getInviteCode())) return false; - + public void setInviteCodeInfo(UserDetailVo userDetailVo) { + if (BlankUtil.isBlank(userDetailVo.getInviteCode())) return; QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(FlowTeamMemberInviteUser::getUid, userDeatilVo.getUid()); + queryWrapper.lambda().eq(FlowTeamMemberInviteUser::getUid, userDetailVo.getUid()); FlowTeamMemberInviteUser inviteUser = flowTeamMemberInviteUserMapper.selectOne(queryWrapper); - - if (ObjectUtil.isNull(inviteUser)) return false; - + if (ObjectUtil.isNull(inviteUser)) return; QueryWrapper teamInfoQueryWrapper = new QueryWrapper<>(); teamInfoQueryWrapper.lambda().eq(FlowTeamInfo::getTeamId, inviteUser.getTeamId()); FlowTeamInfo flowTeamInfo = flowTeamInfoMapper.selectOne(teamInfoQueryWrapper); - - if (ObjectUtil.isNull(flowTeamInfo)) return false; - + if (ObjectUtil.isNull(flowTeamInfo)) return; FlowTeamGroup group = flowTeamGroupMapper.selectById(flowTeamInfo.getGroupId()); if (FlowTeamConstant.MemberStatus.MEMBER_STATUS_VALID.equals(flowTeamInfo.getStatus())) { - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode() + userDetailVo.setInviteCodeinfo(userDetailVo.getInviteCode() + (ObjectUtil.isNull(flowTeamInfo.getTeamName()) ? "" : StrUtil.DASHED + flowTeamInfo.getTeamName()) + (ObjectUtil.isNull(group.getGroupName()) ? "" : StrUtil.DASHED + group.getGroupName()) ); - userDeatilVo.setFlowChannel("流量团队新增"); - }else { - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCode() + (ObjectUtil.isNull(flowTeamInfo.getTeamName()) ? "" : StrUtil.DASHED + flowTeamInfo.getTeamName())); - userDeatilVo.setInviteCodeinfo(userDeatilVo.getInviteCodeinfo() + "(小组已删除)"); - userDeatilVo.setFlowChannel("流量团队新增"); + userDetailVo.setFlowChannel("流量团队新增"); + } else { + userDetailVo.setInviteCodeinfo(userDetailVo.getInviteCode() + (ObjectUtil.isNull(flowTeamInfo.getTeamName()) ? "" : StrUtil.DASHED + flowTeamInfo.getTeamName())); + userDetailVo.setInviteCodeinfo(userDetailVo.getInviteCodeinfo() + "(小组已删除)"); + userDetailVo.setFlowChannel("流量团队新增"); } - - - return true; } } diff --git a/accompany-admin/accompany-admin-service/src/main/resources/mapper/ChargeRecordAdminMapper.xml b/accompany-admin/accompany-admin-service/src/main/resources/mapper/ChargeRecordAdminMapper.xml index 3911fb2eb..25121168c 100644 --- a/accompany-admin/accompany-admin-service/src/main/resources/mapper/ChargeRecordAdminMapper.xml +++ b/accompany-admin/accompany-admin-service/src/main/resources/mapper/ChargeRecordAdminMapper.xml @@ -1,16 +1,17 @@ - - - + + + select charge_record_id, cr.uid, cr.create_time from charge_record cr inner join (select uid, min(create_time) create_time from charge_record - where uid in #{uid} and charge_status in (2,6) group by uid) crg + where uid in #{uid} and + charge_status in (2,6) group by uid) crg on cr.uid = crg.uid and cr.create_time = crg.create_time @@ -62,11 +64,11 @@ + + + + diff --git a/accompany-admin/accompany-admin-service/src/main/resources/mapper/UsersMapperExpand.xml b/accompany-admin/accompany-admin-service/src/main/resources/mapper/UsersMapperExpand.xml index f6cdacf83..ba429d601 100644 --- a/accompany-admin/accompany-admin-service/src/main/resources/mapper/UsersMapperExpand.xml +++ b/accompany-admin/accompany-admin-service/src/main/resources/mapper/UsersMapperExpand.xml @@ -66,39 +66,80 @@ - select - u.uid,u.erban_no,u.nick,u.create_time,u.channel,u.model,u.new_device,u.invite_code,u.invite_uid,u.device_id, pi.`desc` as partitionDesc, - ac.register_ip - from - ( - select uid,erban_no,nick,create_time,channel,model,new_device,invite_code,invite_uid,device_id,partition_id from users - - def_user = 1 - - and erban_no = #{userDetailQueryDto.erbanNo} - - - and phone = #{userDetailQueryDto.phone} - - - and create_time >= #{userDetailQueryDto.startDate} - - - and create_time < #{userDetailQueryDto.endDate} - - - and partition_id = #{userDetailQueryDto.partitionId} - - - ) u - left join account ac on u.uid = ac.uid + u.uid, + u.erban_no as erbanNo, + u.nick, + u.create_time as createTime, + u.channel, + u.model, + u.new_device as newDevice, + u.invite_code as inviteCode, + u.device_id as deviceId, + u.partition_id as partitionId, + u.last_login_region as lastLoginRegion, + if(u.gender = 1, '男', '女') as genderStr, + pi.`desc` as partitionDesc, + a.register_ip as registerIp + from users as u + left join account as a on u.uid = a.uid left join partition_info as pi on pi.id = u.partition_id + + + inner join flow_team_member_invite_user as ftmiu on ftmiu.uid = u.uid + + + inner join room_visitor_user_dict as rvud on rvud.uid = u.uid + + + where u.def_user = 1 + + and u.erban_no = #{userDetailQueryDto.erbanNo} + + + and u.phone = #{userDetailQueryDto.phone} + + + and u.create_time >= #{userDetailQueryDto.startDate} + + + and u.create_time < #{userDetailQueryDto.endDate} + + + and u.partition_id = #{userDetailQueryDto.partitionId} + + + and u.invite_code is not null and u.invite_code != '' + + + and exists( + select 1 from account_login_record as alr + where alr.uid = u.uid and alr.login_type = #{userDetailQueryDto.loginType} and alr.record_id in ( + select min(alr1.record_id) from account_login_record as alr1 where alr1.uid = u.uid + )) + + + and (select count(1) from charge_record as cr where cr.charge_status = 2 and cr.uid = u.uid) > 0 + + + and ( + select + count(1) + from user_in_room_record as uirr + left join users as u1 on u1.uid = uirr.roomUid + where uirr.is_first = 1 + and uirr.uid != uirr.roomUid + and u1.erban_no is not null + and uirr.uid = u.uid + and u1.erban_no = #{userDetailQueryDto.firstRoomErBanNo} + ) > 0 + order by u.create_time desc - select u.uid,u.erban_no,u.nick,u.create_time,u.channel,u.model,u.new_device,u.invite_code,u.invite_uid,u.device_id, ac.register_ip @@ -142,7 +183,7 @@ - select u.uid,u.erban_no,u.nick,u.create_time,u.channel,u.model,u.new_device,u.invite_code,u.device_id, ac.register_ip @@ -178,78 +219,86 @@ order by u.create_time desc - - select - u.uid,u.erban_no,u.nick,u.create_time,u.channel,u.model,u.new_device,u.invite_code,u.invite_uid,u.device_id, pi.`desc` as partitionDesc, - ac.register_ip - from - ( - select uid,erban_no,nick,create_time,channel,model,new_device,invite_code,invite_uid,device_id, partition_id from users - - def_user = 1 - - and erban_no = #{userDetailQueryDto.erbanNo} - - - and phone = #{userDetailQueryDto.phone} - - - and create_time >= #{userDetailQueryDto.startDate} - - - and create_time < #{userDetailQueryDto.endDate} - - - and partition_id = #{userDetailQueryDto.partitionId} - - - ) u - left join account ac on u.uid = ac.uid + u.uid, + u.erban_no as erbanNo, + u.nick, + u.create_time as createTime, + u.channel, + u.model, + u.new_device as newDevice, + u.invite_code as inviteCode, + u.device_id as deviceId, + u.partition_id as partitionId, + u.last_login_region as lastLoginRegion, + u.gender, + pi.`desc` as partitionDesc, + a.register_ip as registerIp + from users as u + left join account as a on u.uid = a.uid left join partition_info as pi on pi.id = u.partition_id - - inner join room_visitor_user_dict rvud - on rvud.uid = u.uid + inner join room_visitor_user_dict as rvud on rvud.uid = u.uid + where u.def_user = 1 + + and u.erban_no = #{userDetailQueryDto.erbanNo} + + + and u.phone = #{userDetailQueryDto.phone} + + + and u.create_time >= #{userDetailQueryDto.startDate} + + + and u.create_time < #{userDetailQueryDto.endDate} + + + and u.partition_id = #{userDetailQueryDto.partitionId} order by u.create_time desc - select - u.uid,u.erban_no,u.nick,u.create_time,u.channel,u.model,u.new_device,u.invite_code,u.device_id, pi.`desc` as partitionDesc, - ac.register_ip - from - ( - select uid,erban_no,nick,create_time,channel,model,new_device,invite_code,device_id, partition_id from users - - def_user = 1 - - and erban_no = #{userDetailQueryDto.erbanNo} - - - and phone = #{userDetailQueryDto.phone} - - - and create_time >= #{userDetailQueryDto.startDate} - - - and create_time < #{userDetailQueryDto.endDate} - - - and partition_id = #{userDetailQueryDto.partitionId} - - - and invite_code IS NOT NULL AND invite_code !='' - - - ) u - left join account ac on u.uid = ac.uid + u.uid, + u.erban_no as erbanNo, + u.nick, + u.create_time as createTime, + u.channel, + u.model, + u.new_device as newDevice, + u.invite_code as inviteCode, + u.device_id as deviceId, + u.partition_id as partitionId, + u.last_login_region as lastLoginRegion, + u.gender, + pi.`desc` as partitionDesc, + a.register_ip as registerIp + from users as u + left join account as a on u.uid = a.uid left join partition_info as pi on pi.id = u.partition_id + inner join flow_team_member_invite_user as ftmiu on ftmiu.uid = u.uid + where u.def_user = 1 + + and u.erban_no = #{userDetailQueryDto.erbanNo} + + + and u.phone = #{userDetailQueryDto.phone} + + + and u.create_time >= #{userDetailQueryDto.startDate} + + + and u.create_time < #{userDetailQueryDto.endDate} + + + and u.partition_id = #{userDetailQueryDto.partitionId} + - inner join `flow_team_member_invite_user` ftiu on u.uid = ftiu.uid + and u.invite_code is not null and u.invite_code !='' order by u.create_time desc diff --git a/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/statistic/StatsUserDetailAdminController.java b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/statistic/StatsUserDetailAdminController.java index 2e8b7e50a..2dc68c877 100644 --- a/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/statistic/StatsUserDetailAdminController.java +++ b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/controller/statistic/StatsUserDetailAdminController.java @@ -1,11 +1,11 @@ package com.accompany.admin.controller.statistic; +import com.accompany.admin.base.Pagination; import com.accompany.admin.controller.BaseController; import com.accompany.admin.dto.UserDetailQueryDto; import com.accompany.admin.service.statistic.StatsUserDetailAdminService; -import com.accompany.admin.vo.stats.UserDeatilVo; +import com.accompany.admin.vo.stats.UserDetailVo; import com.accompany.core.util.ExcelUtils; -import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -26,22 +26,19 @@ public class StatsUserDetailAdminController extends BaseController { private StatsUserDetailAdminService statsUserDetailAdminService; @GetMapping("/list") - public void userDetailList(UserDetailQueryDto userDetailQueryDto) { - PageInfo pageInfo = statsUserDetailAdminService.userDetailList(userDetailQueryDto); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("total",pageInfo.getTotal()); - jsonObject.put("rows",pageInfo.getList()); - writeJson(jsonObject.toJSONString()); + public Pagination userDetailList(UserDetailQueryDto userDetailQueryDto) { + PageInfo pageInfo = statsUserDetailAdminService.userDetailList(userDetailQueryDto); + return new Pagination<>(pageInfo); } @PostMapping("/export") - public void exportUserDetailList(UserDetailQueryDto userDetailQueryDto, HttpServletResponse response) throws Exception { + public void exportUserDetailList(UserDetailQueryDto query, HttpServletResponse response) throws Exception { String filename = "userDetailExport"; - List fields = Arrays.asList("uid", "erbanNo", "nick", "createTime", "inviteCodeinfo", "flowChannel", "channel", "model", "newDeviceStr", "registerIp", "firstChargeInfo", "partitionDesc"); - userDetailQueryDto.setPageSize(60000); - HashMap data = statsUserDetailAdminService.exportUserDetailList(userDetailQueryDto); - ExcelUtils.exportExcel("新增用户明细", filename, fields, (List)data.get("rows"), response); + List fields = Arrays.asList("uid", "partitionDesc", "lastLoginRegion", "erbanNo", "nick", "createTime", "inviteCodeinfo", "flowChannel", "channel", "model", "newDeviceStr", "registerIp", "isChargeStr", "chargeAmount", "firstRoomErBanNo", "loginTypeStr", "genderStr"); + query.setPageSize(60000); + HashMap data = statsUserDetailAdminService.exportUserDetailList(query); + ExcelUtils.exportExcel("新增用户明细", filename, fields, (List) data.get("rows"), response); } } \ No newline at end of file diff --git a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/mybatismapper/AccountLoginRecordMapperExpand.java b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/mybatismapper/AccountLoginRecordMapperExpand.java index ca7fbd495..ddb58f354 100644 --- a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/mybatismapper/AccountLoginRecordMapperExpand.java +++ b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/mybatismapper/AccountLoginRecordMapperExpand.java @@ -39,4 +39,11 @@ public interface AccountLoginRecordMapperExpand { * @return */ List getAnchorUidByRecent3Day(); + + /** + * 获取登录方式 + * @param uidList + * @return + */ + List getLoginType(@Param("uidList") List uidList); } \ No newline at end of file diff --git a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/UsersBaseService.java b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/UsersBaseService.java index 1334c9a3d..89a520318 100644 --- a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/UsersBaseService.java +++ b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/UsersBaseService.java @@ -117,7 +117,7 @@ public class UsersBaseService extends BaseService { } } - public List getUsersListByUids(List uids){ + public List getUsersListByUids(List uids) { UsersExample usersExample = new UsersExample(); usersExample.createCriteria().andUidIn(uids); List usersList = usersMapper.selectByExample(usersExample); @@ -175,12 +175,12 @@ public class UsersBaseService extends BaseService { * @param uids * @return */ - public List getUsersListByUidsFromDB(List uids){ + public List getUsersListByUidsFromDB(List uids) { Assert.notEmpty(uids, "uids is empty"); UsersExample example = new UsersExample(); example.createCriteria().andUidIn(uids); List users = usersMapper.selectByExample(example); - if (CollectionUtils.isEmpty(users)){ + if (CollectionUtils.isEmpty(users)) { return Collections.EMPTY_LIST; } return users; @@ -280,7 +280,7 @@ public class UsersBaseService extends BaseService { return; } String usersJson = gson.toJson(users); - logger.info("debug_getUsersByUid,user={}",usersJson); + logger.info("debug_getUsersByUid,user={}", usersJson); jedisService.hwrite(RedisKey.user.getKey(), users.getUid().toString(), usersJson); jedisService.hwrite(RedisKey.user_erban_no.getKey(), users.getErbanNo().toString(), usersJson); @@ -320,7 +320,7 @@ public class UsersBaseService extends BaseService { Users user = usersMapper.selectByPrimaryKey(uid); if (user != null) { //如果手机号是平台号,则更换为靓号 - if (StringUtils.isBlank(user.getPhone()) || !CommonUtil.checkPhoneFormat(user.getPhoneAreaCode(),user.getPhone())) { + if (StringUtils.isBlank(user.getPhone()) || !CommonUtil.checkPhoneFormat(user.getPhoneAreaCode(), user.getPhone())) { user.setPhone(CommonUtil.genSpecialPhoneForInitAccount(String.valueOf(erbanNo))); } user.setErbanNo(erbanNo); @@ -426,7 +426,8 @@ public class UsersBaseService extends BaseService { if (StringUtils.isBlank(erbanNos)) return null; - List erbanNoList = gson.fromJson(erbanNos, new TypeToken>() {}.getType()); + List erbanNoList = gson.fromJson(erbanNos, new TypeToken>() { + }.getType()); if (CollectionUtils.isEmpty(erbanNoList)) return null; List uidStrList = getUidByErbanNo(Arrays.asList(String.valueOf(erbanNoList.get(0)))); @@ -450,20 +451,20 @@ public class UsersBaseService extends BaseService { } public void updateCache(Long uid, Long erbanNo) { - if (null != uid){ + if (null != uid) { jedisService.hdel(RedisKey.uid_access_token.getKey(), uid.toString()); jedisService.hdel(RedisKey.uid_ticket.getKey(), uid.toString()); jedisService.hdel(RedisKey.user.getKey(), String.valueOf(uid)); jedisService.hdel(RedisKey.user_summary.getKey(), String.valueOf(uid)); } - if (null != erbanNo){ + if (null != erbanNo) { jedisService.hdel(RedisKey.user_erban_no.getKey(), String.valueOf(erbanNo)); jedisService.del(RedisKey.cancel_user_recover_credentials.getKey(String.valueOf(erbanNo))); } } - public void changePartition(Long uid, Integer partitionId){ + public void changePartition(Long uid, Integer partitionId) { Users user = new Users(); user.setUid(uid); user.setPartitionId(partitionId); diff --git a/accompany-base/accompany-basic/accompany-basic-service/src/main/resources/oauth/AccountLoginRecordMapperExpand.xml b/accompany-base/accompany-basic/accompany-basic-service/src/main/resources/oauth/AccountLoginRecordMapperExpand.xml index 1f64a6de6..5717d87bd 100644 --- a/accompany-base/accompany-basic/accompany-basic-service/src/main/resources/oauth/AccountLoginRecordMapperExpand.xml +++ b/accompany-base/accompany-basic/accompany-basic-service/src/main/resources/oauth/AccountLoginRecordMapperExpand.xml @@ -68,4 +68,18 @@ and exists(select 1 from hall_member as hm where hm.status = 1 and hm.uid = alr.uid) + + \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserInRoomRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserInRoomRecordMapper.java index 97e0982a3..3f1b89e7e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserInRoomRecordMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserInRoomRecordMapper.java @@ -25,4 +25,11 @@ public interface UserInRoomRecordMapper extends BaseMapper { List getUserInRoomUidByUid(@Param("uid") Long uid, @Param("startDate") Date startDate, @Param("endDate") Date endDate); + /** + * 获取首次进房 + * @param uidList + * @return + */ + List getFirstRoom(@Param("uidList") List uidList); + } \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInRoomService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInRoomService.java index e01be245a..13f506e23 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInRoomService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/user/UserInRoomService.java @@ -1,6 +1,7 @@ package com.accompany.business.service.user; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.accompany.business.event.room.UserInRoomEvent; import com.accompany.business.message.room.UserInRoomMessage; import com.accompany.business.model.UserInRoomRecord; @@ -99,7 +100,6 @@ public class UserInRoomService { Map publicChatRoomIdMap = partitionInfoService.getPublicChatRoomIdMap(); if (CollectionUtil.isEmpty(publicChatRoomIdMap) || !publicChatRoomIdMap.containsValue(roomVo.getRoomId())) { saveUserInRoomCache(uid, roomVo); - ; } applicationContext.publishEvent(new UserInRoomEvent(new UserInRoomMessage(uid, roomVo, Calendar.getInstance().getTime(), inviteUid, behaveType))); return roomVo; @@ -235,6 +235,11 @@ public class UserInRoomService { //保存进房记录 updateUserInRoomRecord(uid, roomUid, behaveType); saveRoomVisitorDict(uid, roomUid, enterTime); + Users users = usersBaseService.getUsersByUid(uid); + if (users != null && users.getRoomUid() == null) { + users.setRoomUid(roomUid); + usersBaseService.updateUser(users); + } // 记录活动用户 jedisService.zadd(RedisKey.active_user_sortset.getKey(), (double) System.currentTimeMillis(), uid.toString()); } diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserInRoomRecordMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserInRoomRecordMapper.xml index ff8987434..791cf9845 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserInRoomRecordMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserInRoomRecordMapper.xml @@ -39,4 +39,19 @@ and update_time >= #{startDate} and update_time <= #{endDate} GROUP BY roomUid + + \ No newline at end of file diff --git a/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/constant/LoginTypeEnum.java b/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/constant/LoginTypeEnum.java index 1e9ab4822..3a7ea2de9 100644 --- a/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/constant/LoginTypeEnum.java +++ b/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/constant/LoginTypeEnum.java @@ -41,21 +41,21 @@ public enum LoginTypeEnum { /** * 谷歌登录 */ - GOOGLE((byte)8), + GOOGLE((byte) 8), /** * line登录 */ - LINE((byte)9), + LINE((byte) 9), /** * facebook登录 */ - FACEBOOK((byte)10), + FACEBOOK((byte) 10), ; - private byte value; + private final byte value; LoginTypeEnum(byte value) { this.value = value; diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java index 00a8cea51..fb91a2d9a 100644 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java +++ b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java @@ -80,19 +80,18 @@ public class AccountManageService { protected Gson gson = new Gson(); - public Account getOrGenAccountByPhone(String phone,String phoneAreaCode, String smsCode, DeviceInfo deviceInfo, String ipAddress) + public Account getOrGenAccountByPhone(String phone, String phoneAreaCode, String smsCode, DeviceInfo deviceInfo, String ipAddress) throws Exception { - log.info("getOrGenAccountByPhone phone:{},smsCode:{},phoneAreaCode:{}",phone,smsCode,phoneAreaCode); + log.info("getOrGenAccountByPhone phone:{},smsCode:{},phoneAreaCode:{}", phone, smsCode, phoneAreaCode); final String lockVal = jedisLockService.lock(RedisKey.lock_register_by_phone.getKey(phone)); try { - if (BlankUtil.isBlank(lockVal)){ + if (BlankUtil.isBlank(lockVal)) { throw new ServiceException(BusiStatus.REQUEST_FAST); } Account account = accountService.getAccountByPhone(phone); if (account == null) { - account = saveSignUpByPhone(phone,null, deviceInfo,ipAddress,phoneAreaCode); + account = saveSignUpByPhone(phone, null, deviceInfo, ipAddress, phoneAreaCode); } else { - //account = fillDeviceInfo(account, deviceInfo); String state = account.getState(); if ("2".equals(state)) { throw new CustomOAuth2Exception(CustomOAuth2Exception.INVALID_USER, @@ -111,15 +110,15 @@ public class AccountManageService { public Account getOrGenAccountByOpenid(String openid, Byte type, DeviceInfo deviceInfo, String ipAddress, String unionId) throws Exception { - log.info("getOrGenAccountByOpenid openId:{},type:{},unionId:{}",openid,type,unionId); + log.info("getOrGenAccountByOpenid openId:{},type:{},unionId:{}", openid, type, unionId); final String locKey = RedisKey.lock_register_by_openid.getKey(openid, unionId, String.valueOf(type)); final String lockVal = jedisLockService.lock(locKey, 10 * 1000); try { - if (BlankUtil.isBlank(lockVal)){ + if (BlankUtil.isBlank(lockVal)) { throw new ServiceException(BusiStatus.REQUEST_FAST); } Account account = accountService.getAccountByThird(type, unionId, - LoginTypeEnum.GOOGLE.getValue() == type? deviceInfo.getApp(): null); + LoginTypeEnum.GOOGLE.getValue() == type ? deviceInfo.getApp() : null); if (account == null) { checkRegisterLimit(deviceInfo.getDeviceId(), ipAddress); @@ -177,27 +176,27 @@ public class AccountManageService { } } - private void checkRegisterLimit(String deviceId, String ipAddress){ - if (!StringUtils.hasText(deviceId)){ + private void checkRegisterLimit(String deviceId, String ipAddress) { + if (!StringUtils.hasText(deviceId)) { throw new CustomOAuth2Exception(CustomOAuth2Exception.SIGN_IP_TO_OFTEN, BusiStatus.DEVICE_ERROR.getReasonPhrase()); } RepeatedDeviceIpRegisterLimitConfig repeatedConfig = getRepeatedDeviceIpLimitConfig(); - if (repeatedConfig.isOpen()){ + if (repeatedConfig.isOpen()) { int repeatedDeviceNum = accountService.lambdaQuery().eq(Account::getDeviceId, deviceId).count(); - if (repeatedDeviceNum >= repeatedConfig.getRepeatedDeviceNumLimit()){ + if (repeatedDeviceNum >= repeatedConfig.getRepeatedDeviceNumLimit()) { throw new CustomOAuth2Exception(CustomOAuth2Exception.SIGN_IP_TO_OFTEN, BusiStatus.REGISTER_FREQUENT.getReasonPhrase()); } int repeatedIpNum = accountService.lambdaQuery().eq(Account::getRegisterIp, ipAddress).count(); - if (repeatedIpNum >= repeatedConfig.getRepeatedIpNumLimit()){ + if (repeatedIpNum >= repeatedConfig.getRepeatedIpNumLimit()) { throw new CustomOAuth2Exception(CustomOAuth2Exception.SIGN_IP_TO_OFTEN, BusiStatus.REGISTER_FREQUENT.getReasonPhrase()); } } //当日单个ip注册数 DayIpMaxRegisterLimitConfig config = getIpMaxLimitConfig(); - if (config.getOpen()){ + if (config.getOpen()) { int count = accountService.getRegisterIpCountByOneDay(ipAddress); if (count >= config.getMax()) { throw new CustomOAuth2Exception(CustomOAuth2Exception.SIGN_IP_TO_OFTEN, BusiStatus.REGISTER_FREQUENT.getReasonPhrase()); @@ -217,8 +216,8 @@ public class AccountManageService { * @return */ public Account saveSignUpByPhone(String phone, String password, DeviceInfo deviceInfo, - String ipAddress,String phoneAreaCode) throws Exception { - return saveSignUpByPhone(phone, password, deviceInfo, null, null, ipAddress,phoneAreaCode); + String ipAddress, String phoneAreaCode) throws Exception { + return saveSignUpByPhone(phone, password, deviceInfo, null, null, ipAddress, phoneAreaCode); } @@ -230,14 +229,14 @@ public class AccountManageService { * @return */ public Account saveSignUpByPhone(String phone, String password, DeviceInfo deviceInfo, String prefillInviteCode, Long prefillInviteUid, - String ipAddress,String phoneAreaCode) throws Exception { + String ipAddress, String phoneAreaCode) throws Exception { checkRegisterLimit(deviceInfo.getDeviceId(), ipAddress); Date date = new Date(); Account account = new Account(); account.setPhone(phone); account.setPhoneAreaCode(phoneAreaCode); - if(!StringUtils.isEmpty(password)){ + if (!StringUtils.isEmpty(password)) { account.setPassword(encryptPassword(password)); } account.setNeteaseToken(UUIDUtil.get()); @@ -307,7 +306,7 @@ public class AccountManageService { throw new ServiceException(BusiStatus.USER_NOT_EXISTED); } phone = account.getPhone(); - if (!CommonUtil.checkPhoneFormat(account.getPhoneAreaCode(),account.getPhone())) { + if (!CommonUtil.checkPhoneFormat(account.getPhoneAreaCode(), account.getPhone())) { throw new ServiceException(BusiStatus.ACCOUNT_NOT_BIND_PHONE); } } @@ -318,19 +317,19 @@ public class AccountManageService { } Account account = accountService.getAccountByPhone(phone); - if (null == account || (uid != null && !account.getUid().equals(uid)) ) { + if (null == account || (uid != null && !account.getUid().equals(uid))) { throw new ServiceException(BusiStatus.PHONE_BIND_ERROR); } uid = account.getUid(); //检验验证码 - if (!accountService.verifySmsCodeByCache(phone, resetCode, uid)){ + if (!accountService.verifySmsCodeByCache(phone, resetCode, uid)) { throw new ServiceException(BusiStatus.INVALID_IDENTIFYING_CODE); } accountService.resetAccountPwd(account.getUid(), password); //成功后删除验证码缓存 - accountService.delSmsCodeCache(phone,account.getUid()); + accountService.delSmsCodeCache(phone, account.getUid()); //accountService.delNickPasswordCache(account.getErbanNo()); // 删除用户信息缓存 jedisService.hdel(RedisKey.user.getKey(), account.getUid().toString()); @@ -346,7 +345,7 @@ public class AccountManageService { String oldPwd = account.getPassword(); password = encryptPassword(password); - if (!StringUtils.hasText(password) || !password.equals(oldPwd)){ + if (!StringUtils.hasText(password) || !password.equals(oldPwd)) { throw new ServiceException(BusiStatus.OLD_PASSWORD_ERROR); } @@ -355,7 +354,7 @@ public class AccountManageService { //记录最近30天内绑定手机号 jedisService.setex(RedisKey.modify_pwd_sign.getKey(String.valueOf(account.getUid())), - 30 * 24 * 60 *60, String.valueOf(new Date().getTime())); + 30 * 24 * 60 * 60, String.valueOf(new Date().getTime())); } /** @@ -371,7 +370,7 @@ public class AccountManageService { } Boolean result = accountService.updateAccountPwd(account.getUid(), password); - if (!result){ + if (!result) { throw new ServiceException(BusiStatus.INVALID_REQUEST); } @@ -413,17 +412,17 @@ public class AccountManageService { throw exception; } - private DayIpMaxRegisterLimitConfig getIpMaxLimitConfig(){ + private DayIpMaxRegisterLimitConfig getIpMaxLimitConfig() { String config = sysConfService.getSysConfValueById(Constant.SysConfId.IP_MAX_REGISTER_LIMIT_CONFIG); - if (!StringUtils.hasText(config)){ + if (!StringUtils.hasText(config)) { throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG); } return gson.fromJson(config, DayIpMaxRegisterLimitConfig.class); } - private RepeatedDeviceIpRegisterLimitConfig getRepeatedDeviceIpLimitConfig(){ + private RepeatedDeviceIpRegisterLimitConfig getRepeatedDeviceIpLimitConfig() { String config = sysConfService.getSysConfValueById(Constant.SysConfId.REPEATED_DEVICE_IP_REGISTER_LIMIT_CONFIG); - if (!StringUtils.hasText(config)){ + if (!StringUtils.hasText(config)) { throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG); } return gson.fromJson(config, RepeatedDeviceIpRegisterLimitConfig.class);