From 8ad378666e33262c2112caf37d72051324ad30cc Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 27 Nov 2025 13:22:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=94=A8=E6=88=B7tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/recent/member_recent.sql | 21 +++++------ .../module/member/enums/MemberErrorCode.java | 2 ++ .../member/enums/tag/MemberRecentTagEnum.java | 28 +++++++++++++++ .../member/client/service/TxMapApiImpl.java | 1 - .../member/client/vo/txmap/TxMapRespVo.java | 23 ++++++++++++ .../admin/recent/vo/RecentPageReqVO.java | 6 ++++ .../admin/recent/vo/RecentPageResVo.java | 15 ++++++++ .../admin/recent/vo/RecentRespVO.java | 7 ++++ .../admin/recent/vo/RecentSaveReqVO.java | 4 +++ .../admin/user/MemberUserController.java | 16 +++++---- .../admin/user/vo/MemberUserRespVO.java | 19 ++++++++-- .../admin/user/vo/MemberUserUpdateReqVO.java | 4 +++ .../app/recent/vo/AppRecentSaveReqVO.java | 13 ++++--- .../convert/user/MemberUserConvert.java | 20 +++++++++-- .../dal/dataobject/recent/RecentDO.java | 5 +++ .../dataobject/user/MemberRecentTagDO.java | 5 +++ .../member/dal/mysql/recent/RecentMapper.java | 34 ++++++++++-------- .../dal/mysql/user/MemberRecentTagMapper.java | 9 +++++ .../service/location/LocationServiceImpl.java | 5 ++- .../member/service/recent/RecentService.java | 1 + .../service/recent/RecentServiceImpl.java | 36 ++++++++++++++++++- .../thirdauth/ThirdAuthServiceImpl.java | 2 +- .../service/user/MemberUserServiceImpl.java | 26 ++++++++++++++ .../main/resources/mapper/OperationMapper.xml | 4 +-- .../main/resources/mapper/RecentMapper.xml | 7 ++++ 25 files changed, 267 insertions(+), 46 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/tag/MemberRecentTagEnum.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/txmap/TxMapRespVo.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml diff --git a/sql/mysql/recent/member_recent.sql b/sql/mysql/recent/member_recent.sql index f601a13..4c6cbd1 100644 --- a/sql/mysql/recent/member_recent.sql +++ b/sql/mysql/recent/member_recent.sql @@ -149,16 +149,17 @@ CREATE TABLE `member_location` DROP TABLE IF EXISTS `member_recent_tag`; CREATE TABLE `member_recent_tag` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户tagid', - `member_id` bigint NOT NULL COMMENT '人员id', - `tag_title` varchar(64) NOT NULL COMMENT 'tag标题', - `tag_biz_id` bigint DEFAULT NULL COMMENT 'tag获取的对应id', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户tagid', + `member_id` bigint NOT NULL COMMENT '人员id', + `tag_title` varchar(64) NOT NULL COMMENT 'tag标题', + `tag_biz_id` bigint DEFAULT NULL COMMENT 'tag获取的对应id', + `tag_biz_type` char(32) DEFAULT NULL COMMENT 'tag获取的对应type', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '朋友圈用户tag'; diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCode.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCode.java index 6a89bfe..77e2a59 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCode.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberErrorCode.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; */ public interface MemberErrorCode { + ErrorCode EMPTY = new ErrorCode(1_004_000_000, "{}"); + // ========== 用户相关 1-004-001-000 ============ ErrorCode USER_NOT_EXISTS = new ErrorCode(1_004_001_000, "用户不存在"); ErrorCode USER_MOBILE_NOT_EXISTS = new ErrorCode(1_004_001_001, "手机号未注册用户"); diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/tag/MemberRecentTagEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/tag/MemberRecentTagEnum.java new file mode 100644 index 0000000..a549d46 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/tag/MemberRecentTagEnum.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.member.enums.tag; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * 用户朋友圈tag + */ +@AllArgsConstructor +@Getter +public enum MemberRecentTagEnum { + + TRUE_PERSON_AUTH("1", "真人认证"), + NEW_PERSON("2", "新人"), + ; + private final String type; + private final String description; + + public static MemberRecentTagEnum valueOfType(String type) { + return Arrays.asList(values()).stream().filter(v-> ObjectUtil.equals(v.type, type)).findFirst().orElse(null); + } + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/TxMapApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/TxMapApiImpl.java index aa2687c..59bc2f1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/TxMapApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/TxMapApiImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.module.member.client.tool.TxMapApiTool; -import cn.iocoder.yudao.module.member.client.vo.chat.ChatBaseRespVo; import cn.iocoder.yudao.module.member.client.vo.txmap.TxMapRespVo; import cn.iocoder.yudao.module.member.client.vo.txmap.geocoder.TxMapGeocoderReqVo; import cn.iocoder.yudao.module.member.client.vo.txmap.geocoder.TxMapGeocoderRespVo; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/txmap/TxMapRespVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/txmap/TxMapRespVo.java new file mode 100644 index 0000000..ed9e803 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/txmap/TxMapRespVo.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.member.client.vo.txmap; + +import lombok.Data; + +/** + * 腾讯地图响应体 + */ +@Data +public class TxMapRespVo { + + private Integer status; + + private String message; + + private String request_id; + + private String result; + + public boolean isSuccess() { + return status == 0; + } + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java index 2c285a6..a4c1405 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java @@ -26,9 +26,15 @@ public class RecentPageReqVO extends PageParam { @Schema(description = "用户编号") private Long memberId; + @Schema(description = "用户昵称") + private String memberNickname; + @Schema(description = "主图") private String coverPic; + @Schema(description = "视频") + private String coverVideo; + @Schema(description = "描述") private String describe; 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 df065c2..ad4af01 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 @@ -4,6 +4,8 @@ import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.util.List; + @Data public class RecentPageResVo extends RecentDO { @@ -19,6 +21,9 @@ public class RecentPageResVo extends RecentDO { @Schema(description = "操作统计相关") private OperationTotal operationTotal; + @Schema(description = "用户tag") + private List memberTagList; + @Data public static class MemberVo { @@ -71,6 +76,16 @@ public class RecentPageResVo extends RecentDO { @Schema(description = "朋友圈收藏总数") private Integer recentCollectTotal = 0; + } + + @Data + public static class MemberTag { + + @Schema(description = "tag标题") + private String tagTitle; + + @Schema(description = "tag业务类型") + private String tagBizType; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentRespVO.java index b38de03..419127b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentRespVO.java @@ -2,10 +2,14 @@ package cn.iocoder.yudao.module.member.controller.admin.recent.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + import java.util.*; import java.math.BigDecimal; + import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; + import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - 朋友圈 Response VO") @@ -25,6 +29,9 @@ public class RecentRespVO { @ExcelProperty("主图") private String coverPic; + @Schema(description = "视频") + private String coverVideo; + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("描述") private String describe; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentSaveReqVO.java index 640ece9..7b15d10 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentSaveReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.controller.admin.recent.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + import java.util.*; import javax.validation.constraints.*; import java.math.BigDecimal; @@ -21,6 +22,9 @@ public class RecentSaveReqVO { @NotEmpty(message = "主图不能为空") private String coverPic; + @Schema(description = "视频") + private String coverVideo; + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "描述不能为空") private String description; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java index 6ff70e2..172a5e2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java @@ -8,7 +8,9 @@ import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper; import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import cn.iocoder.yudao.module.member.service.group.MemberGroupService; import cn.iocoder.yudao.module.member.service.level.MemberLevelService; @@ -51,6 +53,9 @@ public class MemberUserController { @Resource private MemberPointRecordService memberPointRecordService; + @Resource + private MemberRecentTagMapper memberRecentTagMapper; + @PutMapping("/update") @Operation(summary = "更新会员用户") @PreAuthorize("@ss.hasPermission('member:user:update')") @@ -93,7 +98,6 @@ public class MemberUserController { if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty()); } - // 处理用户标签返显 Set tagIds = pageResult.getList().stream() .map(MemberUserDO::getTagIds) @@ -102,12 +106,12 @@ public class MemberUserController { .collect(Collectors.toSet()); List tags = memberTagService.getTagList(tagIds); // 处理用户级别返显 - List levels = memberLevelService.getLevelList( - convertSet(pageResult.getList(), MemberUserDO::getLevelId)); + List levels = memberLevelService.getLevelList(convertSet(pageResult.getList(), MemberUserDO::getLevelId)); // 处理用户分组返显 - List groups = memberGroupService.getGroupList( - convertSet(pageResult.getList(), MemberUserDO::getGroupId)); - return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups)); + List groups = memberGroupService.getGroupList(convertSet(pageResult.getList(), MemberUserDO::getGroupId)); + // 处理用户朋友圈的TAG + List memberRecentTags = memberRecentTagMapper.getByIds(convertSet(pageResult.getList(), MemberUserDO::getId)); + return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags,memberRecentTags, levels, groups)); } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java index 1cd2283..fe8bd87 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.member.controller.admin.user.vo; +import cn.iocoder.yudao.module.member.controller.admin.recent.vo.RecentPageResVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,7 +32,7 @@ public class MemberUserRespVO extends MemberUserBaseVO { // ========== 其它信息 ========== - @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") private Integer point; @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") @@ -46,7 +47,21 @@ public class MemberUserRespVO extends MemberUserBaseVO { @Schema(description = "用户分组", example = "购物达人") private String groupName; - @Schema(description = "用户经验值", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @Schema(description = "用户经验值", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") private Integer experience; + @Schema(description = "用户tag") + private List memberTagList; + + @Data + public static class MemberTag { + + @Schema(description = "tag标题") + private String tagTitle; + + @Schema(description = "tag业务类型") + private String tagBizType; + + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java index c6a9275..e69e546 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; import javax.validation.constraints.NotNull; +import java.util.List; @Schema(description = "管理后台 - 会员用户更新 Request VO") @Data @@ -17,4 +18,7 @@ public class MemberUserUpdateReqVO extends MemberUserBaseVO { @NotNull(message = "编号不能为空") private Long id; + @Schema(description = "用户标签") + private List memberRecentTagList; + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/vo/AppRecentSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/vo/AppRecentSaveReqVO.java index 33d9605..dac455b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/vo/AppRecentSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/vo/AppRecentSaveReqVO.java @@ -5,7 +5,6 @@ import lombok.Data; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -import java.math.BigDecimal; @Data public class AppRecentSaveReqVO { @@ -13,19 +12,23 @@ public class AppRecentSaveReqVO { @Schema(description = "用户编号") private Long memberId; - @Schema(description = "主图", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "视频") + @NotEmpty(message = "视频不能为空") + private String coverVideo; + + @Schema(description = "主图") @NotEmpty(message = "主图不能为空") private String coverPic; - @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "描述") @NotEmpty(message = "描述不能为空") private String description; - @Schema(description = "发布-经度", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "发布-经度") @NotNull(message = "发布-经度不能为空") private Double issueLong; - @Schema(description = "发布-纬度", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "发布-纬度") @NotNull(message = "发布-纬度不能为空") private Double issueLat; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java index eaa5ab5..1d8baa7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.member.convert.user; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO; @@ -9,17 +10,19 @@ import cn.iocoder.yudao.module.member.convert.address.AddressConvert; import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; @Mapper(uses = {AddressConvert.class}) public interface MemberUserConvert { @@ -49,6 +52,7 @@ public interface MemberUserConvert { default PageResult convertPage(PageResult pageResult, List tags, + List memberRecentTags, List levels, List groups) { PageResult result = convertPage(pageResult); @@ -61,6 +65,18 @@ public interface MemberUserConvert { user.setTagNames(convertList(user.getTagIds(), tagMap::get)); user.setLevelName(levelMap.get(user.getLevelId())); user.setGroupName(groupMap.get(user.getGroupId())); + user.setMemberTagList(new ArrayList<>()); + // 处理朋友圈TAG + List targetTags = memberRecentTags.stream().filter(v -> ObjectUtil.equals(v.getMemberId(), user.getId())).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(targetTags)) { + List disposeTags = targetTags.stream().map(v -> { + MemberUserRespVO.MemberTag entity = new MemberUserRespVO.MemberTag(); + entity.setTagTitle(v.getTagTitle()); + entity.setTagBizType(v.getTagBizType()); + return entity; + }).collect(Collectors.toList()); + user.setMemberTagList(disposeTags); + } }); return result; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/recent/RecentDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/recent/RecentDO.java index f0ffcdd..dce702a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/recent/RecentDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/recent/RecentDO.java @@ -38,6 +38,11 @@ public class RecentDO extends BaseDO { */ private String coverPic; + /** + * 视频 + */ + private String coverVideo; + /** * 描述 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberRecentTagDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberRecentTagDO.java index abcbbd6..3933db9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberRecentTagDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberRecentTagDO.java @@ -33,6 +33,11 @@ public class MemberRecentTagDO extends BaseDO { */ private String tagTitle; + /** + * tag获取的对应type + */ + private String tagBizType; + /** * tag获取的对应id */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/RecentMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/RecentMapper.java index 868e970..c94538b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/RecentMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/recent/RecentMapper.java @@ -1,33 +1,37 @@ package cn.iocoder.yudao.module.member.dal.mysql.recent; +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.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 cn.iocoder.yudao.module.member.controller.admin.recent.vo.*; /** * 朋友圈 Mapper - * - * @author 聊天交友 */ @Mapper public interface RecentMapper extends BaseMapperX { default PageResult selectPage(RecentPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(RecentDO::getMemberId, reqVO.getMemberId()) - .eqIfPresent(RecentDO::getCoverPic, reqVO.getCoverPic()) - .eqIfPresent(RecentDO::getDescription, reqVO.getDescribe()) - .eqIfPresent(RecentDO::getIssueLong, reqVO.getIssueLong()) - .eqIfPresent(RecentDO::getIssueLat, reqVO.getIssueLat()) - .eqIfPresent(RecentDO::getIssueProvince, reqVO.getIssueProvince()) - .eqIfPresent(RecentDO::getIssueCity, reqVO.getIssueCity()) - .eqIfPresent(RecentDO::getIssueDistrict, reqVO.getIssueDistrict()) - .eqIfPresent(RecentDO::getIssueAddress, reqVO.getIssueAddress()) - .betweenIfPresent(RecentDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(RecentDO::getId)); + MPJLambdaWrapper queryWrapper = new MPJLambdaWrapperX() + .selectAll(RecentDO.class) + .leftJoin(MemberUserDO.class, MemberUserDO::getId, RecentDO::getMemberId) + .likeIfExists(MemberUserDO::getNickname, reqVO.getMemberNickname()) + .eqIfExists(RecentDO::getMemberId, reqVO.getMemberId()) + .eqIfExists(RecentDO::getDescription, reqVO.getDescribe()) + .likeIfExists(RecentDO::getIssueProvince, reqVO.getIssueProvince()) + .likeIfExists(RecentDO::getIssueCity, reqVO.getIssueCity()) + .likeIfExists(RecentDO::getIssueDistrict, reqVO.getIssueDistrict()) + .likeIfExists(RecentDO::getIssueAddress, reqVO.getIssueAddress()); + if (ObjectUtil.isNotEmpty(reqVO.getCreateTime())) { + queryWrapper.between(RecentDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]); + } + queryWrapper.orderByDesc(RecentDO::getId); + return selectJoinPage(reqVO, RecentDO.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/user/MemberRecentTagMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberRecentTagMapper.java index 3496cef..ac808d9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberRecentTagMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberRecentTagMapper.java @@ -1,14 +1,23 @@ package cn.iocoder.yudao.module.member.dal.mysql.user; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; +import java.util.Set; + /** * 朋友圈用户tag Mapper */ @Mapper public interface MemberRecentTagMapper extends BaseMapperX { + default List getByIds(Set memberIds) { + return selectList(new LambdaQueryWrapperX() + .in(MemberRecentTagDO::getMemberId, memberIds) + ); + } } \ 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/location/LocationServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/location/LocationServiceImpl.java index 1feda06..65776c8 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/location/LocationServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/location/LocationServiceImpl.java @@ -39,7 +39,7 @@ public class LocationServiceImpl implements LocationService { @Override public Long createLocation(LocationSaveReqVO dto) { - if (!ObjectUtil.isAllEmpty(dto.getProvince(), dto.getCity(), dto.getDistrict())) { + if (!ObjectUtil.isAllNotEmpty(dto.getProvince(), dto.getCity(), dto.getDistrict())) { TxMapGeocoderRespVo geocoder = txMapApi.geocoder(TxMapGeocoderReqVo.builder().location(dto.getLat() + "," + dto.getLon()).build()); if (ObjectUtil.isNotEmpty(geocoder) && ObjectUtil.isNotEmpty(geocoder.getAddress_component())) { TxMapGeocoderRespVo.AddressComponent addressComponent = geocoder.getAddress_component(); @@ -47,6 +47,9 @@ public class LocationServiceImpl implements LocationService { dto.setCity(addressComponent.getCity()); dto.setDistrict(addressComponent.getDistrict()); dto.setAddress(addressComponent.getStreet()); + if (ObjectUtil.isNotEmpty(geocoder.getFormatted_addresses()) && ObjectUtil.isNotEmpty(geocoder.getFormatted_addresses().getRecommend())) { + dto.setAddress(geocoder.getFormatted_addresses().getRecommend()); + } } } // 插入 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java index 919a9bc..1de9d5f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.service.recent; import java.util.*; +import java.util.concurrent.ExecutionException; import javax.validation.*; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.*; 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 e00210b..d76d586 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 @@ -11,8 +11,10 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateR import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO; import cn.iocoder.yudao.module.member.dal.dataobject.location.LocationDO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum; @@ -40,6 +42,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -56,6 +59,8 @@ public class RecentServiceImpl implements RecentService { private RecentMapper recentMapper; @Resource private OperationMapper operationMapper; + @Resource + private MemberRecentTagMapper memberRecentTagMapper; @Resource private MemberUserService memberUserService; @@ -103,7 +108,7 @@ public class RecentServiceImpl implements RecentService { } } catch (Exception e) { log.error("|创建朋友圈|,以外的错误error:{}", e.getMessage()); - throw new RuntimeException(e.getMessage()); + throw exception(MemberErrorCode.EMPTY, e.getMessage()); } // 返回 @@ -228,6 +233,8 @@ public class RecentServiceImpl implements RecentService { convertRecentPageResVoSetupMember(resultList); // 为RecentPageResVo设置OperationTotal信息 convertRecentPageResVoSetupOperationTotal(resultList, pageReqVO); + // 为RecentPageResVo设置Tag信息 + convertRecentPageResVoSetupTag(resultList); return new PageResult<>(resultList, recentPageList.getTotal()); } @@ -434,6 +441,33 @@ public class RecentServiceImpl implements RecentService { } } + // 为RecentPageResVo设置Tag信息 + private void convertRecentPageResVoSetupTag(List list) { + if (ObjectUtil.isEmpty(list)) return; + List memberIds = list.stream().map(RecentPageResVo::getMemberId).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(memberIds)) { + List memberRecentTagList = memberRecentTagMapper.selectList(new LambdaQueryWrapperX() + .in(MemberRecentTagDO::getMemberId, memberIds) + ); + if (ObjectUtil.isNotEmpty(memberRecentTagList)) { + for (RecentPageResVo entity : list) { + List targetList = memberRecentTagList.stream().filter(v -> ObjectUtil.equals(v.getMemberId(), entity.getMemberId())).collect(Collectors.toList()); + if (ObjectUtil.isEmpty(targetList)) { + entity.setMemberTagList(new ArrayList<>()); + continue; + } + List tagList = targetList.stream().map(v -> { + RecentPageResVo.MemberTag tag = new RecentPageResVo.MemberTag(); + tag.setTagTitle(v.getTagTitle()); + tag.setTagBizType(v.getTagBizType()); + return tag; + }).collect(Collectors.toList()); + entity.setMemberTagList(tagList); + } + } + } + } + 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/java/cn/iocoder/yudao/module/member/service/thirdauth/ThirdAuthServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/thirdauth/ThirdAuthServiceImpl.java index 0436e19..6e910cc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/thirdauth/ThirdAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/thirdauth/ThirdAuthServiceImpl.java @@ -140,7 +140,7 @@ public class ThirdAuthServiceImpl implements ThirdAuthService { if (ObjectUtil.isEmpty(client)) return null; RuntimeOptions runtime = new RuntimeOptions(); Map serviceParameters = new HashMap<>(); - serviceParameters.put("imageUrl", "https://img.alicdn.com/tfs/TB1U4r9AeH2gK0jSZJnXXaT1FXa-2880-480.png"); + serviceParameters.put("imageUrl", imageUrl); serviceParameters.put("dataId", String.valueOf(UUID.randomUUID())); serviceParameters.put("infoType", "customImage,textInImage,publicFigure"); ImageModerationRequest imageBatchModerationRequest = new ImageModerationRequest(); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 040c2cd..771d415 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.member.client.service.ChatApi; import cn.iocoder.yudao.module.member.client.vo.chat.user.ChatCreateOrUpdateUserReqVo; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; @@ -16,10 +18,13 @@ import cn.iocoder.yudao.module.member.controller.app.user.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentTagDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.photo.PhotoMapper; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.enums.photo.PhotoBizTypeEnum; +import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum; import cn.iocoder.yudao.module.member.mq.producer.user.MemberUserProducer; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; @@ -59,6 +64,8 @@ public class MemberUserServiceImpl implements MemberUserService { private MemberUserMapper memberUserMapper; @Resource private PhotoMapper photoMapper; + @Resource + private MemberRecentTagMapper memberRecentTagMapper; @Resource private SmsCodeApi smsCodeApi; @@ -269,6 +276,25 @@ public class MemberUserServiceImpl implements MemberUserService { // 更新 MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO); + + // 更新用户朋友圈标签 + if (ObjectUtil.isNotEmpty(updateReqVO.getMemberRecentTagList())) { + // 删除所有标签 + memberRecentTagMapper.delete(new LambdaQueryWrapperX() + .eq(MemberRecentTagDO::getMemberId, updateReqVO.getId()) + ); + // 添加标签 + List tags = updateReqVO.getMemberRecentTagList().stream().map(v -> { + MemberRecentTagEnum tagEnum = MemberRecentTagEnum.valueOfType(v); + if (ObjectUtil.isEmpty(tagEnum)) return null; + MemberRecentTagDO entity = new MemberRecentTagDO(); + entity.setMemberId(updateReqVO.getId()); + entity.setTagTitle(tagEnum.getDescription()); + entity.setTagBizType(tagEnum.getType()); + return entity; + }).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList()); + memberRecentTagMapper.insert(tags); + } memberUserMapper.updateById(updateObj); } 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 index a9f6399..39f295a 100644 --- 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 @@ -28,8 +28,8 @@ resultType="cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationTotalGroupRecentRespVO"> select sum(if(a.biz_type = '1', 1, 0)) as likeTotal, - sum(if(a.biz_type = '1' and a.operator_member_id = #{userId}, 1, 0)) as likeItTotal, - sum(if(a.biz_type = '1' and a.member_id = #{userId}, 1, 0)) as likeMeTotal, + sum(if(a.biz_type = '1' and a.operator_member_id = #{dto.memberId}, 1, 0)) as likeItTotal, + sum(if(a.biz_type = '1' and a.member_id = #{dto.memberId}, 1, 0)) as likeMeTotal, sum(if(a.biz_type = '2', 1, 0)) as reportTotal, sum(if(a.biz_type = '3', 1, 0)) as shieldTotal, sum(if(a.biz_type = '4', 1, 0)) as collectTotal, diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml new file mode 100644 index 0000000..77f33b3 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml @@ -0,0 +1,7 @@ + + + + + + +