Commit 409ec555e899646b92bc2325ec9f2ce4766cd2f4
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 | 151 | |
| 152 | 152 | // 测试分页 tab count |
| 153 | 153 | AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentStatistics(spuId, Boolean.TRUE); |
| 154 | - assertEquals(6, tabsCount.getAllCount()); | |
| 155 | 154 | assertEquals(4, tabsCount.getGoodCount()); |
| 156 | 155 | assertEquals(2, tabsCount.getMediocreCount()); |
| 157 | 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 | 59 | ErrorCode SECKILL_TIME_EQUAL = new ErrorCode(1013009002, "秒杀时段开始时间和结束时间不能相等"); |
| 60 | 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 | 1 | package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.util.ArrayUtil; | |
| 5 | 4 | import cn.hutool.core.util.ObjectUtil; |
| 6 | 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 7 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| ... | ... | @@ -26,6 +25,7 @@ import org.springframework.stereotype.Service; |
| 26 | 25 | import org.springframework.validation.annotation.Validated; |
| 27 | 26 | |
| 28 | 27 | import javax.annotation.Resource; |
| 28 | +import java.util.ArrayList; | |
| 29 | 29 | import java.util.Collection; |
| 30 | 30 | import java.util.List; |
| 31 | 31 | import java.util.Set; |
| ... | ... | @@ -109,13 +109,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { |
| 109 | 109 | // 过滤出所有 spuIds 有交集的活动 |
| 110 | 110 | List<SeckillActivityDO> doList = activityDOs.stream().filter(s -> { |
| 111 | 111 | // 判断 spu 是否有交集 |
| 112 | - List<Long> spuIdsClone = ArrayUtil.clone(s.getSpuIds()); | |
| 112 | + ArrayList<Long> spuIdsClone = CollUtil.newArrayList(s.getSpuIds()); | |
| 113 | 113 | spuIdsClone.retainAll(spuIds); |
| 114 | 114 | if (CollUtil.isEmpty(spuIdsClone)) { |
| 115 | 115 | return false; |
| 116 | 116 | } |
| 117 | 117 | // 判断秒杀时段是否有交集 |
| 118 | - List<Long> configIdsClone = ArrayUtil.clone(s.getConfigIds()); | |
| 118 | + List<Long> configIdsClone = CollUtil.newArrayList(s.getConfigIds()); | |
| 119 | 119 | configIdsClone.retainAll(configIds); |
| 120 | 120 | return CollUtil.isNotEmpty(configIdsClone); |
| 121 | 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 | 115 | when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02)); |
| 116 | 116 | // mock 方法(用户收件地址的校验) |
| 117 | 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 | 120 | when(addressApi.getAddress(eq(10L), eq(userId))).thenReturn(addressRespDTO); |
| 120 | 121 | // mock 方法(价格计算) |
| 121 | 122 | PriceCalculateRespDTO.OrderItem priceOrderItem01 = new PriceCalculateRespDTO.OrderItem() |
| ... | ... | @@ -150,12 +151,12 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { |
| 150 | 151 | }))).thenReturn(1000L); |
| 151 | 152 | |
| 152 | 153 | // 调用方法 |
| 153 | - Long tradeOrderId = tradeOrderService.createOrder(userId, userIp, reqVO); | |
| 154 | + TradeOrderDO order = tradeOrderService.createOrder(userId, userIp, reqVO); | |
| 154 | 155 | // 断言 TradeOrderDO 订单 |
| 155 | 156 | List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList(); |
| 156 | 157 | assertEquals(tradeOrderDOs.size(), 1); |
| 157 | 158 | TradeOrderDO tradeOrderDO = tradeOrderDOs.get(0); |
| 158 | - assertEquals(tradeOrderDO.getId(), tradeOrderId); | |
| 159 | + assertEquals(tradeOrderDO.getId(), order.getId()); | |
| 159 | 160 | assertNotNull(tradeOrderDO.getNo()); |
| 160 | 161 | assertEquals(tradeOrderDO.getType(), TradeOrderTypeEnum.NORMAL.getType()); |
| 161 | 162 | assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal()); |
| ... | ... | @@ -195,7 +196,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { |
| 195 | 196 | TradeOrderItemDO tradeOrderItemDO01 = tradeOrderItemDOs.get(0); |
| 196 | 197 | assertNotNull(tradeOrderItemDO01.getId()); |
| 197 | 198 | assertEquals(tradeOrderItemDO01.getUserId(), userId); |
| 198 | - assertEquals(tradeOrderItemDO01.getOrderId(), tradeOrderId); | |
| 199 | + assertEquals(tradeOrderItemDO01.getOrderId(), order.getId()); | |
| 199 | 200 | assertEquals(tradeOrderItemDO01.getSpuId(), 11L); |
| 200 | 201 | assertEquals(tradeOrderItemDO01.getSkuId(), 1L); |
| 201 | 202 | assertEquals(tradeOrderItemDO01.getProperties().size(), 1); |
| ... | ... | @@ -213,7 +214,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { |
| 213 | 214 | TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1); |
| 214 | 215 | assertNotNull(tradeOrderItemDO02.getId()); |
| 215 | 216 | assertEquals(tradeOrderItemDO02.getUserId(), userId); |
| 216 | - assertEquals(tradeOrderItemDO02.getOrderId(), tradeOrderId); | |
| 217 | + assertEquals(tradeOrderItemDO02.getOrderId(), order.getId()); | |
| 217 | 218 | assertEquals(tradeOrderItemDO02.getSpuId(), 21L); |
| 218 | 219 | assertEquals(tradeOrderItemDO02.getSkuId(), 2L); |
| 219 | 220 | assertEquals(tradeOrderItemDO02.getProperties().size(), 1); |
| ... | ... | @@ -239,7 +240,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { |
| 239 | 240 | verify(couponApi).useCoupon(argThat(reqDTO -> { |
| 240 | 241 | assertEquals(reqDTO.getId(), reqVO.getCouponId()); |
| 241 | 242 | assertEquals(reqDTO.getUserId(), userId); |
| 242 | - assertEquals(reqDTO.getOrderId(), tradeOrderId); | |
| 243 | + assertEquals(reqDTO.getOrderId(), order.getId()); | |
| 243 | 244 | return true; |
| 244 | 245 | })); |
| 245 | 246 | } | ... | ... |