def syncWareStockByJDShopTask(jd_ware): """ """ from shopback.items.models import Product, ProductSku, ItemNumTaskLog from shopback.trades.models import MergeOrder from shopback.users.models import User if not isinstance(jd_ware, JDProduct): jd_ware = JDProduct.objects.get(ware_id=jd_ware) if not jd_ware.sync_stock: return jd_user = User.objects.get(visitor_id=jd_ware.vender_id) user_percent = jd_user.stock_percent skus = jd_ware.skus and json.loads(jd_ware.skus) or [] sku_stock_list = [] for sku in skus: if sku['status'] != JDProduct.VALID or not sku.get('outer_id', None): continue outer_id, outer_sku_id = Product.objects.trancecode( '', sku['outer_id']) product = Product.objects.get(outer_id=outer_id) product_sku = ProductSku.objects.get(outer_id=outer_sku_id, product__outer_id=outer_id) if not (jd_user.sync_stock and product.sync_stock and product_sku.sync_stock): continue order_nums = 0 wait_nums = (product_sku.wait_post_num > 0 and product_sku.wait_post_num or 0) remain_nums = product_sku.remain_num or 0 real_num = product_sku.quantity sync_num = real_num - wait_nums - remain_nums # 如果自动更新库存状态开启,并且计算后库存不等于在线库存,则更新 if sync_num > 0 and user_percent > 0: sync_num = int(user_percent * sync_num) elif sync_num > 0 and sync_num <= product_sku.warn_num: total_num, user_order_num = MergeOrder.get_yesterday_orders_totalnum( jd_user.id, outer_id, outer_sku_id) if total_num > 0 and user_order_num > 0: sync_num = int( float(user_order_num) / float(total_num) * sync_num) else: sync_num = (real_num - wait_nums) > 10 and 2 or 0 elif sync_num > 0: product_sku.is_assign = False update_model_fields(product_sku, update_fields=['is_assign']) else: sync_num = 0 # #针对小小派,测试线上库存低量促销效果 # if product.outer_id == '3116BG7': # sync_num = product_sku.warn_num > 0 and min(sync_num,product_sku.warn_num+10) or min(sync_num,15) # if product_sku.is_assign: sync_num = 0 # 同步库存数不为0,或者没有库存警告,同步数量不等于线上库存,并且店铺,商品,规格同步状态正确 if (sync_num != sku['stock_num']): api.jd_sku_stock_update(outer_id=sku['outer_id'], quantity=sync_num, jd_user_id=jd_user.visitor_id) ItemNumTaskLog.objects.get_or_create( user_id=jd_user.user.id, outer_id=outer_id, sku_outer_id='jd%s' % outer_sku_id, num=sync_num, end_at=datetime.datetime.now())
def updateItemNum(user_id, num_iid): """ taobao_item_quantity_update response: {'iid': '21557036378', 'modified': '2012-12-26 12:51:16', 'num': 24, 'num_iid': 21557036378, 'skus': {'sku': ({'modified': <type 'str'>, 'quantity': <type 'int'>, 'sku_id': <type 'int'>}, {'modified': <type 'str'>, 'quantity': <type 'int'>, 'sku_id': <type 'int'>})}} """ item = Item.objects.get(num_iid=num_iid) user = item.user product = item.product if not product or not item.sync_stock: return user_percent = user.stock_percent p_outer_id = product.outer_id skus = json.loads(item.skus) if item.skus else None if skus: for sku in skus.get('sku', []): try: outer_sku_id = sku.get('outer_id', '') outer_id, outer_sku_id = Product.objects.trancecode(p_outer_id, outer_sku_id) if p_outer_id != outer_id or sku['status'] != pcfg.NORMAL or not outer_sku_id: continue product_sku = product.prod_skus.filter(outer_id=outer_sku_id).first() if not product_sku: continue order_nums = 0 wait_nums = max(product_sku.wait_post_num, 0) remain_nums = product_sku.remain_num or 0 real_num = product_sku.quantity sync_num = real_num - wait_nums - remain_nums # 如果自动更新库存状态开启,并且计算后库存不等于在线库存,则更新 if sync_num > 0 and user_percent > 0: sync_num = int(user_percent * sync_num) elif sync_num > 0 and sync_num <= product_sku.warn_num: total_num, user_order_num = MergeOrder.get_yesterday_orders_totalnum(item.user.id, outer_id, outer_sku_id) if total_num > 0 and user_order_num > 0: sync_num = int(float(user_order_num) / float(total_num) * sync_num) elif total_num == 0: item_count = Item.objects.filter(outer_id=outer_id, approve_status=pcfg.ONSALE_STATUS).count() or 1 sync_num = int(sync_num / item_count) or sync_num else: sync_num = (real_num - wait_nums) > 10 and 2 or 0 elif sync_num > 0: product_sku.is_assign = False else: sync_num = 0 # 当前同步库存值,与线上拍下未付款商品数,哪个大取哪个 sync_num = max(sync_num, sku.get('with_hold_quantity', 0)) # #针对小小派,测试线上库存低量促销效果 # if product.outer_id == '3116BG7': # sync_num = product_sku.warn_num > 0 and min(sync_num,product_sku.warn_num+10) or min(sync_num,15) # 同步库存数不为0,或者没有库存警告,同步数量不等于线上库存,并且店铺,商品,规格同步状态正确 if (not (sync_num == 0 and product_sku.is_assign) and sync_num != sku['quantity'] and user.sync_stock and product.sync_stock and product_sku.sync_stock): response = apis.taobao_item_quantity_update(num_iid=item.num_iid, quantity=sync_num, sku_id=sku['sku_id'], tb_user_id=user_id) item_dict = response['item_quantity_update_response']['item'] Item.objects.filter(num_iid=item_dict['num_iid']).update(modified=item_dict['modified'], num=sync_num) product_sku.save() ItemNumTaskLog.objects.get_or_create(user_id=user_id, outer_id=product.outer_id, sku_outer_id=outer_sku_id, num=sync_num, start_at=item.last_num_updated, end_at=datetime.datetime.now()) except Exception, exc: logger.error('sync sku num error!', exc_info=True)
def syncStockByWxShopTask(wx_product): from shopback.items.models import Product, ProductSku, ItemNumTaskLog from shopback.trades.models import MergeOrder from shopback.users.models import User if not isinstance(wx_product, WXProduct): wx_product = WXProduct.objects.get(product_id=wx_product) if not wx_product.sync_stock: return wx_api = WeiXinAPI() wx_openid = wx_api.getAccountId() wx_user = User.objects.get(visitor_id=wx_openid) user_percent = wx_user.stock_percent skus = wx_product.sku_list or [] for sku in skus: if not sku.get('product_code', None): continue try: outer_id, outer_sku_id = Product.objects.trancecode('', sku['product_code'], sku_code_prior=True) # 特卖商品暂不同步库存 if outer_id.startswith(('1', '8', '9')) and len(outer_id) >= 9: continue product = Product.objects.get(outer_id=outer_id) product_sku = ProductSku.objects.get(outer_id=outer_sku_id, product__outer_id=outer_id) except: continue if not (wx_user.sync_stock and product.sync_stock and product_sku.sync_stock): continue wait_nums = (product_sku.wait_post_num > 0 and product_sku.wait_post_num or 0) remain_nums = product_sku.remain_num or 0 real_num = product_sku.quantity sync_num = real_num - wait_nums - remain_nums # 如果自动更新库存状态开启,并且计算后库存不等于在线库存,则更新 if sync_num > 0 and user_percent > 0: sync_num = int(user_percent * sync_num) elif sync_num > 0 and sync_num <= product_sku.warn_num: total_num, user_order_num = MergeOrder.get_yesterday_orders_totalnum(wx_user.id, outer_id, outer_sku_id) if total_num > 0 and user_order_num > 0: sync_num = int(float(user_order_num) / float(total_num) * sync_num) else: sync_num = (real_num - wait_nums) > 10 and 2 or 0 elif sync_num > 0: product_sku.is_assign = False update_model_fields(product_sku, update_fields=['is_assign']) else: sync_num = 0 # #针对小小派,测试线上库存低量促销效果 # if product.outer_id == '3116BG7': # sync_num = product_sku.warn_num > 0 and min(sync_num,product_sku.warn_num+10) or min(sync_num,15) # if product_sku.is_assign: sync_num = 0 # 同步库存数不为0,或者没有库存警告,同步数量不等于线上库存,并且店铺,商品,规格同步状态正确 if (sync_num != sku['quantity']): vector_num = sync_num - sku['quantity'] if vector_num > 0: wx_api.addMerchantStock(wx_product.product_id, vector_num, sku_info=sku['sku_id']) else: wx_api.reduceMerchantStock(wx_product.product_id, abs(vector_num), sku_info=sku['sku_id']) ItemNumTaskLog.objects.get_or_create(user_id=wx_user.user.id, outer_id=outer_id, sku_outer_id='wx%s' % outer_sku_id, num=sync_num, end_at=datetime.datetime.now())
else: order_nums = 0 outer_id, outer_sku_id = Product.objects.trancecode(p_outer_id, '') wait_nums = max(product.wait_post_num, 0) remain_nums = product.remain_num or 0 real_num = product.collect_num sync_num = real_num - wait_nums - remain_nums # 如果自动更新库存状态开启,并且计算后库存不等于在线库存,则更新 if sync_num > 0 and user_percent > 0: sync_num = int(user_percent * sync_num) elif sync_num > 0 and sync_num <= product.warn_num: total_num, user_order_num = MergeOrder.get_yesterday_orders_totalnum( item.user.id, outer_id, outer_sku_id) if total_num > 0 and user_order_num > 0: sync_num = int(float(user_order_num) / float(total_num) * sync_num) elif total_num == 0: item_count = Item.objects.filter(outer_id=outer_id, approve_status=pcfg.ONSALE_STATUS).count() or 1 sync_num = int(sync_num / item_count) or sync_num else: sync_num = (real_num - wait_nums) > 10 and 2 or 0 elif sync_num > 0: product.is_assign = False else: sync_num = 0 # 当前同步库存值,与线上拍下未付款商品数,哪个大取哪个