满减活动

This commit is contained in:
2025-10-13 15:53:08 +08:00
parent 46faa2cf16
commit ccf791b53b
13 changed files with 572 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
package com.czg.controller.admin;
import com.czg.TimeQueryParam;
import com.czg.log.annotation.OperationLog;
import com.czg.market.dto.MkDiscountActivityDTO;
import com.czg.market.service.MkDiscountActivityService;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.utils.AssertUtil;
import com.czg.validator.group.DefaultGroup;
import com.czg.validator.group.InsertGroup;
import com.czg.validator.group.UpdateGroup;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 满减活动
*
* @author Administrator
*/
@RestController
@RequestMapping("/admin/discountActivity")
public class ADiscountActivityController {
@Resource
private MkDiscountActivityService discountActivityService;
/**
* 分页
*/
@GetMapping("page")
public CzgResult<Page<MkDiscountActivityDTO>> getActivityPage(TimeQueryParam param) {
Page<MkDiscountActivityDTO> data = discountActivityService.getActivityPage(param, StpKit.USER.getShopId());
return CzgResult.success(data);
}
/**
* 新增
*/
@PostMapping
@OperationLog("满减活动-新增")
public CzgResult<Void> addActivity(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) MkDiscountActivityDTO dto) {
Long shopId = StpKit.USER.getShopId();
dto.setShopId(shopId);
discountActivityService.addActivity(dto);
return CzgResult.success();
}
/**
* 修改
*/
@PutMapping
@OperationLog("满减活动-修改")
public CzgResult<Void> updateCoupon(@RequestBody @Validated({UpdateGroup.class, DefaultGroup.class}) MkDiscountActivityDTO dto) {
Long shopId = StpKit.USER.getShopId();
dto.setShopId(shopId);
discountActivityService.updateActivityById(dto);
return CzgResult.success();
}
/**
* 删除
*/
@DeleteMapping
@OperationLog("满减活动--删除")
public CzgResult<String> deleteCoupon(@RequestParam Long id) {
AssertUtil.isNull(id, "{}不能为空", "id");
discountActivityService.deleteActivity(id);
return CzgResult.success();
}
}

View File

@@ -0,0 +1,13 @@
package com.czg;
import lombok.Data;
/**
* @author ww
* @description
*/
@Data
public class BaseQueryParam {
private int pageNum = 1;
private int pageSize = 10;
}

View File

@@ -0,0 +1,20 @@
package com.czg;
import lombok.Data;
/**
* @author ww
* @description
*/
@Data
public class TimeQueryParam extends BaseQueryParam {
/**
* 开始时间 yyyy-MM-dd HH:mm:ss
*/
private String startTime;
/**
* 结束时间 yyyy-MM-dd HH:mm:ss
*
*/
private String endTime;
}

View File

@@ -43,6 +43,10 @@ public class ShopConfig implements Serializable {
*/
private Integer isEnableConsSync;
/**
* 是否启用新客立减 1-是 0-否
*/
private Integer isEnableDiscount;
/**
* 是否允许账号登录 1-是 0-否
*/
private Integer isAllowAccountLogin;

View File

@@ -0,0 +1,133 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.sql.Time;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import java.io.Serial;
import java.util.List;
import com.czg.market.entity.MkDiscountThreshold;
import com.czg.validator.group.UpdateGroup;
import com.mybatisflex.annotation.Column;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 商家满减活动表 实体类。
*
* @author ww
* @since 2025-10-13
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MkDiscountActivityDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@NotNull(message = "ID不能为空", groups = UpdateGroup.class)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 有效期开始时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validStartTime;
/**
* 有效期结束时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validEndTime;
/**
* 可用周期,如:周一,周二,周三,周四,周五,周六,周七
*/
private String useDays;
/**
* 可用时间段类型all-全时段custom-指定时段
*/
private String useTimeType;
/**
* 可用开始时间
*/
private Time useStartTime;
/**
* 可用结束时间
*/
private Time useEndTime;
/**
* 可使用类型dine堂食/pickup自取/deliv配送/express快递
*/
private String useType;
/**
* 排序
*/
private Integer sort;
/**
* 与优惠券同享0-否1-是
*/
private Integer couponShare;
/**
* 与限时折扣同享0-否1-是
*/
private Integer discountShare;
/**
* 与会员价同享0-否1-是
*/
private Integer vipPriceShare;
/**
* 与积分抵扣同享0-否1-是
*/
private Integer pointsShare;
/**
* 状态1未开始2进行中3已结束
*/
private Integer status;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 0否1是
*/
private Boolean isDel;
/**
* 满减阈值列表
*/
@Column(ignore = true)
private List<MkDiscountThreshold> thresholds;
}

View File

@@ -0,0 +1,129 @@
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.sql.Time;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 商家满减活动表 实体类。
*
* @author ww
* @since 2025-10-13
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_discount_activity")
@Accessors(chain = true)
public class MkDiscountActivity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 自增主键
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺ID
*/
private Long shopId;
/**
* 有效期开始时间
*/
private LocalDateTime validStartTime;
/**
* 有效期结束时间
*/
private LocalDateTime validEndTime;
/**
* 可用周期,如:周一,周二,周三,周四,周五,周六,周七
*/
private String useDays;
/**
* 可用时间段类型all-全时段custom-指定时段
*/
private String useTimeType;
/**
* 可用开始时间
*/
private Time useStartTime;
/**
* 可用结束时间
*/
private Time useEndTime;
/**
* 可使用类型dine堂食/pickup自取/deliv配送/express快递
*/
private String useType;
/**
* 排序
*/
private Integer sort;
/**
* 与优惠券同享0-否1-是
*/
private Integer couponShare;
/**
* 与限时折扣同享0-否1-是
*/
private Integer discountShare;
/**
* 与会员价同享0-否1-是
*/
private Integer vipPriceShare;
/**
* 与积分抵扣同享0-否1-是
*/
private Integer pointsShare;
/**
* 状态1未开始2进行中3已结束
*/
private Integer status;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* 0否1是
*/
private Boolean isDel;
}

View File

@@ -0,0 +1,45 @@
package com.czg.market.entity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 商家满减活动明细表 实体类。
*
* @author ww
* @since 2025-10-13
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_discount_threshold")
public class MkDiscountThreshold implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* mk_discount_activity的ID
*/
private Long activityId;
/**
* 满多少金额
*/
private BigDecimal fullAmount;
/**
* 减多少金额
*/
private BigDecimal discountAmount;
}

View File

@@ -0,0 +1,23 @@
package com.czg.market.service;
import com.czg.TimeQueryParam;
import com.czg.market.dto.MkDiscountActivityDTO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkDiscountActivity;
/**
* 商家满减活动表 服务层。
*
* @author ww
* @since 2025-10-13
*/
public interface MkDiscountActivityService extends IService<MkDiscountActivity> {
Page<MkDiscountActivityDTO> getActivityPage(TimeQueryParam param, Long shopId);
void addActivity(MkDiscountActivityDTO param);
void updateActivityById(MkDiscountActivityDTO param);
void deleteActivity(Long id);
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.MkDiscountActivity;
/**
* 商家满减活动表 映射层。
*
* @author ww
* @since 2025-10-13
*/
public interface MkDiscountActivityMapper extends BaseMapper<MkDiscountActivity> {
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.MkDiscountThreshold;
/**
* 商家满减活动明细表 映射层。
*
* @author ww
* @since 2025-10-13
*/
public interface MkDiscountThresholdMapper extends BaseMapper<MkDiscountThreshold> {
}

View File

@@ -0,0 +1,87 @@
package com.czg.service.market.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.czg.TimeQueryParam;
import com.czg.market.dto.MkDiscountActivityDTO;
import com.czg.market.dto.ShopCouponDTO;
import com.czg.market.entity.MkDiscountThreshold;
import com.czg.market.entity.ShopCoupon;
import com.czg.sa.StpKit;
import com.czg.service.market.mapper.MkDiscountThresholdMapper;
import com.czg.utils.PageUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.market.entity.MkDiscountActivity;
import com.czg.market.service.MkDiscountActivityService;
import com.czg.service.market.mapper.MkDiscountActivityMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 商家满减活动表 服务层实现。
*
* @author ww
* @since 2025-10-13
*/
@Service
public class MkDiscountActivityServiceImpl extends ServiceImpl<MkDiscountActivityMapper, MkDiscountActivity> implements MkDiscountActivityService {
@Resource
private MkDiscountThresholdMapper thresholdMapper;
@Override
public Page<MkDiscountActivityDTO> getActivityPage(TimeQueryParam param, Long shopId) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq(MkDiscountActivity::getShopId, shopId)
.eq(MkDiscountActivity::getIsDel, 0)
.lt(MkDiscountActivity::getValidStartTime, param.getStartTime())
.le(MkDiscountActivity::getValidEndTime, param.getEndTime())
.orderBy(MkDiscountActivity::getSort).desc()
.orderBy(MkDiscountActivity::getUpdateTime).desc();
Page<MkDiscountActivityDTO> page = pageAs(PageUtil.buildPage(), queryWrapper, MkDiscountActivityDTO.class);
page.getRecords().forEach(
item -> item.setThresholds(thresholdMapper.selectListByQuery(
new QueryWrapper().eq(MkDiscountThreshold::getActivityId, item.getId())
))
);
return page;
}
@Override
public void addActivity(MkDiscountActivityDTO param) {
if(CollUtil.isEmpty(param.getThresholds())){
throw new IllegalArgumentException("活动必须配置满减阈值");
}
MkDiscountActivity activity = BeanUtil.toBean(param, MkDiscountActivity.class);
save(activity);
for (MkDiscountThreshold threshold : param.getThresholds()) {
threshold.setActivityId(activity.getId());
thresholdMapper.insert(threshold);
}
}
@Override
public void updateActivityById(MkDiscountActivityDTO param) {
if(CollUtil.isEmpty(param.getThresholds())){
throw new IllegalArgumentException("活动必须配置满减阈值");
}
MkDiscountActivity activity = BeanUtil.toBean(param, MkDiscountActivity.class);
updateById(activity, true);
thresholdMapper.deleteByQuery(
new QueryWrapper().eq(MkDiscountThreshold::getActivityId, activity.getId())
);
for (MkDiscountThreshold threshold : param.getThresholds()) {
threshold.setActivityId(activity.getId());
thresholdMapper.insert(threshold);
}
}
@Override
public void deleteActivity(Long id) {
updateById(new MkDiscountActivity().setIsDel(true).setUpdateTime(LocalDateTime.now()).setId(id));
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.market.mapper.MkDiscountActivityMapper">
</mapper>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.market.mapper.MkDiscountThresholdMapper">
</mapper>