Пример #1
0
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())
Пример #2
0
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)
Пример #3
0
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())
Пример #4
0
    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

        # 当前同步库存值,与线上拍下未付款商品数,哪个大取哪个