库存,优惠券处理机制

Posted jiqing9006

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了库存,优惠券处理机制相关的知识,希望对你有一定的参考价值。

创建订单的时候,扣库存,扣优惠券。
订单取消的时候,回滚库存,回滚优惠券。
这种方式,能够避免多使用,多卖出。(支付完成时,扣库存,容易多卖)

/**
 * 回滚优惠券
 */
public function rollbackCoupon($user_coupon_id) {
    // 判断是否过期
    $user_coupon = M(‘user_coupon‘);
    $user_coupon_info = $user_coupon->where([‘id‘=>$user_coupon_id,‘status‘=>2])->find();
    if (!$user_coupon_info) {
        // 不存在
        return true;
    }

    if ($user_coupon_info[‘valid_time‘] < time()) {
        // 已过期
        return true;
    }

    // 设为未使用
    return $user_coupon->where([‘id‘=>$user_coupon_id])->save([‘status‘=>1]);
}

/**
 * 回滚订单商品库存
 */
public function rollbackStock($order_id) {
    $product_order_item = M(‘product_order_item‘);
    $product_order_item_list = $product_order_item->where([‘order_id‘=>$order_id])->select();
    M()->startTrans();
    $product = M(‘product‘);
    $product_spec = M(‘product_spec‘);
    foreach($product_order_item_list as $k => $v) {
        if ($v[‘product_spec_id‘]) { // 有规格
            $flag = $product_spec->where([‘id‘=>$v[‘product_spec_id‘]])->setInc(‘stock‘,$v[‘num‘]);
            if ($flag === false) {
                M()->rollback();
                return false;
            }
        } else { // 无规格
            $flag = $product->where([‘id‘=>$v[‘product_id‘]])->setInc(‘stock‘,$v[‘num‘]);
            if ($flag === false) {
                M()->rollback();
                return false;
            }
        }
    }
    M()->commit();
    return true;
}

以上是关于库存,优惠券处理机制的主要内容,如果未能解决你的问题,请参考以下文章

Java高并发处理优惠券防超卖接口!

Mysql的锁机制与PHP文件锁处理高并发简单思路

Mysql的锁机制与PHP文件锁处理高并发简单思路

Mysql的锁机制与PHP文件锁处理高并发简单思路

并发下编写SQL的注意事项

异常和TCP通讯