预订单任务表 方法编写

This commit is contained in:
Jack 2025-10-23 16:09:36 +08:00
parent 0b738e1b05
commit 675d210956
3 changed files with 118 additions and 17 deletions

View File

@ -15,8 +15,18 @@ import com.suisung.mall.core.web.service.IBaseService;
public interface ShopOrderBookingService extends IBaseService<ShopOrderBooking> {
/**
* 添加预约订单任务
*
* @param orderId 订单ID
* @param bookingAt 预约时间
* @return 是否添加成功
*/
Boolean setupRedisBookingTask(String orderId, Long bookingAt);
/**
* 添加或更新预约订单任务
*
* @param shopOrderBooking 预约订单任务信息
* @return 操作后的预约订单任务实例
*/
@ -24,7 +34,8 @@ public interface ShopOrderBookingService extends IBaseService<ShopOrderBooking>
/**
* 查询有效的预约订单任务分页列表按预约时间升序排序
* @param pageNum 页码
*
* @param pageNum 页码
* @param pageSize 页大小
* @return 分页结果
*/
@ -32,6 +43,7 @@ public interface ShopOrderBookingService extends IBaseService<ShopOrderBooking>
/**
* 更新预约订单任务
*
* @param updateWrapper 更新条件包装器
* @return 是否更新成功
*/

View File

@ -97,7 +97,6 @@ import com.suisung.mall.shop.product.pojo.vo.FixOrderVo;
import com.suisung.mall.shop.product.service.*;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.service.*;
import com.suisung.mall.shop.sync.service.SyncThirdDataService;
import com.suisung.mall.shop.user.service.*;
import com.suisung.mall.shop.wechat.service.WxOrderShippingService;
import io.seata.common.util.StringUtils;
@ -383,7 +382,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
@Lazy
@Autowired
private SyncThirdDataService syncThirdDataService;
private ShopOrderBookingService shopOrderBookingService;
@Autowired
private ThreadPoolExecutor executor;
@ -6641,6 +6640,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
info_row.setBooking_at(bookingBeginTime.getTime() / 1000); // 预订单到达时间戳
info_row.setBooking_begin_time(bookingBeginTime);
info_row.setBooking_end_time(bookingEndTime);
// 重要预约订单任务创建处理
shopOrderBookingService.setupRedisBookingTask(info_row.getOrder_id(), info_row.getBooking_at());
}
info_row.setActivity_json(JSONUtil.toJsonStr(store_item.get("discount_detail_rows")));

View File

@ -8,21 +8,83 @@
package com.suisung.mall.shop.order.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.modules.order.ShopOrderBooking;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.order.mapper.ShopOrderBookingMapper;
import com.suisung.mall.shop.order.service.ShopOrderBookingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class ShopOrderBookingServiceImpl extends BaseServiceImpl<ShopOrderBookingMapper, ShopOrderBooking> implements ShopOrderBookingService {
private static final Long MINUTES_BEFORE_BOOKING = 35L;
@Autowired
private RedisService redisService;
/**
* 添加预约订单任务
*
* @param orderId 订单ID
* @param bookingAt 预约时间
* @return 是否添加成功
*/
@Override
public Boolean setupRedisBookingTask(String orderId, Long bookingAt) {
log.debug("设置预约订单任务: orderId={}, bookingAt={}", orderId, bookingAt);
// 参数校验
if (StringUtils.isEmpty(orderId) || CheckUtil.isEmpty(bookingAt)) {
log.warn("参数无效: orderId={}, bookingAt={}", orderId, bookingAt);
return false;
}
try {
// 计算执行时间预约时间前35分钟
long runAt = bookingAt - TimeUnit.MINUTES.toSeconds(MINUTES_BEFORE_BOOKING);
ShopOrderBooking shopOrderBooking = new ShopOrderBooking();
shopOrderBooking.setOrder_id(orderId);
shopOrderBooking.setBooking_at(bookingAt);
shopOrderBooking.setRun_at(runAt);
shopOrderBooking.setStatus(CommonConstant.Enable);
shopOrderBooking = addOrUpdate(shopOrderBooking);
// 如果保存成功设置Redis过期键
if (shopOrderBooking != null) {
String redisKey = "booking::" + orderId;
// 设置过期时间为runAt时间点相对于当前时间的秒数
if (runAt > 0) {
redisService.set(redisKey, String.valueOf(runAt), runAt);
log.debug("Redis键设置成功: key={}, bookingAt={}, runAt={}", redisKey, bookingAt, runAt);
} else {
log.warn("过期时间无效未设置Redis键: key={}, bookingAt={}, runAt={}", redisKey, bookingAt, runAt);
}
return true;
} else {
log.error("保存预约订单任务失败: orderId={}, bookingAt={}", orderId, bookingAt);
return false;
}
} catch (Exception e) {
log.error("设置预约订单任务时发生异常: orderId={}, bookingAt={}", orderId, bookingAt, e);
return false;
}
}
@Override
public ShopOrderBooking addOrUpdate(ShopOrderBooking shopOrderBooking) {
log.debug("添加或更新预约订单任务: {}", shopOrderBooking);
@ -31,21 +93,46 @@ public class ShopOrderBookingServiceImpl extends BaseServiceImpl<ShopOrderBookin
return null;
}
if (shopOrderBooking.getId() != null && shopOrderBooking.getId() > 0) {
// 更新操作
log.debug("执行更新操作ID: {}", shopOrderBooking.getId());
this.updateById(shopOrderBooking);
return shopOrderBooking;
} else {
// 添加操作
log.debug("执行添加操作");
boolean saved = this.save(shopOrderBooking);
if (saved) {
return shopOrderBooking;
} else {
log.error("保存预约订单任务失败: {}", shopOrderBooking);
return null;
// 参数校验order_id booking_at 是必须项目
if (StrUtil.isBlank(shopOrderBooking.getOrder_id()) || CheckUtil.isEmpty(shopOrderBooking.getBooking_at())) {
log.warn("缺少必要参数: order_id 或 booking_at");
return null;
}
try {
if (CheckUtil.isEmpty(shopOrderBooking.getRun_at())) {
long runAt = shopOrderBooking.getBooking_at() - TimeUnit.MINUTES.toSeconds(MINUTES_BEFORE_BOOKING);
shopOrderBooking.setRun_at(runAt);
}
// 如果 id 有值直接更新
if (CheckUtil.isNotEmpty(shopOrderBooking.getId())) {
log.debug("根据ID直接更新记录: {}", shopOrderBooking.getId());
boolean updated = this.updateById(shopOrderBooking);
return updated ? shopOrderBooking : null;
}
// 如果 order_id 有值先查询记录是否存在
QueryWrapper<ShopOrderBooking> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", shopOrderBooking.getOrder_id()).eq("status", CommonConstant.Enable);
ShopOrderBooking existingBooking = this.getOne(queryWrapper);
if (existingBooking != null) {
// 存在则更新
shopOrderBooking.setId(existingBooking.getId());
log.debug("更新已存在的记录ID: {}", shopOrderBooking.getId());
boolean updated = this.updateById(shopOrderBooking);
return updated ? shopOrderBooking : null;
} else {
// 不存在则保存
log.debug("保存新记录");
boolean saved = this.save(shopOrderBooking);
return saved ? shopOrderBooking : null;
}
} catch (Exception e) {
log.error("添加或更新预约订单任务时发生异常: orderId={}, bookingAt={}",
shopOrderBooking.getOrder_id(), shopOrderBooking.getBooking_at(), e);
return null;
}
}