限时折扣 用户端接口

This commit is contained in:
2025-10-21 15:43:18 +08:00
parent 02cbb27eac
commit a2cd91bf75
10 changed files with 531 additions and 12 deletions

View File

@@ -11,5 +11,12 @@ import com.czg.market.entity.MkDiscountActivity;
*/
public interface MkDiscountActivityMapper extends BaseMapper<MkDiscountActivity> {
MkDiscountActivity selectOneByShopId(Long shopId);
/**
* 根据店铺ID查询限时折扣
*
* @param shopId 店铺ID
* @param useDay 使用日期 周几
* @return 限时折扣
*/
MkDiscountActivity selectOneByShopId(Long shopId, String useDay);
}

View File

@@ -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<MkLimitTimeDiscount> {
/**
* 根据店铺ID查询限时折扣
*
* @param shopId 店铺ID
* @param useDay 使用日期 周几
* @return 限时折扣
*/
MkLimitTimeDiscount selectOneByShopId(Long mainShopId, Long shopId, String useDay);
}

View File

@@ -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<MkDiscountActivit
if (shopInfo.getIsEnableDiscount() == null || shopInfo.getIsEnableDiscount() == 0) {
return null;
}
MkDiscountActivity activity = mapper.selectOneByShopId(shopId);
MkDiscountActivity activity = mapper.selectOneByShopId(shopId,CzgStrUtils.getStrWeek());
if (activity == null) {
return null;
}
if (!activity.getUseDays().contains(CzgStrUtils.getStrWeek())) {
return null;
}
MkDiscountActivityDTO activityDTO = BeanUtil.toBean(activity, MkDiscountActivityDTO.class);
activityDTO.setThresholds(thresholdMapper.selectListByQuery(
new QueryWrapper()

View File

@@ -0,0 +1,136 @@
package com.czg.service.market.service.impl;
import com.czg.TimeQueryParam;
import com.czg.account.entity.ShopInfo;
import com.czg.account.service.ShopInfoService;
import com.czg.exception.CzgException;
import com.czg.market.dto.MkLimitTimeDiscountDTO;
import com.czg.market.entity.MkLimitTimeDiscount;
import com.czg.market.service.MkLimitTimeDiscountService;
import com.czg.service.market.mapper.MkLimitTimeDiscountMapper;
import com.czg.utils.AssertUtil;
import com.czg.utils.CzgStrUtils;
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 org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
/**
* 限时折扣 服务层实现。
*
* @author ww
* @since 2025-10-21
*/
@Service
public class MkLimitTimeDiscountServiceImpl extends ServiceImpl<MkLimitTimeDiscountMapper, MkLimitTimeDiscount> implements MkLimitTimeDiscountService {
@DubboReference
private ShopInfoService shopInfoService;
@Override
public Page<MkLimitTimeDiscountDTO> 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);
}
}
}

View File

@@ -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

View File

@@ -0,0 +1,27 @@
<?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.MkLimitTimeDiscountMapper">
<select id="selectOneByShopId" resultType="com.czg.market.entity.MkLimitTimeDiscount">
SELECT *
FROM mk_limit_time_discount
WHERE shop_id = #{mainShopId}
AND (
(use_shop_type = 'all')
OR (use_shop_type = 'only' AND #{shopId} = shop_id)
OR (use_shop_type = 'custom' AND FIND_IN_SET(#{shopId}, use_shops) > 0)
)
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_days LIKE CONCAT('%', #{useDay}, '%')
ORDER BY sort,
update_time DESC,
create_time DESC
LIMIT 1;
</select>
</mapper>