Commit f8952f8e348ba10a3c0f1e9bfee1d50ba69408fb
Committed by
Gitee
!591 商品:完善商品评论功能
Merge pull request !591 from 疯狂的世界/owen_dev
Showing
21 changed files
with
318 additions
and
52 deletions
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; | @@ -5,7 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; | 5 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; |
| 6 | import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; | 6 | import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; |
| 7 | import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; | 7 | import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; |
| 8 | +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | ||
| 8 | import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; | 9 | import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; |
| 10 | +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | ||
| 9 | import io.swagger.v3.oas.annotations.Operation; | 11 | import io.swagger.v3.oas.annotations.Operation; |
| 10 | import io.swagger.v3.oas.annotations.tags.Tag; | 12 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 11 | import org.springframework.security.access.prepost.PreAuthorize; | 13 | import org.springframework.security.access.prepost.PreAuthorize; |
| @@ -14,8 +16,10 @@ import org.springframework.web.bind.annotation.*; | @@ -14,8 +16,10 @@ import org.springframework.web.bind.annotation.*; | ||
| 14 | 16 | ||
| 15 | import javax.annotation.Resource; | 17 | import javax.annotation.Resource; |
| 16 | import javax.validation.Valid; | 18 | import javax.validation.Valid; |
| 19 | +import java.util.List; | ||
| 17 | 20 | ||
| 18 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 22 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||
| 19 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 23 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 20 | 24 | ||
| 21 | @Tag(name = "管理后台 - 商品评价") | 25 | @Tag(name = "管理后台 - 商品评价") |
| @@ -26,13 +30,19 @@ public class ProductCommentController { | @@ -26,13 +30,19 @@ public class ProductCommentController { | ||
| 26 | 30 | ||
| 27 | @Resource | 31 | @Resource |
| 28 | private ProductCommentService productCommentService; | 32 | private ProductCommentService productCommentService; |
| 33 | + @Resource | ||
| 34 | + private ProductSkuService productSkuService; | ||
| 29 | 35 | ||
| 30 | @GetMapping("/page") | 36 | @GetMapping("/page") |
| 31 | @Operation(summary = "获得商品评价分页") | 37 | @Operation(summary = "获得商品评价分页") |
| 32 | @PreAuthorize("@ss.hasPermission('product:comment:query')") | 38 | @PreAuthorize("@ss.hasPermission('product:comment:query')") |
| 33 | public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { | 39 | public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { |
| 34 | PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO); | 40 | PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO); |
| 35 | - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult)); | 41 | + |
| 42 | + List<ProductSkuDO> skuList = productSkuService.getSkuList( | ||
| 43 | + convertSet(pageResult.getList(), ProductCommentDO::getSkuId)); | ||
| 44 | + | ||
| 45 | + return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList)); | ||
| 36 | } | 46 | } |
| 37 | 47 | ||
| 38 | @PutMapping("/update-visible") | 48 | @PutMapping("/update-visible") |
| @@ -51,7 +61,7 @@ public class ProductCommentController { | @@ -51,7 +61,7 @@ public class ProductCommentController { | ||
| 51 | return success(true); | 61 | return success(true); |
| 52 | } | 62 | } |
| 53 | 63 | ||
| 54 | - @PutMapping("/create") | 64 | + @PostMapping("/create") |
| 55 | @Operation(summary = "添加自评") | 65 | @Operation(summary = "添加自评") |
| 56 | @PreAuthorize("@ss.hasPermission('product:comment:update')") | 66 | @PreAuthorize("@ss.hasPermission('product:comment:update')") |
| 57 | public CommonResult<Boolean> createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) { | 67 | public CommonResult<Boolean> createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) { |
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; | @@ -11,11 +11,9 @@ import java.util.List; | ||
| 11 | public class ProductCommentBaseVO { | 11 | public class ProductCommentBaseVO { |
| 12 | 12 | ||
| 13 | @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868") | 13 | @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868") |
| 14 | - @NotNull(message = "评价人不能为空") | ||
| 15 | private Long userId; | 14 | private Long userId; |
| 16 | 15 | ||
| 17 | @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292") | 16 | @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292") |
| 18 | - @NotNull(message = "评价订单项不能为空") | ||
| 19 | private Long orderItemId; | 17 | private Long orderItemId; |
| 20 | 18 | ||
| 21 | @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉") | 19 | @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉") |
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 { | @@ -52,4 +52,6 @@ public class ProductCommentRespVO extends ProductCommentBaseVO { | ||
| 52 | @NotNull(message = "商品 SPU 名称不能为空") | 52 | @NotNull(message = "商品 SPU 名称不能为空") |
| 53 | private String spuName; | 53 | private String spuName; |
| 54 | 54 | ||
| 55 | + @Schema(description = "商品 SKU 图片地址", example = "https://www.iocoder.cn/yudao.jpg") | ||
| 56 | + private String skuPicUrl; | ||
| 55 | } | 57 | } |
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; | @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.product.convert.comment; | ||
| 3 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 6 | -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||
| 7 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 6 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 8 | import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; | 7 | import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; |
| 9 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; | 8 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; |
| @@ -23,6 +22,11 @@ import java.math.BigDecimal; | @@ -23,6 +22,11 @@ import java.math.BigDecimal; | ||
| 23 | import java.math.RoundingMode; | 22 | import java.math.RoundingMode; |
| 24 | import java.util.List; | 23 | import java.util.List; |
| 25 | import java.util.Map; | 24 | import java.util.Map; |
| 25 | +import java.util.Objects; | ||
| 26 | +import java.util.stream.Collectors; | ||
| 27 | + | ||
| 28 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||
| 29 | +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; | ||
| 26 | 30 | ||
| 27 | /** | 31 | /** |
| 28 | * 商品评价 Convert | 32 | * 商品评价 Convert |
| @@ -60,7 +64,7 @@ public interface ProductCommentConvert { | @@ -60,7 +64,7 @@ public interface ProductCommentConvert { | ||
| 60 | item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS); | 64 | item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS); |
| 61 | } | 65 | } |
| 62 | // 设置 SKU 规格值 | 66 | // 设置 SKU 规格值 |
| 63 | - MapUtils.findAndThen(skuMap, item.getSkuId(), | 67 | + findAndThen(skuMap, item.getSkuId(), |
| 64 | sku -> item.setSkuProperties(convertList01(sku.getProperties()))); | 68 | sku -> item.setSkuProperties(convertList01(sku.getProperties()))); |
| 65 | }); | 69 | }); |
| 66 | return page; | 70 | return page; |
| @@ -101,6 +105,8 @@ public interface ProductCommentConvert { | @@ -101,6 +105,8 @@ public interface ProductCommentConvert { | ||
| 101 | return commentDO; | 105 | return commentDO; |
| 102 | } | 106 | } |
| 103 | 107 | ||
| 108 | + @Mapping(target = "visible", constant = "true") | ||
| 109 | + @Mapping(target = "replyStatus", constant = "false") | ||
| 104 | @Mapping(target = "userId", constant = "0L") | 110 | @Mapping(target = "userId", constant = "0L") |
| 105 | @Mapping(target = "orderId", constant = "0L") | 111 | @Mapping(target = "orderId", constant = "0L") |
| 106 | @Mapping(target = "orderItemId", constant = "0L") | 112 | @Mapping(target = "orderItemId", constant = "0L") |
| @@ -111,4 +117,30 @@ public interface ProductCommentConvert { | @@ -111,4 +117,30 @@ public interface ProductCommentConvert { | ||
| 111 | 117 | ||
| 112 | List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list); | 118 | List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list); |
| 113 | 119 | ||
| 120 | + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO) { | ||
| 121 | + ProductCommentDO commentDO = convert(createReq); | ||
| 122 | + if (spuDO != null) { | ||
| 123 | + commentDO.setSpuId(spuDO.getId()); | ||
| 124 | + commentDO.setSpuName(spuDO.getName()); | ||
| 125 | + } | ||
| 126 | + return commentDO; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + default PageResult<ProductCommentRespVO> convertPage(PageResult<ProductCommentDO> pageResult, List<ProductSkuDO> skuList) { | ||
| 130 | + Map<Long, ProductSkuDO> skuMap = convertMap(skuList, ProductSkuDO::getId); | ||
| 131 | + | ||
| 132 | + PageResult<ProductCommentRespVO> result = convertPage(pageResult); | ||
| 133 | + for (ProductCommentRespVO vo : result.getList()) { | ||
| 134 | + findAndThen(skuMap, vo.getSkuId(), sku -> { | ||
| 135 | + String propertyNames = sku.getProperties().stream() | ||
| 136 | + .map(ProductSkuDO.Property::getValueName) | ||
| 137 | + .filter(Objects::nonNull) | ||
| 138 | + .collect(Collectors.joining(" ")); | ||
| 139 | + | ||
| 140 | + vo.setSkuPicUrl(sku.getPicUrl()); | ||
| 141 | + vo.setSpuName(vo.getSpuName() + " " + propertyNames); | ||
| 142 | + }); | ||
| 143 | + } | ||
| 144 | + return result; | ||
| 145 | + } | ||
| 114 | } | 146 | } |
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<ProductCommentDO> { | @@ -20,6 +20,7 @@ public interface ProductCommentMapper extends BaseMapperX<ProductCommentDO> { | ||
| 20 | .eqIfPresent(ProductCommentDO::getOrderId, reqVO.getOrderId()) | 20 | .eqIfPresent(ProductCommentDO::getOrderId, reqVO.getOrderId()) |
| 21 | .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId()) | 21 | .eqIfPresent(ProductCommentDO::getSpuId, reqVO.getSpuId()) |
| 22 | .eqIfPresent(ProductCommentDO::getScores, reqVO.getScores()) | 22 | .eqIfPresent(ProductCommentDO::getScores, reqVO.getScores()) |
| 23 | + .eqIfPresent(ProductCommentDO::getReplyStatus, reqVO.getReplyStatus()) | ||
| 23 | .betweenIfPresent(ProductCommentDO::getCreateTime, reqVO.getCreateTime()) | 24 | .betweenIfPresent(ProductCommentDO::getCreateTime, reqVO.getCreateTime()) |
| 24 | .likeIfPresent(ProductCommentDO::getSpuName, reqVO.getSpuName()) | 25 | .likeIfPresent(ProductCommentDO::getSpuName, reqVO.getSpuName()) |
| 25 | .orderByDesc(ProductCommentDO::getId)); | 26 | .orderByDesc(ProductCommentDO::getId)); |
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 { | @@ -80,23 +80,18 @@ public class ProductCommentServiceImpl implements ProductCommentService { | ||
| 80 | @Override | 80 | @Override |
| 81 | @Transactional(rollbackFor = Exception.class) | 81 | @Transactional(rollbackFor = Exception.class) |
| 82 | public void createComment(ProductCommentCreateReqVO createReqVO) { | 82 | public void createComment(ProductCommentCreateReqVO createReqVO) { |
| 83 | - // 校验评论 | ||
| 84 | - validateComment(createReqVO.getSkuId(), createReqVO.getUserId(), createReqVO.getOrderItemId()); | 83 | + // 校验商品 |
| 84 | + ProductSpuDO spuDO = validateProduct(createReqVO.getSkuId()); | ||
| 85 | 85 | ||
| 86 | - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO); | 86 | + ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO); |
| 87 | productCommentMapper.insert(commentDO); | 87 | productCommentMapper.insert(commentDO); |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | @Override | 90 | @Override |
| 91 | @Transactional(rollbackFor = Exception.class) | 91 | @Transactional(rollbackFor = Exception.class) |
| 92 | public Long createComment(ProductCommentCreateReqDTO createReqDTO) { | 92 | public Long createComment(ProductCommentCreateReqDTO createReqDTO) { |
| 93 | - // 通过 sku ID 拿到 spu 相关信息 | ||
| 94 | - ProductSkuDO sku = productSkuService.getSku(createReqDTO.getSkuId()); | ||
| 95 | - if (sku == null) { | ||
| 96 | - throw exception(SKU_NOT_EXISTS); | ||
| 97 | - } | ||
| 98 | - // 校验 spu 如果存在返回详情 | ||
| 99 | - ProductSpuDO spuDO = validateSpu(sku.getSpuId()); | 93 | + // 校验商品 |
| 94 | + ProductSpuDO spuDO = validateProduct(createReqDTO.getSkuId()); | ||
| 100 | // 校验评论 | 95 | // 校验评论 |
| 101 | validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId()); | 96 | validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId()); |
| 102 | // 获取用户详细信息 | 97 | // 获取用户详细信息 |
| @@ -116,6 +111,21 @@ public class ProductCommentServiceImpl implements ProductCommentService { | @@ -116,6 +111,21 @@ public class ProductCommentServiceImpl implements ProductCommentService { | ||
| 116 | } | 111 | } |
| 117 | } | 112 | } |
| 118 | 113 | ||
| 114 | + private ProductSpuDO validateProduct(Long skuId) { | ||
| 115 | + // 通过 sku ID 拿到 spu 相关信息 | ||
| 116 | + ProductSkuDO sku = validateSku(skuId); | ||
| 117 | + // 校验 spu 如果存在返回详情 | ||
| 118 | + return validateSpu(sku.getSpuId()); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + private ProductSkuDO validateSku(Long skuId) { | ||
| 122 | + ProductSkuDO sku = productSkuService.getSku(skuId); | ||
| 123 | + if (sku == null) { | ||
| 124 | + throw exception(SKU_NOT_EXISTS); | ||
| 125 | + } | ||
| 126 | + return sku; | ||
| 127 | + } | ||
| 128 | + | ||
| 119 | private ProductSpuDO validateSpu(Long spuId) { | 129 | private ProductSpuDO validateSpu(Long spuId) { |
| 120 | ProductSpuDO spu = productSpuService.getSpu(spuId); | 130 | ProductSpuDO spu = productSpuService.getSpu(spuId); |
| 121 | if (null == spu) { | 131 | if (null == spu) { |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
| 1 | package cn.iocoder.yudao.module.product.service.sku; | 1 | package cn.iocoder.yudao.module.product.service.sku; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.collection.ListUtil; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 5 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; | 6 | import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; |
| 6 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; | 7 | import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO; |
| @@ -74,6 +75,9 @@ public class ProductSkuServiceImpl implements ProductSkuService { | @@ -74,6 +75,9 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 74 | 75 | ||
| 75 | @Override | 76 | @Override |
| 76 | public List<ProductSkuDO> getSkuList(Collection<Long> ids) { | 77 | public List<ProductSkuDO> getSkuList(Collection<Long> ids) { |
| 78 | + if (CollUtil.isEmpty(ids)) { | ||
| 79 | + return ListUtil.empty(); | ||
| 80 | + } | ||
| 77 | return productSkuMapper.selectBatchIds(ids); | 81 | return productSkuMapper.selectBatchIds(ids); |
| 78 | } | 82 | } |
| 79 | 83 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| @@ -12,8 +12,11 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | @@ -12,8 +12,11 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 12 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 12 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 13 | import cn.iocoder.yudao.module.member.api.address.AddressApi; | 13 | import cn.iocoder.yudao.module.member.api.address.AddressApi; |
| 14 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; | 14 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; |
| 15 | +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | ||
| 15 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 16 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| 16 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 17 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 18 | +import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | ||
| 19 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 17 | import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; | 20 | import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; |
| 18 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; | 21 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; |
| 19 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; | 22 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; |
| @@ -29,10 +32,10 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUp | @@ -29,10 +32,10 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUp | ||
| 29 | import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; | 32 | import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; |
| 30 | import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; | 33 | import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; |
| 31 | import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; | 34 | import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; |
| 32 | -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; | ||
| 33 | -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; | ||
| 34 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; | 35 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; |
| 35 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; | 36 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; |
| 37 | +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; | ||
| 38 | +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO; | ||
| 36 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; | 39 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; |
| 37 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; | 40 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; |
| 38 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; | 41 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; |
| @@ -57,6 +60,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | @@ -57,6 +60,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | ||
| 57 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | 60 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| 58 | import lombok.extern.slf4j.Slf4j; | 61 | import lombok.extern.slf4j.Slf4j; |
| 59 | import org.jetbrains.annotations.NotNull; | 62 | import org.jetbrains.annotations.NotNull; |
| 63 | +import org.springframework.scheduling.annotation.Async; | ||
| 60 | import org.springframework.stereotype.Service; | 64 | import org.springframework.stereotype.Service; |
| 61 | import org.springframework.transaction.annotation.Transactional; | 65 | import org.springframework.transaction.annotation.Transactional; |
| 62 | 66 | ||
| @@ -101,9 +105,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -101,9 +105,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 101 | private AddressApi addressApi; | 105 | private AddressApi addressApi; |
| 102 | @Resource | 106 | @Resource |
| 103 | private CouponApi couponApi; | 107 | private CouponApi couponApi; |
| 108 | + | ||
| 104 | @Resource | 109 | @Resource |
| 105 | private MemberUserApi memberUserApi; | 110 | private MemberUserApi memberUserApi; |
| 106 | @Resource | 111 | @Resource |
| 112 | + private MemberLevelApi memberLevelApi; | ||
| 113 | + | ||
| 114 | + @Resource | ||
| 107 | private ProductCommentApi productCommentApi; | 115 | private ProductCommentApi productCommentApi; |
| 108 | @Resource | 116 | @Resource |
| 109 | private TradeMessageService tradeMessageService; | 117 | private TradeMessageService tradeMessageService; |
| @@ -336,6 +344,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -336,6 +344,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 336 | // TODO 芋艿:发送站内信 | 344 | // TODO 芋艿:发送站内信 |
| 337 | 345 | ||
| 338 | // TODO 芋艿:OrderLog | 346 | // TODO 芋艿:OrderLog |
| 347 | + | ||
| 348 | + // 增加用户积分 | ||
| 349 | + addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); | ||
| 350 | + // 增加用户经验 | ||
| 351 | + addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); | ||
| 339 | } | 352 | } |
| 340 | 353 | ||
| 341 | /** | 354 | /** |
| @@ -602,6 +615,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -602,6 +615,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 602 | } | 615 | } |
| 603 | 616 | ||
| 604 | // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 | 617 | // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 |
| 618 | + | ||
| 619 | + // 扣减用户积分 | ||
| 620 | + reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); | ||
| 621 | + // 扣减用户经验 | ||
| 622 | + reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); | ||
| 605 | } | 623 | } |
| 606 | 624 | ||
| 607 | @Override | 625 | @Override |
| @@ -649,4 +667,27 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -649,4 +667,27 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 649 | TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); | 667 | TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); |
| 650 | } | 668 | } |
| 651 | 669 | ||
| 670 | + @Async | ||
| 671 | + protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { | ||
| 672 | + int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); | ||
| 673 | + memberLevelApi.addExperience(userId, payPrice, bizType, String.valueOf(orderId)); | ||
| 674 | + } | ||
| 675 | + | ||
| 676 | + @Async | ||
| 677 | + protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId) { | ||
| 678 | + int bizType = MemberExperienceBizTypeEnum.REFUND.getType(); | ||
| 679 | + memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); | ||
| 680 | + } | ||
| 681 | + | ||
| 682 | + @Async | ||
| 683 | + protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { | ||
| 684 | + int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); | ||
| 685 | + memberUserApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); | ||
| 686 | + } | ||
| 687 | + | ||
| 688 | + @Async | ||
| 689 | + protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { | ||
| 690 | + int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); | ||
| 691 | + memberUserApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); | ||
| 692 | + } | ||
| 652 | } | 693 | } |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
| 1 | package cn.iocoder.yudao.module.member.api.user; | 1 | package cn.iocoder.yudao.module.member.api.user; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 4 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 4 | 5 | ||
| 5 | import java.util.Collection; | 6 | import java.util.Collection; |
| 6 | import java.util.List; | 7 | import java.util.List; |
| @@ -57,4 +58,13 @@ public interface MemberUserApi { | @@ -57,4 +58,13 @@ public interface MemberUserApi { | ||
| 57 | */ | 58 | */ |
| 58 | MemberUserRespDTO getUserByMobile(String mobile); | 59 | MemberUserRespDTO getUserByMobile(String mobile); |
| 59 | 60 | ||
| 61 | + /** | ||
| 62 | + * 增加用户积分 | ||
| 63 | + * | ||
| 64 | + * @param userId 用户编号 | ||
| 65 | + * @param point 积分 | ||
| 66 | + * @param bizType 业务类型 {@link MemberPointBizTypeEnum} | ||
| 67 | + * @param bizId 业务编号 | ||
| 68 | + */ | ||
| 69 | + void addPoint(Long userId, Integer point, Integer bizType, String bizId); | ||
| 60 | } | 70 | } |
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; | @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; | ||
| 4 | 4 | ||
| 5 | /** | 5 | /** |
| 6 | * Member 错误码枚举类 | 6 | * Member 错误码枚举类 |
| 7 | - * | 7 | + * <p> |
| 8 | * member 系统,使用 1-004-000-000 段 | 8 | * member 系统,使用 1-004-000-000 段 |
| 9 | */ | 9 | */ |
| 10 | public interface ErrorCodeConstants { | 10 | public interface ErrorCodeConstants { |
| @@ -32,6 +32,7 @@ public interface ErrorCodeConstants { | @@ -32,6 +32,7 @@ public interface ErrorCodeConstants { | ||
| 32 | //========== 积分配置 1004007000 ========== | 32 | //========== 积分配置 1004007000 ========== |
| 33 | 33 | ||
| 34 | //========== 积分记录 1004008000 ========== | 34 | //========== 积分记录 1004008000 ========== |
| 35 | + ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1004008000, "用户积分记录业务类型不支持"); | ||
| 35 | 36 | ||
| 36 | //========== 签到配置 1004009000 ========== | 37 | //========== 签到配置 1004009000 ========== |
| 37 | ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1004009000, "签到天数规则不存在"); | 38 | ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1004009000, "签到天数规则不存在"); |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
| 1 | package cn.iocoder.yudao.module.member.enums; | 1 | package cn.iocoder.yudao.module.member.enums; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.EnumUtil; | ||
| 3 | import lombok.AllArgsConstructor; | 4 | import lombok.AllArgsConstructor; |
| 4 | import lombok.Getter; | 5 | import lombok.Getter; |
| 5 | 6 | ||
| 7 | +import java.util.Objects; | ||
| 8 | + | ||
| 6 | /** | 9 | /** |
| 7 | * 会员经验 - 业务类型 | 10 | * 会员经验 - 业务类型 |
| 8 | * | 11 | * |
| @@ -15,16 +18,33 @@ public enum MemberExperienceBizTypeEnum { | @@ -15,16 +18,33 @@ public enum MemberExperienceBizTypeEnum { | ||
| 15 | /** | 18 | /** |
| 16 | * 管理员调整、邀请新用户、下单、退单、签到、抽奖 | 19 | * 管理员调整、邀请新用户、下单、退单、签到、抽奖 |
| 17 | */ | 20 | */ |
| 18 | - ADMIN(0, "管理员调整","管理员调整获得 {} 经验"), | ||
| 19 | - INVITE_REGISTER(1, "邀新奖励","邀请好友获得 {} 经验"), | ||
| 20 | - ORDER(2, "下单奖励", "下单获得 {} 经验"), | ||
| 21 | - REFUND(3, "退单扣除","退单获得 {} 经验"), | ||
| 22 | - SIGN_IN(4, "签到奖励","签到获得 {} 经验"), | ||
| 23 | - LOTTERY(5, "抽奖奖励","抽奖获得 {} 经验"), | 21 | + ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", false), |
| 22 | + INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", false), | ||
| 23 | + ORDER(2, "下单奖励", "下单获得 {} 经验", false), | ||
| 24 | + REFUND(3, "退单扣除", "退单获得 {} 经验", true), | ||
| 25 | + SIGN_IN(4, "签到奖励", "签到获得 {} 经验", false), | ||
| 26 | + LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", false), | ||
| 24 | ; | 27 | ; |
| 25 | 28 | ||
| 29 | + /** | ||
| 30 | + * 业务类型 | ||
| 31 | + */ | ||
| 26 | private final int type; | 32 | private final int type; |
| 33 | + /** | ||
| 34 | + * 标题 | ||
| 35 | + */ | ||
| 27 | private final String title; | 36 | private final String title; |
| 37 | + /** | ||
| 38 | + * 描述 | ||
| 39 | + */ | ||
| 28 | private final String description; | 40 | private final String description; |
| 41 | + /** | ||
| 42 | + * 是否为扣减积分 | ||
| 43 | + */ | ||
| 44 | + private final boolean isReduce; | ||
| 29 | 45 | ||
| 46 | + public static MemberExperienceBizTypeEnum getByType(Integer type) { | ||
| 47 | + return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, | ||
| 48 | + e -> Objects.equals(type, e.getType())); | ||
| 49 | + } | ||
| 30 | } | 50 | } |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
| 1 | package cn.iocoder.yudao.module.member.enums.point; | 1 | package cn.iocoder.yudao.module.member.enums.point; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.EnumUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | 4 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; |
| 4 | import lombok.AllArgsConstructor; | 5 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Getter; | 6 | import lombok.Getter; |
| 6 | 7 | ||
| 8 | +import java.util.Objects; | ||
| 9 | + | ||
| 7 | /** | 10 | /** |
| 8 | * 会员积分的业务类型枚举 | 11 | * 会员积分的业务类型枚举 |
| 9 | * | 12 | * |
| @@ -13,9 +16,9 @@ import lombok.Getter; | @@ -13,9 +16,9 @@ import lombok.Getter; | ||
| 13 | @Getter | 16 | @Getter |
| 14 | public enum MemberPointBizTypeEnum implements IntArrayValuable { | 17 | public enum MemberPointBizTypeEnum implements IntArrayValuable { |
| 15 | 18 | ||
| 16 | - SIGN(1, "签到"), | ||
| 17 | - ORDER_BUY(10, "订单消费"), | ||
| 18 | - ORDER_CANCEL(11, "订单取消"); // 退回积分 | 19 | + SIGN(1, "签到", "签到获得 {} 积分", false), |
| 20 | + ORDER_BUY(10, "订单消费", "下单获得 {} 积分", false), | ||
| 21 | + ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", true); // 退回积分 | ||
| 19 | 22 | ||
| 20 | /** | 23 | /** |
| 21 | * 类型 | 24 | * 类型 |
| @@ -25,10 +28,24 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { | @@ -25,10 +28,24 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { | ||
| 25 | * 名字 | 28 | * 名字 |
| 26 | */ | 29 | */ |
| 27 | private final String name; | 30 | private final String name; |
| 31 | + /** | ||
| 32 | + * 描述 | ||
| 33 | + */ | ||
| 34 | + private final String description; | ||
| 35 | + /** | ||
| 36 | + * 是否为扣减积分 | ||
| 37 | + */ | ||
| 38 | + private final boolean isReduce; | ||
| 28 | 39 | ||
| 29 | @Override | 40 | @Override |
| 30 | public int[] array() { | 41 | public int[] array() { |
| 31 | return new int[0]; | 42 | return new int[0]; |
| 32 | } | 43 | } |
| 33 | 44 | ||
| 45 | + | ||
| 46 | + public static MemberPointBizTypeEnum getByType(Integer type) { | ||
| 47 | + return EnumUtil.getBy(MemberPointBizTypeEnum.class, | ||
| 48 | + e -> Objects.equals(type, e.getType())); | ||
| 49 | + } | ||
| 50 | + | ||
| 34 | } | 51 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
| 1 | package cn.iocoder.yudao.module.member.api.level; | 1 | package cn.iocoder.yudao.module.member.api.level; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.util.EnumUtil; | ||
| 4 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | 3 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; |
| 5 | import cn.iocoder.yudao.module.member.service.level.MemberLevelService; | 4 | import cn.iocoder.yudao.module.member.service.level.MemberLevelService; |
| 6 | import org.springframework.stereotype.Service; | 5 | import org.springframework.stereotype.Service; |
| 7 | import org.springframework.validation.annotation.Validated; | 6 | import org.springframework.validation.annotation.Validated; |
| 8 | 7 | ||
| 9 | import javax.annotation.Resource; | 8 | import javax.annotation.Resource; |
| 10 | -import java.util.Objects; | ||
| 11 | 9 | ||
| 12 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 10 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 13 | import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT; | 11 | import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT; |
| @@ -26,9 +24,7 @@ public class MemberLevelApiImpl implements MemberLevelApi { | @@ -26,9 +24,7 @@ public class MemberLevelApiImpl implements MemberLevelApi { | ||
| 26 | 24 | ||
| 27 | @Override | 25 | @Override |
| 28 | public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) { | 26 | public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) { |
| 29 | - // TODO @疯狂:可以在 MemberExperienceBizTypeEnum 增加一个方法,获得哈。 | ||
| 30 | - MemberExperienceBizTypeEnum bizTypeEnum = EnumUtil.getBy(MemberExperienceBizTypeEnum.class, | ||
| 31 | - e -> Objects.equals(bizType, e.getType())); | 27 | + MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType); |
| 32 | if (bizTypeEnum == null) { | 28 | if (bizTypeEnum == null) { |
| 33 | throw exception(EXPERIENCE_BIZ_NOT_SUPPORT); | 29 | throw exception(EXPERIENCE_BIZ_NOT_SUPPORT); |
| 34 | } | 30 | } |
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; | @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.member.api.user; | ||
| 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 4 | import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; | 4 | import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; |
| 5 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 5 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 6 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 7 | +import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; | ||
| 6 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; | 8 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 7 | import org.springframework.stereotype.Service; | 9 | import org.springframework.stereotype.Service; |
| 8 | import org.springframework.validation.annotation.Validated; | 10 | import org.springframework.validation.annotation.Validated; |
| @@ -11,6 +13,9 @@ import javax.annotation.Resource; | @@ -11,6 +13,9 @@ import javax.annotation.Resource; | ||
| 11 | import java.util.Collection; | 13 | import java.util.Collection; |
| 12 | import java.util.List; | 14 | import java.util.List; |
| 13 | 15 | ||
| 16 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 17 | +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; | ||
| 18 | + | ||
| 14 | /** | 19 | /** |
| 15 | * 会员用户的 API 实现类 | 20 | * 会员用户的 API 实现类 |
| 16 | * | 21 | * |
| @@ -23,6 +28,9 @@ public class MemberUserApiImpl implements MemberUserApi { | @@ -23,6 +28,9 @@ public class MemberUserApiImpl implements MemberUserApi { | ||
| 23 | @Resource | 28 | @Resource |
| 24 | private MemberUserService userService; | 29 | private MemberUserService userService; |
| 25 | 30 | ||
| 31 | + @Resource | ||
| 32 | + private MemberPointRecordService memberPointRecordService; | ||
| 33 | + | ||
| 26 | @Override | 34 | @Override |
| 27 | public MemberUserRespDTO getUser(Long id) { | 35 | public MemberUserRespDTO getUser(Long id) { |
| 28 | MemberUserDO user = userService.getUser(id); | 36 | MemberUserDO user = userService.getUser(id); |
| @@ -44,4 +52,13 @@ public class MemberUserApiImpl implements MemberUserApi { | @@ -44,4 +52,13 @@ public class MemberUserApiImpl implements MemberUserApi { | ||
| 44 | return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); | 52 | return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); |
| 45 | } | 53 | } |
| 46 | 54 | ||
| 55 | + @Override | ||
| 56 | + public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { | ||
| 57 | + MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); | ||
| 58 | + if (bizTypeEnum == null) { | ||
| 59 | + throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); | ||
| 60 | + } | ||
| 61 | + memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); | ||
| 62 | + } | ||
| 63 | + | ||
| 47 | } | 64 | } |
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 | @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdat | ||
| 9 | import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert; | 9 | import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert; |
| 10 | import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; | 10 | import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; |
| 11 | import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; | 11 | import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; |
| 12 | -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; | 12 | +import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 13 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 14 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 15 | 15 | ||
| @@ -33,7 +33,7 @@ public class MemberGroupServiceImpl implements MemberGroupService { | @@ -33,7 +33,7 @@ public class MemberGroupServiceImpl implements MemberGroupService { | ||
| 33 | @Resource | 33 | @Resource |
| 34 | private MemberGroupMapper groupMapper; | 34 | private MemberGroupMapper groupMapper; |
| 35 | @Resource | 35 | @Resource |
| 36 | - private MemberUserMapper memberUserMapper; | 36 | + private MemberUserService memberUserService; |
| 37 | 37 | ||
| 38 | @Override | 38 | @Override |
| 39 | public Long createGroup(MemberGroupCreateReqVO createReqVO) { | 39 | public Long createGroup(MemberGroupCreateReqVO createReqVO) { |
| @@ -69,9 +69,8 @@ public class MemberGroupServiceImpl implements MemberGroupService { | @@ -69,9 +69,8 @@ public class MemberGroupServiceImpl implements MemberGroupService { | ||
| 69 | } | 69 | } |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | - // TODO @疯狂:不要直接调用 memberUserMapper,需要对方 service 提供方法 | ||
| 73 | void validateGroupHasUser(Long id) { | 72 | void validateGroupHasUser(Long id) { |
| 74 | - Long count = memberUserMapper.selectCountByGroupId(id); | 73 | + Long count = memberUserService.getUserCountByGroupId(id); |
| 75 | if (count > 0) { | 74 | if (count > 0) { |
| 76 | throw exception(GROUP_HAS_USER); | 75 | throw exception(GROUP_HAS_USER); |
| 77 | } | 76 | } |
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; | @@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; | ||
| 14 | import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO; | 14 | import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO; |
| 15 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 15 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 16 | import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; | 16 | import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; |
| 17 | -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; | ||
| 18 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | 17 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; |
| 19 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; | 18 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 20 | import com.google.common.annotations.VisibleForTesting; | 19 | import com.google.common.annotations.VisibleForTesting; |
| @@ -49,8 +48,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { | @@ -49,8 +48,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||
| 49 | @Resource | 48 | @Resource |
| 50 | private MemberExperienceRecordService memberExperienceRecordService; | 49 | private MemberExperienceRecordService memberExperienceRecordService; |
| 51 | @Resource | 50 | @Resource |
| 52 | - private MemberUserMapper memberUserMapper; | ||
| 53 | - @Resource | ||
| 54 | private MemberUserService memberUserService; | 51 | private MemberUserService memberUserService; |
| 55 | 52 | ||
| 56 | @Override | 53 | @Override |
| @@ -157,7 +154,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | @@ -157,7 +154,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||
| 157 | // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper | 154 | // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper |
| 158 | @VisibleForTesting | 155 | @VisibleForTesting |
| 159 | void validateLevelHasUser(Long id) { | 156 | void validateLevelHasUser(Long id) { |
| 160 | - Long count = memberUserMapper.selectCountByLevelId(id); | 157 | + Long count = memberUserService.getUserCountByLevelId(id); |
| 161 | if (count > 0) { | 158 | if (count > 0) { |
| 162 | throw exception(LEVEL_HAS_USER); | 159 | throw exception(LEVEL_HAS_USER); |
| 163 | } | 160 | } |
| @@ -238,8 +235,11 @@ public class MemberLevelServiceImpl implements MemberLevelService { | @@ -238,8 +235,11 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||
| 238 | if (experience == 0) { | 235 | if (experience == 0) { |
| 239 | return; | 236 | return; |
| 240 | } | 237 | } |
| 238 | + if (bizType.isReduce() && experience > 0) { | ||
| 239 | + experience = -experience; | ||
| 240 | + } | ||
| 241 | 241 | ||
| 242 | - MemberUserDO user = memberUserMapper.selectById(userId); | 242 | + MemberUserDO user = memberUserService.getUser(userId); |
| 243 | 243 | ||
| 244 | int userExperience = NumberUtil.max(user.getExperience() + experience, 0); | 244 | int userExperience = NumberUtil.max(user.getExperience() + experience, 0); |
| 245 | MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() | 245 | MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() |
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; | @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; | 5 | import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; |
| 6 | import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; | 6 | import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; |
| 7 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 7 | 8 | ||
| 8 | /** | 9 | /** |
| 9 | * 用户积分记录 Service 接口 | 10 | * 用户积分记录 Service 接口 |
| @@ -29,4 +30,13 @@ public interface MemberPointRecordService { | @@ -29,4 +30,13 @@ public interface MemberPointRecordService { | ||
| 29 | */ | 30 | */ |
| 30 | PageResult<MemberPointRecordDO> getPointRecordPage(Long userId, PageParam pageVO); | 31 | PageResult<MemberPointRecordDO> getPointRecordPage(Long userId, PageParam pageVO); |
| 31 | 32 | ||
| 33 | + /** | ||
| 34 | + * 创建用户积分记录 | ||
| 35 | + * | ||
| 36 | + * @param userId 用户ID | ||
| 37 | + * @param point 变动积分 | ||
| 38 | + * @param bizType 业务类型 | ||
| 39 | + * @param bizId 业务编号 | ||
| 40 | + */ | ||
| 41 | + void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId); | ||
| 32 | } | 42 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java
| 1 | package cn.iocoder.yudao.module.member.service.point; | 1 | package cn.iocoder.yudao.module.member.service.point; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.NumberUtil; | ||
| 4 | +import cn.hutool.core.util.ObjectUtil; | ||
| 5 | +import cn.hutool.core.util.StrUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 8 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| 6 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 9 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 7 | import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; | 10 | import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; |
| 11 | +import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointConfigDO; | ||
| 8 | import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; | 12 | import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO; |
| 13 | +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | ||
| 9 | import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper; | 14 | import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper; |
| 15 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 16 | +import cn.iocoder.yudao.module.member.service.user.MemberUserService; | ||
| 17 | +import lombok.extern.slf4j.Slf4j; | ||
| 10 | import org.apache.commons.lang3.StringUtils; | 18 | import org.apache.commons.lang3.StringUtils; |
| 11 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 12 | import org.springframework.util.CollectionUtils; | 20 | import org.springframework.util.CollectionUtils; |
| @@ -24,15 +32,20 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | @@ -24,15 +32,20 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | ||
| 24 | * | 32 | * |
| 25 | * @author QingX | 33 | * @author QingX |
| 26 | */ | 34 | */ |
| 35 | +@Slf4j | ||
| 27 | @Service | 36 | @Service |
| 28 | @Validated | 37 | @Validated |
| 29 | public class MemberPointRecordServiceImpl implements MemberPointRecordService { | 38 | public class MemberPointRecordServiceImpl implements MemberPointRecordService { |
| 30 | 39 | ||
| 31 | @Resource | 40 | @Resource |
| 32 | private MemberPointRecordMapper recordMapper; | 41 | private MemberPointRecordMapper recordMapper; |
| 42 | + @Resource | ||
| 43 | + private MemberPointConfigService memberPointConfigService; | ||
| 33 | 44 | ||
| 34 | @Resource | 45 | @Resource |
| 35 | private MemberUserApi memberUserApi; | 46 | private MemberUserApi memberUserApi; |
| 47 | + @Resource | ||
| 48 | + private MemberUserService memberUserService; | ||
| 36 | 49 | ||
| 37 | @Override | 50 | @Override |
| 38 | public PageResult<MemberPointRecordDO> getPointRecordPage(MemberPointRecordPageReqVO pageReqVO) { | 51 | public PageResult<MemberPointRecordDO> getPointRecordPage(MemberPointRecordPageReqVO pageReqVO) { |
| @@ -55,4 +68,38 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { | @@ -55,4 +68,38 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { | ||
| 55 | return recordMapper.selectPage(userId, pageVO); | 68 | return recordMapper.selectPage(userId, pageVO); |
| 56 | } | 69 | } |
| 57 | 70 | ||
| 71 | + @Override | ||
| 72 | + public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) { | ||
| 73 | + MemberPointConfigDO pointConfig = memberPointConfigService.getPointConfig(); | ||
| 74 | + if (pointConfig == null || pointConfig.getTradeGivePoint() == null) { | ||
| 75 | + log.warn("增加积分失败:积分配置”1 元赠送多少分“未设置, userId={}, point={}, bizType={}, bizId={}", | ||
| 76 | + userId, point, bizType.getType(), bizId); | ||
| 77 | + return; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + // 根据配置的比例,换算实际的积分 | ||
| 81 | + point = point * pointConfig.getTradeGivePoint(); | ||
| 82 | + if (bizType.isReduce() && point > 0) { | ||
| 83 | + point = -point; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + MemberUserDO user = memberUserService.getUser(userId); | ||
| 87 | + Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); | ||
| 88 | + // 用户变动后的积分,防止扣出负数 | ||
| 89 | + Integer totalPoint = NumberUtil.max(userPoint + point, 0); | ||
| 90 | + // 增加积分记录 | ||
| 91 | + MemberPointRecordDO recordDO = new MemberPointRecordDO() | ||
| 92 | + .setUserId(userId) | ||
| 93 | + .setBizId(bizId) | ||
| 94 | + .setBizType(bizType.getType()) | ||
| 95 | + .setTitle(bizType.getName()) | ||
| 96 | + .setDescription(StrUtil.format(bizType.getDescription(), point)) | ||
| 97 | + .setPoint(point) | ||
| 98 | + .setTotalPoint(totalPoint); | ||
| 99 | + recordMapper.insert(recordDO); | ||
| 100 | + | ||
| 101 | + // 更新用户积分 | ||
| 102 | + memberUserService.updateUserPoint(userId, totalPoint); | ||
| 103 | + } | ||
| 104 | + | ||
| 58 | } | 105 | } |
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 | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagUpdateReq | ||
| 10 | import cn.iocoder.yudao.module.member.convert.tag.MemberTagConvert; | 10 | import cn.iocoder.yudao.module.member.convert.tag.MemberTagConvert; |
| 11 | import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; | 11 | import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; |
| 12 | import cn.iocoder.yudao.module.member.dal.mysql.tag.MemberTagMapper; | 12 | import cn.iocoder.yudao.module.member.dal.mysql.tag.MemberTagMapper; |
| 13 | -import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; | 13 | +import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 14 | import org.springframework.stereotype.Service; | 14 | import org.springframework.stereotype.Service; |
| 15 | import org.springframework.validation.annotation.Validated; | 15 | import org.springframework.validation.annotation.Validated; |
| 16 | 16 | ||
| @@ -33,7 +33,7 @@ public class MemberTagServiceImpl implements MemberTagService { | @@ -33,7 +33,7 @@ public class MemberTagServiceImpl implements MemberTagService { | ||
| 33 | @Resource | 33 | @Resource |
| 34 | private MemberTagMapper tagMapper; | 34 | private MemberTagMapper tagMapper; |
| 35 | @Resource | 35 | @Resource |
| 36 | - private MemberUserMapper memberUserMapper; | 36 | + private MemberUserService memberUserService; |
| 37 | 37 | ||
| 38 | @Override | 38 | @Override |
| 39 | public Long createTag(MemberTagCreateReqVO createReqVO) { | 39 | public Long createTag(MemberTagCreateReqVO createReqVO) { |
| @@ -92,7 +92,7 @@ public class MemberTagServiceImpl implements MemberTagService { | @@ -92,7 +92,7 @@ public class MemberTagServiceImpl implements MemberTagService { | ||
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | void validateTagHasUser(Long id) { | 94 | void validateTagHasUser(Long id) { |
| 95 | - Long count = memberUserMapper.selectCountByTagId(id); | 95 | + Long count = memberUserService.getUserCountByTagId(id); |
| 96 | if (count > 0) { | 96 | if (count > 0) { |
| 97 | throw exception(TAG_HAS_USER); | 97 | throw exception(TAG_HAS_USER); |
| 98 | } | 98 | } |
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; | @@ -5,9 +5,9 @@ import cn.iocoder.yudao.framework.common.validation.Mobile; | ||
| 5 | import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; | 5 | import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; |
| 6 | import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; | 6 | import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; |
| 7 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; | 7 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO; |
| 8 | +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; | ||
| 8 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; | 9 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; |
| 9 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; | 10 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; |
| 10 | -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; | ||
| 11 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 11 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 12 | 12 | ||
| 13 | import javax.validation.Valid; | 13 | import javax.validation.Valid; |
| @@ -41,7 +41,7 @@ public interface MemberUserService { | @@ -41,7 +41,7 @@ public interface MemberUserService { | ||
| 41 | * 基于手机号创建用户。 | 41 | * 基于手机号创建用户。 |
| 42 | * 如果用户已经存在,则直接进行返回 | 42 | * 如果用户已经存在,则直接进行返回 |
| 43 | * | 43 | * |
| 44 | - * @param mobile 手机号 | 44 | + * @param mobile 手机号 |
| 45 | * @param registerIp 注册 IP | 45 | * @param registerIp 注册 IP |
| 46 | * @return 用户对象 | 46 | * @return 用户对象 |
| 47 | */ | 47 | */ |
| @@ -50,7 +50,7 @@ public interface MemberUserService { | @@ -50,7 +50,7 @@ public interface MemberUserService { | ||
| 50 | /** | 50 | /** |
| 51 | * 更新用户的最后登陆信息 | 51 | * 更新用户的最后登陆信息 |
| 52 | * | 52 | * |
| 53 | - * @param id 用户编号 | 53 | + * @param id 用户编号 |
| 54 | * @param loginIp 登陆 IP | 54 | * @param loginIp 登陆 IP |
| 55 | */ | 55 | */ |
| 56 | void updateUserLogin(Long id, String loginIp); | 56 | void updateUserLogin(Long id, String loginIp); |
| @@ -75,7 +75,7 @@ public interface MemberUserService { | @@ -75,7 +75,7 @@ public interface MemberUserService { | ||
| 75 | * 【会员】修改基本信息 | 75 | * 【会员】修改基本信息 |
| 76 | * | 76 | * |
| 77 | * @param userId 用户编号 | 77 | * @param userId 用户编号 |
| 78 | - * @param reqVO 基本信息 | 78 | + * @param reqVO 基本信息 |
| 79 | */ | 79 | */ |
| 80 | void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO); | 80 | void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO); |
| 81 | 81 | ||
| @@ -83,7 +83,7 @@ public interface MemberUserService { | @@ -83,7 +83,7 @@ public interface MemberUserService { | ||
| 83 | * 【会员】修改手机 | 83 | * 【会员】修改手机 |
| 84 | * | 84 | * |
| 85 | * @param userId 用户编号 | 85 | * @param userId 用户编号 |
| 86 | - * @param reqVO 请求信息 | 86 | + * @param reqVO 请求信息 |
| 87 | */ | 87 | */ |
| 88 | void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO); | 88 | void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO); |
| 89 | 89 | ||
| @@ -91,7 +91,7 @@ public interface MemberUserService { | @@ -91,7 +91,7 @@ public interface MemberUserService { | ||
| 91 | * 【会员】修改密码 | 91 | * 【会员】修改密码 |
| 92 | * | 92 | * |
| 93 | * @param userId 用户编号 | 93 | * @param userId 用户编号 |
| 94 | - * @param reqVO 请求信息 | 94 | + * @param reqVO 请求信息 |
| 95 | */ | 95 | */ |
| 96 | void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO); | 96 | void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO); |
| 97 | 97 | ||
| @@ -105,7 +105,7 @@ public interface MemberUserService { | @@ -105,7 +105,7 @@ public interface MemberUserService { | ||
| 105 | /** | 105 | /** |
| 106 | * 判断密码是否匹配 | 106 | * 判断密码是否匹配 |
| 107 | * | 107 | * |
| 108 | - * @param rawPassword 未加密的密码 | 108 | + * @param rawPassword 未加密的密码 |
| 109 | * @param encodedPassword 加密后的密码 | 109 | * @param encodedPassword 加密后的密码 |
| 110 | * @return 是否匹配 | 110 | * @return 是否匹配 |
| 111 | */ | 111 | */ |
| @@ -135,4 +135,35 @@ public interface MemberUserService { | @@ -135,4 +135,35 @@ public interface MemberUserService { | ||
| 135 | */ | 135 | */ |
| 136 | void updateUserLevel(Long id, Long levelId, Integer experience); | 136 | void updateUserLevel(Long id, Long levelId, Integer experience); |
| 137 | 137 | ||
| 138 | + /** | ||
| 139 | + * 获得指定用户分组下的用户数量 | ||
| 140 | + * | ||
| 141 | + * @param groupId 用户分组编号 | ||
| 142 | + * @return 用户数量 | ||
| 143 | + */ | ||
| 144 | + Long getUserCountByGroupId(Long groupId); | ||
| 145 | + | ||
| 146 | + /** | ||
| 147 | + * 获得指定用户等级下的用户数量 | ||
| 148 | + * | ||
| 149 | + * @param levelId 用户等级编号 | ||
| 150 | + * @return 用户数量 | ||
| 151 | + */ | ||
| 152 | + Long getUserCountByLevelId(Long levelId); | ||
| 153 | + | ||
| 154 | + /** | ||
| 155 | + * 获得指定会员标签下的用户数量 | ||
| 156 | + * | ||
| 157 | + * @param tagId 用户标签编号 | ||
| 158 | + * @return 用户数量 | ||
| 159 | + */ | ||
| 160 | + Long getUserCountByTagId(Long tagId); | ||
| 161 | + | ||
| 162 | + /** | ||
| 163 | + * 更新用户的积分 | ||
| 164 | + * | ||
| 165 | + * @param userId 用户ID | ||
| 166 | + * @param point 积分数量 | ||
| 167 | + */ | ||
| 168 | + void updateUserPoint(Long userId, Integer point); | ||
| 138 | } | 169 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
| @@ -239,4 +239,24 @@ public class MemberUserServiceImpl implements MemberUserService { | @@ -239,4 +239,24 @@ public class MemberUserServiceImpl implements MemberUserService { | ||
| 239 | ); | 239 | ); |
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | + @Override | ||
| 243 | + public Long getUserCountByGroupId(Long groupId) { | ||
| 244 | + return memberUserMapper.selectCountByGroupId(groupId); | ||
| 245 | + } | ||
| 246 | + | ||
| 247 | + @Override | ||
| 248 | + public Long getUserCountByLevelId(Long levelId) { | ||
| 249 | + return memberUserMapper.selectCountByLevelId(levelId); | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | + @Override | ||
| 253 | + public Long getUserCountByTagId(Long tagId) { | ||
| 254 | + return memberUserMapper.selectCountByTagId(tagId); | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + @Override | ||
| 258 | + public void updateUserPoint(Long userId, Integer point) { | ||
| 259 | + memberUserMapper.updateById(new MemberUserDO().setId(userId).setPoint(point)); | ||
| 260 | + } | ||
| 261 | + | ||
| 242 | } | 262 | } |