diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/OperationController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/OperationController.java index 9a0ef83..89f38b2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/OperationController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/OperationController.java @@ -81,8 +81,8 @@ public class OperationController { @Operation(summary = "获得朋友圈操作分页") @PreAuthorize("@ss.hasPermission('member:operation:query')") public CommonResult> getOperationPage(@Valid OperationPageReqVO pageReqVO) { - PageResult pageResult = operationService.getOperationPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, OperationRespVO.class)); + PageResult pageResult = operationService.getOperationPage(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") @@ -91,9 +91,9 @@ public class OperationController { @ApiAccessLog(operateType = EXPORT) public void exportOperationExcel(@Valid OperationPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = operationService.getOperationPage(pageReqVO).getList(); + List list = operationService.getOperationPage(pageReqVO).getList(); // 导出 Excel - ExcelUtils.write(response, "朋友圈操作.xls", "数据", OperationRespVO.class, BeanUtils.toBean(list, OperationRespVO.class)); + ExcelUtils.write(response, "朋友圈操作.xls", "数据", OperationRespVO.class, list); } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationPageReqVO.java index 416bbaa..f96e4d0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationPageReqVO.java @@ -1,10 +1,14 @@ package cn.iocoder.yudao.module.member.controller.admin.recent.vo; +import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; import lombok.*; + import java.util.*; + import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -15,15 +19,24 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class OperationPageReqVO extends PageParam { - @Schema(description = "用户编号", example = "31854") + @Schema(description = "用户编号") private Long memberId; - @Schema(description = "朋友圈编号", example = "29447") + @Schema(description = "朋友圈编号") private Long memberRecentId; - @Schema(description = "点赞、屏蔽、举报", example = "2") + @Schema(description = "朋友圈编号") + private List memberRecentIds; + + /** + * @see MemberRecentOperateEnum + */ + @Schema(description = "点赞、屏蔽、举报") private String bizType; + @Schema(description = "点赞、屏蔽、举报") + private List bizTypes; + @Schema(description = "点击时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] tapTime; @@ -32,7 +45,7 @@ public class OperationPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] cancelTime; - @Schema(description = "举报类型", example = "2") + @Schema(description = "举报类型") private String reportType; @Schema(description = "身材评分") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationRespVO.java index cc225e3..e422eae 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationRespVO.java @@ -16,19 +16,30 @@ import com.alibaba.excel.annotation.*; @ExcelIgnoreUnannotated public class OperationRespVO { - @Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11909") + @Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("收件地址编号") private Long id; - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31854") - @ExcelProperty("用户编号") + @Schema(description = "操作用户编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("操作用户编号") + private Long operatorMemberId; + + @Schema(description = "操作时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("操作用户昵称") + private String operatorMemberNickname; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("朋友圈用户编号") private Long memberId; - @Schema(description = "朋友圈编号", example = "29447") + @Schema(description = "朋友圈用户昵称", requiredMode = Schema.RequiredMode.REQUIRED) + private String memberNickname; + + @Schema(description = "朋友圈编号") @ExcelProperty("朋友圈编号") private Long memberRecentId; - @Schema(description = "点赞、屏蔽、举报", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @Schema(description = "点赞、屏蔽、举报", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("点赞、屏蔽、举报") private String bizType; @@ -40,7 +51,7 @@ public class OperationRespVO { @ExcelProperty("取消时间") private LocalDateTime cancelTime; - @Schema(description = "举报类型", example = "2") + @Schema(description = "举报类型") @ExcelProperty("举报类型") private String reportType; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationTotalGroupRecentRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationTotalGroupRecentRespVO.java new file mode 100644 index 0000000..3855fcd --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationTotalGroupRecentRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.member.controller.admin.recent.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "朋友圈统计 Request VO") +@Data +public class OperationTotalGroupRecentRespVO { + + @Schema(description = "朋友圈id") + private Long memberRecentId; + + @Schema(description = "操作类型") + private String bizType; + + @Schema(description = "朋友圈点赞总数") + private Integer likeTotal = 0; + + @Schema(description = "朋友圈举报总数") + private Integer reportTotal = 0; + + @Schema(description = "朋友圈屏蔽总数") + private Integer shieldTotal = 0; + + @Schema(description = "收藏总数") + private Integer collectTotal = 0; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java index 8ddaaa7..df065c2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java @@ -16,12 +16,18 @@ public class RecentPageResVo extends RecentDO { @Schema(description = "距离相关") private LocationVo location; + @Schema(description = "操作统计相关") + private OperationTotal operationTotal; + @Data public static class MemberVo { @Schema(description = "用户编号") private Long memberId; + @Schema(description = "用户性别") + private Integer memberSex; + @Schema(description = "用户头像") private String memberAvatar; @@ -49,6 +55,22 @@ public class RecentPageResVo extends RecentDO { @Schema(description = "距离(千米)") private Double distance; + } + + @Data + public static class OperationTotal { + + @Schema(description = "朋友圈点赞总数") + private Integer recentLikeTotal = 0; + + @Schema(description = "朋友圈举报总数") + private Integer recentReportTotal = 0; + + @Schema(description = "朋友圈屏蔽总数") + private Integer recentShieldTotal = 0; + + @Schema(description = "朋友圈收藏总数") + private Integer recentCollectTotal = 0; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/feedback/FeedbackMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/feedback/FeedbackMapper.java index 07e0df4..340b513 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/feedback/FeedbackMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/feedback/FeedbackMapper.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.member.dal.dataobject.feedback.FeedbackDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.member.controller.admin.feedback.vo.*; @@ -19,14 +20,18 @@ import cn.iocoder.yudao.module.member.controller.admin.feedback.vo.*; public interface FeedbackMapper extends BaseMapperX { default PageResult selectPage(FeedbackPageReqVO reqVO) { - return selectJoinPage(reqVO, FeedbackRespVO.class, new MPJLambdaWrapperX() + MPJLambdaWrapper queryWrapper = new MPJLambdaWrapperX() .selectAll(FeedbackDO.class) .selectAs(MemberUserDO::getNickname, FeedbackPageReqVO::getMemberName) .leftJoin(MemberUserDO.class, MemberUserDO::getId, FeedbackDO::getMemberId) .eqIfExists(FeedbackDO::getMemberId, reqVO.getMemberId()) .likeIfExists(FeedbackDO::getContent, reqVO.getContent()) - .between(ObjectUtil.isNotEmpty(reqVO.getCreateTime()), FeedbackDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]) - .orderByDesc(FeedbackDO::getId)); + .likeIfExists(MemberUserDO::getNickname, reqVO.getMemberName()); + if (ObjectUtil.isNotEmpty(reqVO.getCreateTime())) { + queryWrapper.between(FeedbackDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]); + } + queryWrapper.orderByDesc(FeedbackDO::getId); + return selectJoinPage(reqVO, FeedbackRespVO.class, queryWrapper); } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/OperationMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/OperationMapper.java index 675b4b1..fd8e4f4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/OperationMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/OperationMapper.java @@ -2,35 +2,45 @@ package cn.iocoder.yudao.module.member.dal.mysql.recent; import java.util.*; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationTotalGroupRecentRespVO; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; +import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 朋友圈操作 Mapper - * - * @author 聊天交友 */ @Mapper public interface OperationMapper extends BaseMapperX { - default PageResult selectPage(OperationPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(OperationDO::getMemberId, reqVO.getMemberId()) - .eqIfPresent(OperationDO::getMemberRecentId, reqVO.getMemberRecentId()) - .eqIfPresent(OperationDO::getBizType, reqVO.getBizType()) - .betweenIfPresent(OperationDO::getTapTime, reqVO.getTapTime()) - .betweenIfPresent(OperationDO::getCancelTime, reqVO.getCancelTime()) - .eqIfPresent(OperationDO::getReportType, reqVO.getReportType()) - .eqIfPresent(OperationDO::getScoreSc, reqVO.getScoreSc()) - .eqIfPresent(OperationDO::getScoreNx, reqVO.getScoreNx()) - .eqIfPresent(OperationDO::getScoreSk, reqVO.getScoreSk()) - .eqIfPresent(OperationDO::getScoreYq, reqVO.getScoreYq()) - .betweenIfPresent(OperationDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(OperationDO::getId)); + default PageResult selectPage(OperationPageReqVO reqVO) { + MPJLambdaWrapper queryWrapper = new MPJLambdaWrapperX() + .selectAll(OperationDO.class) + .selectAs("member", MemberUserDO::getNickname, OperationRespVO::getMemberNickname) + .selectAs("operator_member", MemberUserDO::getNickname, OperationRespVO::getOperatorMemberNickname) + .leftJoin(MemberUserDO.class, "member", MemberUserDO::getId, OperationDO::getMemberId) + .leftJoin(MemberUserDO.class, "operator_member", MemberUserDO::getId, OperationDO::getOperatorMemberId) + .eqIfExists(OperationDO::getMemberId, reqVO.getMemberId()) + .eqIfExists(OperationDO::getMemberRecentId, reqVO.getMemberRecentId()) + .eqIfExists(OperationDO::getBizType, reqVO.getBizType()) + .eqIfExists(OperationDO::getReportType, reqVO.getReportType()); + if (ObjectUtil.isNotEmpty(reqVO.getCreateTime())) { + queryWrapper.between(OperationDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]); + } + queryWrapper.orderByDesc(OperationDO::getId); + return selectJoinPage(reqVO, OperationRespVO.class, queryWrapper); } + List totalGroupRecent(@Param("dto") OperationPageReqVO dto); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java index 9f87b87..53be2fd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.service.recent; import javax.validation.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationSaveReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; @@ -49,6 +50,6 @@ public interface OperationService { * @param pageReqVO 分页查询 * @return 朋友圈操作分页 */ - PageResult getOperationPage(OperationPageReqVO pageReqVO); + PageResult getOperationPage(OperationPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java index a3d756e..2b5b936 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.service.recent; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationSaveReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper; @@ -65,7 +66,7 @@ public class OperationServiceImpl implements OperationService { } @Override - public PageResult getOperationPage(OperationPageReqVO pageReqVO) { + public PageResult getOperationPage(OperationPageReqVO pageReqVO) { return operationMapper.selectPage(pageReqVO); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java index eec9a6b..04d2003 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java @@ -226,6 +226,8 @@ public class RecentServiceImpl implements RecentService { List resultList = BeanUtils.toBean(recentPageList.getList(), RecentPageResVo.class); // 为RecentPageResVo设置Member信息 convertRecentPageResVoSetupMember(resultList); + // 为RecentPageResVo设置OperationTotal信息 + convertRecentPageResVoSetupOperationTotal(resultList, pageReqVO); return new PageResult<>(resultList, recentPageList.getTotal()); } @@ -384,12 +386,42 @@ public class RecentServiceImpl implements RecentService { memberVO.setMemberOcc(member.getOcc()); memberVO.setMemberHeight(member.getHeight()); memberVO.setMemberWeight(member.getWeight()); + memberVO.setMemberSex(member.getSex()); entity.setMember(memberVO); } } } } + /** + * 为RecentPageResVo设置OperationTotal信息 + */ + private void convertRecentPageResVoSetupOperationTotal(List list, RecentPageReqVO query) { + if (ObjectUtil.isEmpty(list)) return; + List ids = list.stream().map(RecentPageResVo::getId).collect(Collectors.toList()); + + OperationPageReqVO operationTotalQuery = new OperationPageReqVO(); + List bizTypes = MemberRecentOperateEnum.userOperateList.stream().map(MemberRecentOperateEnum::getType).collect(Collectors.toList()); + operationTotalQuery.setBizTypes(bizTypes); + operationTotalQuery.setMemberRecentIds(ids); + List totalList = operationMapper.totalGroupRecent(operationTotalQuery); + Map totalMap = IterUtil.toMap(totalList, OperationTotalGroupRecentRespVO::getMemberRecentId); + for (RecentPageResVo entity : list) { + // 操作统计相关 + OperationTotalGroupRecentRespVO total = totalMap.get(entity.getId()); + if (ObjectUtil.isNotEmpty(total)) { + RecentPageResVo.OperationTotal operationTotal = new RecentPageResVo.OperationTotal(); + operationTotal.setRecentLikeTotal(total.getLikeTotal()); + operationTotal.setRecentReportTotal(total.getReportTotal()); + operationTotal.setRecentShieldTotal(total.getShieldTotal()); + operationTotal.setRecentCollectTotal(total.getCollectTotal()); + entity.setOperationTotal(operationTotal); + } else { + entity.setOperationTotal(new RecentPageResVo.OperationTotal()); + } + } + } + private void convertRecentPageResVoSetupMember(RecentPageResVo detail) { if (ObjectUtil.isEmpty(detail)) return; MemberUserDO member = memberUserService.getUser(detail.getMemberId()); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml new file mode 100644 index 0000000..dff975e --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml @@ -0,0 +1,41 @@ + + + + + + a.deleted = 0 + + and a.member_recent_id = #{dto.memberRecentId} + + + and a.member_recent_id in + + #{v} + + + + and a.biz_type = #{dto.bizType} + + + and a.biz_type in + + #{v} + + + + + + diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 70ecf1f..325c183 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -3,8 +3,8 @@ spring: name: yudao-server profiles: - active: prod - # active: local + # active: prod + active: local main: allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。