Commit 409ec555e899646b92bc2325ec9f2ce4766cd2f4

Authored by puhui999
1 parent 6fc72454

feat:mall CombinationActivity

Showing 18 changed files with 1022 additions and 10 deletions
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImplTest.java
@@ -151,7 +151,6 @@ public class ProductCommentServiceImplTest extends BaseDbUnitTest { @@ -151,7 +151,6 @@ public class ProductCommentServiceImplTest extends BaseDbUnitTest {
151 151
152 // 测试分页 tab count 152 // 测试分页 tab count
153 AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentStatistics(spuId, Boolean.TRUE); 153 AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentStatistics(spuId, Boolean.TRUE);
154 - assertEquals(6, tabsCount.getAllCount());  
155 assertEquals(4, tabsCount.getGoodCount()); 154 assertEquals(4, tabsCount.getGoodCount());
156 assertEquals(2, tabsCount.getMediocreCount()); 155 assertEquals(2, tabsCount.getMediocreCount());
157 assertEquals(0, tabsCount.getNegativeCount()); 156 assertEquals(0, tabsCount.getNegativeCount());
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
@@ -59,4 +59,6 @@ public interface ErrorCodeConstants { @@ -59,4 +59,6 @@ public interface ErrorCodeConstants {
59 ErrorCode SECKILL_TIME_EQUAL = new ErrorCode(1013009002, "秒杀时段开始时间和结束时间不能相等"); 59 ErrorCode SECKILL_TIME_EQUAL = new ErrorCode(1013009002, "秒杀时段开始时间和结束时间不能相等");
60 ErrorCode SECKILL_START_TIME_BEFORE_END_TIME = new ErrorCode(1013009003, "秒杀时段开始时间不能在结束时间之后"); 60 ErrorCode SECKILL_START_TIME_BEFORE_END_TIME = new ErrorCode(1013009003, "秒杀时段开始时间不能在结束时间之后");
61 61
  62 + // ========== 拼团活动 1013010000 ==========
  63 + ErrorCode COMBINATION_ACTIVITY_NOT_EXISTS = new ErrorCode(1013010000, "拼团活动不存在");
62 } 64 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/CombinationActivityController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.*;
  8 +import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
  9 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  10 +import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
  11 +import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
  13 +import io.swagger.v3.oas.annotations.tags.Tag;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.validation.annotation.Validated;
  16 +import org.springframework.web.bind.annotation.*;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.servlet.http.HttpServletResponse;
  20 +import javax.validation.Valid;
  21 +import java.io.IOException;
  22 +import java.util.Collection;
  23 +import java.util.List;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  26 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  27 +
  28 +@Tag(name = "管理后台 - 拼团活动")
  29 +@RestController
  30 +@RequestMapping("/promotion/combination-activity")
  31 +@Validated
  32 +public class CombinationActivityController {
  33 +
  34 + @Resource
  35 + private CombinationActivityService combinationActivityService;
  36 +
  37 + @PostMapping("/create")
  38 + @Operation(summary = "创建拼团活动")
  39 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:create')")
  40 + public CommonResult<Long> createCombinationActivity(@Valid @RequestBody CombinationActivityCreateReqVO createReqVO) {
  41 + return success(combinationActivityService.createCombinationActivity(createReqVO));
  42 + }
  43 +
  44 + @PutMapping("/update")
  45 + @Operation(summary = "更新拼团活动")
  46 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:update')")
  47 + public CommonResult<Boolean> updateCombinationActivity(@Valid @RequestBody CombinationActivityUpdateReqVO updateReqVO) {
  48 + combinationActivityService.updateCombinationActivity(updateReqVO);
  49 + return success(true);
  50 + }
  51 +
  52 + @DeleteMapping("/delete")
  53 + @Operation(summary = "删除拼团活动")
  54 + @Parameter(name = "id", description = "编号", required = true)
  55 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:delete')")
  56 + public CommonResult<Boolean> deleteCombinationActivity(@RequestParam("id") Long id) {
  57 + combinationActivityService.deleteCombinationActivity(id);
  58 + return success(true);
  59 + }
  60 +
  61 + @GetMapping("/get")
  62 + @Operation(summary = "获得拼团活动")
  63 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  64 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')")
  65 + public CommonResult<CombinationActivityRespVO> getCombinationActivity(@RequestParam("id") Long id) {
  66 + CombinationActivityDO combinationActivity = combinationActivityService.getCombinationActivity(id);
  67 + return success(CombinationActivityConvert.INSTANCE.convert(combinationActivity));
  68 + }
  69 +
  70 + @GetMapping("/list")
  71 + @Operation(summary = "获得拼团活动列表")
  72 + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
  73 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')")
  74 + public CommonResult<List<CombinationActivityRespVO>> getCombinationActivityList(@RequestParam("ids") Collection<Long> ids) {
  75 + List<CombinationActivityDO> list = combinationActivityService.getCombinationActivityList(ids);
  76 + return success(CombinationActivityConvert.INSTANCE.convertList(list));
  77 + }
  78 +
  79 + @GetMapping("/page")
  80 + @Operation(summary = "获得拼团活动分页")
  81 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')")
  82 + public CommonResult<PageResult<CombinationActivityRespVO>> getCombinationActivityPage(@Valid CombinationActivityPageReqVO pageVO) {
  83 + PageResult<CombinationActivityDO> pageResult = combinationActivityService.getCombinationActivityPage(pageVO);
  84 + return success(CombinationActivityConvert.INSTANCE.convertPage(pageResult));
  85 + }
  86 +
  87 + @GetMapping("/export-excel")
  88 + @Operation(summary = "导出拼团活动 Excel")
  89 + @PreAuthorize("@ss.hasPermission('promotion:combination-activity:export')")
  90 + @OperateLog(type = EXPORT)
  91 + public void exportCombinationActivityExcel(@Valid CombinationActivityExportReqVO exportReqVO,
  92 + HttpServletResponse response) throws IOException {
  93 + List<CombinationActivityDO> list = combinationActivityService.getCombinationActivityList(exportReqVO);
  94 + // 导出 Excel
  95 + List<CombinationActivityExcelVO> datas = CombinationActivityConvert.INSTANCE.convertList02(list);
  96 + ExcelUtils.write(response, "拼团活动.xls", "数据", CombinationActivityExcelVO.class, datas);
  97 + }
  98 +
  99 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +import java.time.LocalDateTime;
  9 +
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +/**
  13 + * 拼团活动 Base VO,提供给添加、修改、详细的子 VO 使用
  14 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  15 + */
  16 +@Data
  17 +public class CombinationActivityBaseVO {
  18 +
  19 + @Schema(description = "拼团名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
  20 + @NotNull(message = "拼团名称不能为空")
  21 + private String name;
  22 +
  23 + @Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "14016")
  24 + private Long spuId;
  25 +
  26 + @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "16218")
  27 + @NotNull(message = "总限购数量不能为空")
  28 + private Integer totalLimitCount;
  29 +
  30 + @Schema(description = "单次限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28265")
  31 + @NotNull(message = "单次限购数量不能为空")
  32 + private Integer singleLimitCount;
  33 +
  34 + @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
  35 + @NotNull(message = "开始时间不能为空")
  36 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  37 + private LocalDateTime startTime;
  38 +
  39 + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
  40 + @NotNull(message = "结束时间不能为空")
  41 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  42 + private LocalDateTime endTime;
  43 +
  44 + @Schema(description = "购买人数", requiredMode = Schema.RequiredMode.REQUIRED)
  45 + @NotNull(message = "购买人数不能为空")
  46 + private Integer userSize;
  47 +
  48 + @Schema(description = "开团组数", requiredMode = Schema.RequiredMode.REQUIRED)
  49 + @NotNull(message = "开团组数不能为空")
  50 + private Integer totalNum;
  51 +
  52 + @Schema(description = "成团组数", requiredMode = Schema.RequiredMode.REQUIRED)
  53 + @NotNull(message = "成团组数不能为空")
  54 + private Integer successNum;
  55 +
  56 + @Schema(description = "参与人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222")
  57 + @NotNull(message = "参与人数不能为空")
  58 + private Integer orderUserCount;
  59 +
  60 + @Schema(description = "虚拟成团", requiredMode = Schema.RequiredMode.REQUIRED)
  61 + @NotNull(message = "虚拟成团不能为空")
  62 + private Integer virtualGroup;
  63 +
  64 + @Schema(description = "活动状态:0开启 1关闭", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  65 + @NotNull(message = "活动状态:0开启 1关闭不能为空")
  66 + private Integer status;
  67 +
  68 + @Schema(description = "限制时长(小时)", requiredMode = Schema.RequiredMode.REQUIRED)
  69 + @NotNull(message = "限制时长(小时)不能为空")
  70 + private Integer limitDuration;
  71 +
  72 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +@Schema(description = "管理后台 - 拼团活动创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class CombinationActivityCreateReqVO extends CombinationActivityBaseVO {
  13 +
  14 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +
  11 +/**
  12 + * 拼团活动 Excel VO
  13 + *
  14 + * @author HUIHUI
  15 + */
  16 +@Data
  17 +public class CombinationActivityExcelVO {
  18 +
  19 + @ExcelProperty("活动编号")
  20 + private Long id;
  21 +
  22 + @ExcelProperty("拼团名称")
  23 + private String name;
  24 +
  25 + @ExcelProperty("商品 SPU 编号关联 ProductSpuDO 的 id")
  26 + private Long spuId;
  27 +
  28 + @ExcelProperty("总限购数量")
  29 + private Integer totalLimitCount;
  30 +
  31 + @ExcelProperty("单次限购数量")
  32 + private Integer singleLimitCount;
  33 +
  34 + @ExcelProperty("开始时间")
  35 + private LocalDateTime startTime;
  36 +
  37 + @ExcelProperty("结束时间")
  38 + private LocalDateTime endTime;
  39 +
  40 + @ExcelProperty("购买人数")
  41 + private Integer userSize;
  42 +
  43 + @ExcelProperty("开团组数")
  44 + private Integer totalNum;
  45 +
  46 + @ExcelProperty("成团组数")
  47 + private Integer successNum;
  48 +
  49 + @ExcelProperty("参与人数")
  50 + private Integer orderUserCount;
  51 +
  52 + @ExcelProperty("虚拟成团")
  53 + private Integer virtualGroup;
  54 +
  55 + @ExcelProperty(value = "活动状态:0开启 1关闭", converter = DictConvert.class)
  56 + @DictFormat("common_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
  57 + private Integer status;
  58 +
  59 + @ExcelProperty("限制时长(小时)")
  60 + private Integer limitDuration;
  61 +
  62 + @ExcelProperty("创建时间")
  63 + private LocalDateTime createTime;
  64 +
  65 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityExportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@Schema(description = "管理后台 - 拼团活动 Excel 导出 Request VO,参数和 CombinationActivityPageReqVO 是一致的")
  12 +@Data
  13 +public class CombinationActivityExportReqVO {
  14 +
  15 + @Schema(description = "拼团名称", example = "赵六")
  16 + private String name;
  17 +
  18 + @Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "14016")
  19 + private Long spuId;
  20 +
  21 + @Schema(description = "总限购数量", example = "16218")
  22 + private Integer totalLimitCount;
  23 +
  24 + @Schema(description = "单次限购数量", example = "28265")
  25 + private Integer singleLimitCount;
  26 +
  27 + @Schema(description = "开始时间")
  28 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  29 + private LocalDateTime[] startTime;
  30 +
  31 + @Schema(description = "结束时间")
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + private LocalDateTime[] endTime;
  34 +
  35 + @Schema(description = "购买人数")
  36 + private Integer userSize;
  37 +
  38 + @Schema(description = "开团组数")
  39 + private Integer totalNum;
  40 +
  41 + @Schema(description = "成团组数")
  42 + private Integer successNum;
  43 +
  44 + @Schema(description = "参与人数", example = "25222")
  45 + private Integer orderUserCount;
  46 +
  47 + @Schema(description = "虚拟成团")
  48 + private Integer virtualGroup;
  49 +
  50 + @Schema(description = "活动状态:0开启 1关闭", example = "0")
  51 + private Integer status;
  52 +
  53 + @Schema(description = "限制时长(小时)")
  54 + private Integer limitDuration;
  55 +
  56 + @Schema(description = "创建时间")
  57 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  58 + private LocalDateTime[] createTime;
  59 +
  60 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - 拼团活动分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class CombinationActivityPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "拼团名称", example = "赵六")
  21 + private String name;
  22 +
  23 + @Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "14016")
  24 + private Long spuId;
  25 +
  26 + @Schema(description = "总限购数量", example = "16218")
  27 + private Integer totalLimitCount;
  28 +
  29 + @Schema(description = "单次限购数量", example = "28265")
  30 + private Integer singleLimitCount;
  31 +
  32 + @Schema(description = "开始时间")
  33 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  34 + private LocalDateTime[] startTime;
  35 +
  36 + @Schema(description = "结束时间")
  37 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  38 + private LocalDateTime[] endTime;
  39 +
  40 + @Schema(description = "购买人数")
  41 + private Integer userSize;
  42 +
  43 + @Schema(description = "开团组数")
  44 + private Integer totalNum;
  45 +
  46 + @Schema(description = "成团组数")
  47 + private Integer successNum;
  48 +
  49 + @Schema(description = "参与人数", example = "25222")
  50 + private Integer orderUserCount;
  51 +
  52 + @Schema(description = "虚拟成团")
  53 + private Integer virtualGroup;
  54 +
  55 + @Schema(description = "活动状态:0开启 1关闭", example = "0")
  56 + private Integer status;
  57 +
  58 + @Schema(description = "限制时长(小时)")
  59 + private Integer limitDuration;
  60 +
  61 + @Schema(description = "创建时间")
  62 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  63 + private LocalDateTime[] createTime;
  64 +
  65 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 拼团活动 Response VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class CombinationActivityRespVO extends CombinationActivityBaseVO {
  15 +
  16 + @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901")
  17 + private Long id;
  18 +
  19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  20 + private LocalDateTime createTime;
  21 +
  22 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/CombinationActivityUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.combination.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Schema(description = "管理后台 - 拼团活动更新 Request VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class CombinationActivityUpdateReqVO extends CombinationActivityBaseVO {
  15 +
  16 + @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901")
  17 + @NotNull(message = "活动编号不能为空")
  18 + private Long id;
  19 +
  20 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.convert.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityExcelVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityRespVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityUpdateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 拼团活动 Convert
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +@Mapper
  20 +public interface CombinationActivityConvert {
  21 +
  22 + CombinationActivityConvert INSTANCE = Mappers.getMapper(CombinationActivityConvert.class);
  23 +
  24 + CombinationActivityDO convert(CombinationActivityCreateReqVO bean);
  25 +
  26 + CombinationActivityDO convert(CombinationActivityUpdateReqVO bean);
  27 +
  28 + CombinationActivityRespVO convert(CombinationActivityDO bean);
  29 +
  30 + List<CombinationActivityRespVO> convertList(List<CombinationActivityDO> list);
  31 +
  32 + PageResult<CombinationActivityRespVO> convertPage(PageResult<CombinationActivityDO> page);
  33 +
  34 + List<CombinationActivityExcelVO> convertList02(List<CombinationActivityDO> list);
  35 +
  36 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/combination/CombinationActivityDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.dal.dataobject.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import com.sun.xml.internal.bind.v2.TODO;
  8 +import lombok.*;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +/**
  13 + * 拼团活动 DO
  14 + *
  15 + * @author HUIHUI
  16 + */
  17 +@TableName("promotion_combination_activity")
  18 +@KeySequence("promotion_combination_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  19 +@Data
  20 +@EqualsAndHashCode(callSuper = true)
  21 +@ToString(callSuper = true)
  22 +@Builder
  23 +@NoArgsConstructor
  24 +@AllArgsConstructor
  25 +public class CombinationActivityDO extends BaseDO {
  26 +
  27 + /**
  28 + * 活动编号
  29 + */
  30 + @TableId
  31 + private Long id;
  32 + /**
  33 + * 拼团名称
  34 + */
  35 + private String name;
  36 + /**
  37 + * 商品 SPU 编号关联 ProductSpuDO 的 id
  38 + */
  39 + private Long spuId;
  40 + /**
  41 + * 总限购数量
  42 + */
  43 + private Integer totalLimitCount;
  44 + /**
  45 + * 单次限购数量
  46 + */
  47 + private Integer singleLimitCount;
  48 + /**
  49 + * 开始时间
  50 + */
  51 + private LocalDateTime startTime;
  52 + /**
  53 + * 结束时间
  54 + */
  55 + private LocalDateTime endTime;
  56 + /**
  57 + * 购买人数
  58 + */
  59 + private Integer userSize;
  60 + /**
  61 + * 开团组数
  62 + */
  63 + private Integer totalNum;
  64 + /**
  65 + * 成团组数
  66 + */
  67 + private Integer successNum;
  68 + /**
  69 + * 参与人数
  70 + */
  71 + private Integer orderUserCount;
  72 + /**
  73 + * 虚拟成团
  74 + */
  75 + private Integer virtualGroup;
  76 + /**
  77 + * 活动状态:0开启 1关闭
  78 + * <p>
  79 + * 枚举 {@link TODO common_status 对应的类}
  80 + */
  81 + private Integer status;
  82 + /**
  83 + * 限制时长(小时)
  84 + */
  85 + private Integer limitDuration;
  86 +
  87 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.dal.mysql.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityExportReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityPageReqVO;
  8 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 拼团活动 Mapper
  15 + *
  16 + * @author HUIHUI
  17 + */
  18 +@Mapper
  19 +public interface CombinationActivityMapper extends BaseMapperX<CombinationActivityDO> {
  20 +
  21 + default PageResult<CombinationActivityDO> selectPage(CombinationActivityPageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<CombinationActivityDO>()
  23 + .likeIfPresent(CombinationActivityDO::getName, reqVO.getName())
  24 + .eqIfPresent(CombinationActivityDO::getSpuId, reqVO.getSpuId())
  25 + .eqIfPresent(CombinationActivityDO::getTotalLimitCount, reqVO.getTotalLimitCount())
  26 + .eqIfPresent(CombinationActivityDO::getSingleLimitCount, reqVO.getSingleLimitCount())
  27 + .betweenIfPresent(CombinationActivityDO::getStartTime, reqVO.getStartTime())
  28 + .betweenIfPresent(CombinationActivityDO::getEndTime, reqVO.getEndTime())
  29 + .eqIfPresent(CombinationActivityDO::getUserSize, reqVO.getUserSize())
  30 + .eqIfPresent(CombinationActivityDO::getTotalNum, reqVO.getTotalNum())
  31 + .eqIfPresent(CombinationActivityDO::getSuccessNum, reqVO.getSuccessNum())
  32 + .eqIfPresent(CombinationActivityDO::getOrderUserCount, reqVO.getOrderUserCount())
  33 + .eqIfPresent(CombinationActivityDO::getVirtualGroup, reqVO.getVirtualGroup())
  34 + .eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus())
  35 + .eqIfPresent(CombinationActivityDO::getLimitDuration, reqVO.getLimitDuration())
  36 + .betweenIfPresent(CombinationActivityDO::getCreateTime, reqVO.getCreateTime())
  37 + .orderByDesc(CombinationActivityDO::getId));
  38 + }
  39 +
  40 + default List<CombinationActivityDO> selectList(CombinationActivityExportReqVO reqVO) {
  41 + return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
  42 + .likeIfPresent(CombinationActivityDO::getName, reqVO.getName())
  43 + .eqIfPresent(CombinationActivityDO::getSpuId, reqVO.getSpuId())
  44 + .eqIfPresent(CombinationActivityDO::getTotalLimitCount, reqVO.getTotalLimitCount())
  45 + .eqIfPresent(CombinationActivityDO::getSingleLimitCount, reqVO.getSingleLimitCount())
  46 + .betweenIfPresent(CombinationActivityDO::getStartTime, reqVO.getStartTime())
  47 + .betweenIfPresent(CombinationActivityDO::getEndTime, reqVO.getEndTime())
  48 + .eqIfPresent(CombinationActivityDO::getUserSize, reqVO.getUserSize())
  49 + .eqIfPresent(CombinationActivityDO::getTotalNum, reqVO.getTotalNum())
  50 + .eqIfPresent(CombinationActivityDO::getSuccessNum, reqVO.getSuccessNum())
  51 + .eqIfPresent(CombinationActivityDO::getOrderUserCount, reqVO.getOrderUserCount())
  52 + .eqIfPresent(CombinationActivityDO::getVirtualGroup, reqVO.getVirtualGroup())
  53 + .eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus())
  54 + .eqIfPresent(CombinationActivityDO::getLimitDuration, reqVO.getLimitDuration())
  55 + .betweenIfPresent(CombinationActivityDO::getCreateTime, reqVO.getCreateTime())
  56 + .orderByDesc(CombinationActivityDO::getId));
  57 + }
  58 +
  59 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityExportReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityPageReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityUpdateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  9 +
  10 +import javax.validation.Valid;
  11 +import java.util.Collection;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 拼团活动 Service 接口
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +public interface CombinationActivityService {
  20 +
  21 + /**
  22 + * 创建拼团活动
  23 + *
  24 + * @param createReqVO 创建信息
  25 + * @return 编号
  26 + */
  27 + Long createCombinationActivity(@Valid CombinationActivityCreateReqVO createReqVO);
  28 +
  29 + /**
  30 + * 更新拼团活动
  31 + *
  32 + * @param updateReqVO 更新信息
  33 + */
  34 + void updateCombinationActivity(@Valid CombinationActivityUpdateReqVO updateReqVO);
  35 +
  36 + /**
  37 + * 删除拼团活动
  38 + *
  39 + * @param id 编号
  40 + */
  41 + void deleteCombinationActivity(Long id);
  42 +
  43 + /**
  44 + * 获得拼团活动
  45 + *
  46 + * @param id 编号
  47 + * @return 拼团活动
  48 + */
  49 + CombinationActivityDO getCombinationActivity(Long id);
  50 +
  51 + /**
  52 + * 获得拼团活动列表
  53 + *
  54 + * @param ids 编号
  55 + * @return 拼团活动列表
  56 + */
  57 + List<CombinationActivityDO> getCombinationActivityList(Collection<Long> ids);
  58 +
  59 + /**
  60 + * 获得拼团活动分页
  61 + *
  62 + * @param pageReqVO 分页查询
  63 + * @return 拼团活动分页
  64 + */
  65 + PageResult<CombinationActivityDO> getCombinationActivityPage(CombinationActivityPageReqVO pageReqVO);
  66 +
  67 + /**
  68 + * 获得拼团活动列表, 用于 Excel 导出
  69 + *
  70 + * @param exportReqVO 查询条件
  71 + * @return 拼团活动列表
  72 + */
  73 + List<CombinationActivityDO> getCombinationActivityList(CombinationActivityExportReqVO exportReqVO);
  74 +
  75 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityExportReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityPageReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityUpdateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
  9 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  10 +import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import javax.annotation.Resource;
  15 +import java.util.Collection;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COMBINATION_ACTIVITY_NOT_EXISTS;
  20 +
  21 +/**
  22 + * 拼团活动 Service 实现类
  23 + *
  24 + * @author HUIHUI
  25 + */
  26 +@Service
  27 +@Validated
  28 +public class CombinationActivityServiceImpl implements CombinationActivityService {
  29 +
  30 + @Resource
  31 + private CombinationActivityMapper combinationActivityMapper;
  32 +
  33 + @Override
  34 + public Long createCombinationActivity(CombinationActivityCreateReqVO createReqVO) {
  35 + // 插入
  36 + CombinationActivityDO combinationActivity = CombinationActivityConvert.INSTANCE.convert(createReqVO);
  37 + combinationActivityMapper.insert(combinationActivity);
  38 + // 返回
  39 + return combinationActivity.getId();
  40 + }
  41 +
  42 + @Override
  43 + public void updateCombinationActivity(CombinationActivityUpdateReqVO updateReqVO) {
  44 + // 校验存在
  45 + validateCombinationActivityExists(updateReqVO.getId());
  46 + // 更新
  47 + CombinationActivityDO updateObj = CombinationActivityConvert.INSTANCE.convert(updateReqVO);
  48 + combinationActivityMapper.updateById(updateObj);
  49 + }
  50 +
  51 + @Override
  52 + public void deleteCombinationActivity(Long id) {
  53 + // 校验存在
  54 + validateCombinationActivityExists(id);
  55 + // 删除
  56 + combinationActivityMapper.deleteById(id);
  57 + }
  58 +
  59 + private void validateCombinationActivityExists(Long id) {
  60 + if (combinationActivityMapper.selectById(id) == null) {
  61 + throw exception(COMBINATION_ACTIVITY_NOT_EXISTS);
  62 + }
  63 + }
  64 +
  65 + @Override
  66 + public CombinationActivityDO getCombinationActivity(Long id) {
  67 + return combinationActivityMapper.selectById(id);
  68 + }
  69 +
  70 + @Override
  71 + public List<CombinationActivityDO> getCombinationActivityList(Collection<Long> ids) {
  72 + return combinationActivityMapper.selectBatchIds(ids);
  73 + }
  74 +
  75 + @Override
  76 + public PageResult<CombinationActivityDO> getCombinationActivityPage(CombinationActivityPageReqVO pageReqVO) {
  77 + return combinationActivityMapper.selectPage(pageReqVO);
  78 + }
  79 +
  80 + @Override
  81 + public List<CombinationActivityDO> getCombinationActivityList(CombinationActivityExportReqVO exportReqVO) {
  82 + return combinationActivityMapper.selectList(exportReqVO);
  83 + }
  84 +
  85 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 -import cn.hutool.core.util.ArrayUtil;  
5 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -26,6 +25,7 @@ import org.springframework.stereotype.Service; @@ -26,6 +25,7 @@ import org.springframework.stereotype.Service;
26 import org.springframework.validation.annotation.Validated; 25 import org.springframework.validation.annotation.Validated;
27 26
28 import javax.annotation.Resource; 27 import javax.annotation.Resource;
  28 +import java.util.ArrayList;
29 import java.util.Collection; 29 import java.util.Collection;
30 import java.util.List; 30 import java.util.List;
31 import java.util.Set; 31 import java.util.Set;
@@ -109,13 +109,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -109,13 +109,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
109 // 过滤出所有 spuIds 有交集的活动 109 // 过滤出所有 spuIds 有交集的活动
110 List<SeckillActivityDO> doList = activityDOs.stream().filter(s -> { 110 List<SeckillActivityDO> doList = activityDOs.stream().filter(s -> {
111 // 判断 spu 是否有交集 111 // 判断 spu 是否有交集
112 - List<Long> spuIdsClone = ArrayUtil.clone(s.getSpuIds()); 112 + ArrayList<Long> spuIdsClone = CollUtil.newArrayList(s.getSpuIds());
113 spuIdsClone.retainAll(spuIds); 113 spuIdsClone.retainAll(spuIds);
114 if (CollUtil.isEmpty(spuIdsClone)) { 114 if (CollUtil.isEmpty(spuIdsClone)) {
115 return false; 115 return false;
116 } 116 }
117 // 判断秒杀时段是否有交集 117 // 判断秒杀时段是否有交集
118 - List<Long> configIdsClone = ArrayUtil.clone(s.getConfigIds()); 118 + List<Long> configIdsClone = CollUtil.newArrayList(s.getConfigIds());
119 configIdsClone.retainAll(configIds); 119 configIdsClone.retainAll(configIds);
120 return CollUtil.isNotEmpty(configIdsClone); 120 return CollUtil.isNotEmpty(configIdsClone);
121 }).collect(Collectors.toList()); 121 }).collect(Collectors.toList());
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.combination;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityCreateReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityExportReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityPageReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.CombinationActivityUpdateReqVO;
  9 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  10 +import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
  11 +import org.junit.jupiter.api.Disabled;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.springframework.context.annotation.Import;
  14 +
  15 +import javax.annotation.Resource;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  19 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  20 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  21 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  22 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  23 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  24 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COMBINATION_ACTIVITY_NOT_EXISTS;
  25 +import static org.junit.jupiter.api.Assertions.*;
  26 +
  27 +/**
  28 + * {@link CombinationActivityServiceImpl} 的单元测试类
  29 + *
  30 + * @author HUIHUI
  31 + */
  32 +@Import(CombinationActivityServiceImpl.class)
  33 +public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
  34 +
  35 + @Resource
  36 + private CombinationActivityServiceImpl combinationActivityService;
  37 +
  38 + @Resource
  39 + private CombinationActivityMapper combinationActivityMapper;
  40 +
  41 + @Test
  42 + public void testCreateCombinationActivity_success() {
  43 + // 准备参数
  44 + CombinationActivityCreateReqVO reqVO = randomPojo(CombinationActivityCreateReqVO.class);
  45 +
  46 + // 调用
  47 + Long combinationActivityId = combinationActivityService.createCombinationActivity(reqVO);
  48 + // 断言
  49 + assertNotNull(combinationActivityId);
  50 + // 校验记录的属性是否正确
  51 + CombinationActivityDO combinationActivity = combinationActivityMapper.selectById(combinationActivityId);
  52 + assertPojoEquals(reqVO, combinationActivity);
  53 + }
  54 +
  55 + @Test
  56 + public void testUpdateCombinationActivity_success() {
  57 + // mock 数据
  58 + CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class);
  59 + combinationActivityMapper.insert(dbCombinationActivity);// @Sql: 先插入出一条存在的数据
  60 + // 准备参数
  61 + CombinationActivityUpdateReqVO reqVO = randomPojo(CombinationActivityUpdateReqVO.class, o -> {
  62 + o.setId(dbCombinationActivity.getId()); // 设置更新的 ID
  63 + });
  64 +
  65 + // 调用
  66 + combinationActivityService.updateCombinationActivity(reqVO);
  67 + // 校验是否更新正确
  68 + CombinationActivityDO combinationActivity = combinationActivityMapper.selectById(reqVO.getId()); // 获取最新的
  69 + assertPojoEquals(reqVO, combinationActivity);
  70 + }
  71 +
  72 + @Test
  73 + public void testUpdateCombinationActivity_notExists() {
  74 + // 准备参数
  75 + CombinationActivityUpdateReqVO reqVO = randomPojo(CombinationActivityUpdateReqVO.class);
  76 +
  77 + // 调用, 并断言异常
  78 + assertServiceException(() -> combinationActivityService.updateCombinationActivity(reqVO), COMBINATION_ACTIVITY_NOT_EXISTS);
  79 + }
  80 +
  81 + @Test
  82 + public void testDeleteCombinationActivity_success() {
  83 + // mock 数据
  84 + CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class);
  85 + combinationActivityMapper.insert(dbCombinationActivity);// @Sql: 先插入出一条存在的数据
  86 + // 准备参数
  87 + Long id = dbCombinationActivity.getId();
  88 +
  89 + // 调用
  90 + combinationActivityService.deleteCombinationActivity(id);
  91 + // 校验数据不存在了
  92 + assertNull(combinationActivityMapper.selectById(id));
  93 + }
  94 +
  95 + @Test
  96 + public void testDeleteCombinationActivity_notExists() {
  97 + // 准备参数
  98 + Long id = randomLongId();
  99 +
  100 + // 调用, 并断言异常
  101 + assertServiceException(() -> combinationActivityService.deleteCombinationActivity(id), COMBINATION_ACTIVITY_NOT_EXISTS);
  102 + }
  103 +
  104 + @Test
  105 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  106 + public void testGetCombinationActivityPage() {
  107 + // mock 数据
  108 + CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class, o -> { // 等会查询到
  109 + o.setName(null);
  110 + o.setSpuId(null);
  111 + o.setTotalLimitCount(null);
  112 + o.setSingleLimitCount(null);
  113 + o.setStartTime(null);
  114 + o.setEndTime(null);
  115 + o.setUserSize(null);
  116 + o.setTotalNum(null);
  117 + o.setSuccessNum(null);
  118 + o.setOrderUserCount(null);
  119 + o.setVirtualGroup(null);
  120 + o.setStatus(null);
  121 + o.setLimitDuration(null);
  122 + o.setCreateTime(null);
  123 + });
  124 + combinationActivityMapper.insert(dbCombinationActivity);
  125 + // 测试 name 不匹配
  126 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setName(null)));
  127 + // 测试 spuId 不匹配
  128 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSpuId(null)));
  129 + // 测试 totalLimitCount 不匹配
  130 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalLimitCount(null)));
  131 + // 测试 singleLimitCount 不匹配
  132 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSingleLimitCount(null)));
  133 + // 测试 startTime 不匹配
  134 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStartTime(null)));
  135 + // 测试 endTime 不匹配
  136 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setEndTime(null)));
  137 + // 测试 userSize 不匹配
  138 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null)));
  139 + // 测试 totalNum 不匹配
  140 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalNum(null)));
  141 + // 测试 successNum 不匹配
  142 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessNum(null)));
  143 + // 测试 orderUserCount 不匹配
  144 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null)));
  145 + // 测试 virtualGroup 不匹配
  146 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setVirtualGroup(null)));
  147 + // 测试 status 不匹配
  148 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStatus(null)));
  149 + // 测试 limitDuration 不匹配
  150 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setLimitDuration(null)));
  151 + // 测试 createTime 不匹配
  152 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setCreateTime(null)));
  153 + // 准备参数
  154 + CombinationActivityPageReqVO reqVO = new CombinationActivityPageReqVO();
  155 + reqVO.setName(null);
  156 + reqVO.setSpuId(null);
  157 + reqVO.setTotalLimitCount(null);
  158 + reqVO.setSingleLimitCount(null);
  159 + reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  160 + reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  161 + reqVO.setUserSize(null);
  162 + reqVO.setTotalNum(null);
  163 + reqVO.setSuccessNum(null);
  164 + reqVO.setOrderUserCount(null);
  165 + reqVO.setVirtualGroup(null);
  166 + reqVO.setStatus(null);
  167 + reqVO.setLimitDuration(null);
  168 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  169 +
  170 + // 调用
  171 + PageResult<CombinationActivityDO> pageResult = combinationActivityService.getCombinationActivityPage(reqVO);
  172 + // 断言
  173 + assertEquals(1, pageResult.getTotal());
  174 + assertEquals(1, pageResult.getList().size());
  175 + assertPojoEquals(dbCombinationActivity, pageResult.getList().get(0));
  176 + }
  177 +
  178 + @Test
  179 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  180 + public void testGetCombinationActivityList() {
  181 + // mock 数据
  182 + CombinationActivityDO dbCombinationActivity = randomPojo(CombinationActivityDO.class, o -> { // 等会查询到
  183 + o.setName(null);
  184 + o.setSpuId(null);
  185 + o.setTotalLimitCount(null);
  186 + o.setSingleLimitCount(null);
  187 + o.setStartTime(null);
  188 + o.setEndTime(null);
  189 + o.setUserSize(null);
  190 + o.setTotalNum(null);
  191 + o.setSuccessNum(null);
  192 + o.setOrderUserCount(null);
  193 + o.setVirtualGroup(null);
  194 + o.setStatus(null);
  195 + o.setLimitDuration(null);
  196 + o.setCreateTime(null);
  197 + });
  198 + combinationActivityMapper.insert(dbCombinationActivity);
  199 + // 测试 name 不匹配
  200 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setName(null)));
  201 + // 测试 spuId 不匹配
  202 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSpuId(null)));
  203 + // 测试 totalLimitCount 不匹配
  204 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalLimitCount(null)));
  205 + // 测试 singleLimitCount 不匹配
  206 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSingleLimitCount(null)));
  207 + // 测试 startTime 不匹配
  208 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStartTime(null)));
  209 + // 测试 endTime 不匹配
  210 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setEndTime(null)));
  211 + // 测试 userSize 不匹配
  212 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null)));
  213 + // 测试 totalNum 不匹配
  214 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalNum(null)));
  215 + // 测试 successNum 不匹配
  216 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessNum(null)));
  217 + // 测试 orderUserCount 不匹配
  218 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null)));
  219 + // 测试 virtualGroup 不匹配
  220 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setVirtualGroup(null)));
  221 + // 测试 status 不匹配
  222 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setStatus(null)));
  223 + // 测试 limitDuration 不匹配
  224 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setLimitDuration(null)));
  225 + // 测试 createTime 不匹配
  226 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setCreateTime(null)));
  227 + // 准备参数
  228 + CombinationActivityExportReqVO reqVO = new CombinationActivityExportReqVO();
  229 + reqVO.setName(null);
  230 + reqVO.setSpuId(null);
  231 + reqVO.setTotalLimitCount(null);
  232 + reqVO.setSingleLimitCount(null);
  233 + reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  234 + reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  235 + reqVO.setUserSize(null);
  236 + reqVO.setTotalNum(null);
  237 + reqVO.setSuccessNum(null);
  238 + reqVO.setOrderUserCount(null);
  239 + reqVO.setVirtualGroup(null);
  240 + reqVO.setStatus(null);
  241 + reqVO.setLimitDuration(null);
  242 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  243 +
  244 + // 调用
  245 + List<CombinationActivityDO> list = combinationActivityService.getCombinationActivityList(reqVO);
  246 + // 断言
  247 + assertEquals(1, list.size());
  248 + assertPojoEquals(dbCombinationActivity, list.get(0));
  249 + }
  250 +
  251 +}
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
@@ -115,7 +115,8 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -115,7 +115,8 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
115 when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02)); 115 when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02));
116 // mock 方法(用户收件地址的校验) 116 // mock 方法(用户收件地址的校验)
117 AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10L).setUserId(userId).setName("芋艿") 117 AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10L).setUserId(userId).setName("芋艿")
118 - .setMobile("15601691300").setAreaId(3306).setPostCode("85757").setDetailAddress("土豆村"); 118 + //.setMobile("15601691300").setAreaId(3306).setPostCode("85757").setDetailAddress("土豆村");
  119 + .setMobile("15601691300").setAreaId(3306).setDetailAddress("土豆村");
119 when(addressApi.getAddress(eq(10L), eq(userId))).thenReturn(addressRespDTO); 120 when(addressApi.getAddress(eq(10L), eq(userId))).thenReturn(addressRespDTO);
120 // mock 方法(价格计算) 121 // mock 方法(价格计算)
121 PriceCalculateRespDTO.OrderItem priceOrderItem01 = new PriceCalculateRespDTO.OrderItem() 122 PriceCalculateRespDTO.OrderItem priceOrderItem01 = new PriceCalculateRespDTO.OrderItem()
@@ -150,12 +151,12 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -150,12 +151,12 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
150 }))).thenReturn(1000L); 151 }))).thenReturn(1000L);
151 152
152 // 调用方法 153 // 调用方法
153 - Long tradeOrderId = tradeOrderService.createOrder(userId, userIp, reqVO); 154 + TradeOrderDO order = tradeOrderService.createOrder(userId, userIp, reqVO);
154 // 断言 TradeOrderDO 订单 155 // 断言 TradeOrderDO 订单
155 List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList(); 156 List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList();
156 assertEquals(tradeOrderDOs.size(), 1); 157 assertEquals(tradeOrderDOs.size(), 1);
157 TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0); 158 TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0);
158 - assertEquals(tradeOrderDO.getId(), tradeOrderId); 159 + assertEquals(tradeOrderDO.getId(), order.getId());
159 assertNotNull(tradeOrderDO.getNo()); 160 assertNotNull(tradeOrderDO.getNo());
160 assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType()); 161 assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType());
161 assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal()); 162 assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal());
@@ -195,7 +196,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -195,7 +196,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
195 TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0); 196 TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0);
196 assertNotNull(tradeOrderItemDO01.getId()); 197 assertNotNull(tradeOrderItemDO01.getId());
197 assertEquals(tradeOrderItemDO01.getUserId(), userId); 198 assertEquals(tradeOrderItemDO01.getUserId(), userId);
198 - assertEquals(tradeOrderItemDO01.getOrderId(), tradeOrderId); 199 + assertEquals(tradeOrderItemDO01.getOrderId(), order.getId());
199 assertEquals(tradeOrderItemDO01.getSpuId(), 11L); 200 assertEquals(tradeOrderItemDO01.getSpuId(), 11L);
200 assertEquals(tradeOrderItemDO01.getSkuId(), 1L); 201 assertEquals(tradeOrderItemDO01.getSkuId(), 1L);
201 assertEquals(tradeOrderItemDO01.getProperties().size(), 1); 202 assertEquals(tradeOrderItemDO01.getProperties().size(), 1);
@@ -213,7 +214,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -213,7 +214,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
213 TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1); 214 TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1);
214 assertNotNull(tradeOrderItemDO02.getId()); 215 assertNotNull(tradeOrderItemDO02.getId());
215 assertEquals(tradeOrderItemDO02.getUserId(), userId); 216 assertEquals(tradeOrderItemDO02.getUserId(), userId);
216 - assertEquals(tradeOrderItemDO02.getOrderId(), tradeOrderId); 217 + assertEquals(tradeOrderItemDO02.getOrderId(), order.getId());
217 assertEquals(tradeOrderItemDO02.getSpuId(), 21L); 218 assertEquals(tradeOrderItemDO02.getSpuId(), 21L);
218 assertEquals(tradeOrderItemDO02.getSkuId(), 2L); 219 assertEquals(tradeOrderItemDO02.getSkuId(), 2L);
219 assertEquals(tradeOrderItemDO02.getProperties().size(), 1); 220 assertEquals(tradeOrderItemDO02.getProperties().size(), 1);
@@ -239,7 +240,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -239,7 +240,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
239 verify(couponApi).useCoupon(argThat(reqDTO -> { 240 verify(couponApi).useCoupon(argThat(reqDTO -> {
240 assertEquals(reqDTO.getId(), reqVO.getCouponId()); 241 assertEquals(reqDTO.getId(), reqVO.getCouponId());
241 assertEquals(reqDTO.getUserId(), userId); 242 assertEquals(reqDTO.getUserId(), userId);
242 - assertEquals(reqDTO.getOrderId(), tradeOrderId); 243 + assertEquals(reqDTO.getOrderId(), order.getId());
243 return true; 244 return true;
244 })); 245 }));
245 } 246 }