From a2cd91bf756d2daacf790edf2c507a2fe07656ce Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Tue, 21 Oct 2025 15:43:18 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E6=97=B6=E6=8A=98=E6=89=A3=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AB=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/ULimitTimeDiscountController.java | 34 +++++ .../market/dto/MkLimitTimeDiscountDTO.java | 133 ++++++++++++++++ .../market/entity/MkLimitTimeDiscount.java | 142 ++++++++++++++++++ .../service/MkLimitTimeDiscountService.java | 25 +++ .../mapper/MkDiscountActivityMapper.java | 9 +- .../mapper/MkLimitTimeDiscountMapper.java | 21 +++ .../impl/MkDiscountActivityServiceImpl.java | 11 +- .../impl/MkLimitTimeDiscountServiceImpl.java | 136 +++++++++++++++++ .../mapper/MkDiscountActivityMapper.xml | 5 +- .../mapper/MkLimitTimeDiscountMapper.xml | 27 ++++ 10 files changed, 531 insertions(+), 12 deletions(-) create mode 100644 cash-api/market-server/src/main/java/com/czg/controller/user/ULimitTimeDiscountController.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkLimitTimeDiscountDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkLimitTimeDiscount.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/service/MkLimitTimeDiscountService.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkLimitTimeDiscountMapper.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkLimitTimeDiscountServiceImpl.java create mode 100644 cash-service/market-service/src/main/resources/mapper/MkLimitTimeDiscountMapper.xml diff --git a/cash-api/market-server/src/main/java/com/czg/controller/user/ULimitTimeDiscountController.java b/cash-api/market-server/src/main/java/com/czg/controller/user/ULimitTimeDiscountController.java new file mode 100644 index 00000000..d775f9dc --- /dev/null +++ b/cash-api/market-server/src/main/java/com/czg/controller/user/ULimitTimeDiscountController.java @@ -0,0 +1,34 @@ +package com.czg.controller.user; + +import com.czg.market.entity.MkLimitTimeDiscount; +import com.czg.market.service.MkLimitTimeDiscountService; +import com.czg.resp.CzgResult; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 限时折扣 + * + * @author ww + */ + +@RestController +@RequestMapping("/user/limitTimeDiscount") +public class ULimitTimeDiscountController { + @Resource + private MkLimitTimeDiscountService limitTimeDiscountService; + + /** + * 获取限时折扣 + */ + @GetMapping + public CzgResult getActivity(@RequestParam Long shopId) { + MkLimitTimeDiscount data = limitTimeDiscountService.getLimitTimeDiscountByShopId(shopId); + return CzgResult.success(data); + } + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkLimitTimeDiscountDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkLimitTimeDiscountDTO.java new file mode 100644 index 00000000..526410fb --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkLimitTimeDiscountDTO.java @@ -0,0 +1,133 @@ + +package com.czg.market.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalDateTime; + +/** + * 限时折扣 实体类。 + * + * @author ww + * @since 2025-10-21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class MkLimitTimeDiscountDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 自增主键 + */ + private Long id; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * only-仅本店 all全部 /custom 指定 + */ + private String useShopType; + + /** + * 可用门店 + */ + private String useShops; + + /** + * 有效期开始时间 + */ + private String validStartTime; + + /** + * 有效期结束时间 + */ + private String validEndTime; + + /** + * 可用周期,示例:周一,周二,周三,周四,周五,周六,周日 + */ + private String useDays; + + /** + * 可用时间段类型:all-全时段,custom-指定时段 + */ + private String useTimeType; + + /** + * 可用开始时间 + */ + private Time useStartTime; + + /** + * 可用结束时间 + */ + private Time useEndTime; + + /** + * 可使用类型:堂食 dine-in 外带 take-out 外卖 take-away 配送 post + * 示例 dine-in,take-out,take-away,post + */ + private String useType; + + /** + * 折扣% 范围1-99 + */ + private Integer discountRate; + + /** + * 数字越小级别越高 + */ + private Integer sort; + + /** + * 折扣优先级 limit-time/vip-price + */ + private String discountPriority; + + /** + * 参与商品 1全部 2部分 + */ + private Integer foodType; + + /** + * 参与商品 + */ + private String foods; + + /** + * 状态:1未开始,2进行中,3已结束 -1当前时间不可用 + */ + 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; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkLimitTimeDiscount.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkLimitTimeDiscount.java new file mode 100644 index 00000000..27ec3a7a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkLimitTimeDiscount.java @@ -0,0 +1,142 @@ +package com.czg.market.entity; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 限时折扣 实体类。 + * + * @author ww + * @since 2025-10-21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_limit_time_discount") +public class MkLimitTimeDiscount implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 自增主键 + */ + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * only-仅本店 all全部 /custom 指定 + */ + private String useShopType; + + /** + * 可用门店 + */ + private String useShops; + + /** + * 有效期开始时间 + */ + @JSONField(format = "yyyy-MM-dd") + private LocalDate validStartTime; + + /** + * 有效期结束时间 + */ + @JSONField(format = "yyyy-MM-dd") + private LocalDate validEndTime; + + /** + * 可用周期,如:周一,周二,周三,周四,周五,周六,周日 + */ + private String useDays; + + /** + * 可用时间段类型:all-全时段,custom-指定时段 + */ + private String useTimeType; + + /** + * 可用开始时间 + */ + @JSONField(format = "HH:mm") + private LocalTime useStartTime; + + /** + * 可用结束时间 + */ + @JSONField(format = "HH:mm") + private LocalTime useEndTime; + + /** + * 可使用类型:堂食 dine-in 外带 take-out 外卖 take-away 配送 post + */ + private String useType; + + /** + * 折扣% 范围1-99 + */ + private Integer discountRate; + + /** + * 数字越小级别越高 + */ + private Integer sort; + + /** + * 折扣优先级 limit-time/vip-price + */ + private String discountPriority; + + /** + * 参与商品 1全部 2部分 + */ + private Integer foodType; + + /** + * 参与商品 + */ + private String foods; + + /** + * 状态:1未开始,2进行中,3已结束 -1当前时间不可用 + */ + 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/service/MkLimitTimeDiscountService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkLimitTimeDiscountService.java new file mode 100644 index 00000000..bd4328c8 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkLimitTimeDiscountService.java @@ -0,0 +1,25 @@ +package com.czg.market.service; + +import com.czg.TimeQueryParam; +import com.czg.market.dto.MkLimitTimeDiscountDTO; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkLimitTimeDiscount; + +/** + * 限时折扣 服务层。 + * + * @author ww + * @since 2025-10-21 + */ +public interface MkLimitTimeDiscountService extends IService { + Page getLimitTimeDiscountPage(TimeQueryParam param, Long shopId); + + MkLimitTimeDiscount getLimitTimeDiscountByShopId(Long shopId); + + void addLimitTimeDiscount(MkLimitTimeDiscountDTO param); + + void updateLimitTimeDiscountById(MkLimitTimeDiscountDTO param); + + void deleteLimitTimeDiscount(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 index 65d46fa6..51cefa1f 100644 --- 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 @@ -11,5 +11,12 @@ import com.czg.market.entity.MkDiscountActivity; */ public interface MkDiscountActivityMapper extends BaseMapper { - MkDiscountActivity selectOneByShopId(Long shopId); + /** + * 根据店铺ID查询限时折扣 + * + * @param shopId 店铺ID + * @param useDay 使用日期 周几 + * @return 限时折扣 + */ + MkDiscountActivity selectOneByShopId(Long shopId, String useDay); } diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkLimitTimeDiscountMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkLimitTimeDiscountMapper.java new file mode 100644 index 00000000..f4a9ccdb --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkLimitTimeDiscountMapper.java @@ -0,0 +1,21 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkLimitTimeDiscount; + +/** + * 限时折扣 映射层。 + * + * @author ww + * @since 2025-10-21 + */ +public interface MkLimitTimeDiscountMapper extends BaseMapper { + /** + * 根据店铺ID查询限时折扣 + * + * @param shopId 店铺ID + * @param useDay 使用日期 周几 + * @return 限时折扣 + */ + MkLimitTimeDiscount selectOneByShopId(Long mainShopId, Long shopId, String useDay); +} 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 index ecf6cfa7..a8db9512 100644 --- 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 @@ -2,7 +2,6 @@ package com.czg.service.market.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; import com.czg.TimeQueryParam; import com.czg.account.entity.ShopInfo; import com.czg.account.service.ShopInfoService; @@ -23,15 +22,10 @@ import jakarta.annotation.Resource; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import java.time.format.TextStyle; -import java.util.Date; -import java.util.Locale; /** * 商家满减活动表 服务层实现。 @@ -93,13 +87,10 @@ public class MkDiscountActivityServiceImpl extends ServiceImpl implements MkLimitTimeDiscountService { + + @DubboReference + private ShopInfoService shopInfoService; + + @Override + public Page getLimitTimeDiscountPage(TimeQueryParam param, Long shopId) { + Long mainShopId = shopInfoService.getMainIdByShopId(shopId); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq(MkLimitTimeDiscount::getShopId, mainShopId) + .eq(MkLimitTimeDiscount::getIsDel, 0) + .lt(MkLimitTimeDiscount::getValidStartTime, CzgStrUtils.getStrOrNull(param.getStartTime())) + .le(MkLimitTimeDiscount::getValidEndTime, CzgStrUtils.getStrOrNull(param.getEndTime())) + .orderBy(MkLimitTimeDiscount::getSort).desc() + .orderBy(MkLimitTimeDiscount::getUpdateTime).desc(); + return pageAs(PageUtil.buildPage(), queryWrapper, MkLimitTimeDiscountDTO.class); + } + + + @Override + public MkLimitTimeDiscount getLimitTimeDiscountByShopId(Long shopId) { + ShopInfo shopInfo = shopInfoService.getById(shopId); + AssertUtil.isNull(shopInfo, "店铺不存在"); + if (shopInfo.getIsEnableDiscount() == null || shopInfo.getIsEnableDiscount() == 0) { + return null; + } + Long mainShopId = shopInfoService.getMainIdByShopId(shopId); + return mapper.selectOneByShopId(mainShopId, shopId, CzgStrUtils.getStrWeek()); + } + + @Override + public void addLimitTimeDiscount(MkLimitTimeDiscountDTO param) { +// validateAndInitStatus(param); +// if ("only".equals(param.getUseShopType())) { +// param.setUseShops(param.getShopId().toString()); +// } else if ("custom".equals(param.getUseShopType())) { +// AssertUtil.isBlank(param.getUseShops(), "请配置可用门店"); +// } +// +// if(param.getFoodType() == 2){ +// AssertUtil.isBlank(param.getFoods(), "请配置参与商品"); +// } +// if(param.getFoodType() == 2){ +// AssertUtil.isBlank(param.getFoods(), "请配置参与商品"); +// } +// MkLimitTimeDiscount activity = BeanUtil.toBean(param, MkLimitTimeDiscount.class); +// save(activity); + } + + @Override + public void updateLimitTimeDiscountById(MkLimitTimeDiscountDTO param) { +// if (CollUtil.isEmpty(param.getThresholds())) { +// throw new IllegalArgumentException("活动必须配置满减阈值"); +// } +// validateAndInitStatus(param); +// 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 deleteLimitTimeDiscount(Long id) { + + } + + + /** + * 校验时间有效性并初始化状态 + */ + private void validateAndInitStatus(MkLimitTimeDiscountDTO param) { + LocalDate startDate; + LocalDate endDate; + LocalDate currentDate = LocalDate.now(); + + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + startDate = LocalDate.parse(param.getValidStartTime(), formatter); + endDate = LocalDate.parse(param.getValidEndTime(), formatter); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("时间格式不正确,请使用yyyy-MM-dd格式"); + } + // 校验开始时间不能晚于结束时间 + if (currentDate.isAfter(endDate)) { + throw new CzgException("有效期结束时间不能早于当前时间"); + } + // 校验开始时间不能晚于结束时间 + if (startDate.isAfter(endDate)) { + throw new CzgException("有效期开始时间不能晚于结束时间"); + } + + // 根据时间初始化状态 + if (currentDate.isBefore(startDate)) { + // 当前日期在开始日期之前-未开始 + param.setStatus(1); + } else { + // 这里先默认设置为进行中,具体由定时任务根据时段更新 + param.setStatus(2); + } + } +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml index 9b3c06e3..bae252c2 100644 --- a/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml +++ b/cash-service/market-service/src/main/resources/mapper/MkDiscountActivityMapper.xml @@ -9,8 +9,11 @@ FROM mk_discount_activity WHERE shop_id = #{shopId} AND is_del = 0 + AND status = 2 AND NOW() BETWEEN valid_start_time AND valid_end_time - AND (use_time_type = 'all' OR (use_time_type = 'custom' AND TIME(NOW()) BETWEEN use_start_time AND use_end_time)) + AND (use_time_type = 'all' OR + (use_time_type = 'custom' AND TIME(NOW()) BETWEEN use_start_time AND use_end_time)) + AND use_days LIKE CONCAT('%', #{useDay}, '%') ORDER BY sort DESC, update_time DESC, create_time DESC diff --git a/cash-service/market-service/src/main/resources/mapper/MkLimitTimeDiscountMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkLimitTimeDiscountMapper.xml new file mode 100644 index 00000000..f128bfe6 --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkLimitTimeDiscountMapper.xml @@ -0,0 +1,27 @@ + + + + + +