@@ -20,6 +20,7 @@ from kol.models import KOLInfo |
||
20 | 20 |
from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, liveGoodsInfo |
21 | 21 |
from pay.models import OrderInfo |
22 | 22 |
from utils.error.errno_utils import AdministratorStatusCode, OrderStatusCode |
23 |
+from utils.redis.rinventory import set_inventory |
|
23 | 24 |
|
24 | 25 |
|
25 | 26 |
logger = logging.getLogger('logit') |
@@ -502,6 +503,7 @@ def live_order_delivery(request): |
||
502 | 503 |
@logit(res=True) |
503 | 504 |
def fetch_wx_room_list(request): |
504 | 505 |
admin_id = request.POST.get('admin_id', '') |
506 |
+ |
|
505 | 507 |
try: |
506 | 508 |
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
507 | 509 |
except AdministratorInfo.DoesNotExist: |
@@ -513,14 +515,9 @@ def fetch_wx_room_list(request): |
||
513 | 515 |
secret = wxcfg.get('appsecret') |
514 | 516 |
token = access_token(appid, secret) |
515 | 517 |
|
516 |
- rooms = RoomInfo.objects.exclude(Q(live_status=101) | Q(live_status=102)) |
|
517 |
- start = 0 |
|
518 |
- if rooms.count() != 0: |
|
519 |
- start = int(rooms[0].room_id) - 1 |
|
520 |
- |
|
521 | 518 |
roominfos = requests.post(url=('http://api.weixin.qq.com/wxa/business/getliveinfo?access_token=' + token), json={'start': 0, 'limit': 99}) |
522 |
- |
|
523 | 519 |
roominfos = json.loads(roominfos.text).get('room_info', {}) |
520 |
+ |
|
524 | 521 |
for roominfo in roominfos: |
525 | 522 |
anchor, _ = AnchorInfo.objects.get_or_create( |
526 | 523 |
anchor_name=roominfo.get('anchor_name') |
@@ -588,6 +585,8 @@ def room_goods_add(request): |
||
588 | 585 |
room_goods.inventory = goods.get('inventory', 0) |
589 | 586 |
room_goods.save() |
590 | 587 |
|
588 |
+ set_inventory(room_goods.pk, room_goods.inventory) |
|
589 |
+ |
|
591 | 590 |
return response(200, 'Room Goods Add Success', u'直播间商品库添加成功') |
592 | 591 |
|
593 | 592 |
|
@@ -1,6 +1,7 @@ |
||
1 | 1 |
from django.contrib import admin |
2 | 2 |
|
3 | 3 |
from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, RoomUserInfo, liveGoodsInfo |
4 |
+from utils.redis.rinventory import set_inventory |
|
4 | 5 |
|
5 | 6 |
|
6 | 7 |
class AnchorInfoAdmin(admin.ModelAdmin): |
@@ -18,6 +19,10 @@ class liveGoodsInfoAdmin(admin.ModelAdmin): |
||
18 | 19 |
class RoomGoodsInfoAdmin(admin.ModelAdmin): |
19 | 20 |
list_display = ('room_id', 'anchor_id', 'goods_id', 'inventory', 'sale_infos', 'status', 'created_at', 'updated_at') |
20 | 21 |
|
22 |
+ def save_model(self, request, obj, form, change): |
|
23 |
+ set_inventory(obj.pk, obj.inventory) |
|
24 |
+ obj.save() |
|
25 |
+ |
|
21 | 26 |
|
22 | 27 |
class RoomOrderInfoAdmin(admin.ModelAdmin): |
23 | 28 |
list_display = ('order_id', 'anchor_id', 'room_id', 'goods_id', 'share_openid', 'user_id', 'total_fee', 'name', 'phone', 'address', 'tracking_number', 'pay_status', 'status', 'created_at', 'updated_at') |
@@ -6,6 +6,7 @@ from shortuuidfield import ShortUUIDField |
||
6 | 6 |
from TimeConvert import TimeConvert as tc |
7 | 7 |
|
8 | 8 |
from simditor.fields import RichTextField |
9 |
+from utils.redis.rinventory import get_inventory |
|
9 | 10 |
|
10 | 11 |
|
11 | 12 |
class AnchorInfo(BaseModelMixin): |
@@ -223,7 +224,7 @@ class RoomGoodsInfo(BaseModelMixin): |
||
223 | 224 |
'price_type': goods.price_type, |
224 | 225 |
'price': goods.price, |
225 | 226 |
'price2': goods.price2, |
226 |
- 'inventory': self.inventory, |
|
227 |
+ 'inventory': get_inventory(self.pk) or self.inventory, |
|
227 | 228 |
'goods_status': self.goods_status, |
228 | 229 |
'sale_count': len(self.sale_infos), |
229 | 230 |
} |
@@ -13,6 +13,7 @@ from TimeConvert import TimeConvert as tc |
||
13 | 13 |
from account.models import UserInfo |
14 | 14 |
from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, liveGoodsInfo |
15 | 15 |
from utils.error.errno_utils import OrderStatusCode, UserStatusCode |
16 |
+from utils.redis.rinventory import decr_inventory, incr_inventory |
|
16 | 17 |
|
17 | 18 |
|
18 | 19 |
WECHAT = settings.WECHAT |
@@ -140,7 +141,10 @@ def live_order_create(request): |
||
140 | 141 |
return response(400001, 'Room Goods Not Found', description='直播间商品不存在') |
141 | 142 |
|
142 | 143 |
# 库存校验 |
143 |
- if room_goods_info.inventory <= 0: |
|
144 |
+ # if room_goods_info.inventory <= 0: |
|
145 |
+ # return response(400001, 'Room Goods Not En', description='商品库存不足') |
|
146 |
+ inventory = decr_inventory(room_goods_info.pk) |
|
147 |
+ if inventory < 0: |
|
144 | 148 |
return response(400001, 'Room Goods Not En', description='商品库存不足') |
145 | 149 |
|
146 | 150 |
# 金额校验 |
@@ -153,8 +157,8 @@ def live_order_create(request): |
||
153 | 157 |
return response(404091, 'FEE Check Fail', description='金额校验失败') |
154 | 158 |
|
155 | 159 |
# 消库存 |
156 |
- room_goods_info.inventory -= 1 |
|
157 |
- room_goods_info.save() |
|
160 |
+ # room_goods_info.inventory -= 1 |
|
161 |
+ # room_goods_info.save() |
|
158 | 162 |
|
159 | 163 |
# JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里 |
160 | 164 |
trade_type = 'JSAPI' |
@@ -230,8 +234,9 @@ def live_order_cancel(request): |
||
230 | 234 |
except RoomGoodsInfo.DoesNotExist: |
231 | 235 |
return response(400001, 'Room Goods Not Found', description='直播间商品不存在') |
232 | 236 |
|
233 |
- goods_info.inventory += order.amount |
|
234 |
- goods_info.save() |
|
237 |
+ # goods_info.inventory += order.amount |
|
238 |
+ # goods_info.save() |
|
239 |
+ incr_inventory(goods_info.pk, order.amount) |
|
235 | 240 |
|
236 | 241 |
return response(200, 'Order Cancel Success', '订单取消成功') |
237 | 242 |
|
@@ -265,8 +270,9 @@ def order_paid_fail(order): |
||
265 | 270 |
except RoomGoodsInfo.DoesNotExist: |
266 | 271 |
return |
267 | 272 |
|
268 |
- goods_info.inventory += order.amount |
|
269 |
- goods_info.save() |
|
273 |
+ # goods_info.inventory += order.amount |
|
274 |
+ # goods_info.save() |
|
275 |
+ incr_inventory(goods_info.pk, order.amount) |
|
270 | 276 |
|
271 | 277 |
|
272 | 278 |
@logit |
@@ -0,0 +1,24 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from utils.redis.connect import r |
|
4 |
+from utils.redis.rkeys import ROOM_GOODS_INVENTORY |
|
5 |
+ |
|
6 |
+ |
|
7 |
+def set_inventory(rgid, inventory): |
|
8 |
+ r.set(ROOM_GOODS_INVENTORY % rgid, inventory) |
|
9 |
+ |
|
10 |
+ |
|
11 |
+def __get_inventory(rgid): |
|
12 |
+ return r.getint(ROOM_GOODS_INVENTORY % rgid) |
|
13 |
+ |
|
14 |
+ |
|
15 |
+def get_inventory(rgid): |
|
16 |
+ return max(__get_inventory(rgid), 0) |
|
17 |
+ |
|
18 |
+ |
|
19 |
+def incr_inventory(rgid, num): |
|
20 |
+ r.incr(ROOM_GOODS_INVENTORY % rgid, num) |
|
21 |
+ |
|
22 |
+ |
|
23 |
+def decr_inventory(rgid, num): |
|
24 |
+ r.decr(ROOM_GOODS_INVENTORY % rgid, num) |
@@ -1 +1,3 @@ |
||
1 | 1 |
# -*- coding: utf-8 -*- |
2 |
+ |
|
3 |
+ROOM_GOODS_INVENTORY = 'room:goods:inventory:%s' |