diff --git a/cash-api/market-server/src/main/java/com/czg/controller/admin/ADiscountActivityController.java b/cash-api/market-server/src/main/java/com/czg/controller/admin/ADiscountActivityController.java new file mode 100644 index 000000000..76a20791f --- /dev/null +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/ADiscountActivityController.java @@ -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> getActivityPage(TimeQueryParam param) { + Page data = discountActivityService.getActivityPage(param, StpKit.USER.getShopId()); + return CzgResult.success(data); + } + + + /** + * 新增 + */ + @PostMapping + @OperationLog("满减活动-新增") + public CzgResult 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 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 deleteCoupon(@RequestParam Long id) { + AssertUtil.isNull(id, "{}不能为空", "id"); + discountActivityService.deleteActivity(id); + return CzgResult.success(); + } + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/BaseQueryParam.java b/cash-common/cash-common-service/src/main/java/com/czg/BaseQueryParam.java new file mode 100644 index 000000000..97dd763ca --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/BaseQueryParam.java @@ -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; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/TimeQueryParam.java b/cash-common/cash-common-service/src/main/java/com/czg/TimeQueryParam.java new file mode 100644 index 000000000..868af404b --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/TimeQueryParam.java @@ -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; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java index 2b70c71f5..876690017 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java @@ -43,6 +43,10 @@ public class ShopConfig implements Serializable { */ private Integer isEnableConsSync; /** + * 是否启用新客立减 1-是 0-否 + */ + private Integer isEnableDiscount; + /** * 是否允许账号登录 1-是 0-否 */ private Integer isAllowAccountLogin; diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDiscountActivityDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDiscountActivityDTO.java new file mode 100644 index 000000000..fbc0f32d9 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkDiscountActivityDTO.java @@ -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 thresholds; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountActivity.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountActivity.java new file mode 100644 index 000000000..0c82ef516 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountActivity.java @@ -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; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountThreshold.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountThreshold.java new file mode 100644 index 000000000..b4af36947 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkDiscountThreshold.java @@ -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; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDiscountActivityService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDiscountActivityService.java new file mode 100644 index 000000000..d0990187d --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkDiscountActivityService.java @@ -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 { + Page getActivityPage(TimeQueryParam param, Long shopId); + + void addActivity(MkDiscountActivityDTO param); + + void updateActivityById(MkDiscountActivityDTO param); + + void deleteActivity(Long id); +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountActivityMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountActivityMapper.java new file mode 100644 index 000000000..91eda878b --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountActivityMapper.java @@ -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 { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountThresholdMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountThresholdMapper.java new file mode 100644 index 000000000..dd9c4656b --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkDiscountThresholdMapper.java @@ -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 { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDiscountActivityServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDiscountActivityServiceImpl.java new file mode 100644 index 000000000..9dec6b2fd --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkDiscountActivityServiceImpl.java @@ -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 implements MkDiscountActivityService { + + @Resource + private MkDiscountThresholdMapper thresholdMapper; + + @Override + public Page 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 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)); + } +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml new file mode 100644 index 000000000..7540175e1 --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cash-service/market-service/src/main/resources/mapper/MkDiscountThresholdMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDiscountThresholdMapper.xml new file mode 100644 index 000000000..37c3343f6 --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkDiscountThresholdMapper.xml @@ -0,0 +1,7 @@ + + + + +