1. 需求分析
订单创建后,需要在一定时间内完成支付,否则自动取消。
支持多用户同时下单。
2. 系统设计
2.1 数据库设计
表名 | 字段名 | 类型 | 描述 |
orders | id | int | 订单ID |
orders | user_id | int | 用户ID |
orders | create_time | datetime | 订单创建时间 |
orders | pay_time | datetime | 订单支付时间(如果未支付则为null) |
orders | status | int | 订单状态:0待支付,1已支付,2已取消 |
users | id | int | 用户ID |
users | username | varchar | 用户名 |
users | password | varchar | 密码 |
2.2 业务逻辑
1、当用户下单时,将订单插入到orders
表中,并设置订单状态为待支付。
2、定时任务检查所有未支付的订单,如果超过设定的超时时间(例如30分钟),则将订单状态设置为已取消。
3. 代码实现
3.1 实体类
public class Order { private int id; private int userId; private Date createTime; private Date payTime; private int status; // getter和setter方法省略 } public class User { private int id; private String username; private String password; // getter和setter方法省略 }
3.2 订单服务接口
public interface OrderService { void createOrder(int userId); void cancelTimeoutOrders(); }
3.3 订单服务实现
@Service public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Override public void createOrder(int userId) { Order order = new Order(); order.setUserId(userId); order.setStatus(0); orderMapper.insert(order); } @Override public void cancelTimeoutOrders() { Date now = new Date(); int timeoutMinutes = 30; Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, timeoutMinutes); Date thresholdTime = calendar.getTime(); List<Order> orders = orderMapper.selectByStatusAndCreateTimeLessThan(0, thresholdTime); for (Order order : orders) { order.setStatus(2); orderMapper.updateByPrimaryKey(order); } } }
3.4 定时任务配置
在Spring Boot项目中,可以使用@Scheduled
注解来配置定时任务。
@Configuration public class AppConfig { @Bean public TaskScheduler taskScheduler() { return new ConcurrentTaskScheduler(); } }
@Component public class OrderCancelTask { @Autowired private OrderService orderService; @Scheduled(fixedRate = 60000) // 每60秒执行一次 public void cancelTimeoutOrders() { orderService.cancelTimeoutOrders(); } }
这样,每隔一段时间,订单超时自动取消的功能就实现了。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/643564.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复