import celery
import time
backend = "redis://127.0.0.1:6379/1"
broker = "redis://127.0.0.1:6379/2"
cel = celery.Celery("test",backend=backend,broker = broker)
import os,sys
import django
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #定位到你django的根目录
sys.path.append(os.path.abspath(BASE_DIR))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shopapi.settings")
django.setup()
from django.db import transaction
@cel.task
@transaction.atomic
def del_order(order_id):
#要通过数据库来查当前order_id的订单状态,如果没有支付,我们要操作库存,并且取消订单
from app01 import models
# 查询订单
data = models.Order.objects.filter(order_id = order_id,pay_status=0).first()
#如果data没有,表示以及支付成功,无需操作,反之要回滚库存
if data:
# 回滚哪些商品的库存,回滚多少?从哪里知道order_item中看
item_data = models.Order_items.objects.filter(order_id =order_id).values("product","nums")
# item_data-->[{'product':1,'nums":2},{product':2,'nums":1}]
all_product_dict = {k["product"] :k["nums"] for k in item_data}
#{1:2,2:2}
all_product_id = list(all_product_dict.keys())
all_product = models.Product.objects.filter(product_id__in = all_product_id)
#开启事务
sid = transaction.savepoint()
for product in all_product:
for i in range(3):
stock = product.stock.quantity
new_stock = stock + all_product_dict[product.product_id]
#用了乐观锁
res = models.Stock.objects.filter(quantity=stock,stock_id=product.stock.stock_id).update(quantity=new_stock)
if not res:
if i==2:
transaction.savepoint_rollback(sid)
from app01.func import function_tool
function_tool.pay_status(order_id,1)
return
else:
continue
else:
break
new_buy_cont = product.buy_count-all_product_dict[product.product_id]
models.Product.objects.filter(product_id = product.product_id).update(buy_count = new_buy_cont)
# 一定要判断pay_status,防止途中完成支付
row = models.Order.objects.filter(order_id = order_id,pay_status=0).update(status = "dead")
if row:
transaction.savepoint_commit(sid)
else:
transaction.savepoint_rollback(sid)
|