Merge branch 'feature/1.8.0-uniapp' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.8.0-uniapp
commit
fb45f22533
@ -1,14 +1,57 @@
|
|||||||
package cn.iocoder.yudao.module.product.controller.admin.sku;
|
package cn.iocoder.yudao.module.product.controller.admin.sku;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||||
|
import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuOptionRespVO;
|
||||||
|
import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
|
||||||
|
import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
|
||||||
|
import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
|
||||||
|
import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
|
||||||
|
import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
|
|
||||||
@Api(tags = "管理后台 - 商品 sku")
|
@Api(tags = "管理后台 - 商品 sku")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/product/sku")
|
@RequestMapping("/product/sku")
|
||||||
@Validated
|
@Validated
|
||||||
public class ProductSkuController {
|
public class ProductSkuController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProductSkuService productSkuService;
|
||||||
|
@Resource
|
||||||
|
private ProductSpuService productSpuService;
|
||||||
|
|
||||||
|
@GetMapping("/get-option-list")
|
||||||
|
@ApiOperation("获得商品 SKU 选项的列表")
|
||||||
|
// @PreAuthorize("@ss.hasPermission('product:sku:query')")
|
||||||
|
public CommonResult<List<ProductSkuOptionRespVO>> getSkuOptionList() {
|
||||||
|
// 获得 SKU 列表
|
||||||
|
List<ProductSkuDO> skus = productSkuService.getSkuList();
|
||||||
|
if (CollUtil.isEmpty(skus)) {
|
||||||
|
return success(Collections.emptyList());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得对应的 SPU 映射
|
||||||
|
Map<Long, ProductSpuDO> spuMap = productSpuService.getSpuMap(convertSet(skus, ProductSkuDO::getSpuId));
|
||||||
|
// 转换为返回结果
|
||||||
|
List<ProductSkuOptionRespVO> skuVOs = ProductSkuConvert.INSTANCE.convertList05(skus);
|
||||||
|
skuVOs.forEach(sku -> MapUtils.findAndThen(spuMap, sku.getSpuId(),
|
||||||
|
spu -> sku.setSpuId(spu.getId()).setSpuName(spu.getName())));
|
||||||
|
return success(skuVOs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,31 @@
|
|||||||
|
package cn.iocoder.yudao.module.product.controller.admin.sku.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel(value = "管理后台 - 商品 SKU 选项 Response VO", description = "用于前端 SELECT 选项")
|
||||||
|
@Data
|
||||||
|
public class ProductSkuOptionRespVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "主键", required = true, example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品 SKU 名字", example = "红色")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "销售价格", required = true, example = "100", notes = "单位:分")
|
||||||
|
private String price;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "库存", required = true, example = "100")
|
||||||
|
private Integer stock;
|
||||||
|
|
||||||
|
// ========== 商品 SPU 信息 ==========
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品 SPU 编号", required = true, example = "1")
|
||||||
|
private Long spuId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品 SPU 名字", required = true, example = "iPhone 11")
|
||||||
|
private String spuName;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.module.product.controller.admin.spu.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 商品 SPU 精简 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class ProductSpuSimpleRespVO extends ProductSpuBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "主键", required = true, example = "1")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品名称", required = true, example = "芋道")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = " 最小价格,单位使用:分", required = true, example = "1024")
|
||||||
|
private Integer minPrice;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最大价格,单位使用:分", required = true, example = "1024")
|
||||||
|
private Integer maxPrice;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.enums.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵状态枚举
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public enum CouponStatusEnum implements IntArrayValuable {
|
||||||
|
|
||||||
|
UNUSED(1, "未使用"),
|
||||||
|
USED(2, "已使用"),
|
||||||
|
EXPIRE(3, "已过期"),
|
||||||
|
;
|
||||||
|
|
||||||
|
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 值
|
||||||
|
*/
|
||||||
|
private final Integer status;
|
||||||
|
/**
|
||||||
|
* 名字
|
||||||
|
*/
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] array() {
|
||||||
|
return ARRAYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||||
|
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
|
||||||
|
import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.convert.coupon.CouponConvert;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
|
|
||||||
|
@Api(tags = "管理后台 - 优惠劵")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/promotion/coupon")
|
||||||
|
@Validated
|
||||||
|
public class CouponController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CouponService couponService;
|
||||||
|
@Resource
|
||||||
|
private MemberUserApi memberUserApi;
|
||||||
|
|
||||||
|
// @GetMapping("/get")
|
||||||
|
// @ApiOperation("获得优惠劵")
|
||||||
|
// @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||||
|
// @PreAuthorize("@ss.hasPermission('promotion:coupon:query')")
|
||||||
|
// public CommonResult<CouponRespVO> getCoupon(@RequestParam("id") Long id) {
|
||||||
|
// CouponDO coupon = couponService.getCoupon(id);
|
||||||
|
// return success(CouponConvert.INSTANCE.convert(coupon));
|
||||||
|
// }
|
||||||
|
|
||||||
|
@DeleteMapping("/delete")
|
||||||
|
@ApiOperation("回收优惠劵")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:coupon:delete')")
|
||||||
|
public CommonResult<Boolean> deleteCoupon(@RequestParam("id") Long id) {
|
||||||
|
couponService.deleteCoupon(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/page")
|
||||||
|
@ApiOperation("获得优惠劵分页")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:coupon:query')")
|
||||||
|
public CommonResult<PageResult<CouponPageItemRespVO>> getCouponPage(@Valid CouponPageReqVO pageVO) {
|
||||||
|
PageResult<CouponDO> pageResult = couponService.getCouponPage(pageVO);
|
||||||
|
PageResult<CouponPageItemRespVO> pageResulVO = CouponConvert.INSTANCE.convertPage(pageResult);
|
||||||
|
if (CollUtil.isEmpty(pageResulVO.getList())) {
|
||||||
|
return success(pageResulVO);
|
||||||
|
}
|
||||||
|
// 读取用户信息,进行拼接
|
||||||
|
Set<Long> userIds = convertSet(pageResult.getList(), CouponDO::getUserId);
|
||||||
|
Map<Long, UserRespDTO> userMap = memberUserApi.getUserMap(userIds);
|
||||||
|
pageResulVO.getList().forEach(itemRespVO -> MapUtils.findAndThen(userMap, itemRespVO.getUserId(),
|
||||||
|
userRespDTO -> itemRespVO.setNickname(userRespDTO.getNickname())));
|
||||||
|
return success(pageResulVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 优惠劵分页的每一项 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class CouponPageItemRespVO extends CouponRespVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户昵称", example = "老芋艿")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 优惠劵分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class CouponPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠劵模板编号", example = "2048")
|
||||||
|
private Long templateId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠码状态", example = "1", notes = "参见 CouponStatusEnum 枚举")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private Date[] createTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户昵称", example = "芋艿", notes = "模糊匹配")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 优惠劵 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class CouponRespVO extends CouponBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠劵编号", required = true, example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间", required = true)
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
}
|
||||||
19
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateBaseVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java
19
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateBaseVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateCreateReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateCreateReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateCreateReqVO.java
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo;
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplatePageReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplatePageReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplatePageReqVO.java
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo;
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateRespVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateRespVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateRespVO.java
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo;
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateUpdateReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java
2
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/CouponTemplateUpdateReqVO.java → yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateUpdateReqVO.java
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo;
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 优惠劵模板更新状态 Request VO")
|
||||||
|
@Data
|
||||||
|
public class CouponTemplateUpdateStatusReqVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠劵模板编号", required = true, example = "1024")
|
||||||
|
@NotNull(message = "优惠劵模板编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举")
|
||||||
|
@NotNull(message = "状态不能为空")
|
||||||
|
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Api(tags = "管理后台 - 限时折扣活动")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/promotion/discount-activity")
|
||||||
|
@Validated
|
||||||
|
public class DiscountActivityController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DiscountActivityService discountActivityService;
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
@ApiOperation("创建限时折扣活动")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:create')")
|
||||||
|
public CommonResult<Long> createDiscountActivity(@Valid @RequestBody DiscountActivityCreateReqVO createReqVO) {
|
||||||
|
return success(discountActivityService.createDiscountActivity(createReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/update")
|
||||||
|
@ApiOperation("更新限时折扣活动")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:update')")
|
||||||
|
public CommonResult<Boolean> updateDiscountActivity(@Valid @RequestBody DiscountActivityUpdateReqVO updateReqVO) {
|
||||||
|
discountActivityService.updateDiscountActivity(updateReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/close")
|
||||||
|
@ApiOperation("关闭限时折扣活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:close')")
|
||||||
|
public CommonResult<Boolean> closeRewardActivity(@RequestParam("id") Long id) {
|
||||||
|
discountActivityService.closeRewardActivity(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete")
|
||||||
|
@ApiOperation("删除限时折扣活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:delete')")
|
||||||
|
public CommonResult<Boolean> deleteDiscountActivity(@RequestParam("id") Long id) {
|
||||||
|
discountActivityService.deleteDiscountActivity(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get")
|
||||||
|
@ApiOperation("获得限时折扣活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')")
|
||||||
|
public CommonResult<DiscountActivityDetailRespVO> getDiscountActivity(@RequestParam("id") Long id) {
|
||||||
|
DiscountActivityDO discountActivity = discountActivityService.getDiscountActivity(id);
|
||||||
|
if (discountActivity == null) {
|
||||||
|
return success(null);
|
||||||
|
}
|
||||||
|
// 拼接结果
|
||||||
|
List<DiscountProductDO> discountProducts = discountActivityService.getDiscountProductsByActivityId(id);
|
||||||
|
return success(DiscountActivityConvert.INSTANCE.convert(discountActivity, discountProducts));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/page")
|
||||||
|
@ApiOperation("获得限时折扣活动分页")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')")
|
||||||
|
public CommonResult<PageResult<DiscountActivityRespVO>> getDiscountActivityPage(@Valid DiscountActivityPageReqVO pageVO) {
|
||||||
|
PageResult<DiscountActivityDO> pageResult = discountActivityService.getDiscountActivityPage(pageVO);
|
||||||
|
return success(DiscountActivityConvert.INSTANCE.convertPage(pageResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* TODO 占位
|
|
||||||
*/
|
|
||||||
package cn.iocoder.yudao.module.promotion.controller.admin.discount;
|
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 限时折扣活动创建 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class DiscountActivityCreateReqVO extends DiscountActivityBaseVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品列表
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "商品列表不能为空")
|
||||||
|
@Valid
|
||||||
|
private List<Product> products;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 限时折扣活动的详细 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class DiscountActivityDetailRespVO extends DiscountActivityRespVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品列表
|
||||||
|
*/
|
||||||
|
private List<Product> products;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import java.util.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 限时折扣活动分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class DiscountActivityPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动标题", example = "一个标题")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动状态", example = "1")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private Date[] createTime;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 限时折扣活动 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class DiscountActivityRespVO extends DiscountActivityBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动编号", required = true, example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动状态", required = true, example = "1")
|
||||||
|
@NotNull(message = "活动状态不能为空")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间", required = true)
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 限时折扣活动更新 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class DiscountActivityUpdateReqVO extends DiscountActivityBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动编号", required = true, example = "1024")
|
||||||
|
@NotNull(message = "活动编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品列表
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "商品列表不能为空")
|
||||||
|
@Valid
|
||||||
|
private List<DiscountActivityCreateReqVO.Product> products;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.reward;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
|
@Api(tags = "管理后台 - 满减送活动")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/promotion/reward-activity")
|
||||||
|
@Validated
|
||||||
|
public class RewardActivityController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RewardActivityService rewardActivityService;
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
@ApiOperation("创建满减送活动")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:create')")
|
||||||
|
public CommonResult<Long> createRewardActivity(@Valid @RequestBody RewardActivityCreateReqVO createReqVO) {
|
||||||
|
return success(rewardActivityService.createRewardActivity(createReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/update")
|
||||||
|
@ApiOperation("更新满减送活动")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:update')")
|
||||||
|
public CommonResult<Boolean> updateRewardActivity(@Valid @RequestBody RewardActivityUpdateReqVO updateReqVO) {
|
||||||
|
rewardActivityService.updateRewardActivity(updateReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/close")
|
||||||
|
@ApiOperation("关闭满减送活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:close')")
|
||||||
|
public CommonResult<Boolean> closeRewardActivity(@RequestParam("id") Long id) {
|
||||||
|
rewardActivityService.closeRewardActivity(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete")
|
||||||
|
@ApiOperation("删除满减送活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:delete')")
|
||||||
|
public CommonResult<Boolean> deleteRewardActivity(@RequestParam("id") Long id) {
|
||||||
|
rewardActivityService.deleteRewardActivity(id);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get")
|
||||||
|
@ApiOperation("获得满减送活动")
|
||||||
|
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')")
|
||||||
|
public CommonResult<RewardActivityRespVO> getRewardActivity(@RequestParam("id") Long id) {
|
||||||
|
RewardActivityDO rewardActivity = rewardActivityService.getRewardActivity(id);
|
||||||
|
return success(RewardActivityConvert.INSTANCE.convert(rewardActivity));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/page")
|
||||||
|
@ApiOperation("获得满减送活动分页")
|
||||||
|
@PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')")
|
||||||
|
public CommonResult<PageResult<RewardActivityRespVO>> getRewardActivityPage(@Valid RewardActivityPageReqVO pageVO) {
|
||||||
|
PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(pageVO);
|
||||||
|
return success(RewardActivityConvert.INSTANCE.convertPage(pageResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 满减送活动创建 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class RewardActivityCreateReqVO extends RewardActivityBaseVO {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 满减送活动分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class RewardActivityPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动标题", example = "满啦满啦")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动状态", example = "1")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import java.util.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 满减送活动 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class RewardActivityRespVO extends RewardActivityBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动编号", required = true, example = "1024")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动状态", required = true, example = "1")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间", required = true)
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import io.swagger.annotations.*;
|
||||||
|
import javax.validation.constraints.*;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 满减送活动更新 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class RewardActivityUpdateReqVO extends RewardActivityBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "活动编号", required = true, example = "1024")
|
||||||
|
@NotNull(message = "活动编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.convert.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵 Convert
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface CouponConvert {
|
||||||
|
|
||||||
|
CouponConvert INSTANCE = Mappers.getMapper(CouponConvert.class);
|
||||||
|
|
||||||
|
PageResult<CouponPageItemRespVO> convertPage(PageResult<CouponDO> page);
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* TODO 占位
|
|
||||||
*/
|
|
||||||
package cn.iocoder.yudao.module.promotion.convert.discount;
|
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.convert.reward;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 满减送活动 Convert
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface RewardActivityConvert {
|
||||||
|
|
||||||
|
RewardActivityConvert INSTANCE = Mappers.getMapper(RewardActivityConvert.class);
|
||||||
|
|
||||||
|
RewardActivityDO convert(RewardActivityCreateReqVO bean);
|
||||||
|
|
||||||
|
RewardActivityDO convert(RewardActivityUpdateReqVO bean);
|
||||||
|
|
||||||
|
RewardActivityRespVO convert(RewardActivityDO bean);
|
||||||
|
|
||||||
|
PageResult<RewardActivityRespVO> convertPage(PageResult<RewardActivityDO> page);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.dal.mysql.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface CouponMapper extends BaseMapperX<CouponDO> {
|
||||||
|
|
||||||
|
default PageResult<CouponDO> selectPage(CouponPageReqVO reqVO, Collection<Long> userIds) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<CouponDO>()
|
||||||
|
.eqIfPresent(CouponDO::getTemplateId, reqVO.getTemplateId())
|
||||||
|
.eqIfPresent(CouponDO::getStatus, reqVO.getStatus())
|
||||||
|
.inIfPresent(CouponDO::getUserId, userIds)
|
||||||
|
.betweenIfPresent(CouponDO::getCreateTime, reqVO.getCreateTime())
|
||||||
|
.orderByDesc(CouponDO::getId));
|
||||||
|
}
|
||||||
|
|
||||||
|
default int delete(Long id, Collection<Integer> whereStatuses) {
|
||||||
|
return update(null, new LambdaUpdateWrapper<CouponDO>()
|
||||||
|
.eq(CouponDO::getId, id).in(CouponDO::getStatus, whereStatuses)
|
||||||
|
.set(CouponDO::getDeleted, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.dal.mysql.discount;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 限时折扣活动 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface DiscountActivityMapper extends BaseMapperX<DiscountActivityDO> {
|
||||||
|
|
||||||
|
default PageResult<DiscountActivityDO> selectPage(DiscountActivityPageReqVO reqVO) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<DiscountActivityDO>()
|
||||||
|
.likeIfPresent(DiscountActivityDO::getName, reqVO.getName())
|
||||||
|
.eqIfPresent(DiscountActivityDO::getStatus, reqVO.getStatus())
|
||||||
|
.betweenIfPresent(DiscountActivityDO::getCreateTime, reqVO.getCreateTime())
|
||||||
|
.orderByDesc(DiscountActivityDO::getId));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.dal.mysql.discount;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 限时折扣商城 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface DiscountProductMapper extends BaseMapperX<DiscountProductDO> {
|
||||||
|
|
||||||
|
default List<DiscountProductDO> selectListBySkuId(Collection<Long> skuIds) {
|
||||||
|
return selectList(DiscountProductDO::getSkuId, skuIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
default List<DiscountProductDO> selectListByActivityId(Long activityId) {
|
||||||
|
return selectList(DiscountProductDO::getActivityId, activityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* TODO 占位
|
|
||||||
*/
|
|
||||||
package cn.iocoder.yudao.module.promotion.dal.mysql.discount;
|
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.dal.mysql.reward;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 满减送活动 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> {
|
||||||
|
|
||||||
|
default PageResult<RewardActivityDO> selectPage(RewardActivityPageReqVO reqVO) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<RewardActivityDO>()
|
||||||
|
.likeIfPresent(RewardActivityDO::getName, reqVO.getName())
|
||||||
|
.eqIfPresent(RewardActivityDO::getStatus, reqVO.getStatus())
|
||||||
|
.orderByDesc(RewardActivityDO::getId));
|
||||||
|
}
|
||||||
|
|
||||||
|
default List<RewardActivityDO> selectListByStatus(Collection<Integer> statuses) {
|
||||||
|
return selectList(RewardActivityDO::getStatus, statuses);
|
||||||
|
}
|
||||||
|
|
||||||
|
default List<RewardActivityDO> selectListByProductScopeAndStatus(Integer productScope, Integer status) {
|
||||||
|
return selectList(new LambdaQueryWrapperX<RewardActivityDO>()
|
||||||
|
.eq(RewardActivityDO::getProductScope, productScope)
|
||||||
|
.eq(RewardActivityDO::getStatus, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,196 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.service.discount;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||||
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 限时折扣 Service 实现类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class DiscountActivityServiceImpl implements DiscountActivityService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DiscountActivityMapper discountActivityMapper;
|
||||||
|
@Resource
|
||||||
|
private DiscountProductMapper discountProductMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Long, DiscountProductDetailBO> getMatchDiscountProducts(Collection<Long> skuIds) {
|
||||||
|
List<DiscountProductDetailBO> discountProducts = getRewardProductListBySkuIds(skuIds, singleton(PromotionActivityStatusEnum.RUN.getStatus()));
|
||||||
|
return convertMap(discountProducts, DiscountProductDetailBO::getSkuId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long createDiscountActivity(DiscountActivityCreateReqVO createReqVO) {
|
||||||
|
// 校验商品是否冲突
|
||||||
|
validateDiscountActivityProductConflicts(null, createReqVO.getProducts());
|
||||||
|
|
||||||
|
// 插入活动
|
||||||
|
DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO)
|
||||||
|
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
|
||||||
|
discountActivityMapper.insert(discountActivity);
|
||||||
|
// 插入商品
|
||||||
|
List<DiscountProductDO> discountProducts = convertList(createReqVO.getProducts(),
|
||||||
|
product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(discountActivity.getId()));
|
||||||
|
discountProductMapper.insertBatch(discountProducts);
|
||||||
|
// 返回
|
||||||
|
return discountActivity.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateDiscountActivity(DiscountActivityUpdateReqVO updateReqVO) {
|
||||||
|
// 校验存在
|
||||||
|
DiscountActivityDO discountActivity = validateDiscountActivityExists(updateReqVO.getId());
|
||||||
|
if (discountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能修改噢
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED);
|
||||||
|
}
|
||||||
|
// 校验商品是否冲突
|
||||||
|
validateDiscountActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts());
|
||||||
|
|
||||||
|
// 更新活动
|
||||||
|
DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO)
|
||||||
|
.setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime()));
|
||||||
|
discountActivityMapper.updateById(updateObj);
|
||||||
|
// 更新商品
|
||||||
|
updateDiscountProduct(updateReqVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateDiscountProduct(DiscountActivityUpdateReqVO updateReqVO) {
|
||||||
|
List<DiscountProductDO> dbDiscountProducts = discountProductMapper.selectListByActivityId(updateReqVO.getId());
|
||||||
|
// 计算要删除的记录
|
||||||
|
List<Long> deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId,
|
||||||
|
discountProductDO -> updateReqVO.getProducts().stream()
|
||||||
|
.noneMatch(product -> DiscountActivityConvert.INSTANCE.isEquals(discountProductDO, product)));
|
||||||
|
if (CollUtil.isNotEmpty(deleteIds)) {
|
||||||
|
discountProductMapper.deleteBatchIds(deleteIds);
|
||||||
|
}
|
||||||
|
// 计算新增的记录
|
||||||
|
List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(),
|
||||||
|
product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
|
||||||
|
newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch(
|
||||||
|
dbProduct -> DiscountActivityConvert.INSTANCE.isEquals(dbProduct, product))); // 如果匹配到,说明是更新的
|
||||||
|
if (CollectionUtil.isNotEmpty(newDiscountProducts)) {
|
||||||
|
discountProductMapper.insertBatch(newDiscountProducts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验商品是否冲突
|
||||||
|
*
|
||||||
|
* @param id 编号
|
||||||
|
* @param products 商品列表
|
||||||
|
*/
|
||||||
|
private void validateDiscountActivityProductConflicts(Long id, List<DiscountActivityBaseVO.Product> products) {
|
||||||
|
if (CollUtil.isEmpty(products)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 查询商品参加的活动
|
||||||
|
List<DiscountProductDetailBO> discountActivityProductList = getRewardProductListBySkuIds(
|
||||||
|
convertSet(products, DiscountActivityBaseVO.Product::getSkuId),
|
||||||
|
asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()));
|
||||||
|
if (id != null) { // 排除自己这个活动
|
||||||
|
discountActivityProductList.removeIf(product -> id.equals(product.getActivityId()));
|
||||||
|
}
|
||||||
|
// 如果非空,则说明冲突
|
||||||
|
if (CollUtil.isNotEmpty(discountActivityProductList)) {
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_SPU_CONFLICTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<DiscountProductDetailBO> getRewardProductListBySkuIds(Collection<Long> skuIds,
|
||||||
|
Collection<Integer> statuses) {
|
||||||
|
// 查询商品
|
||||||
|
List<DiscountProductDO> products = discountProductMapper.selectListBySkuId(skuIds);
|
||||||
|
if (CollUtil.isEmpty(products)) {
|
||||||
|
return new ArrayList<>(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询活动
|
||||||
|
List<DiscountActivityDO> activities = discountActivityMapper.selectBatchIds(skuIds);
|
||||||
|
activities.removeIf(activity -> !statuses.contains(activity.getStatus())); // 移除不满足 statuses 状态的
|
||||||
|
Map<Long, DiscountActivityDO> activityMap = CollectionUtils.convertMap(activities, DiscountActivityDO::getId);
|
||||||
|
|
||||||
|
// 移除不满足活动的商品
|
||||||
|
products.removeIf(product -> !activityMap.containsKey(product.getActivityId()));
|
||||||
|
return DiscountActivityConvert.INSTANCE.convertList(products, activityMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeRewardActivity(Long id) {
|
||||||
|
// 校验存在
|
||||||
|
DiscountActivityDO dbDiscountActivity = validateDiscountActivityExists(id);
|
||||||
|
if (dbDiscountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能关闭噢
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED);
|
||||||
|
}
|
||||||
|
if (dbDiscountActivity.getStatus().equals(PromotionActivityStatusEnum.END.getStatus())) { // 已关闭的活动,不能关闭噢
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
DiscountActivityDO updateObj = new DiscountActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
discountActivityMapper.updateById(updateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteDiscountActivity(Long id) {
|
||||||
|
// 校验存在
|
||||||
|
DiscountActivityDO discountActivity = validateDiscountActivityExists(id);
|
||||||
|
if (!discountActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 未关闭的活动,不能删除噢
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除
|
||||||
|
discountActivityMapper.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DiscountActivityDO validateDiscountActivityExists(Long id) {
|
||||||
|
DiscountActivityDO discountActivity = discountActivityMapper.selectById(id);
|
||||||
|
if (discountActivity == null) {
|
||||||
|
throw exception(DISCOUNT_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
return discountActivity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DiscountActivityDO getDiscountActivity(Long id) {
|
||||||
|
return discountActivityMapper.selectById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<DiscountActivityDO> getDiscountActivityPage(DiscountActivityPageReqVO pageReqVO) {
|
||||||
|
return discountActivityMapper.selectPage(pageReqVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DiscountProductDO> getDiscountProductsByActivityId(Long activityId) {
|
||||||
|
return discountProductMapper.selectListByActivityId(activityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,29 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.service.discount;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 限时折扣 Service 实现类
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@Validated
|
|
||||||
public class DiscountServiceImpl implements DiscountService {
|
|
||||||
|
|
||||||
// TODO 芋艿:待实现
|
|
||||||
@Override
|
|
||||||
public Map<Long, DiscountProductDO> getMatchDiscountProducts(Collection<Long> skuIds) {
|
|
||||||
Map<Long, DiscountProductDO> products = new HashMap<>();
|
|
||||||
products.put(1L, new DiscountProductDO().setPromotionPrice(100));
|
|
||||||
products.put(2L, new DiscountProductDO().setPromotionPrice(50));
|
|
||||||
return products;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -0,0 +1,169 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.service.reward;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.map.MapUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.hutool.core.collection.CollUtil.intersectionDistinct;
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static java.util.Collections.singleton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 满减送活动 Service 实现类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class RewardActivityServiceImpl implements RewardActivityService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RewardActivityMapper rewardActivityMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long createRewardActivity(RewardActivityCreateReqVO createReqVO) {
|
||||||
|
// 校验商品是否冲突
|
||||||
|
validateRewardActivitySpuConflicts(null, createReqVO.getProductSpuIds());
|
||||||
|
|
||||||
|
// 插入
|
||||||
|
RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO)
|
||||||
|
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
|
||||||
|
rewardActivityMapper.insert(rewardActivity);
|
||||||
|
// 返回
|
||||||
|
return rewardActivity.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateRewardActivity(RewardActivityUpdateReqVO updateReqVO) {
|
||||||
|
// 校验存在
|
||||||
|
RewardActivityDO dbRewardActivity = validateRewardActivityExists(updateReqVO.getId());
|
||||||
|
if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能修改噢
|
||||||
|
throw exception(REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED);
|
||||||
|
}
|
||||||
|
// 校验商品是否冲突
|
||||||
|
validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO.getProductSpuIds());
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO)
|
||||||
|
.setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime()));
|
||||||
|
rewardActivityMapper.updateById(updateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeRewardActivity(Long id) {
|
||||||
|
// 校验存在
|
||||||
|
RewardActivityDO dbRewardActivity = validateRewardActivityExists(id);
|
||||||
|
if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能关闭噢
|
||||||
|
throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED);
|
||||||
|
}
|
||||||
|
if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.END.getStatus())) { // 已关闭的活动,不能关闭噢
|
||||||
|
throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
RewardActivityDO updateObj = new RewardActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
rewardActivityMapper.updateById(updateObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteRewardActivity(Long id) {
|
||||||
|
// 校验存在
|
||||||
|
RewardActivityDO dbRewardActivity = validateRewardActivityExists(id);
|
||||||
|
if (!dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 未关闭的活动,不能删除噢
|
||||||
|
throw exception(REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除
|
||||||
|
rewardActivityMapper.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private RewardActivityDO validateRewardActivityExists(Long id) {
|
||||||
|
RewardActivityDO activity = rewardActivityMapper.selectById(id);
|
||||||
|
if (activity == null) {
|
||||||
|
throw exception(REWARD_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
return activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验商品参加的活动是否冲突
|
||||||
|
*
|
||||||
|
* @param id 活动编号
|
||||||
|
* @param spuIds 商品 SPU 编号数组
|
||||||
|
*/
|
||||||
|
private void validateRewardActivitySpuConflicts(Long id, Collection<Long> spuIds) {
|
||||||
|
if (CollUtil.isEmpty(spuIds)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 查询商品参加的活动
|
||||||
|
List<RewardActivityDO> rewardActivityList = getRewardActivityListBySpuIds(spuIds,
|
||||||
|
asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()));
|
||||||
|
if (id != null) { // 排除自己这个活动
|
||||||
|
rewardActivityList.removeIf(activity -> id.equals(activity.getId()));
|
||||||
|
}
|
||||||
|
// 如果非空,则说明冲突
|
||||||
|
if (CollUtil.isNotEmpty(rewardActivityList)) {
|
||||||
|
throw exception(REWARD_ACTIVITY_SPU_CONFLICTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得商品参加的满减送活动的数组
|
||||||
|
*
|
||||||
|
* @param spuIds 商品 SPU 编号数组
|
||||||
|
* @param statuses 活动状态数组
|
||||||
|
* @return 商品参加的满减送活动的数组
|
||||||
|
*/
|
||||||
|
private List<RewardActivityDO> getRewardActivityListBySpuIds(Collection<Long> spuIds,
|
||||||
|
Collection<Integer> statuses) {
|
||||||
|
List<RewardActivityDO> list = rewardActivityMapper.selectListByStatus(statuses);
|
||||||
|
return CollUtil.filter(list, activity -> CollUtil.containsAny(activity.getProductSpuIds(), spuIds));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewardActivityDO getRewardActivity(Long id) {
|
||||||
|
return rewardActivityMapper.selectById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<RewardActivityDO> getRewardActivityPage(RewardActivityPageReqVO pageReqVO) {
|
||||||
|
return rewardActivityMapper.selectPage(pageReqVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<RewardActivityDO, Set<Long>> getMatchRewardActivities(Set<Long> spuIds) {
|
||||||
|
// 如果有全局活动,则直接选择它
|
||||||
|
List<RewardActivityDO> allActivities = rewardActivityMapper.selectListByProductScopeAndStatus(
|
||||||
|
PromotionProductScopeEnum.ALL.getScope(), PromotionActivityStatusEnum.RUN.getStatus());
|
||||||
|
if (CollUtil.isNotEmpty(allActivities)) {
|
||||||
|
return MapUtil.builder(allActivities.get(0), spuIds).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询某个活动参加的活动
|
||||||
|
List<RewardActivityDO> productActivityList = getRewardActivityListBySpuIds(spuIds,
|
||||||
|
singleton(PromotionActivityStatusEnum.RUN.getStatus()));
|
||||||
|
return convertMap(productActivityList, activity -> activity,
|
||||||
|
rewardActivityDO -> intersectionDistinct(rewardActivityDO.getProductSpuIds(), spuIds)); // 求交集返回
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,26 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.promotion.service.reward;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 满减送 Service 实现类
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@Validated
|
|
||||||
public class RewardServiceImpl implements RewardService {
|
|
||||||
|
|
||||||
// TODO 芋艿:待实现
|
|
||||||
@Override
|
|
||||||
public Map<RewardActivityDO, Set<Long>> getMatchRewardActivities(Set<Long> spuIds) {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper">
|
||||||
|
|
||||||
|
<update id="updateTakeCount">
|
||||||
|
UPDATE promotion_coupon_template
|
||||||
|
SET take_count = take_count + #{incrCount}
|
||||||
|
WHERE id = #{id}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,209 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.service.discount;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||||
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.DISCOUNT_ACTIVITY_NOT_EXISTS;
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link DiscountActivityServiceImpl} 的单元测试类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Import(DiscountActivityServiceImpl.class)
|
||||||
|
public class DiscountActivityServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DiscountActivityServiceImpl discountActivityService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DiscountActivityMapper discountActivityMapper;
|
||||||
|
@Resource
|
||||||
|
private DiscountProductMapper discountProductMapper;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateDiscountActivity_success() {
|
||||||
|
// 准备参数
|
||||||
|
DiscountActivityCreateReqVO reqVO = randomPojo(DiscountActivityCreateReqVO.class, o -> {
|
||||||
|
// 用于触发进行中的状态
|
||||||
|
o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
|
||||||
|
// 设置商品
|
||||||
|
o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L)
|
||||||
|
.setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3),
|
||||||
|
new DiscountActivityBaseVO.Product().setSpuId(10L).setSkuId(20L)
|
||||||
|
.setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30)));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
Long discountActivityId = discountActivityService.createDiscountActivity(reqVO);
|
||||||
|
// 断言
|
||||||
|
assertNotNull(discountActivityId);
|
||||||
|
// 校验活动
|
||||||
|
DiscountActivityDO discountActivity = discountActivityMapper.selectById(discountActivityId);
|
||||||
|
assertPojoEquals(reqVO, discountActivity);
|
||||||
|
assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
// 校验商品
|
||||||
|
List<DiscountProductDO> discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId());
|
||||||
|
assertEquals(discountProducts.size(), reqVO.getProducts().size());
|
||||||
|
for (int i = 0; i < reqVO.getProducts().size(); i++) {
|
||||||
|
DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i);
|
||||||
|
DiscountProductDO discountProduct = discountProducts.get(i);
|
||||||
|
assertEquals(discountProduct.getActivityId(), discountActivity.getId());
|
||||||
|
assertEquals(discountProduct.getSpuId(), product.getSpuId());
|
||||||
|
assertEquals(discountProduct.getSkuId(), product.getSkuId());
|
||||||
|
assertEquals(discountProduct.getDiscountType(), product.getDiscountType());
|
||||||
|
assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice());
|
||||||
|
assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateDiscountActivity_success() {
|
||||||
|
// mock 数据(商品)
|
||||||
|
DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class);
|
||||||
|
discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// mock 数据(活动)
|
||||||
|
DiscountProductDO dbDiscountProduct01 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId())
|
||||||
|
.setSpuId(1L).setSkuId(2L).setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null));
|
||||||
|
DiscountProductDO dbDiscountProduct02 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId())
|
||||||
|
.setSpuId(10L).setSkuId(20L).setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null));
|
||||||
|
discountProductMapper.insert(dbDiscountProduct01);
|
||||||
|
discountProductMapper.insert(dbDiscountProduct02);
|
||||||
|
// 准备参数
|
||||||
|
DiscountActivityUpdateReqVO reqVO = randomPojo(DiscountActivityUpdateReqVO.class, o -> {
|
||||||
|
o.setId(dbDiscountActivity.getId()); // 设置更新的 ID
|
||||||
|
// 用于触发进行中的状态
|
||||||
|
o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
|
||||||
|
// 设置商品
|
||||||
|
o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L)
|
||||||
|
.setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null),
|
||||||
|
new DiscountActivityBaseVO.Product().setSpuId(100L).setSkuId(200L)
|
||||||
|
.setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null)));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
discountActivityService.updateDiscountActivity(reqVO);
|
||||||
|
// 校验活动
|
||||||
|
DiscountActivityDO discountActivity = discountActivityMapper.selectById(reqVO.getId()); // 获取最新的
|
||||||
|
assertPojoEquals(reqVO, discountActivity);
|
||||||
|
assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
// 校验商品
|
||||||
|
List<DiscountProductDO> discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId());
|
||||||
|
assertEquals(discountProducts.size(), reqVO.getProducts().size());
|
||||||
|
for (int i = 0; i < reqVO.getProducts().size(); i++) {
|
||||||
|
DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i);
|
||||||
|
DiscountProductDO discountProduct = discountProducts.get(i);
|
||||||
|
assertEquals(discountProduct.getActivityId(), discountActivity.getId());
|
||||||
|
assertEquals(discountProduct.getSpuId(), product.getSpuId());
|
||||||
|
assertEquals(discountProduct.getSkuId(), product.getSkuId());
|
||||||
|
assertEquals(discountProduct.getDiscountType(), product.getDiscountType());
|
||||||
|
assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice());
|
||||||
|
assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCloseDiscountActivity() {
|
||||||
|
// mock 数据
|
||||||
|
DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class,
|
||||||
|
o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()));
|
||||||
|
discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbDiscountActivity.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
discountActivityService.closeRewardActivity(id);
|
||||||
|
// 校验状态
|
||||||
|
DiscountActivityDO discountActivity = discountActivityMapper.selectById(id);
|
||||||
|
assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateDiscountActivity_notExists() {
|
||||||
|
// 准备参数
|
||||||
|
DiscountActivityUpdateReqVO reqVO = randomPojo(DiscountActivityUpdateReqVO.class);
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> discountActivityService.updateDiscountActivity(reqVO), DISCOUNT_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteDiscountActivity_success() {
|
||||||
|
// mock 数据
|
||||||
|
DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class,
|
||||||
|
o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()));
|
||||||
|
discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbDiscountActivity.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
discountActivityService.deleteDiscountActivity(id);
|
||||||
|
// 校验数据不存在了
|
||||||
|
assertNull(discountActivityMapper.selectById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteDiscountActivity_notExists() {
|
||||||
|
// 准备参数
|
||||||
|
Long id = randomLongId();
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> discountActivityService.deleteDiscountActivity(id), DISCOUNT_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDiscountActivityPage() {
|
||||||
|
// mock 数据
|
||||||
|
DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class, o -> { // 等会查询到
|
||||||
|
o.setName("芋艿");
|
||||||
|
o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
o.setCreateTime(buildTime(2021, 1, 15));
|
||||||
|
});
|
||||||
|
discountActivityMapper.insert(dbDiscountActivity);
|
||||||
|
// 测试 name 不匹配
|
||||||
|
discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setName("土豆")));
|
||||||
|
// 测试 status 不匹配
|
||||||
|
discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setStatus(PromotionActivityStatusEnum.END.getStatus())));
|
||||||
|
// 测试 createTime 不匹配
|
||||||
|
discountActivityMapper.insert(cloneIgnoreId(dbDiscountActivity, o -> o.setCreateTime(buildTime(2021, 2, 10))));
|
||||||
|
// 准备参数
|
||||||
|
DiscountActivityPageReqVO reqVO = new DiscountActivityPageReqVO();
|
||||||
|
reqVO.setName("芋艿");
|
||||||
|
reqVO.setStatus(PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 1), buildTime(2021, 1, 31)}));
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
PageResult<DiscountActivityDO> pageResult = discountActivityService.getDiscountActivityPage(reqVO);
|
||||||
|
// 断言
|
||||||
|
assertEquals(1, pageResult.getTotal());
|
||||||
|
assertEquals(1, pageResult.getList().size());
|
||||||
|
assertPojoEquals(dbDiscountActivity, pageResult.getList().get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,218 @@
|
|||||||
|
package cn.iocoder.yudao.module.promotion.service.reward;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
||||||
|
import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||||
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS;
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link RewardActivityServiceImpl} 的单元测试类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Import(RewardActivityServiceImpl.class)
|
||||||
|
public class RewardActivityServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RewardActivityServiceImpl rewardActivityService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RewardActivityMapper rewardActivityMapper;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateRewardActivity_success() {
|
||||||
|
// 准备参数
|
||||||
|
RewardActivityCreateReqVO reqVO = randomPojo(RewardActivityCreateReqVO.class, o -> {
|
||||||
|
o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType());
|
||||||
|
o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope());
|
||||||
|
// 用于触发进行中的状态
|
||||||
|
o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
Long rewardActivityId = rewardActivityService.createRewardActivity(reqVO);
|
||||||
|
// 断言
|
||||||
|
assertNotNull(rewardActivityId);
|
||||||
|
// 校验记录的属性是否正确
|
||||||
|
RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId);
|
||||||
|
assertPojoEquals(reqVO, rewardActivity, "rules");
|
||||||
|
assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
for (int i = 0; i < reqVO.getRules().size(); i++) {
|
||||||
|
assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateRewardActivity_success() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()));
|
||||||
|
rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> {
|
||||||
|
o.setId(dbRewardActivity.getId()); // 设置更新的 ID
|
||||||
|
o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType());
|
||||||
|
o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope());
|
||||||
|
// 用于触发进行中的状态
|
||||||
|
o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
rewardActivityService.updateRewardActivity(reqVO);
|
||||||
|
// 校验是否更新正确
|
||||||
|
RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的
|
||||||
|
assertPojoEquals(reqVO, rewardActivity, "rules");
|
||||||
|
assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
|
||||||
|
for (int i = 0; i < reqVO.getRules().size(); i++) {
|
||||||
|
assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCloseRewardActivity() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()));
|
||||||
|
rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbRewardActivity.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
rewardActivityService.closeRewardActivity(id);
|
||||||
|
// 校验状态
|
||||||
|
RewardActivityDO rewardActivity = rewardActivityMapper.selectById(id);
|
||||||
|
assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateRewardActivity_notExists() {
|
||||||
|
// 准备参数
|
||||||
|
RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class);
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> rewardActivityService.updateRewardActivity(reqVO), REWARD_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteRewardActivity_success() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()));
|
||||||
|
rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbRewardActivity.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
rewardActivityService.deleteRewardActivity(id);
|
||||||
|
// 校验数据不存在了
|
||||||
|
assertNull(rewardActivityMapper.selectById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteRewardActivity_notExists() {
|
||||||
|
// 准备参数
|
||||||
|
Long id = randomLongId();
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> rewardActivityService.deleteRewardActivity(id), REWARD_ACTIVITY_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetRewardActivityPage() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到
|
||||||
|
o.setName("芋艿");
|
||||||
|
o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
});
|
||||||
|
rewardActivityMapper.insert(dbRewardActivity);
|
||||||
|
// 测试 name 不匹配
|
||||||
|
rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆")));
|
||||||
|
// 测试 status 不匹配
|
||||||
|
rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())));
|
||||||
|
// 准备参数
|
||||||
|
RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO();
|
||||||
|
reqVO.setName("芋艿");
|
||||||
|
reqVO.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus());
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(reqVO);
|
||||||
|
// 断言
|
||||||
|
assertEquals(1, pageResult.getTotal());
|
||||||
|
assertEquals(1, pageResult.getList().size());
|
||||||
|
assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetRewardActivities_all() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
|
||||||
|
.setProductScope(PromotionProductScopeEnum.ALL.getScope()));
|
||||||
|
rewardActivityMapper.insert(allActivity);
|
||||||
|
RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
|
||||||
|
.setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L)));
|
||||||
|
rewardActivityMapper.insert(productActivity);
|
||||||
|
// 准备参数
|
||||||
|
Set<Long> spuIds = asSet(1L, 2L);
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds);
|
||||||
|
// 断言
|
||||||
|
assertEquals(matchRewardActivities.size(), 1);
|
||||||
|
Map.Entry<RewardActivityDO, Set<Long>> next = matchRewardActivities.entrySet().iterator().next();
|
||||||
|
assertPojoEquals(next.getKey(), allActivity);
|
||||||
|
assertEquals(next.getValue(), spuIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetRewardActivities_product() {
|
||||||
|
// mock 数据
|
||||||
|
RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
|
||||||
|
.setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L)));
|
||||||
|
rewardActivityMapper.insert(productActivity01);
|
||||||
|
RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
|
||||||
|
.setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(singletonList(3L)));
|
||||||
|
rewardActivityMapper.insert(productActivity02);
|
||||||
|
// 准备参数
|
||||||
|
Set<Long> spuIds = asSet(1L, 2L, 3L);
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds);
|
||||||
|
// 断言
|
||||||
|
assertEquals(matchRewardActivities.size(), 2);
|
||||||
|
matchRewardActivities.forEach((activity, activitySpuIds) -> {
|
||||||
|
if (activity.getId().equals(productActivity01.getId())) {
|
||||||
|
assertPojoEquals(activity, productActivity01);
|
||||||
|
assertEquals(activitySpuIds, asSet(1L, 2L));
|
||||||
|
} else if (activity.getId().equals(productActivity02.getId())) {
|
||||||
|
assertPojoEquals(activity, productActivity02);
|
||||||
|
assertEquals(activitySpuIds, asSet(3L));
|
||||||
|
} else {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1 +1,6 @@
|
|||||||
DELETE FROM "market_activity";
|
DELETE FROM "market_activity";
|
||||||
|
DELETE FROM "promotion_coupon_template";
|
||||||
|
DELETE FROM "promotion_coupon";
|
||||||
|
DELETE FROM "promotion_reward_activity";
|
||||||
|
DELETE FROM "promotion_discount_activity";
|
||||||
|
DELETE FROM "promotion_discount_product";
|
||||||
|
|||||||
@ -1,52 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.member.api.user.dto;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户信息 Response DTO
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class UserInfoDTO {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户ID
|
|
||||||
*/
|
|
||||||
private Long id;
|
|
||||||
/**
|
|
||||||
* 用户昵称
|
|
||||||
*/
|
|
||||||
private String nickname;
|
|
||||||
/**
|
|
||||||
* 用户头像
|
|
||||||
*/
|
|
||||||
private String avatar;
|
|
||||||
/**
|
|
||||||
* 帐号状态
|
|
||||||
*
|
|
||||||
* 枚举 {@link CommonStatusEnum}
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 手机
|
|
||||||
*/
|
|
||||||
private String mobile;
|
|
||||||
/**
|
|
||||||
* 注册 IP
|
|
||||||
*/
|
|
||||||
private String registerIp;
|
|
||||||
/**
|
|
||||||
* 最后登录IP
|
|
||||||
*/
|
|
||||||
private String loginIp;
|
|
||||||
/**
|
|
||||||
* 最后登录时间
|
|
||||||
*/
|
|
||||||
private Date loginDate;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.member.controller.admin.user;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
||||||
import cn.iocoder.yudao.module.member.api.user.dto.UserInfoDTO;
|
|
||||||
import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO;
|
|
||||||
import cn.iocoder.yudao.module.member.convert.user.UserConvert;
|
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
|
||||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Banging
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Api("用户管理")
|
|
||||||
@RestController(value = "memberUserController")
|
|
||||||
@RequestMapping("/user")
|
|
||||||
public class UserController {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private MemberUserService userService;
|
|
||||||
|
|
||||||
@ApiOperation(value = "用户信息获取",notes = "用户基本信息的获取")
|
|
||||||
@GetMapping("/{tel}")
|
|
||||||
public CommonResult<UserInfoDTO> getUserInfo(@PathVariable String tel){
|
|
||||||
MemberUserDO user = userService.getUserByMobile(tel);
|
|
||||||
return CommonResult.success(UserConvert.INSTANCE.convertInfo(user));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
import request from '@/utils/request'
|
|
||||||
|
|
||||||
// 创建优惠券模板
|
|
||||||
export function create(data) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/create',
|
|
||||||
method: 'post',
|
|
||||||
data: data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新优惠券模板
|
|
||||||
export function update(data) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/update',
|
|
||||||
method: 'put',
|
|
||||||
data: data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除优惠券模板
|
|
||||||
export function deleteCouponTemplete (id) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/delete?id=' + id,
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获得优惠券模板
|
|
||||||
export function get(id) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/get?id=' + id,
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获得优惠券模板分页
|
|
||||||
export function getPage(query) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/page',
|
|
||||||
method: 'get',
|
|
||||||
params: query
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出优惠券模板 Excel
|
|
||||||
export function exportExcel(query) {
|
|
||||||
return request({
|
|
||||||
url: '/coupon/template/export-excel',
|
|
||||||
method: 'get',
|
|
||||||
params: query,
|
|
||||||
responseType: 'blob'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 获得商品 SKU 选项的列表
|
||||||
|
export function getSkuOptionList() {
|
||||||
|
return request({
|
||||||
|
url: '/product/sku/get-option-list',
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue