预订单任务表 方法编写
This commit is contained in:
parent
0b738e1b05
commit
675d210956
@ -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,6 +34,7 @@ public interface ShopOrderBookingService extends IBaseService<ShopOrderBooking>
|
||||
|
||||
/**
|
||||
* 查询有效的预约订单任务分页列表(按预约时间升序排序)
|
||||
*
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 页大小
|
||||
* @return 分页结果
|
||||
@ -32,6 +43,7 @@ public interface ShopOrderBookingService extends IBaseService<ShopOrderBooking>
|
||||
|
||||
/**
|
||||
* 更新预约订单任务
|
||||
*
|
||||
* @param updateWrapper 更新条件包装器
|
||||
* @return 是否更新成功
|
||||
*/
|
||||
|
||||
@ -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")));
|
||||
|
||||
@ -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);
|
||||
// 参数校验: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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user