1. 会员用户,增加 point 积分字段

2. 增加获得优惠劵、收藏数量的 API 接口
This commit is contained in:
YunaiV 2023-08-19 17:00:40 +08:00
parent a4e2cacc46
commit 94a32d34b2
18 changed files with 119 additions and 13 deletions

View File

@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@ -84,8 +83,15 @@ public class AppFavoriteController {
@Operation(summary = "检查是否收藏过商品") @Operation(summary = "检查是否收藏过商品")
@PreAuthenticated @PreAuthenticated
public CommonResult<Boolean> isFavoriteExists(AppFavoriteReqVO reqVO) { public CommonResult<Boolean> isFavoriteExists(AppFavoriteReqVO reqVO) {
ProductFavoriteDO favoriteDO = productFavoriteService.getFavorite(getLoginUserId(), reqVO.getSpuId()); ProductFavoriteDO favorite = productFavoriteService.getFavorite(getLoginUserId(), reqVO.getSpuId());
return success(Objects.nonNull(favoriteDO)); return success(favorite != null);
}
@GetMapping(value = "/get-count")
@Operation(summary = "获得商品收藏数量")
@PreAuthenticated
public CommonResult<Long> getFavoriteCount() {
return success(productFavoriteService.getFavoriteCount(getLoginUserId()));
} }
} }

View File

@ -21,4 +21,8 @@ public interface ProductFavoriteMapper extends BaseMapperX<ProductFavoriteDO> {
.orderByDesc(ProductFavoriteDO::getId)); .orderByDesc(ProductFavoriteDO::getId));
} }
default Long selectCountByUserId(Long userId) {
return selectCount(ProductFavoriteDO::getUserId, userId);
}
} }

View File

@ -16,7 +16,7 @@ public interface ProductFavoriteService {
/** /**
* 创建商品收藏 * 创建商品收藏
* *
* @param userId 用户 id * @param userId 用户编号
* @param spuId SPU 编号 * @param spuId SPU 编号
*/ */
Long createFavorite(Long userId, Long spuId); Long createFavorite(Long userId, Long spuId);
@ -24,7 +24,7 @@ public interface ProductFavoriteService {
/** /**
* 取消商品收藏 * 取消商品收藏
* *
* @param userId 用户 id * @param userId 用户编号
* @param spuId SPU 编号 * @param spuId SPU 编号
*/ */
void deleteFavorite(Long userId, Long spuId); void deleteFavorite(Long userId, Long spuId);
@ -32,7 +32,7 @@ public interface ProductFavoriteService {
/** /**
* 分页查询用户收藏列表 * 分页查询用户收藏列表
* *
* @param userId 用户 id * @param userId 用户编号
* @param reqVO 请求 vo * @param reqVO 请求 vo
*/ */
PageResult<ProductFavoriteDO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO); PageResult<ProductFavoriteDO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO);
@ -40,9 +40,17 @@ public interface ProductFavoriteService {
/** /**
* 获取收藏过商品 * 获取收藏过商品
* *
* @param userId 用户id * @param userId 用户编号
* @param spuId SPU 编号 * @param spuId SPU 编号
*/ */
ProductFavoriteDO getFavorite(Long userId, Long spuId); ProductFavoriteDO getFavorite(Long userId, Long spuId);
/**
* 获取用户收藏数量
*
* @param userId 用户编号
* @return 数量
*/
Long getFavoriteCount(Long userId);
} }

View File

@ -10,7 +10,6 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.FAVORITE_EXISTS; import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.FAVORITE_EXISTS;
@ -31,7 +30,7 @@ public class ProductFavoriteServiceImpl implements ProductFavoriteService {
@Override @Override
public Long createFavorite(Long userId, Long spuId) { public Long createFavorite(Long userId, Long spuId) {
ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId);
if (Objects.nonNull(favorite)) { if (favorite != null) {
throw exception(FAVORITE_EXISTS); throw exception(FAVORITE_EXISTS);
} }
@ -43,7 +42,7 @@ public class ProductFavoriteServiceImpl implements ProductFavoriteService {
@Override @Override
public void deleteFavorite(Long userId, Long spuId) { public void deleteFavorite(Long userId, Long spuId) {
ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); ProductFavoriteDO favorite = productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId);
if (Objects.isNull(favorite)) { if (favorite == null) {
throw exception(FAVORITE_NOT_EXISTS); throw exception(FAVORITE_NOT_EXISTS);
} }
@ -60,4 +59,9 @@ public class ProductFavoriteServiceImpl implements ProductFavoriteService {
return productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId); return productFavoriteMapper.selectByUserIdAndSpuId(userId, spuId);
} }
@Override
public Long getFavoriteCount(Long userId) {
return productFavoriteMapper.selectCountByUserId(userId);
}
} }

View File

@ -15,7 +15,9 @@ import java.util.Arrays;
@Getter @Getter
public enum DecoratePageEnum implements IntArrayValuable { public enum DecoratePageEnum implements IntArrayValuable {
INDEX(1, "首页"); INDEX(1, "首页"),
MY(2, "个人中心"),
;
private static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DecoratePageEnum::getPage).toArray(); private static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DecoratePageEnum::getPage).toArray();

View File

@ -2,22 +2,26 @@ package cn.iocoder.yudao.module.promotion.controller.app.coupon;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchReqVO; import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchReqVO;
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchRespVO; import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchRespVO;
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponPageReqVO; import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponPageReqVO;
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponRespVO; import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponRespVO;
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.template.AppCouponTemplatePageReqVO; import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.template.AppCouponTemplatePageReqVO;
import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "用户 App - 优惠劵") @Tag(name = "用户 App - 优惠劵")
@RestController @RestController
@ -25,6 +29,9 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Validated @Validated
public class AppCouponController { public class AppCouponController {
@Resource
private CouponService couponService;
// TODO 芋艿待实现 // TODO 芋艿待实现
@PostMapping("/take") @PostMapping("/take")
@Operation(summary = "领取优惠劵") @Operation(summary = "领取优惠劵")
@ -93,4 +100,11 @@ public class AppCouponController {
return success(new PageResult<>(list, 20L)); return success(new PageResult<>(list, 20L));
} }
@GetMapping(value = "/get-unused-count")
@Operation(summary = "获得未使用的优惠劵数量")
@PreAuthenticated
public CommonResult<Long> getUnusedCouponCount() {
return success(couponService.getUnusedCouponCount(getLoginUserId()));
}
} }

View File

@ -49,4 +49,10 @@ public interface CouponMapper extends BaseMapperX<CouponDO> {
.eq(CouponDO::getId, id).eq(CouponDO::getStatus, status)); .eq(CouponDO::getId, id).eq(CouponDO::getStatus, status));
} }
default Long selectCountByUserIdAndStatus(Long userId, Integer status) {
return selectCount(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getUserId, userId)
.eq(CouponDO::getStatus, status));
}
} }

View File

@ -67,4 +67,12 @@ public interface CouponService {
*/ */
List<CouponDO> getCouponList(Long userId, Integer status); List<CouponDO> getCouponList(Long userId, Integer status);
/**
* 获得未使用的优惠劵数量
*
* @param userId 用户编号
* @return 未使用的优惠劵数量
*/
Long getUnusedCouponCount(Long userId);
} }

View File

@ -120,4 +120,9 @@ public class CouponServiceImpl implements CouponService {
} }
} }
@Override
public Long getUnusedCouponCount(Long userId) {
return couponMapper.selectCountByUserIdAndStatus(userId, CouponStatusEnum.UNUSED.getStatus());
}
} }

View File

@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import static cn.hutool.core.util.ArrayUtil.firstMatch; import static cn.hutool.core.util.ArrayUtil.firstMatch;
@ -55,6 +56,18 @@ public enum TradeAfterSaleStatusEnum implements IntArrayValuable {
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray(); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray();
/**
* 进行中的售后状态
*
* 不包括已经结束的状态
*/
public static final Collection<Integer> APPLYING_STATUSES = Arrays.asList(
APPLY.getStatus(),
SELLER_AGREE.getStatus(),
BUYER_DELIVERY.getStatus(),
WAIT_REFUND.getStatus()
);
/** /**
* 状态 * 状态
*/ */

View File

@ -50,6 +50,12 @@ public class AppTradeAfterSaleController {
return success(TradeAfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id))); return success(TradeAfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id)));
} }
@GetMapping(value = "/get-applying-count")
@Operation(summary = "获得进行中的售后订单数量")
public CommonResult<Long> getApplyingAfterSaleCount() {
return success(afterSaleService.getApplyingAfterSaleCount(getLoginUserId()));
}
// TODO 芋艿待实现 // TODO 芋艿待实现
@GetMapping(value = "/get-reason-list") @GetMapping(value = "/get-reason-list")
@Operation(summary = "获得售后原因") @Operation(summary = "获得售后原因")

View File

@ -9,6 +9,8 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
@Mapper @Mapper
public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> { public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> {
@ -40,4 +42,10 @@ public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> {
TradeAfterSaleDO::getUserId, userId); TradeAfterSaleDO::getUserId, userId);
} }
default Long selectCountByUserIdAndStatus(Long userId, Collection<Integer> statuses) {
return selectCount(new LambdaQueryWrapperX<TradeAfterSaleDO>()
.eq(TradeAfterSaleDO::getUserId, userId)
.in(TradeAfterSaleDO::getStatus, statuses));
}
} }

View File

@ -108,4 +108,12 @@ public interface TradeAfterSaleService {
*/ */
void cancelAfterSale(Long userId, Long id); void cancelAfterSale(Long userId, Long id);
/**
* 会员获得正在进行中的售后订单数量
*
* @param userId
* @return 数量
*/
Long getApplyingAfterSaleCount(Long userId);
} }

View File

@ -398,6 +398,11 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus());
} }
@Override
public Long getApplyingAfterSaleCount(Long userId) {
return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, TradeAfterSaleStatusEnum.APPLYING_STATUSES);
}
@Deprecated @Deprecated
private void createAfterSaleLog(Long userId, Integer userType, TradeAfterSaleDO afterSale, private void createAfterSaleLog(Long userId, Integer userType, TradeAfterSaleDO afterSale,
Integer beforeStatus, Integer afterStatus) { Integer beforeStatus, Integer afterStatus) {

View File

@ -27,7 +27,7 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_IS_EMP
@RequestMapping("/member/user") @RequestMapping("/member/user")
@Validated @Validated
@Slf4j @Slf4j
public class AppUserController { public class AppMemberUserController {
@Resource @Resource
private MemberUserService userService; private MemberUserService userService;

View File

@ -14,9 +14,13 @@ public class AppUserInfoRespVO {
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
private String nickname; private String nickname;
@Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "/infra/file/get/35a12e57-4297-4faa-bf7d-7ed2f211c952") @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.png")
private String avatar; private String avatar;
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") @Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300")
private String mobile; private String mobile;
@Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer point;
} }

View File

@ -102,6 +102,11 @@ public class MemberUserDO extends TenantBaseDO {
// ========== 其它信息 ========== // ========== 其它信息 ==========
/**
* 积分
*/
private Integer point;
// TODO 积分成长值会员等级等等 // TODO 积分成长值会员等级等等
} }