From 2132de9dd1e2edfa849794404f707700b0df679b Mon Sep 17 00:00:00 2001 From: owen Date: Fri, 25 Aug 2023 21:02:49 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=95=86=E5=93=81=EF=BC=9A=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E5=90=8E=E5=8F=B0=E5=95=86=E5=93=81=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/ProductCommentController.java | 14 ++++++-- .../comment/vo/ProductCommentBaseVO.java | 2 -- .../comment/vo/ProductCommentRespVO.java | 2 ++ .../comment/ProductCommentConvert.java | 36 +++++++++++++++++-- .../mysql/comment/ProductCommentMapper.java | 1 + .../comment/ProductCommentServiceImpl.java | 30 ++++++++++------ .../service/sku/ProductSkuServiceImpl.java | 4 +++ 7 files changed, 73 insertions(+), 16 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java index 91020a51c..bac915a0f 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java @@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; @@ -14,8 +16,10 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 商品评价") @@ -26,13 +30,19 @@ public class ProductCommentController { @Resource private ProductCommentService productCommentService; + @Resource + private ProductSkuService productSkuService; @GetMapping("/page") @Operation(summary = "获得商品评价分页") @PreAuthorize("@ss.hasPermission('product:comment:query')") public CommonResult> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { PageResult pageResult = productCommentService.getCommentPage(pageVO); - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult)); + + List skuList = productSkuService.getSkuList( + convertSet(pageResult.getList(), ProductCommentDO::getSkuId)); + + return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList)); } @PutMapping("/update-visible") @@ -51,7 +61,7 @@ public class ProductCommentController { return success(true); } - @PutMapping("/create") + @PostMapping("/create") @Operation(summary = "添加自评") @PreAuthorize("@ss.hasPermission('product:comment:update')") public CommonResult createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java index 24d6a5456..f88f5ed68 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java @@ -11,11 +11,9 @@ import java.util.List; public class ProductCommentBaseVO { @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868") - @NotNull(message = "评价人不能为空") private Long userId; @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292") - @NotNull(message = "评价订单项不能为空") private Long orderItemId; @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉") diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java index 9205e34cc..8e3c732a5 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java @@ -52,4 +52,6 @@ public class ProductCommentRespVO extends ProductCommentBaseVO { @NotNull(message = "商品 SPU 名称不能为空") private String spuName; + @Schema(description = "商品 SKU 图片地址", example = "https://www.iocoder.cn/yudao.jpg") + private String skuPicUrl; } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java index cabc79a7d..216212b2e 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.product.convert.comment; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; @@ -23,6 +22,11 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** * 商品评价 Convert @@ -60,7 +64,7 @@ public interface ProductCommentConvert { item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS); } // 设置 SKU 规格值 - MapUtils.findAndThen(skuMap, item.getSkuId(), + findAndThen(skuMap, item.getSkuId(), sku -> item.setSkuProperties(convertList01(sku.getProperties()))); }); return page; @@ -101,6 +105,8 @@ public interface ProductCommentConvert { return commentDO; } + @Mapping(target = "visible", constant = "true") + @Mapping(target = "replyStatus", constant = "false") @Mapping(target = "userId", constant = "0L") @Mapping(target = "orderId", constant = "0L") @Mapping(target = "orderItemId", constant = "0L") @@ -111,4 +117,30 @@ public interface ProductCommentConvert { List convertList02(List list); + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO) { + ProductCommentDO commentDO = convert(createReq); + if (spuDO != null) { + commentDO.setSpuId(spuDO.getId()); + commentDO.setSpuName(spuDO.getName()); + } + return commentDO; + } + + default PageResult convertPage(PageResult pageResult, List skuList) { + Map skuMap = convertMap(skuList, ProductSkuDO::getId); + + PageResult result = convertPage(pageResult); + for (ProductCommentRespVO vo : result.getList()) { + findAndThen(skuMap, vo.getSkuId(), sku -> { + String propertyNames = sku.getProperties().stream() + .map(ProductSkuDO.Property::getValueName) + .filter(Objects::nonNull) + .collect(Collectors.joining(" ")); + + vo.setSkuPicUrl(sku.getPicUrl()); + vo.setSpuName(vo.getSpuName() + " " + propertyNames); + }); + } + return result; + } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java index c933c4370..095cd655b 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java @@ -20,6 +20,7 @@ public interface ProductCommentMapper extends BaseMapperX { .eqIfPresent(ProductCommentDO::getOrderId, reqVO.getOrderId()) .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId()) .eqIfPresent(ProductCommentDO::getScores, reqVO.getScores()) + .eqIfPresent(ProductCommentDO::getReplyStatus, reqVO.getReplyStatus()) .betweenIfPresent(ProductCommentDO::getCreateTime, reqVO.getCreateTime()) .likeIfPresent(ProductCommentDO::getSpuName, reqVO.getSpuName()) .orderByDesc(ProductCommentDO::getId)); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java index 97a3d1562..05d5b02cd 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java @@ -80,23 +80,18 @@ public class ProductCommentServiceImpl implements ProductCommentService { @Override @Transactional(rollbackFor = Exception.class) public void createComment(ProductCommentCreateReqVO createReqVO) { - // 校验评论 - validateComment(createReqVO.getSkuId(), createReqVO.getUserId(), createReqVO.getOrderItemId()); + // 校验商品 + ProductSpuDO spuDO = validateProduct(createReqVO.getSkuId()); - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO); + ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO); productCommentMapper.insert(commentDO); } @Override @Transactional(rollbackFor = Exception.class) public Long createComment(ProductCommentCreateReqDTO createReqDTO) { - // 通过 sku ID 拿到 spu 相关信息 - ProductSkuDO sku = productSkuService.getSku(createReqDTO.getSkuId()); - if (sku == null) { - throw exception(SKU_NOT_EXISTS); - } - // 校验 spu 如果存在返回详情 - ProductSpuDO spuDO = validateSpu(sku.getSpuId()); + // 校验商品 + ProductSpuDO spuDO = validateProduct(createReqDTO.getSkuId()); // 校验评论 validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId()); // 获取用户详细信息 @@ -116,6 +111,21 @@ public class ProductCommentServiceImpl implements ProductCommentService { } } + private ProductSpuDO validateProduct(Long skuId) { + // 通过 sku ID 拿到 spu 相关信息 + ProductSkuDO sku = validateSku(skuId); + // 校验 spu 如果存在返回详情 + return validateSpu(sku.getSpuId()); + } + + private ProductSkuDO validateSku(Long skuId) { + ProductSkuDO sku = productSkuService.getSku(skuId); + if (sku == null) { + throw exception(SKU_NOT_EXISTS); + } + return sku; + } + private ProductSpuDO validateSpu(Long spuId) { ProductSpuDO spu = productSpuService.getSpu(spuId); if (null == spu) { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java index 7c6c5030e..cd0ba6b46 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.product.service.sku; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; @@ -74,6 +75,9 @@ public class ProductSkuServiceImpl implements ProductSkuService { @Override public List getSkuList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return ListUtil.empty(); + } return productSkuMapper.selectBatchIds(ids); } From 9aee08ee0e8bdccfeca29c5711082608d9374362 Mon Sep 17 00:00:00 2001 From: owen Date: Fri, 25 Aug 2023 21:12:31 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BC=9A=E5=91=98=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9Review=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/MemberExperienceBizTypeEnum.java | 17 ++++++--- .../member/api/level/MemberLevelApiImpl.java | 6 +-- .../service/group/MemberGroupServiceImpl.java | 7 ++-- .../service/level/MemberLevelServiceImpl.java | 7 +--- .../service/tag/MemberTagServiceImpl.java | 6 +-- .../service/user/MemberUserService.java | 37 +++++++++++++++---- .../service/user/MemberUserServiceImpl.java | 15 ++++++++ 7 files changed, 66 insertions(+), 29 deletions(-) diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java index d8cb54132..fcd0f6e7a 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java @@ -1,8 +1,11 @@ package cn.iocoder.yudao.module.member.enums; +import cn.hutool.core.util.EnumUtil; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Objects; + /** * 会员经验 - 业务类型 * @@ -15,16 +18,20 @@ public enum MemberExperienceBizTypeEnum { /** * 管理员调整、邀请新用户、下单、退单、签到、抽奖 */ - ADMIN(0, "管理员调整","管理员调整获得 {} 经验"), - INVITE_REGISTER(1, "邀新奖励","邀请好友获得 {} 经验"), + ADMIN(0, "管理员调整", "管理员调整获得 {} 经验"), + INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验"), ORDER(2, "下单奖励", "下单获得 {} 经验"), - REFUND(3, "退单扣除","退单获得 {} 经验"), - SIGN_IN(4, "签到奖励","签到获得 {} 经验"), - LOTTERY(5, "抽奖奖励","抽奖获得 {} 经验"), + REFUND(3, "退单扣除", "退单获得 {} 经验"), + SIGN_IN(4, "签到奖励", "签到获得 {} 经验"), + LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验"), ; private final int type; private final String title; private final String description; + public static MemberExperienceBizTypeEnum getByType(Integer type) { + return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, + e -> Objects.equals(type, e.getType())); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java index 3d89663e7..3cd2cad65 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java @@ -1,13 +1,11 @@ package cn.iocoder.yudao.module.member.api.level; -import cn.hutool.core.util.EnumUtil; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; import cn.iocoder.yudao.module.member.service.level.MemberLevelService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT; @@ -26,9 +24,7 @@ public class MemberLevelApiImpl implements MemberLevelApi { @Override public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) { - // TODO @疯狂:可以在 MemberExperienceBizTypeEnum 增加一个方法,获得哈。 - MemberExperienceBizTypeEnum bizTypeEnum = EnumUtil.getBy(MemberExperienceBizTypeEnum.class, - e -> Objects.equals(bizType, e.getType())); + MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType); if (bizTypeEnum == null) { throw exception(EXPERIENCE_BIZ_NOT_SUPPORT); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java index e0e24c776..98ec3cc85 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdat import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert; import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -33,7 +33,7 @@ public class MemberGroupServiceImpl implements MemberGroupService { @Resource private MemberGroupMapper groupMapper; @Resource - private MemberUserMapper memberUserMapper; + private MemberUserService memberUserService; @Override public Long createGroup(MemberGroupCreateReqVO createReqVO) { @@ -69,9 +69,8 @@ public class MemberGroupServiceImpl implements MemberGroupService { } } - // TODO @疯狂:不要直接调用 memberUserMapper,需要对方 service 提供方法 void validateGroupHasUser(Long id) { - Long count = memberUserMapper.selectCountByGroupId(id); + Long count = memberUserService.getUserCountByGroupId(id); if (count > 0) { throw exception(GROUP_HAS_USER); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java index fb9d5c663..d46465554 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java @@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import com.google.common.annotations.VisibleForTesting; @@ -49,8 +48,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { @Resource private MemberExperienceRecordService memberExperienceRecordService; @Resource - private MemberUserMapper memberUserMapper; - @Resource private MemberUserService memberUserService; @Override @@ -157,7 +154,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper @VisibleForTesting void validateLevelHasUser(Long id) { - Long count = memberUserMapper.selectCountByLevelId(id); + Long count = memberUserService.getUserCountByLevelId(id); if (count > 0) { throw exception(LEVEL_HAS_USER); } @@ -239,7 +236,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { return; } - MemberUserDO user = memberUserMapper.selectById(userId); + MemberUserDO user = memberUserService.getUser(userId); int userExperience = NumberUtil.max(user.getExperience() + experience, 0); MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java index 93e09d747..d176bcabb 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagUpdateReq import cn.iocoder.yudao.module.member.convert.tag.MemberTagConvert; import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; import cn.iocoder.yudao.module.member.dal.mysql.tag.MemberTagMapper; -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -33,7 +33,7 @@ public class MemberTagServiceImpl implements MemberTagService { @Resource private MemberTagMapper tagMapper; @Resource - private MemberUserMapper memberUserMapper; + private MemberUserService memberUserService; @Override public Long createTag(MemberTagCreateReqVO createReqVO) { @@ -92,7 +92,7 @@ public class MemberTagServiceImpl implements MemberTagService { } void validateTagHasUser(Long id) { - Long count = memberUserMapper.selectCountByTagId(id); + Long count = memberUserService.getUserCountByTagId(id); if (count > 0) { throw exception(TAG_HAS_USER); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 2b8155184..7a0c13380 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -5,9 +5,9 @@ import cn.iocoder.yudao.framework.common.validation.Mobile; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import javax.validation.Valid; @@ -41,7 +41,7 @@ public interface MemberUserService { * 基于手机号创建用户。 * 如果用户已经存在,则直接进行返回 * - * @param mobile 手机号 + * @param mobile 手机号 * @param registerIp 注册 IP * @return 用户对象 */ @@ -50,7 +50,7 @@ public interface MemberUserService { /** * 更新用户的最后登陆信息 * - * @param id 用户编号 + * @param id 用户编号 * @param loginIp 登陆 IP */ void updateUserLogin(Long id, String loginIp); @@ -75,7 +75,7 @@ public interface MemberUserService { * 【会员】修改基本信息 * * @param userId 用户编号 - * @param reqVO 基本信息 + * @param reqVO 基本信息 */ void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO); @@ -83,7 +83,7 @@ public interface MemberUserService { * 【会员】修改手机 * * @param userId 用户编号 - * @param reqVO 请求信息 + * @param reqVO 请求信息 */ void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO); @@ -91,7 +91,7 @@ public interface MemberUserService { * 【会员】修改密码 * * @param userId 用户编号 - * @param reqVO 请求信息 + * @param reqVO 请求信息 */ void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO); @@ -105,7 +105,7 @@ public interface MemberUserService { /** * 判断密码是否匹配 * - * @param rawPassword 未加密的密码 + * @param rawPassword 未加密的密码 * @param encodedPassword 加密后的密码 * @return 是否匹配 */ @@ -135,4 +135,27 @@ public interface MemberUserService { */ void updateUserLevel(Long id, Long levelId, Integer experience); + /** + * 获得指定用户分组下的用户数量 + * + * @param groupId 用户分组编号 + * @return 用户数量 + */ + Long getUserCountByGroupId(Long groupId); + + /** + * 获得指定用户等级下的用户数量 + * + * @param levelId 用户等级编号 + * @return 用户数量 + */ + Long getUserCountByLevelId(Long levelId); + + /** + * 获得指定会员标签下的用户数量 + * + * @param tagId 用户标签编号 + * @return 用户数量 + */ + Long getUserCountByTagId(Long tagId); } 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 cfaaf22de..152f87cad 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 @@ -239,4 +239,19 @@ public class MemberUserServiceImpl implements MemberUserService { ); } + @Override + public Long getUserCountByGroupId(Long groupId) { + return memberUserMapper.selectCountByGroupId(groupId); + } + + @Override + public Long getUserCountByLevelId(Long levelId) { + return memberUserMapper.selectCountByLevelId(levelId); + } + + @Override + public Long getUserCountByTagId(Long tagId) { + return memberUserMapper.selectCountByTagId(tagId); + } + } From dad56fd0963e46eb866923a5f39bcef3fc237b42 Mon Sep 17 00:00:00 2001 From: owen Date: Fri, 25 Aug 2023 22:21:14 +0800 Subject: [PATCH 3/5] =?UTF-8?q?trade:=201.=E6=94=AF=E4=BB=98=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=90=8E=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=8F=E9=AA=8C=EF=BC=9B2.=E9=80=80=E6=AC=BE=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=90=8E=EF=BC=8C=E6=89=A3=E5=87=8F=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=8F=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/TradeOrderUpdateServiceImpl.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index dd119a64e..2de660131 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -12,8 +12,10 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.member.api.address.AddressApi; import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; @@ -29,10 +31,10 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUp import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; @@ -57,6 +59,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -101,8 +104,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { private AddressApi addressApi; @Resource private CouponApi couponApi; + @Resource private MemberUserApi memberUserApi; + @Resource + private MemberLevelApi memberLevelApi; + @Resource private ProductCommentApi productCommentApi; @Resource @@ -336,6 +343,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // TODO 芋艿:发送站内信 // TODO 芋艿:OrderLog + + // todo 增加用户积分 + + // 增加用户经验 + addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); } /** @@ -602,6 +614,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { } // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 + + // todo 取消用户积分 + + // 取消用户经验 + reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); } @Override @@ -649,4 +666,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); } + @Async + protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { + int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); + memberLevelApi.addExperience(userId, payPrice, bizType, String.valueOf(orderId)); + } + + @Async + protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId){ + int bizType = MemberExperienceBizTypeEnum.REFUND.getType(); + memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); + } } From d4acacec60c137aa3ab916357f176f65b406d0f8 Mon Sep 17 00:00:00 2001 From: owen Date: Fri, 25 Aug 2023 23:07:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?trade:=201.=E6=94=AF=E4=BB=98=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=90=8E=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=A7=AF=E5=88=86=EF=BC=9B2.=E9=80=80=E6=AC=BE=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=90=8E=EF=BC=8C=E6=89=A3=E5=87=8F=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/TradeOrderUpdateServiceImpl.java | 25 ++++++++++---- .../module/member/api/user/MemberUserApi.java | 10 ++++++ .../member/enums/ErrorCodeConstants.java | 3 +- .../enums/MemberExperienceBizTypeEnum.java | 25 ++++++++++---- .../enums/point/MemberPointBizTypeEnum.java | 23 +++++++++++-- .../member/api/user/MemberUserApiImpl.java | 17 ++++++++++ .../service/level/MemberLevelServiceImpl.java | 3 ++ .../point/MemberPointRecordService.java | 10 ++++++ .../point/MemberPointRecordServiceImpl.java | 33 +++++++++++++++++++ .../service/user/MemberUserService.java | 8 +++++ .../service/user/MemberUserServiceImpl.java | 5 +++ 11 files changed, 146 insertions(+), 16 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 2de660131..a9f61f198 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; @@ -344,8 +345,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // TODO 芋艿:OrderLog - // todo 增加用户积分 - + // 增加用户积分 + addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); // 增加用户经验 addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); } @@ -615,9 +616,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 - // todo 取消用户积分 - - // 取消用户经验 + // 扣减用户积分 + reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); + // 扣减用户经验 reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); } @@ -673,8 +674,20 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { } @Async - protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId){ + protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId) { int bizType = MemberExperienceBizTypeEnum.REFUND.getType(); memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); } + + @Async + protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { + int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); + memberUserApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); + } + + @Async + protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { + int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); + memberUserApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); + } } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java index 5743493e3..90445ffa6 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.api.user; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import java.util.Collection; import java.util.List; @@ -57,4 +58,13 @@ public interface MemberUserApi { */ MemberUserRespDTO getUserByMobile(String mobile); + /** + * 增加用户积分 + * + * @param userId 用户编号 + * @param point 积分 + * @param bizType 业务类型 {@link MemberPointBizTypeEnum} + * @param bizId 业务编号 + */ + void addPoint(Long userId, Integer point, Integer bizType, String bizId); } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 724ba0c5e..ba283ab0c 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; /** * Member 错误码枚举类 - * + *

* member 系统,使用 1-004-000-000 段 */ public interface ErrorCodeConstants { @@ -32,6 +32,7 @@ public interface ErrorCodeConstants { //========== 积分配置 1004007000 ========== //========== 积分记录 1004008000 ========== + ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1004008000, "用户积分记录业务类型不支持"); //========== 签到配置 1004009000 ========== ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1004009000, "签到天数规则不存在"); diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java index fcd0f6e7a..a287b0cdc 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java @@ -18,17 +18,30 @@ public enum MemberExperienceBizTypeEnum { /** * 管理员调整、邀请新用户、下单、退单、签到、抽奖 */ - ADMIN(0, "管理员调整", "管理员调整获得 {} 经验"), - INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验"), - ORDER(2, "下单奖励", "下单获得 {} 经验"), - REFUND(3, "退单扣除", "退单获得 {} 经验"), - SIGN_IN(4, "签到奖励", "签到获得 {} 经验"), - LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验"), + ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", false), + INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", false), + ORDER(2, "下单奖励", "下单获得 {} 经验", false), + REFUND(3, "退单扣除", "退单获得 {} 经验", true), + SIGN_IN(4, "签到奖励", "签到获得 {} 经验", false), + LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", false), ; + /** + * 业务类型 + */ private final int type; + /** + * 标题 + */ private final String title; + /** + * 描述 + */ private final String description; + /** + * 是否为扣减积分 + */ + private final boolean isReduce; public static MemberExperienceBizTypeEnum getByType(Integer type) { return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java index 65e4c6c34..80d8fd767 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.member.enums.point; +import cn.hutool.core.util.EnumUtil; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Objects; + /** * 会员积分的业务类型枚举 * @@ -13,9 +16,9 @@ import lombok.Getter; @Getter public enum MemberPointBizTypeEnum implements IntArrayValuable { - SIGN(1, "签到"), - ORDER_BUY(10, "订单消费"), - ORDER_CANCEL(11, "订单取消"); // 退回积分 + SIGN(1, "签到", "签到获得 {} 积分", false), + ORDER_BUY(10, "订单消费", "下单获得 {} 积分", false), + ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", true); // 退回积分 /** * 类型 @@ -25,10 +28,24 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { * 名字 */ private final String name; + /** + * 描述 + */ + private final String description; + /** + * 是否为扣减积分 + */ + private final boolean isReduce; @Override public int[] array() { return new int[0]; } + + public static MemberPointBizTypeEnum getByType(Integer type) { + return EnumUtil.getBy(MemberPointBizTypeEnum.class, + e -> Objects.equals(type, e.getType())); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java index 8da857c6d..898b7fe9c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.member.api.user; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; +import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -11,6 +13,9 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; + /** * 会员用户的 API 实现类 * @@ -23,6 +28,9 @@ public class MemberUserApiImpl implements MemberUserApi { @Resource private MemberUserService userService; + @Resource + private MemberPointRecordService memberPointRecordService; + @Override public MemberUserRespDTO getUser(Long id) { MemberUserDO user = userService.getUser(id); @@ -44,4 +52,13 @@ public class MemberUserApiImpl implements MemberUserApi { return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); } + @Override + public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { + MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); + if (bizTypeEnum == null) { + throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); + } + memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java index d46465554..9169b04fd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java @@ -235,6 +235,9 @@ public class MemberLevelServiceImpl implements MemberLevelService { if (experience == 0) { return; } + if (bizType.isReduce() && experience > 0) { + experience = -experience; + } MemberUserDO user = memberUserService.getUser(userId); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordService.java index 971cb7274..74e91880f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordService.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; /** * 用户积分记录 Service 接口 @@ -29,4 +30,13 @@ public interface MemberPointRecordService { */ PageResult getPointRecordPage(Long userId, PageParam pageVO); + /** + * 创建用户积分记录 + * + * @param userId 用户ID + * @param point 变动积分 + * @param bizType 业务类型 + * @param bizId 业务编号 + */ + void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java index 52257183d..9516981bb 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java @@ -1,12 +1,18 @@ package cn.iocoder.yudao.module.member.service.point; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper; +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -33,6 +39,8 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { @Resource private MemberUserApi memberUserApi; + @Resource + private MemberUserService memberUserService; @Override public PageResult getPointRecordPage(MemberPointRecordPageReqVO pageReqVO) { @@ -55,4 +63,29 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { return recordMapper.selectPage(userId, pageVO); } + @Override + public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) { + if (bizType.isReduce() && point > 0) { + point = -point; + } + + MemberUserDO user = memberUserService.getUser(userId); + Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); + // 用户变动后的积分,防止扣出负数 + Integer totalPoint = NumberUtil.max(userPoint + point, 0); + // 增加积分记录 + MemberPointRecordDO recordDO = new MemberPointRecordDO() + .setUserId(userId) + .setBizId(bizId) + .setBizType(bizType.getType()) + .setTitle(bizType.getName()) + .setDescription(StrUtil.format(bizType.getDescription(), point)) + .setPoint(point) + .setTotalPoint(totalPoint); + recordMapper.insert(recordDO); + + // 更新用户积分 + memberUserService.updateUserPoint(userId, totalPoint); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 7a0c13380..a1161d668 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -158,4 +158,12 @@ public interface MemberUserService { * @return 用户数量 */ Long getUserCountByTagId(Long tagId); + + /** + * 更新用户的积分 + * + * @param userId 用户ID + * @param point 积分数量 + */ + void updateUserPoint(Long userId, Integer point); } 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 152f87cad..c5b674cc8 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 @@ -254,4 +254,9 @@ public class MemberUserServiceImpl implements MemberUserService { return memberUserMapper.selectCountByTagId(tagId); } + @Override + public void updateUserPoint(Long userId, Integer point) { + memberUserMapper.updateById(new MemberUserDO().setId(userId).setPoint(point)); + } + } From fd126ba2f7ed54111ea9d2187aa86d7a39983d85 Mon Sep 17 00:00:00 2001 From: owen Date: Fri, 25 Aug 2023 23:14:27 +0800 Subject: [PATCH 5/5] =?UTF-8?q?member:=20=E6=A0=B9=E6=8D=AE=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E9=85=8D=E7=BD=AE=E7=9A=84=E6=AF=94=E4=BE=8B=EF=BC=8C?= =?UTF-8?q?=E6=8D=A2=E7=AE=97=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/MemberPointRecordServiceImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java index 9516981bb..1ffc38809 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java @@ -8,11 +8,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointConfigDO; import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper; import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -30,12 +32,15 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. * * @author QingX */ +@Slf4j @Service @Validated public class MemberPointRecordServiceImpl implements MemberPointRecordService { @Resource private MemberPointRecordMapper recordMapper; + @Resource + private MemberPointConfigService memberPointConfigService; @Resource private MemberUserApi memberUserApi; @@ -65,6 +70,15 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { @Override public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) { + MemberPointConfigDO pointConfig = memberPointConfigService.getPointConfig(); + if (pointConfig == null || pointConfig.getTradeGivePoint() == null) { + log.warn("增加积分失败:积分配置”1 元赠送多少分“未设置, userId={}, point={}, bizType={}, bizId={}", + userId, point, bizType.getType(), bizId); + return; + } + + // 根据配置的比例,换算实际的积分 + point = point * pointConfig.getTradeGivePoint(); if (bizType.isReduce() && point > 0) { point = -point; }