满减活动
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -43,6 +43,10 @@ public class ShopConfig implements Serializable {
|
||||
*/
|
||||
private Integer isEnableConsSync;
|
||||
/**
|
||||
* 是否启用新客立减 1-是 0-否
|
||||
*/
|
||||
private Integer isEnableDiscount;
|
||||
/**
|
||||
* 是否允许账号登录 1-是 0-否
|
||||
*/
|
||||
private Integer isAllowAccountLogin;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user