From 675d2109564ddde2819dd40f45284383d61874db Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 23 Oct 2025 16:09:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E8=AE=A2=E5=8D=95=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=A1=A8=20=E6=96=B9=E6=B3=95=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShopOrderBookingService.java | 14 ++- .../impl/ShopOrderBaseServiceImpl.java | 6 +- .../impl/ShopOrderBookingServiceImpl.java | 115 +++++++++++++++--- 3 files changed, 118 insertions(+), 17 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java index 39fdd889..31c87590 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java @@ -15,8 +15,18 @@ import com.suisung.mall.core.web.service.IBaseService; public interface ShopOrderBookingService extends IBaseService { + /** + * 添加预约订单任务 + * + * @param orderId 订单ID + * @param bookingAt 预约时间 + * @return 是否添加成功 + */ + Boolean setupRedisBookingTask(String orderId, Long bookingAt); + /** * 添加或更新预约订单任务 + * * @param shopOrderBooking 预约订单任务信息 * @return 操作后的预约订单任务实例 */ @@ -24,7 +34,8 @@ public interface ShopOrderBookingService extends IBaseService /** * 查询有效的预约订单任务分页列表(按预约时间升序排序) - * @param pageNum 页码 + * + * @param pageNum 页码 * @param pageSize 页大小 * @return 分页结果 */ @@ -32,6 +43,7 @@ public interface ShopOrderBookingService extends IBaseService /** * 更新预约订单任务 + * * @param updateWrapper 更新条件包装器 * @return 是否更新成功 */ diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 5b31bc61..14d1490c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -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 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 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 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; } }