Commit 14a1d70cbbd4e99366b3abaccfa02ef834abf282

Authored by shuaidawang
1 parent 8d08d593

【促销活动】-代码生成

Showing 21 changed files with 948 additions and 0 deletions
sql/mall.sql
... ... @@ -85,3 +85,28 @@ INSERT INTO `system_menu`(`name`, `permission`, `menu_type`, `sort`, `parent_id`
85 85 INSERT INTO `system_menu`(`name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`) VALUES ('品牌更新', 'product:brand:update', 3, 3, @parentId, '', '', '', 0);
86 86 INSERT INTO `system_menu`(`name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`) VALUES ('品牌删除', 'product:brand:delete', 3, 4, @parentId, '', '', '', 0);
87 87 INSERT INTO `system_menu`(`name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`) VALUES ('品牌导出', 'product:brand:export', 3, 5, @parentId, '', '', '', 0);
  88 +
  89 +
  90 +-- ----------------------------
  91 +-- Table structure for market_activity
  92 +-- ----------------------------
  93 +DROP TABLE IF EXISTS `market_activity`;
  94 +CREATE TABLE `market_activity` (
  95 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动编号',
  96 + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '活动标题',
  97 + `activity_type` tinyint(4) NOT NULL COMMENT '活动类型',
  98 + `status` tinyint(4) NOT NULL DEFAULT '-1' COMMENT '活动状态',
  99 + `start_time` datetime NOT NULL COMMENT '开始时间',
  100 + `end_time` datetime NOT NULL COMMENT '结束时间',
  101 + `invalid_time` datetime DEFAULT NULL COMMENT '失效时间',
  102 + `delete_time` datetime DEFAULT NULL COMMENT '删除时间',
  103 + `time_limited_discount` varchar(2000) DEFAULT NULL COMMENT '限制折扣字符串,使用 JSON 序列化成字符串存储',
  104 + `full_privilege` varchar(2000) DEFAULT NULL COMMENT '限制折扣字符串,使用 JSON 序列化成字符串存储',
  105 + `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  106 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  107 + `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  108 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  109 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  110 + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
  111 + PRIMARY KEY (`id`) USING BTREE
  112 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='促销活动';
88 113 \ No newline at end of file
... ...
yudao-module-mall/yudao-module-market-api/src/main/java/cn/iocoder/yudao/module/market/api/package-info.java 0 → 100644
  1 +/**
  2 + * 占位
  3 + */
  4 +package cn.iocoder.yudao.module.market.api;
0 5 \ No newline at end of file
... ...
yudao-module-mall/yudao-module-market-api/src/main/java/cn/iocoder/yudao/module/market/enums/ErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * market 错误码枚举类
  7 + * <p>
  8 + * market 系统,使用 1-003-000-000 段
  9 + */
  10 +public interface ErrorCodeConstants {
  11 +
  12 +
  13 + // ========== 促销活动相关 1003001000============
  14 + ErrorCode ACTIVITY_NOT_EXISTS = new ErrorCode(1003001000, "促销活动不存在");
  15 +}
... ...
yudao-module-mall/yudao-module-market-api/src/main/java/cn/iocoder/yudao/module/market/enums/activity/MarketActivityStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.enums.activity;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +
  5 +import java.util.Arrays;
  6 +
  7 +/**
  8 + * 促销活动状态枚举
  9 + */
  10 +public enum MarketActivityStatusEnum implements IntArrayValuable {
  11 +
  12 + WAIT(10, "未开始"),
  13 + RUN(20, "进行中"),
  14 + END(30, "已结束"),
  15 + /**
  16 + * 1. WAIT、RUN、END 可以转换成 INVALID 状态。
  17 + * 2. INVALID 只可以转换成 DELETED 状态。
  18 + */
  19 + INVALID(40, "已撤销"),
  20 + DELETED(50, "已删除"),
  21 + ;
  22 +
  23 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MarketActivityStatusEnum::getValue).toArray();
  24 +
  25 + /**
  26 + * 状态值
  27 + */
  28 + private final Integer value;
  29 + /**
  30 + * 状态名
  31 + */
  32 + private final String name;
  33 +
  34 + MarketActivityStatusEnum(Integer value, String name) {
  35 + this.value = value;
  36 + this.name = name;
  37 + }
  38 +
  39 + public Integer getValue() {
  40 + return value;
  41 + }
  42 +
  43 + public String getName() {
  44 + return name;
  45 + }
  46 +
  47 + @Override
  48 + public int[] array() {
  49 + return ARRAYS;
  50 + }
  51 +}
... ...
yudao-module-mall/yudao-module-market-api/src/main/java/cn/iocoder/yudao/module/market/enums/activity/MarketActivityTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.enums.activity;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +
  5 +import java.util.Arrays;
  6 +
  7 +/**
  8 + * 促销活动类型枚举
  9 + */
  10 +public enum MarketActivityTypeEnum implements IntArrayValuable {
  11 +
  12 + TIME_LIMITED_DISCOUNT(1, "限时折扣"),
  13 + FULL_PRIVILEGE(2, "满减送"),
  14 + ;
  15 +
  16 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MarketActivityTypeEnum::getValue).toArray();
  17 +
  18 + /**
  19 + * 类型值
  20 + */
  21 + private final Integer value;
  22 + /**
  23 + * 类型名
  24 + */
  25 + private final String name;
  26 +
  27 + MarketActivityTypeEnum(Integer value, String name) {
  28 + this.value = value;
  29 + this.name = name;
  30 + }
  31 +
  32 + public Integer getValue() {
  33 + return value;
  34 + }
  35 +
  36 + public String getName() {
  37 + return name;
  38 + }
  39 +
  40 + @Override
  41 + public int[] array() {
  42 + return ARRAYS;
  43 + }
  44 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/ActivityController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity;
  2 +
  3 +import org.springframework.web.bind.annotation.*;
  4 +import javax.annotation.Resource;
  5 +import org.springframework.validation.annotation.Validated;
  6 +import org.springframework.security.access.prepost.PreAuthorize;
  7 +import io.swagger.annotations.*;
  8 +import javax.validation.*;
  9 +import java.util.*;
  10 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  11 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  12 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  13 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  14 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  15 +import cn.iocoder.yudao.module.market.convert.activity.ActivityConvert;
  16 +import cn.iocoder.yudao.module.market.service.activity.ActivityService;
  17 +
  18 +@Api(tags = "管理后台 - 促销活动")
  19 +@RestController
  20 +@RequestMapping("/market/activity")
  21 +@Validated
  22 +public class ActivityController {
  23 +
  24 + @Resource
  25 + private ActivityService activityService;
  26 +
  27 + @PostMapping("/create")
  28 + @ApiOperation("创建促销活动")
  29 + @PreAuthorize("@ss.hasPermission('market:activity:create')")
  30 + public CommonResult<Long> createActivity(@Valid @RequestBody ActivityCreateReqVO createReqVO) {
  31 + return success(activityService.createActivity(createReqVO));
  32 + }
  33 +
  34 + @PutMapping("/update")
  35 + @ApiOperation("更新促销活动")
  36 + @PreAuthorize("@ss.hasPermission('market:activity:update')")
  37 + public CommonResult<Boolean> updateActivity(@Valid @RequestBody ActivityUpdateReqVO updateReqVO) {
  38 + activityService.updateActivity(updateReqVO);
  39 + return success(true);
  40 + }
  41 +
  42 + @DeleteMapping("/delete")
  43 + @ApiOperation("删除促销活动")
  44 + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
  45 + @PreAuthorize("@ss.hasPermission('market:activity:delete')")
  46 + public CommonResult<Boolean> deleteActivity(@RequestParam("id") Long id) {
  47 + activityService.deleteActivity(id);
  48 + return success(true);
  49 + }
  50 +
  51 + @GetMapping("/get")
  52 + @ApiOperation("获得促销活动")
  53 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  54 + @PreAuthorize("@ss.hasPermission('market:activity:query')")
  55 + public CommonResult<ActivityRespVO> getActivity(@RequestParam("id") Long id) {
  56 + ActivityDO activity = activityService.getActivity(id);
  57 + return success(ActivityConvert.INSTANCE.convert(activity));
  58 + }
  59 +
  60 + @GetMapping("/list")
  61 + @ApiOperation("获得促销活动列表")
  62 + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
  63 + @PreAuthorize("@ss.hasPermission('market:activity:query')")
  64 + public CommonResult<List<ActivityRespVO>> getActivityList(@RequestParam("ids") Collection<Long> ids) {
  65 + List<ActivityDO> list = activityService.getActivityList(ids);
  66 + return success(ActivityConvert.INSTANCE.convertList(list));
  67 + }
  68 +
  69 + @GetMapping("/page")
  70 + @ApiOperation("获得促销活动分页")
  71 + @PreAuthorize("@ss.hasPermission('market:activity:query')")
  72 + public CommonResult<PageResult<ActivityRespVO>> getActivityPage(@Valid ActivityPageReqVO pageVO) {
  73 + PageResult<ActivityDO> pageResult = activityService.getActivityPage(pageVO);
  74 + return success(ActivityConvert.INSTANCE.convertPage(pageResult));
  75 + }
  76 +
  77 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.market.enums.activity.MarketActivityStatusEnum;
  5 +import cn.iocoder.yudao.module.market.enums.activity.MarketActivityTypeEnum;
  6 +import lombok.*;
  7 +import java.util.*;
  8 +import io.swagger.annotations.*;
  9 +import javax.validation.constraints.*;
  10 +import org.springframework.format.annotation.DateTimeFormat;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +/**
  15 +* 促销活动 Base VO,提供给添加、修改、详细的子 VO 使用
  16 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  17 +*/
  18 +@Data
  19 +public class ActivityBaseVO {
  20 +
  21 + @ApiModelProperty(value = "活动标题", required = true)
  22 + @NotNull(message = "活动标题不能为空")
  23 + private String title;
  24 +
  25 + @ApiModelProperty(value = "活动类型", required = true)
  26 + @NotNull(message = "活动类型不能为空")
  27 + @InEnum(MarketActivityTypeEnum.class)
  28 + private Integer activityType;
  29 +
  30 + @ApiModelProperty(value = "活动状态", required = true)
  31 + @NotNull(message = "活动状态不能为空")
  32 + @InEnum(MarketActivityStatusEnum.class)
  33 + private Integer status;
  34 +
  35 + @ApiModelProperty(value = "开始时间", required = true)
  36 + @NotNull(message = "开始时间不能为空")
  37 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  38 + private Date startTime;
  39 +
  40 + @ApiModelProperty(value = "结束时间", required = true)
  41 + @NotNull(message = "结束时间不能为空")
  42 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  43 + private Date endTime;
  44 +
  45 + @ApiModelProperty(value = "失效时间")
  46 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  47 + private Date invalidTime;
  48 +
  49 + @ApiModelProperty(value = "删除时间")
  50 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  51 + private Date deleteTime;
  52 +
  53 + @ApiModelProperty(value = "限制折扣字符串,使用 JSON 序列化成字符串存储")
  54 + private String timeLimitedDiscount;
  55 +
  56 + @ApiModelProperty(value = "限制折扣字符串,使用 JSON 序列化成字符串存储")
  57 + private String fullPrivilege;
  58 +
  59 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import javax.validation.constraints.*;
  7 +
  8 +@ApiModel("管理后台 - 促销活动创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class ActivityCreateReqVO extends ActivityBaseVO {
  13 +
  14 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.market.enums.activity.MarketActivityStatusEnum;
  5 +import cn.iocoder.yudao.module.market.enums.activity.MarketActivityTypeEnum;
  6 +import lombok.*;
  7 +import java.util.*;
  8 +import io.swagger.annotations.*;
  9 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  10 +import org.springframework.format.annotation.DateTimeFormat;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@ApiModel("管理后台 - 促销活动分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class ActivityPageReqVO extends PageParam {
  19 +
  20 + @ApiModelProperty(value = "活动标题")
  21 + private String title;
  22 +
  23 + @ApiModelProperty(value = "活动类型")
  24 + @InEnum(MarketActivityTypeEnum.class)
  25 + private Integer activityType;
  26 +
  27 + @ApiModelProperty(value = "活动状态")
  28 + @InEnum(MarketActivityStatusEnum.class)
  29 + private Integer status;
  30 +
  31 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  32 + @ApiModelProperty(value = "开始开始时间")
  33 + private Date beginStartTime;
  34 +
  35 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  36 + @ApiModelProperty(value = "结束开始时间")
  37 + private Date endStartTime;
  38 +
  39 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  40 + @ApiModelProperty(value = "开始结束时间")
  41 + private Date beginEndTime;
  42 +
  43 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  44 + @ApiModelProperty(value = "结束结束时间")
  45 + private Date endEndTime;
  46 +
  47 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  48 + @ApiModelProperty(value = "开始失效时间")
  49 + private Date beginInvalidTime;
  50 +
  51 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  52 + @ApiModelProperty(value = "结束失效时间")
  53 + private Date endInvalidTime;
  54 +
  55 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  56 + @ApiModelProperty(value = "开始删除时间")
  57 + private Date beginDeleteTime;
  58 +
  59 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  60 + @ApiModelProperty(value = "结束删除时间")
  61 + private Date endDeleteTime;
  62 +
  63 + @ApiModelProperty(value = "限制折扣字符串,使用 JSON 序列化成字符串存储")
  64 + private String timeLimitedDiscount;
  65 +
  66 + @ApiModelProperty(value = "限制折扣字符串,使用 JSON 序列化成字符串存储")
  67 + private String fullPrivilege;
  68 +
  69 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  70 + @ApiModelProperty(value = "开始创建时间")
  71 + private Date beginCreateTime;
  72 +
  73 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  74 + @ApiModelProperty(value = "结束创建时间")
  75 + private Date endCreateTime;
  76 +
  77 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +
  7 +@ApiModel("管理后台 - 促销活动 Response VO")
  8 +@Data
  9 +@EqualsAndHashCode(callSuper = true)
  10 +@ToString(callSuper = true)
  11 +public class ActivityRespVO extends ActivityBaseVO {
  12 +
  13 + @ApiModelProperty(value = "活动编号", required = true)
  14 + private Long id;
  15 +
  16 + @ApiModelProperty(value = "创建时间", required = true)
  17 + private Date createTime;
  18 +
  19 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.activity.vo;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import io.swagger.annotations.*;
  6 +import javax.validation.constraints.*;
  7 +
  8 +@ApiModel("管理后台 - 促销活动更新 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class ActivityUpdateReqVO extends ActivityBaseVO {
  13 +
  14 + @ApiModelProperty(value = "活动编号", required = true)
  15 + @NotNull(message = "活动编号不能为空")
  16 + private Long id;
  17 +
  18 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/convert/activity/ActivityConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.convert.activity;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  10 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  11 +
  12 +/**
  13 + * 促销活动 Convert
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Mapper
  18 +public interface ActivityConvert {
  19 +
  20 + ActivityConvert INSTANCE = Mappers.getMapper(ActivityConvert.class);
  21 +
  22 + ActivityDO convert(ActivityCreateReqVO bean);
  23 +
  24 + ActivityDO convert(ActivityUpdateReqVO bean);
  25 +
  26 + ActivityRespVO convert(ActivityDO bean);
  27 +
  28 + List<ActivityRespVO> convertList(List<ActivityDO> list);
  29 +
  30 + PageResult<ActivityRespVO> convertPage(PageResult<ActivityDO> page);
  31 +
  32 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/dataobject/activity/ActivityDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.dal.dataobject.activity;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import com.baomidou.mybatisplus.annotation.*;
  6 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  7 +
  8 +/**
  9 + * 促销活动 DO
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +@TableName("market_activity")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +@Builder
  18 +@NoArgsConstructor
  19 +@AllArgsConstructor
  20 +public class ActivityDO extends BaseDO {
  21 +
  22 + /**
  23 + * 活动编号
  24 + */
  25 + @TableId
  26 + private Long id;
  27 + /**
  28 + * 活动标题
  29 + */
  30 + private String title;
  31 + /**
  32 + * 活动类型MarketActivityTypeEnum
  33 + */
  34 + private Integer activityType;
  35 + /**
  36 + * 活动状态MarketActivityStatusEnum
  37 + */
  38 + private Integer status;
  39 + /**
  40 + * 开始时间
  41 + */
  42 + private Date startTime;
  43 + /**
  44 + * 结束时间
  45 + */
  46 + private Date endTime;
  47 + /**
  48 + * 失效时间
  49 + */
  50 + private Date invalidTime;
  51 + /**
  52 + * 删除时间
  53 + */
  54 + private Date deleteTime;
  55 + /**
  56 + * 限制折扣字符串,使用 JSON 序列化成字符串存储
  57 + */
  58 + private String timeLimitedDiscount;
  59 + /**
  60 + * 限制折扣字符串,使用 JSON 序列化成字符串存储
  61 + */
  62 + private String fullPrivilege;
  63 +
  64 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/mysql/activity/ActivityMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.dal.mysql.activity;
  2 +
  3 +import java.util.*;
  4 +
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  7 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  8 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  11 +
  12 +/**
  13 + * 促销活动 Mapper
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Mapper
  18 +public interface ActivityMapper extends BaseMapperX<ActivityDO> {
  19 +
  20 + default PageResult<ActivityDO> selectPage(ActivityPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<ActivityDO>()
  22 + .eqIfPresent(ActivityDO::getTitle, reqVO.getTitle())
  23 + .eqIfPresent(ActivityDO::getActivityType, reqVO.getActivityType())
  24 + .eqIfPresent(ActivityDO::getStatus, reqVO.getStatus())
  25 + .betweenIfPresent(ActivityDO::getStartTime, reqVO.getBeginStartTime(), reqVO.getEndStartTime())
  26 + .betweenIfPresent(ActivityDO::getEndTime, reqVO.getBeginEndTime(), reqVO.getEndEndTime())
  27 + .betweenIfPresent(ActivityDO::getInvalidTime, reqVO.getBeginInvalidTime(), reqVO.getEndInvalidTime())
  28 + .betweenIfPresent(ActivityDO::getDeleteTime, reqVO.getBeginDeleteTime(), reqVO.getEndDeleteTime())
  29 + .eqIfPresent(ActivityDO::getTimeLimitedDiscount, reqVO.getTimeLimitedDiscount())
  30 + .eqIfPresent(ActivityDO::getFullPrivilege, reqVO.getFullPrivilege())
  31 + .betweenIfPresent(ActivityDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  32 + .orderByDesc(ActivityDO::getId));
  33 + }
  34 +
  35 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/service/activity/ActivityService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.service.activity;
  2 +
  3 +import java.util.*;
  4 +import javax.validation.*;
  5 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  6 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +
  9 +/**
  10 + * 促销活动 Service 接口
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface ActivityService {
  15 +
  16 + /**
  17 + * 创建促销活动
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createActivity(@Valid ActivityCreateReqVO createReqVO);
  23 +
  24 + /**
  25 + * 更新促销活动
  26 + *
  27 + * @param updateReqVO 更新信息
  28 + */
  29 + void updateActivity(@Valid ActivityUpdateReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除促销活动
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteActivity(Long id);
  37 +
  38 + /**
  39 + * 获得促销活动
  40 + *
  41 + * @param id 编号
  42 + * @return 促销活动
  43 + */
  44 + ActivityDO getActivity(Long id);
  45 +
  46 + /**
  47 + * 获得促销活动列表
  48 + *
  49 + * @param ids 编号
  50 + * @return 促销活动列表
  51 + */
  52 + List<ActivityDO> getActivityList(Collection<Long> ids);
  53 +
  54 + /**
  55 + * 获得促销活动分页
  56 + *
  57 + * @param pageReqVO 分页查询
  58 + * @return 促销活动分页
  59 + */
  60 + PageResult<ActivityDO> getActivityPage(ActivityPageReqVO pageReqVO);
  61 +
  62 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/service/activity/ActivityServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.service.activity;
  2 +
  3 +import org.springframework.stereotype.Service;
  4 +import javax.annotation.Resource;
  5 +import org.springframework.validation.annotation.Validated;
  6 +
  7 +import java.util.*;
  8 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  9 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  10 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  11 +
  12 +import cn.iocoder.yudao.module.market.convert.activity.ActivityConvert;
  13 +import cn.iocoder.yudao.module.market.dal.mysql.activity.ActivityMapper;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  16 +import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.*;
  17 +
  18 +/**
  19 + * 促销活动 Service 实现类
  20 + *
  21 + * @author 芋道源码
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class ActivityServiceImpl implements ActivityService {
  26 +
  27 + @Resource
  28 + private ActivityMapper activityMapper;
  29 +
  30 + @Override
  31 + public Long createActivity(ActivityCreateReqVO createReqVO) {
  32 + // 插入
  33 + ActivityDO activity = ActivityConvert.INSTANCE.convert(createReqVO);
  34 + activityMapper.insert(activity);
  35 + // 返回
  36 + return activity.getId();
  37 + }
  38 +
  39 + @Override
  40 + public void updateActivity(ActivityUpdateReqVO updateReqVO) {
  41 + // 校验存在
  42 + this.validateActivityExists(updateReqVO.getId());
  43 + // 更新
  44 + ActivityDO updateObj = ActivityConvert.INSTANCE.convert(updateReqVO);
  45 + activityMapper.updateById(updateObj);
  46 + }
  47 +
  48 + @Override
  49 + public void deleteActivity(Long id) {
  50 + // 校验存在
  51 + this.validateActivityExists(id);
  52 + // 删除
  53 + activityMapper.deleteById(id);
  54 + }
  55 +
  56 + private void validateActivityExists(Long id) {
  57 + if (activityMapper.selectById(id) == null) {
  58 + throw exception(ACTIVITY_NOT_EXISTS);
  59 + }
  60 + }
  61 +
  62 + @Override
  63 + public ActivityDO getActivity(Long id) {
  64 + return activityMapper.selectById(id);
  65 + }
  66 +
  67 + @Override
  68 + public List<ActivityDO> getActivityList(Collection<Long> ids) {
  69 + return activityMapper.selectBatchIds(ids);
  70 + }
  71 +
  72 + @Override
  73 + public PageResult<ActivityDO> getActivityPage(ActivityPageReqVO pageReqVO) {
  74 + return activityMapper.selectPage(pageReqVO);
  75 + }
  76 +
  77 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/test/java/cn/iocoder/yudao/module/market/service/activity/ActivityServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.service.activity;
  2 +
  3 +import org.junit.jupiter.api.Disabled;
  4 +import org.junit.jupiter.api.Test;
  5 +
  6 +import javax.annotation.Resource;
  7 +
  8 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  9 +
  10 +import cn.iocoder.yudao.module.market.controller.admin.activity.vo.*;
  11 +import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  12 +import cn.iocoder.yudao.module.market.dal.mysql.activity.ActivityMapper;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  14 +
  15 +import org.springframework.context.annotation.Import;
  16 +
  17 +import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.*;
  18 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
  19 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  20 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
  21 +import static org.junit.jupiter.api.Assertions.*;
  22 +
  23 +/**
  24 +* {@link ActivityServiceImpl} 的单元测试类
  25 +*
  26 +* @author 芋道源码
  27 +*/
  28 +@Import(ActivityServiceImpl.class)
  29 +public class ActivityServiceImplTest extends BaseDbUnitTest {
  30 +
  31 + @Resource
  32 + private ActivityServiceImpl activityService;
  33 +
  34 + @Resource
  35 + private ActivityMapper activityMapper;
  36 +
  37 + @Test
  38 + public void testCreateActivity_success() {
  39 + // 准备参数
  40 + ActivityCreateReqVO reqVO = randomPojo(ActivityCreateReqVO.class);
  41 +
  42 + // 调用
  43 + Long activityId = activityService.createActivity(reqVO);
  44 + // 断言
  45 + assertNotNull(activityId);
  46 + // 校验记录的属性是否正确
  47 + ActivityDO activity = activityMapper.selectById(activityId);
  48 + assertPojoEquals(reqVO, activity);
  49 + }
  50 +
  51 + @Test
  52 + public void testUpdateActivity_success() {
  53 + // mock 数据
  54 + ActivityDO dbActivity = randomPojo(ActivityDO.class);
  55 + activityMapper.insert(dbActivity);// @Sql: 先插入出一条存在的数据
  56 + // 准备参数
  57 + ActivityUpdateReqVO reqVO = randomPojo(ActivityUpdateReqVO.class, o -> {
  58 + o.setId(dbActivity.getId()); // 设置更新的 ID
  59 + });
  60 +
  61 + // 调用
  62 + activityService.updateActivity(reqVO);
  63 + // 校验是否更新正确
  64 + ActivityDO activity = activityMapper.selectById(reqVO.getId()); // 获取最新的
  65 + assertPojoEquals(reqVO, activity);
  66 + }
  67 +
  68 + @Test
  69 + public void testUpdateActivity_notExists() {
  70 + // 准备参数
  71 + ActivityUpdateReqVO reqVO = randomPojo(ActivityUpdateReqVO.class);
  72 +
  73 + // 调用, 并断言异常
  74 + assertServiceException(() -> activityService.updateActivity(reqVO), ACTIVITY_NOT_EXISTS);
  75 + }
  76 +
  77 + @Test
  78 + public void testDeleteActivity_success() {
  79 + // mock 数据
  80 + ActivityDO dbActivity = randomPojo(ActivityDO.class);
  81 + activityMapper.insert(dbActivity);// @Sql: 先插入出一条存在的数据
  82 + // 准备参数
  83 + Long id = dbActivity.getId();
  84 +
  85 + // 调用
  86 + activityService.deleteActivity(id);
  87 + // 校验数据不存在了
  88 + assertNull(activityMapper.selectById(id));
  89 + }
  90 +
  91 + @Test
  92 + public void testDeleteActivity_notExists() {
  93 + // 准备参数
  94 + Long id = randomLongId();
  95 +
  96 + // 调用, 并断言异常
  97 + assertServiceException(() -> activityService.deleteActivity(id), ACTIVITY_NOT_EXISTS);
  98 + }
  99 +
  100 + @Test
  101 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  102 + public void testGetActivityPage() {
  103 + // mock 数据
  104 + ActivityDO dbActivity = randomPojo(ActivityDO.class, o -> { // 等会查询到
  105 + o.setTitle(null);
  106 + o.setActivityType(null);
  107 + o.setStatus(null);
  108 + o.setStartTime(null);
  109 + o.setEndTime(null);
  110 + o.setInvalidTime(null);
  111 + o.setDeleteTime(null);
  112 + o.setTimeLimitedDiscount(null);
  113 + o.setFullPrivilege(null);
  114 + o.setCreateTime(null);
  115 + });
  116 + activityMapper.insert(dbActivity);
  117 + // 测试 title 不匹配
  118 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setTitle(null)));
  119 + // 测试 activityType 不匹配
  120 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setActivityType(null)));
  121 + // 测试 status 不匹配
  122 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setStatus(null)));
  123 + // 测试 startTime 不匹配
  124 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setStartTime(null)));
  125 + // 测试 endTime 不匹配
  126 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setEndTime(null)));
  127 + // 测试 invalidTime 不匹配
  128 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setInvalidTime(null)));
  129 + // 测试 deleteTime 不匹配
  130 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setDeleteTime(null)));
  131 + // 测试 timeLimitedDiscount 不匹配
  132 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setTimeLimitedDiscount(null)));
  133 + // 测试 fullPrivilege 不匹配
  134 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setFullPrivilege(null)));
  135 + // 测试 createTime 不匹配
  136 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setCreateTime(null)));
  137 + // 准备参数
  138 + ActivityPageReqVO reqVO = new ActivityPageReqVO();
  139 + reqVO.setTitle(null);
  140 + reqVO.setActivityType(null);
  141 + reqVO.setStatus(null);
  142 + reqVO.setBeginStartTime(null);
  143 + reqVO.setEndStartTime(null);
  144 + reqVO.setBeginEndTime(null);
  145 + reqVO.setEndEndTime(null);
  146 + reqVO.setBeginInvalidTime(null);
  147 + reqVO.setEndInvalidTime(null);
  148 + reqVO.setBeginDeleteTime(null);
  149 + reqVO.setEndDeleteTime(null);
  150 + reqVO.setTimeLimitedDiscount(null);
  151 + reqVO.setFullPrivilege(null);
  152 + reqVO.setBeginCreateTime(null);
  153 + reqVO.setEndCreateTime(null);
  154 +
  155 + // 调用
  156 + PageResult<ActivityDO> pageResult = activityService.getActivityPage(reqVO);
  157 + // 断言
  158 + assertEquals(1, pageResult.getTotal());
  159 + assertEquals(1, pageResult.getList().size());
  160 + assertPojoEquals(dbActivity, pageResult.getList().get(0));
  161 + }
  162 +
  163 + @Test
  164 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  165 + public void testGetActivityList() {
  166 + // mock 数据
  167 + ActivityDO dbActivity = randomPojo(ActivityDO.class, o -> { // 等会查询到
  168 + o.setTitle(null);
  169 + o.setActivityType(null);
  170 + o.setStatus(null);
  171 + o.setStartTime(null);
  172 + o.setEndTime(null);
  173 + o.setInvalidTime(null);
  174 + o.setDeleteTime(null);
  175 + o.setTimeLimitedDiscount(null);
  176 + o.setFullPrivilege(null);
  177 + o.setCreateTime(null);
  178 + });
  179 + activityMapper.insert(dbActivity);
  180 + // 测试 title 不匹配
  181 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setTitle(null)));
  182 + // 测试 activityType 不匹配
  183 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setActivityType(null)));
  184 + // 测试 status 不匹配
  185 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setStatus(null)));
  186 + // 测试 startTime 不匹配
  187 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setStartTime(null)));
  188 + // 测试 endTime 不匹配
  189 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setEndTime(null)));
  190 + // 测试 invalidTime 不匹配
  191 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setInvalidTime(null)));
  192 + // 测试 deleteTime 不匹配
  193 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setDeleteTime(null)));
  194 + // 测试 timeLimitedDiscount 不匹配
  195 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setTimeLimitedDiscount(null)));
  196 + // 测试 fullPrivilege 不匹配
  197 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setFullPrivilege(null)));
  198 + // 测试 createTime 不匹配
  199 + activityMapper.insert(cloneIgnoreId(dbActivity, o -> o.setCreateTime(null)));
  200 + }
  201 +
  202 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/test/resources/application-unit-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + druid:
  17 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  18 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
  22 +
  23 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  24 + redis:
  25 + host: 127.0.0.1 # 地址
  26 + port: 16379 # 端口(单元测试,使用 16379 端口)
  27 + database: 0 # 数据库索引
  28 +
  29 +mybatis:
  30 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  31 +
  32 +--- #################### 定时任务相关配置 ####################
  33 +
  34 +--- #################### 配置中心相关配置 ####################
  35 +
  36 +--- #################### 服务保障相关配置 ####################
  37 +
  38 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  39 +
  40 +# Resilience4j 配置项
  41 +
  42 +--- #################### 监控相关配置 ####################
  43 +
  44 +--- #################### 芋道相关配置 ####################
  45 +
  46 +# 芋道配置项,设置当前项目所有自定义的配置
  47 +yudao:
  48 + info:
  49 + base-package: cn.iocoder.yudao.module
... ...
yudao-module-mall/yudao-module-market-biz/src/test/resources/logback.xml 0 → 100644
  1 +<configuration>
  2 + <!-- 引用 Spring Boot 的 logback 基础配置 -->
  3 + <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  4 +</configuration>
... ...
yudao-module-mall/yudao-module-market-biz/src/test/resources/sql/clean.sql 0 → 100644
  1 +DELETE FROM "market_activity";
... ...
yudao-module-mall/yudao-module-market-biz/src/test/resources/sql/create_tables.sql 0 → 100644
  1 +CREATE TABLE IF NOT EXISTS "market_activity" (
  2 + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  3 + "title" varchar(50) NOT NULL,
  4 + "activity_type" tinyint(4) NOT NULL,
  5 + "status" tinyint(4) NOT NULL,
  6 + "start_time" datetime NOT NULL,
  7 + "end_time" datetime NOT NULL,
  8 + "invalid_time" datetime,
  9 + "delete_time" datetime,
  10 + "time_limited_discount" varchar(2000),
  11 + "full_privilege" varchar(2000),
  12 + "creator" varchar(64) DEFAULT '',
  13 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  14 + "updater" varchar(64) DEFAULT '',
  15 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  16 + "deleted" bit NOT NULL DEFAULT FALSE,
  17 + "tenant_id" bigint(20) NOT NULL,
  18 + PRIMARY KEY ("id")
  19 + ) COMMENT '促销活动';
0 20 \ No newline at end of file
... ...