Rails 关于订单失效

hxh1246996371 · 2015年06月16日 · 最后由 zhujg 回复于 2015年06月18日 · 4260 次阅读

我们做了一个商城项目,如果会员下了一个订单后需要在 24 小时内支付,否则失效。该如何来设计这个逻辑呢? 我现在能想到的就是给每个订单加上过期时间,然后写个定时任务 每分钟去检查每个订单的过期时间和当前时间做对比,然后更新订单状态。 还有没有更好的方法呢?不知道淘宝之类的是怎么做的

判断创建时间。

如果是用支付宝接口的话还要指定过期时间的参数。

#1 楼 @rei 是需要用定时任务每分钟去判断是否过期吗

#3 楼 @hxh1246996371 需要判断时判断。

失效后不需要做什么其他数据更新,在用户点显示订单时,判断当前时间和订单 created at 的差就可以了。 要失效时更新商品的,比如库存加一,那就永定时任务扫描。

r#3 楼 @hxh1246996371 读取的时候判断吧,如果判断的逻辑很复杂,就加个‘是否有效’的属性保存下来。

#5 楼 @marksloan 你们是采用的下单即更新库存的方式?如果是一定要这么做的话,可以考虑用 sidekiq,然后设定 24 小时后检查这张订单。如果是在失效时间内已经支付,可以同时从定时队列中移除这个任务。

首先定义一个“苦逼”的 worker 来干活:

# app/workers/order_expiration_checker.rb
class OrderExpirationChecker
  include Sidekiq::Worker
  def perform(id)
    order = Order.find id
    do_some_stuff if order.unpaid? && order.expired?  # 订单未支付,并且已经超过有效期
  end
end

然后在每次下单时,自动将订单加入定时任务,24h 后执行检查:

# app/models/order.rb
class Order < ActiveRecord::Base
  after_create :check_expiration

  def expired?
    created_at + 24.hours < Time.now
  end

  private
  def check_expiration
    OrderExpirationChecker.perform_in(24.hours, id)
  end
end

#5 楼 @marksloan 库存可以用查询的方式,库存 = 真实库存 - 未过期的打开订单。

#5 楼 @marksloan +1 如果失效需要更新其他数据,那么使用定时任务。 库存计算使用 四柱结算法 当前库存 = 上期库存 + 本次入库数量 - 本次出库数量

#7 楼 @martin91 正解~~

如果不把订单设置一个过期标识,存在两个问题。

  1. 其他依赖是否过期这个条件的查询更复杂
  2. 无法触发过期这个事件

之前有过一个类似的需求:http://hooopo.iteye.com/blog/757760

#10 楼 @ery 四柱结算法是什么

#12 楼 @hooopo 一种 计算余额的方法(会计常用)有百年历史了。可以用来统计实时库存,

http://baike.baidu.com/link?url=U8Cq5QEm9HqviT2lUCXeM9zl7KS9Zx-8QHeHJNaQCpN7hnG11C5PqAToiG2cHitKSNkLTZ-cii7FMOiqRTr2Ta#3

库存,资金余额,都可以采用这种方法计算。 就是,一个表,有四个字段。上期余额,当前余额,本期增加额,本期减少额。(把本期增减合成一个字段也可以) 每次出库,入库,该表就增加一条记录。 当需要查询余额的时候,去查该表的最后一条记录的当前余额,即可!

#13 楼 @ery (sku_id, last_stock, current_stock, incr_stock, decr_stock) 这样吗

和普通做法 (sku_id, current_stock) 这样存储比有什么优点呢?

#14 楼 @hooopo 方便查看历史记录,跟踪库存变化

#15 楼 @ery 嗯嗯,能够理解了, @hooopo 的方案再加个 auditing 就跟你的实际上是一样了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号