Пример #1
0
    def handle(self, *args, **options):
        """
        从今年3月1日开始,当天有活跃就增加1天妈妈截止日期
        """
        start_date = datetime.date(2016, 3, 1)
        end_date = datetime.date(2016, 7, 10)
        activites = ActiveValue.objects.filter(date_field__gte=start_date,
                                               date_field__lte=end_date)

        mms = XiaoluMama.objects.filter(status=XiaoluMama.EFFECT,
                                        agencylevel__gte=XiaoluMama.VIP_LEVEL,
                                        charge_status=XiaoluMama.CHARGED)
        print "mama count is %s" % mms.count()
        data_0 = []
        data_1 = []
        for mm in mms:
            renewdays = len(
                activites.filter(
                    mama_id=mm.id).values('date_field').distinct())  # 活跃天数
            dic = {"mm": mm.id, "days": renewdays}
            if mm.id % 100 == 0:
                print 'mm id %s , old renew date is %s , renew days is %s .' % (
                    mm.id, mm.renew_time, renewdays)
            data_1.append(dic) if renewdays > 0 else data_0.append(dic)
            if isinstance(mm.renew_time, datetime.datetime) and renewdays > 0:
                mm.renew_time = mm.renew_time + datetime.timedelta(
                    days=renewdays)
                update_model_fields(mm, update_fields=['renew_time'])
        print "0 days mm count %s" % len(data_0)
        print "n days mm count %s" % len(data_1)
Пример #2
0
def task_Update_Weixin_Userinfo(openId, unionId=None, userinfo={}, accessToken=None):
    """ 通过接口获取用户信息 """
    _wx_api = WeiXinAPI()
    if accessToken and not userinfo:
        userinfo = options.get_weixin_snsuserinfo(openId, accessToken)
    elif not userinfo:
        userinfo = _wx_api.getUserInfo(openId)

    wx_user, state = WeiXinUser.objects.get_or_create(openid=openId)
    pre_subscribe_time = wx_user.subscribe_time

    pre_nickname = wx_user.nickname
    for k, v in userinfo.iteritems():
        if hasattr(wx_user, k) and v:
            setattr(wx_user, k, v or getattr(wx_user, k))

    wx_user.nickname = pre_nickname or replace_utf8mb4(wx_user.nickname.decode('utf8'))
    wx_user.unionid = wx_user.unionid or unionId or ''
    subscribe_time = userinfo.get('subscribe_time', None)
    if subscribe_time:
        wx_user.subscribe_time = pre_subscribe_time or datetime.datetime \
            .fromtimestamp(int(subscribe_time))

    key_list = ['openid', 'sex', 'language', 'headimgurl', 'country', 'province', 'nickname', 'unionid',
                'subscribe_time', 'sceneid']
    update_model_fields(wx_user, update_fields=key_list)

    if not wx_user.unionid:
        return

    app_key = _wx_api._wx_account.app_id
    WeixinUnionID.objects.get_or_create(openid=openId, app_key=app_key, unionid=wx_user.unionid)
Пример #3
0
def task_notify_package_post(package_order):
    """
    :param package_order: PackageOrder instance
    功能: 用户的订单发货了, 发送发货的短信通知 , package_order 称重的时候触发此任务执行.
    """

    package_sku_item = package_order.package_sku_items.filter(
        assign_status=2).first()
    if not package_sku_item:
        return

    now = datetime.datetime.now()
    delay_days = (now - package_sku_item.pay_time).days

    if delay_days <= 3:
        sms_notify_type = SMS_TYPE.SMS_NOTIFY_POST
    else:
        sms_notify_type = SMS_TYPE.SMS_NOTIFY_DELAY_POST

    mobiles = package_order.receiver_mobile
    params = {
        'sms_title': package_sku_item.title.split("/")[0],
        'sms_delay': '%d' % delay_days,
        'sms_logistic': package_order.logistics_company.name,
        'sms_logistic_no': package_order.out_sid,
        'sms_tips': '',
    }
    success = send_sms_message(mobiles, msg_type=sms_notify_type, **params)
    if success:
        package_order.is_send_sms = True
        update_model_fields(package_order, update_fields=['is_send_sms'])
Пример #4
0
    def updatePubTime(self, userId, trade, modified):

        if not isinstance(trade, self.model):
            trade = self.get(user__visitor_id=userId, tid=trade)

        trade.modified = modified

        update_model_fields(trade, update_fields=['modified'])
Пример #5
0
    def process(self, merge_trade, *args, **kwargs):
        logger.debug('DEBUG INIT:%s' % merge_trade)
        log_action(merge_trade.user.user.id, merge_trade, ADDITION, u'订单入库')

        merge_trade.ware_by = merge_trade.get_trade_assign_ware()
        merge_trade.sys_status = pcfg.REGULAR_REMAIN_STATUS
        if merge_trade.ware_by == WARE_NONE:
            merge_trade.sys_memo += ',请选择所属仓库'
            merge_trade.append_reason_code(pcfg.NEW_MEMO_CODE)

        update_model_fields(
            merge_trade, update_fields=['sys_status', 'ware_by', 'sys_memo'])
Пример #6
0
def releaseRegularOutstockTrade(trade, num_maps=None):
    """ 释放特卖定时订单 """
    trade_out_stock = False
    full_out_stock = True
    tnum_maps = {}
    ware_set = set()
    code_defect = False

    for order in trade.normal_orders:
        try:
            bar_code = order.outer_id + order.outer_sku_id
            tnum_maps[bar_code] = tnum_maps.get(bar_code, 0) + order.num
            plus_num = num_maps.get(bar_code, 0) + tnum_maps[bar_code]
            out_stock = not Product.objects.isProductOutingStockEnough(
                order.outer_id,
                order.outer_sku_id,
                plus_num)
            order.out_stock = out_stock
            order.save()
            trade_out_stock |= out_stock
            full_out_stock &= out_stock
            prduct_ware = Product.objects.get(outer_id=order.outer_id).ware_by
            ware_set.add(prduct_ware)
        except Product.ProductCodeDefect:
            code_defect = True
            continue

    t = MergeTrade.objects.get(id=trade.id)
    if trade_out_stock:
        t.append_reason_code(pcfg.OUT_GOOD_CODE)

    if len(ware_set) == 1:
        t.ware_by = ware_set.pop()
    else:
        t.ware_by = WARE_NONE
        t.sys_memo += u'[物流:请拆单或选择始发仓]'
        t.append_reason_code(pcfg.DISTINCT_RULE_CODE)

    if t.reason_code:
        if not code_defect and full_out_stock:
            t.sys_status = pcfg.REGULAR_REMAIN_STATUS
        else:
            t.sys_status = pcfg.WAIT_AUDIT_STATUS
            for code, num in tnum_maps.iteritems():
                num_maps[code] = num_maps.get(code, 0) + num
    else:
        t.sys_status = pcfg.WAIT_PREPARE_SEND_STATUS
    update_model_fields(t, update_fields=['sys_status', 'sys_memo', 'ware_by'])

    if t.sys_status in (pcfg.WAIT_AUDIT_STATUS, pcfg.WAIT_PREPARE_SEND_STATUS):
        oauser = User.getSystemOAUser()
        log_action(oauser.id, t, CHANGE, u'到货释放订单')
    return t
Пример #7
0
    def process(self, merge_trade, *args, **kwargs):

        logger.debug('DEBUG DEFECT:%s' % merge_trade)

        merge_trade.append_reason_code(pcfg.TRADE_DEFECT_CODE)

        for order in merge_trade.inuse_orders:
            if MergeTrade.objects.isOrderDefect(order.outer_id,
                                                order.outer_sku_id):
                order.is_rule_match = True
                update_model_fields(order, update_fields=['is_rule_match'])

        post_save.send(sender=MergeOrder, instance=order)
Пример #8
0
    def process(self, merge_trade, *args, **kwargs):

        logger.debug('DEBUG STOCKOUT:%s' % merge_trade)

        merge_trade.append_reason_code(pcfg.OUT_GOOD_CODE)
        for order in merge_trade.inuse_orders:
            if Product.objects.isProductOutOfStock(order.outer_id,
                                                   order.outer_sku_id) or \
                    self.isOutStockByTitle(order):
                order.out_stock = True
                update_model_fields(order, update_fields=['out_stock'])

        post_save.send(sender=MergeOrder, instance=order)
Пример #9
0
    def handle(self, *args, **options):
        """
        更新(不能使用保存) 交易统计明细列表 中的选品字段
        """
        from statistics.tasks import get_product

        records = SaleOrderStatsRecord.objects.all()
        print "records count is %s:" % records.count()
        for record in records:
            product = get_product(record.outer_id)
            if product:
                record.sale_product = product.sale_product
                update_model_fields(record, update_fields=['sale_product'])
            else:
                print "record %s product not found" % record.id
Пример #10
0
def mergeRemover(trade):
    from shopapp.memorule.services import ruleMatchPayment

    if not isinstance(trade, MergeTrade):
        trade = MergeTrade.objects.get(id=trade)

    trade_id = trade.id
    if not trade.has_merge:
        return False

    trade.remove_reason_code(pcfg.NEW_MERGE_TRADE_CODE)
    trade.has_merge = False

    trade.merge_orders.filter(is_merge=True).delete()
    sub_merges = MergeBuyerTrade.objects.filter(main_tid=trade_id)

    for sub_merge in sub_merges:
        sub_trade = MergeTrade.objects.get(id=sub_merge.sub_tid)
        sub_trade.remove_reason_code(pcfg.NEW_MERGE_TRADE_CODE)

        trade.remove_buyer_message(sub_merge.sub_tid)
        trade.remove_seller_memo(sub_merge.sub_tid)

        sub_trade.sys_status = pcfg.WAIT_AUDIT_STATUS
        update_model_fields(sub_trade, update_fields=['sys_status'])

        log_action(trade.user.user.id, sub_trade, CHANGE, u'取消合并')

        trade.payment -= sub_trade.payment
        trade.post_fee -= sub_trade.post_fee

    update_model_fields(trade,
                        update_fields=['payment', 'post_fee', 'has_merge'])

    mbts = MergeBuyerTrade.objects.filter(main_tid=trade_id)
    for mbt in mbts:
        mbt.delete()

    log_action(trade.user.user.id, trade, CHANGE, u'取消合并')

    recalc_fee_signal.send(sender=MergeTrade, trade_id=trade_id)

    ruleMatchPayment(trade)

    return True
Пример #11
0
    def isTradeNewRefund(self, trade):

        if not isinstance(trade, self.model):
            trade = self.get(id=trade)

        refund_orders_num = trade.merge_orders.filter(
            gift_type=pcfg.REAL_ORDER_GIT_TYPE,
            is_merge=False) \
            .exclude(refund_status__in=(pcfg.NO_REFUND,
                                        pcfg.REFUND_CLOSED,
                                        pcfg.EMPTY_STATUS)).count()

        if refund_orders_num > trade.refund_num:
            trade.refund_num = refund_orders_num
            update_model_fields(trade, update_fields=['refund_num'])
            return True

        return False
Пример #12
0
    def ShipTrade(self, oid, *args, **kwargs):

        self.bservice.shipTrade(oid, *args, **kwargs)

        self.trade.merge_orders.filter(oid=oid) \
            .update(status=pcfg.WAIT_BUYER_CONFIRM_GOODS)

        if self.trade.merge_orders.filter(
                sys_status=pcfg.IN_EFFECT,
                gift_type=pcfg.REAL_ORDER_GIT_TYPE,
                status=pcfg.WAIT_SELLER_SEND_GOODS).count() > 0:
            return

        self.trade.merge_orders.filter(sys_status=pcfg.IN_EFFECT) \
            .update(status=pcfg.WAIT_BUYER_CONFIRM_GOODS)

        self.trade.status = pcfg.WAIT_BUYER_CONFIRM_GOODS
        self.trade.consign_time = datetime.datetime.now()

        update_model_fields(self.trade,
                            update_fields=['status', 'consign_time'])
Пример #13
0
    def process(self, merge_trade, *args, **kwargs):

        logger.debug('DEBUG RULE MATCH:%s' % merge_trade)

        merge_trade.append_reason_code(pcfg.RULE_MATCH_CODE)
        match_reason_list = []

        for order in merge_trade.inuse_orders:
            if MergeTrade.objects.isOrderRuleMatch(order):
                order.is_rule_match = True
                update_model_fields(order, update_fields=['is_rule_match'])
                match_reason_list.append(
                    Product.objects.getProductMatchReason(
                        order.outer_id, order.outer_sku_id))

        merge_trade.sys_memo = u'%s,匹配原因:%s' % (merge_trade.sys_memo,
                                                ','.join(match_reason_list))

        update_model_fields(merge_trade, update_fields=['sys_memo'])

        post_save.send(sender=MergeOrder, instance=order)
Пример #14
0
def _createAndCalcOrderFee(trade, sub_trade):
    payment = 0
    total_fee = 0
    discount_fee = 0
    adjust_fee = 0
    for order in sub_trade.merge_orders.all():

        merge_order, state = MergeOrder.objects.get_or_create(
            oid=order.oid, merge_trade=trade)
        for field in order._meta.fields:
            if field.name not in ('id', 'oid', 'merge_trade'):
                setattr(merge_order, field.name, getattr(order, field.name))
        if state:
            merge_order.is_merge = state
        if MergeOrder.NORMAL in (order.sys_status, merge_order.sys_status):
            merge_order.sys_status = MergeOrder.NORMAL
        else:
            merge_order.sys_status = MergeOrder.DELETE
        merge_order.is_reverse_order = trade.isPostScan()
        merge_order.created = order.created
        merge_order.pay_time = order.pay_time
        merge_order.save()

        if order.isEffect():
            payment += order.payment
            total_fee += order.total_fee
            discount_fee += order.discount_fee
            adjust_fee += order.adjust_fee

    trade.payment += payment
    trade.total_fee += total_fee
    trade.discount_fee += discount_fee
    trade.adjust_fee += adjust_fee
    trade.post_fee = sub_trade.post_fee + trade.post_fee

    update_model_fields(trade,
                        update_fields=[
                            'payment', 'total_fee', 'discount_fee',
                            'adjust_fee', 'post_fee'
                        ])
Пример #15
0
    def handle(self, *args, **options):
        """
        更新(不能使用保存) 交易统计明细列表 中的pay_time字段
        """
        date_froms = options.get('date_from')
        date_tos = options.get('date_to')

        if date_froms and date_tos:
            date_from = date_froms[0]
            date_to = date_tos[0]
            from flashsale.pay.models import SaleOrder

            orders = SaleOrder.objects.filter(created__gte=date_from,
                                              created__lte=date_to)
            print "orders count is %s:" % orders.count()
            records = SaleOrderStatsRecord.objects.all()
            for order in orders:
                record = records.filter(oid=order.oid).first()
                if record:
                    record.pay_time = order.pay_time if order.pay_time else order.created
                    update_model_fields(record, ['pay_time'])
                else:
                    print "record not found order id %s" % order.id
Пример #16
0
def task_update_mamafortune_mama_level(relationship):
    #print "%s, mama_id: %s" % (get_cur_info(), mama_id)
    from flashsale.xiaolumm.models import XiaoluMama
    from_mama_id = relationship.referal_from_grandma_id

    invite_num = ReferalRelationship.objects.filter(
        referal_from_mama_id=from_mama_id,
        referal_type__gte=XiaoluMama.HALF).count()
    group_num = ReferalRelationship.objects.filter(
        referal_from_grandma_id=from_mama_id,
        referal_type__gte=XiaoluMama.HALF).exclude(
            referal_to_mama_id=relationship.referal_to_mama_id).count()
    total = invite_num + group_num + 1

    level = 0
    if invite_num >= 15 or total >= 50:
        level = 1
    if total >= 200:
        level = 2
    if total >= 500:
        level = 3
    if total >= 1000:
        level = 4

    mama = MamaFortune.objects.filter(mama_id=from_mama_id).first()
    if mama:
        if mama.mama_level != level:
            mama.mama_level = level
            update_model_fields(mama, update_fields=['mama_level'])
    else:
        try:
            create_mamafortune_with_integrity(from_mama_id, mama_level=level)
        except IntegrityError as exc:
            logger.warn(
                "IntegrityError - MamaFortune mamalevel | mama_id: %s" %
                (from_mama_id))
            raise task_update_mamafortune_mama_level.retry(exc=exc)
Пример #17
0
    def createMergeTrade(cls, trade, *args, **kwargs):

        tid = trade.id
        update_address = False
        merge_trade, state = MergeTrade.objects.get_or_create(
            user=trade.user, tid=tid, type=pcfg.TAOBAO_TYPE)

        update_fields = [
            'buyer_nick', 'is_force_wlb', 'seller_cod_fee', 'buyer_cod_fee',
            'cod_fee', 'cod_status', 'seller_flag', 'created', 'pay_time',
            'modified', 'consign_time', 'send_time', 'status', 'is_brand_sale',
            'is_lgtype', 'lg_aging', 'lg_aging_type', 'buyer_rate',
            'seller_rate', 'seller_can_rate', 'is_part_consign',
            'step_paid_fee', 'step_trade_status'
        ]

        if not merge_trade.receiver_name and trade.receiver_name:
            update_address = True
            address_fields = [
                'receiver_name', 'receiver_state', 'receiver_city',
                'receiver_district', 'receiver_address', 'receiver_zip',
                'receiver_mobile', 'receiver_phone'
            ]

            update_fields.extend(address_fields)

        for k in update_fields:
            setattr(merge_trade, k, getattr(trade, k))

        merge_trade.is_cod = trade.type == pcfg.COD_TYPE
        merge_trade.payment = merge_trade.payment or trade.payment
        merge_trade.total_fee = merge_trade.total_fee or trade.total_fee
        merge_trade.discount_fee = merge_trade.discount_fee or trade.discount_fee
        merge_trade.adjust_fee = merge_trade.adjust_fee or trade.adjust_fee
        merge_trade.post_fee = merge_trade.post_fee or trade.post_fee

        merge_trade.trade_from = MergeTrade.objects.mapTradeFromToCode(
            trade.trade_from)
        merge_trade.shipping_type = (merge_trade.shipping_type
                                     or pcfg.SHIPPING_TYPE_MAP.get(
                                         trade.shipping_type,
                                         pcfg.EXPRESS_SHIPPING_TYPE))

        update_model_fields(
            merge_trade,
            update_fields=update_fields + [
                'is_cod', 'shipping_type', 'payment', 'total_fee',
                'discount_fee', 'adjust_fee', 'post_fee', 'trade_from'
            ])

        for order in trade.trade_orders.all():
            cls.createMergeOrder(merge_trade, order)

        trade_handler.proccess(
            merge_trade, **{
                'origin_trade':
                trade,
                'update_address':
                (update_address
                 and merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS),
                'first_pay_load':
                (merge_trade.sys_status == pcfg.EMPTY_STATUS
                 and merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS)
            })

        return merge_trade
Пример #18
0
def process_trade_notify_task(id):
    """ 处理交易主动通知信息 """
    try:
        notify = TradeNotify.objects.get(id=id)
        # 如果是分销部分订单,主动通知不做处理
        if notify.type != pcfg.FENXIAO_TYPE:

            # 订单创建,修改,关闭,则重新下载该订单,并对订单价格进行修改
            if notify.status in ('TradeCreate',
                                 'TradeCloseAndModifyDetailOrder'):
                if (notify.type != pcfg.COD_TYPE
                        and MergeTrade.judge_need_pull(notify.tid,
                                                       notify.modified)):
                    response = apis.taobao_trade_get(tid=notify.tid,
                                                     tb_user_id=notify.user_id)
                    trade_dict = response['trade_get_response']['trade']
                    trade_modify = datetime.datetime.strptime(
                        trade_dict['modified'], '%Y-%m-%d %H:%M:%S')
                    if MergeTrade.judge_need_pull(notify.tid, trade_modify):
                        trade = Trade.save_trade_through_dict(
                            notify.user_id, trade_dict)
                # 货到付款处理
                elif notify.type == pcfg.COD_TYPE:
                    response = apis.taobao_trade_fullinfo_get(
                        tid=notify.tid, tb_user_id=notify.user_id)
                    trade_dict = response['trade_fullinfo_get_response'][
                        'trade']
                    trade = Trade.save_trade_through_dict(
                        notify.user_id, trade_dict)

                if notify.type != pcfg.COD_TYPE:
                    # 修改订单价格
                    modify_fee_signal.send(sender='modify_post_fee',
                                           user_id=notify.user_id,
                                           trade_id=notify.tid)
            # 修改交易备注
            elif notify.status == 'TradeMemoModified':
                try:
                    trade = MergeTrade.objects.get(tid=notify.tid)
                except MergeTrade.DoesNotExist, exc:
                    response = apis.taobao_trade_fullinfo_get(
                        tid=notify.tid, tb_user_id=notify.user_id)
                    trade_dict = response['trade_fullinfo_get_response'][
                        'trade']
                    trade = Trade.save_trade_through_dict(
                        notify.user_id, trade_dict)
                else:
                    # 如果交易存在,并且等待卖家发货
                    response = apis.taobao_trade_fullinfo_get(
                        tid=notify.tid,
                        fields='tid,buyer_message,seller_memo,seller_flag',
                        tb_user_id=notify.user_id)
                    trade_dict = response['trade_fullinfo_get_response'][
                        'trade']
                    buyer_message = trade_dict.get('buyer_message', '')
                    seller_memo = trade_dict.get('seller_memo', '')
                    seller_flag = trade_dict.get('seller_flag', 0)

                    # 如果消息没有抓取到,则重试
                    if trade.status in (pcfg.WAIT_BUYER_PAY, pcfg.WAIT_SELLER_SEND_GOODS, pcfg.WAIT_BUYER_CONFIRM_GOODS) \
                            and trade.buyer_message == buyer_message and trade.seller_memo == seller_memo and not seller_memo:
                        raise EmptyMemo('empty memo modified notify:%d' %
                                        notify.tid)

                    Trade.objects.filter(id=notify.tid).update(
                        modified=notify.modified,
                        buyer_message=buyer_message,
                        seller_memo=seller_memo,
                        seller_flag=seller_flag)
                    merge_type = MergeBuyerTrade.get_merge_type(trade.tid)
                    trade.modified = notify.modified
                    trade.seller_flag = seller_flag
                    trade.buyer_message = buyer_message

                    if merge_type == 0:
                        trade.seller_memo = seller_memo
                        trade.save()
                    elif merge_type == 2:
                        trade.save()
                        trade.update_seller_memo(notify.tid, seller_memo)
                    elif merge_type == 1:
                        trade.seller_memo = seller_memo
                        try:
                            main_tid = MergeBuyerTrade.objects.get(
                                sub_tid=notify.tid).main_tid
                        except MergeBuyerTrade.DoesNotExist:
                            pass
                        else:
                            main_trade = MergeTrade.objects.get(tid=main_tid)
                            main_trade.update_seller_memo(
                                notify.tid, seller_memo)
                            main_trade.has_memo = True
                            update_model_fields(main_trade,
                                                update_fields=[
                                                    'has_memo',
                                                ])
                            main_trade.append_reason_code(pcfg.NEW_MEMO_CODE)
                    if trade.seller_memo:
                        trade.has_memo = True
                        update_model_fields(trade,
                                            update_fields=[
                                                'has_memo', 'seller_memo',
                                                'seller_flag', 'modified'
                                            ])
                        trade.append_reason_code(pcfg.NEW_MEMO_CODE)

            # 交易关闭
            elif notify.status == 'TradeClose':
                Trade.objects.filter(id=notify.tid).update(
                    status=pcfg.TRADE_CLOSED, modified=notify.modified)
                Order.objects.filter(trade=notify.tid).update(
                    status=pcfg.TRADE_CLOSED)
                MergeTrade.objects.filter(tid=notify.tid).update(
                    status=pcfg.TRADE_CLOSED, modified=notify.modified)
                MergeTrade.objects.filter(tid=notify.tid).exclude(
                    sys_status__in=('', pcfg.FINISHED_STATUS)).update(
                        sys_status=pcfg.INVALID_STATUS)
                MergeOrder.objects.filter(tid=notify.tid).update(
                    status=pcfg.TRADE_CLOSED)
                try:
                    merge_trade = MergeTrade.objects.get(tid=notify.tid)
                except:
                    pass
                else:
                    if merge_trade.sys_status == pcfg.INVALID_STATUS and merge_trade.has_merge:
                        merge_order_remover(notify.tid)
            # 买家付款
            elif notify.status == 'TradeBuyerPay':
                response = apis.taobao_trade_fullinfo_get(
                    tid=notify.tid, tb_user_id=notify.user_id)
                trade_dict = response['trade_fullinfo_get_response']['trade']
                trade = Trade.save_trade_through_dict(notify.user_id,
                                                      trade_dict)
            # 卖家发货
            elif notify.status == 'TradeSellerShip':
                Trade.objects.filter(id=notify.tid).update(
                    status=pcfg.WAIT_BUYER_CONFIRM_GOODS,
                    modified=notify.modified,
                    consign_time=notify.modified)
                Order.objects.filter(
                    trade=notify.tid,
                    status=pcfg.WAIT_SELLER_SEND_GOODS).update(
                        status=pcfg.WAIT_BUYER_CONFIRM_GOODS)
                MergeTrade.objects.filter(tid=notify.tid).update(
                    status=pcfg.WAIT_BUYER_CONFIRM_GOODS,
                    modified=notify.modified)
                MergeTrade.objects.filter(
                    tid=notify.tid,
                    sys_status__in=(pcfg.WAIT_AUDIT_STATUS,
                                    pcfg.WAIT_PREPARE_SEND_STATUS,
                                    pcfg.REGULAR_REMAIN_STATUS),
                    out_sid='').exclude(
                        shipping_type=pcfg.EXTRACT_SHIPPING_TYPE).update(
                            sys_status=pcfg.INVALID_STATUS)
                MergeOrder.objects.filter(
                    tid=notify.tid, status=pcfg.WAIT_SELLER_SEND_GOODS).update(
                        status=pcfg.WAIT_BUYER_CONFIRM_GOODS)
                try:
                    merge_trade = MergeTrade.objects.get(tid=notify.tid)
                except:
                    pass
                else:
                    if merge_trade.sys_status == pcfg.INVALID_STATUS and merge_trade.has_merge:
                        merge_order_remover(notify.tid)

            # 交易成功
            elif notify.status == 'TradeSuccess':
                Trade.objects.filter(id=notify.tid).update(
                    status=pcfg.TRADE_FINISHED, modified=notify.modified)
                Order.objects.filter(
                    trade=notify.tid,
                    status=pcfg.WAIT_BUYER_CONFIRM_GOODS).update(
                        status=pcfg.TRADE_FINISHED)
                MergeTrade.objects.filter(tid=notify.tid).update(
                    status=pcfg.TRADE_FINISHED, modified=notify.modified)
                MergeTrade.objects.filter(
                    tid=notify.tid,
                    sys_status__in=pcfg.WAIT_DELIVERY_STATUS).update(
                        sys_status=pcfg.INVALID_STATUS)
                MergeOrder.objects.filter(
                    tid=notify.tid,
                    status=pcfg.WAIT_BUYER_CONFIRM_GOODS).update(
                        status=pcfg.TRADE_FINISHED)
            # 修改地址
            elif notify.status == 'TradeLogisticsAddressChanged':
                trade = MergeTrade.objects.get(tid=notify.tid)
                response = apis.taobao_logistics_orders_get(
                    tid=notify.tid, tb_user_id=notify.user_id)
                ship_dict = response['logistics_orders_get_response'][
                    'shippings']['shipping'][0]
                Logistics.save_logistics_through_dict(notify.user_id,
                                                      ship_dict)

                trade.append_reason_code(pcfg.ADDR_CHANGE_CODE)
                MergeTrade.objects.filter(tid=notify.tid).update(
                    receiver_name=ship_dict['receiver_name'],
                    receiver_state=ship_dict['receiver_state'],
                    receiver_city=ship_dict['receiver_city'],
                    receiver_district=ship_dict['receiver_district'],
                    receiver_address=ship_dict['receiver_address'],
                    receiver_zip=ship_dict['receiver_zip'],
                    receiver_mobile=ship_dict['receiver_mobile'],
                    receiver_phone=ship_dict['receiver_phone'])

                try:
                    main_tid = MergeBuyerTrade.objects.filter(
                        sub_tid=trade.tid).main_tid
                except:
                    pass
                else:
                    main_trade = MergeTrade.objects.get(tid=main_tid)
                    main_trade.append_reason_code(pcfg.ADDR_CHANGE_CODE)

    except Exception, exc:
        raise process_trade_notify_task.retry(exc=exc, countdown=60)
Пример #19
0
    def remindTrade(self, *args, **kwargs):

        self.trade.priority = pcfg.PRIORITY_HIG
        update_model_fields(self.trade, update_fields=['priority'])
Пример #20
0
    def process(self, merge_trade, *args, **kwargs):

        logger.debug('DEBUG FINAL:%s' % merge_trade)

        if (merge_trade.sys_status != pcfg.EMPTY_STATUS
                and not merge_trade.logistics_company):
            merge_trade.append_reason_code(pcfg.LOGISTIC_ERROR_CODE)

        if (merge_trade.logistics_company
                and merge_trade.has_reason_code(pcfg.LOGISTIC_ERROR_CODE)):
            merge_trade.remove_reason_code(pcfg.LOGISTIC_ERROR_CODE)

        if ((merge_trade.reason_code and not merge_trade.is_locked
             and merge_trade.sys_status == pcfg.WAIT_PREPARE_SEND_STATUS)
                or (merge_trade.sys_status == pcfg.REGULAR_REMAIN_STATUS
                    and merge_trade.remind_time == None)):
            merge_trade.sys_status = pcfg.WAIT_AUDIT_STATUS

        if (not merge_trade.reason_code
                and (merge_trade.sys_status == pcfg.WAIT_AUDIT_STATUS or
                     (merge_trade.sys_status == pcfg.REGULAR_REMAIN_STATUS
                      and merge_trade.remind_time == None)) and
                merge_trade.type not in (pcfg.DIRECT_TYPE, pcfg.EXCHANGE_TYPE,
                                         pcfg.REISSUE_TYPE)):
            merge_trade.sys_status = pcfg.WAIT_PREPARE_SEND_STATUS

        if kwargs.get('first_pay_load', None):
            for order in merge_trade.inuse_orders:
                ### we should comment the following line in order to retire updating waitpostnum
                Product.objects.updateWaitPostNumByCode(
                    order.outer_id, order.outer_sku_id, order.num)

        if (merge_trade.status
                in (pcfg.TRADE_FINISHED, pcfg.TRADE_BUYER_SIGNED,
                    pcfg.TRADE_CLOSED, pcfg.TRADE_CLOSED_BY_TAOBAO)
                and merge_trade.sys_status
                not in (pcfg.FINISHED_STATUS, pcfg.INVALID_STATUS)):
            merge_trade.append_reason_code(pcfg.INVALID_END_CODE)

            if not merge_trade.is_locked:

                merge_type = MergeBuyerTrade.getMergeType(merge_trade.id)

                if merge_type == pcfg.SUB_MERGE_TYPE:
                    main_tid = MergeBuyerTrade.objects.get(
                        sub_tid=merge_trade.id).main_tid

                    main_trade = MergeTrade.objects.get(id=main_tid)
                    main_trade.append_reason_code(pcfg.INVALID_END_CODE)

                    sub_oids = [
                        o[0]
                        for o in merge_trade.merge_orders.values_list('oid')
                    ]
                    main_trade.merge_orders.filter(oid__in=sub_oids) \
                        .update(sys_status=pcfg.INVALID_STATUS)

                elif merge_type == pcfg.MAIN_MERGE_TYPE:
                    MergeTrade.objects.mergeRemover(merge_trade.id)

                merge_trade.sys_status = pcfg.INVALID_STATUS

        update_model_fields(merge_trade, update_fields=['sys_status'])
Пример #21
0
def mergeMaker(trade, sub_trade):
    if not isinstance(trade, MergeTrade):
        trade = MergeTrade.objects.get(id=trade)

    if not isinstance(sub_trade, MergeTrade):
        sub_trade = MergeTrade.objects.get(id=sub_trade)

    if MergeBuyerTrade.objects.filter(sub_tid=trade.id).count() > 0:
        return False

    try:
        mt = MergeBuyerTrade.objects.get(sub_tid=sub_trade.id)
    except:
        MergeBuyerTrade.objects.get_or_create(sub_tid=sub_trade.id,
                                              main_tid=trade.id)
    else:
        mt.main_tid = trade.id
        mt.save()

    trade.append_reason_code(pcfg.MULTIPLE_ORDERS_CODE)

    if (not trade.is_locked
            and trade.sys_status == pcfg.WAIT_PREPARE_SEND_STATUS):
        trade.sys_status = pcfg.WAIT_AUDIT_STATUS
        update_model_fields(trade, update_fields=['sys_status'])

    _createAndCalcOrderFee(trade, sub_trade)

    if sub_trade.buyer_message or sub_trade.seller_memo or sub_trade.sys_memo:
        trade.update_buyer_message(sub_trade.id, sub_trade.buyer_message)
        trade.update_seller_memo(sub_trade.id,
                                 sub_trade.seller_memo + sub_trade.sys_memo)
        trade.append_reason_code(pcfg.NEW_MEMO_CODE)

    if sub_trade.has_merge:
        strades = MergeBuyerTrade.objects.filter(main_tid=sub_trade.id)

        for strade in strades:
            MergeBuyerTrade.objects.filter(sub_tid=strade.sub_tid).update(
                main_tid=trade.id)

        MergeOrder.objects.filter(merge_trade=sub_trade.id,
                                  is_merge=True).delete()

    for scode in sub_trade.reason_code.split(','):
        trade.append_reason_code(scode)

    sub_trade.append_reason_code(pcfg.NEW_MERGE_TRADE_CODE)

    # 判断是否还有订单需要合并,如果没有,则去掉需合单问题编号
    queryset = MergeTrade.objects.getMergeQueryset(
        trade.buyer_nick,
        trade.receiver_name,
        trade.receiver_mobile,
        trade.receiver_phone,
    )

    if (trade.type == MergeTrade.WX_TYPE
        or queryset.filter(sys_status__in=(pcfg.WAIT_AUDIT_STATUS,
                                           pcfg.REGULAR_REMAIN_STATUS)) \
                .exclude(id__in=(sub_trade.id, trade.id)).count() == 0):
        trade.remove_reason_code(pcfg.MULTIPLE_ORDERS_CODE)

    log_action(trade.user.user.id, trade, CHANGE, u'合并订单(%s)' % (sub_trade.id))

    if (not trade.reason_code and not trade.is_locked
            and trade.sys_status == pcfg.WAIT_AUDIT_STATUS):
        trade.sys_status = pcfg.WAIT_PREPARE_SEND_STATUS
    else:
        trade.append_reason_code(pcfg.NEW_MERGE_TRADE_CODE)

    log_action(sub_trade.user.user.id, sub_trade, CHANGE,
               u'并入订单(%s)' % (trade.id))

    sub_trade.sys_status = pcfg.ON_THE_FLY_STATUS
    update_model_fields(sub_trade, update_fields=['sys_status'])

    trade.has_merge = True
    update_model_fields(trade, update_fields=['has_merge', 'sys_status'])

    return True
Пример #22
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())
Пример #23
0
    def createMergeTrade(cls, trade, *args, **kwargs):

        from shopback.trades.handlers import trade_handler
        from shopback.trades.models import MergeTrade
        from shopback.users.models import User

        seller = User.getOrCreateSeller(trade.shop.vender_id, seller_type=User.SHOP_TYPE_JD)
        merge_trade, state = MergeTrade.objects.get_or_create(tid=trade.order_id,
                                                              user=seller)

        update_fields = ['buyer_nick', 'created', 'pay_time', 'modified', 'status']

        merge_trade.buyer_nick = trade.pin

        merge_trade.created = trade.order_start_time
        merge_trade.modified = trade.modified
        merge_trade.pay_time = trade.payment_confirm_time
        merge_trade.status = JDOrder.mapTradeStatus(trade.order_state)

        update_address = False
        if not merge_trade.receiver_name and trade.consignee_info:
            update_address = True
            receiver_info = json.loads(trade.consignee_info)
            merge_trade.receiver_name = receiver_info['fullname']
            merge_trade.receiver_state = receiver_info['province']
            merge_trade.receiver_city = receiver_info['city']
            merge_trade.receiver_district = receiver_info['county']
            merge_trade.receiver_address = receiver_info['full_address']
            merge_trade.receiver_mobile = receiver_info['mobile']
            merge_trade.receiver_phone = receiver_info['telephone']

            address_fields = ['receiver_name', 'receiver_state',
                              'receiver_city', 'receiver_address',
                              'receiver_district', 'receiver_mobile',
                              'receiver_phone']

            update_fields.extend(address_fields)

        merge_trade.payment = merge_trade.payment or float(trade.order_payment)
        merge_trade.total_fee = merge_trade.total_fee or float(trade.order_total_price)
        merge_trade.post_fee = merge_trade.post_fee or float(trade.freight_price)

        merge_trade.trade_from = 0
        merge_trade.shipping_type = pcfg.EXPRESS_SHIPPING_TYPE
        merge_trade.type = pcfg.JD_TYPE

        update_model_fields(merge_trade, update_fields=update_fields
                                                       + ['shipping_type', 'type', 'payment',
                                                          'total_fee', 'post_fee', 'trade_from'])

        if trade.item_info_list:
            item_list = json.loads(trade.item_info_list)
            for item in item_list:
                cls.createMergeOrder(merge_trade, item)

        trade_handler.proccess(merge_trade,
                               **{'origin_trade': trade,
                                  'update_address': (update_address and
                                                     merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS),
                                  'first_pay_load': (
                                      merge_trade.sys_status == pcfg.EMPTY_STATUS and
                                      merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS)})

        return merge_trade
Пример #24
0
    def createMergeTrade(cls, trade, *args, **kwargs):

        tid = trade.id
        merge_trade, state = MergeTrade.objects.get_or_create(
            user=trade.user, tid=tid, type=pcfg.FENXIAO_TYPE)

        update_fields = [
            'buyer_nick', 'payment', 'shipping_type', 'total_fee', 'post_fee',
            'created', 'trade_from', 'pay_time', 'modified', 'consign_time',
            'seller_flag', 'priority', 'status'
        ]

        if not merge_trade.receiver_name and \
                        trade.status not in ('',
                                             pcfg.TRADE_NO_CREATE_PAY,
                                             pcfg.WAIT_BUYER_PAY,
                                             pcfg.TRADE_CLOSED,
                                             pcfg.TRADE_CLOSED_BY_TAOBAO):
            logistics = Logistics.get_or_create(trade.user.visitor_id, tid)
            location = json.loads(logistics.location or 'null')

            merge_trade.receiver_name = logistics.receiver_name
            merge_trade.receiver_zip = location.get('zip',
                                                    '') if location else ''
            merge_trade.receiver_mobile = logistics.receiver_mobile
            merge_trade.receiver_phone = logistics.receiver_phone

            merge_trade.receiver_state = location.get('state',
                                                      '') if location else ''
            merge_trade.receiver_city = location.get('city',
                                                     '') if location else ''
            merge_trade.receiver_district = location.get(
                'district', '') if location else ''
            merge_trade.receiver_address = location.get('address',
                                                        '') if location else ''

            address_fields = [
                'receiver_name', 'receiver_state', 'receiver_city',
                'receiver_district', 'receiver_address', 'receiver_zip',
                'receiver_mobile', 'receiver_phone'
            ]

            update_fields.extend(address_fields)

        merge_trade.payment = merge_trade.payment or trade.distributor_payment
        merge_trade.total_fee = merge_trade.total_fee or trade.total_fee
        merge_trade.post_fee = merge_trade.post_fee or trade.post_fee

        merge_trade.buyer_nick = trade.distributor_username
        merge_trade.shipping_type = merge_trade.shipping_type or \
                                    pcfg.SHIPPING_TYPE_MAP.get(trade.shipping, pcfg.EXPRESS_SHIPPING_TYPE)
        merge_trade.created = trade.created
        merge_trade.pay_time = trade.created
        merge_trade.modified = trade.modified
        merge_trade.consign_time = trade.consign_time
        merge_trade.seller_flag = trade.supplier_flag
        merge_trade.priority = 0
        merge_trade.status = trade.status
        merge_trade.trade_from = MergeTrade.objects.mapTradeFromToCode(
            pcfg.TF_TAOBAO)

        update_model_fields(merge_trade, update_fields=update_fields)

        # 保存分销订单到抽象全局抽象订单表
        for order in trade.sub_purchase_orders.all():
            cls.createMergeOrder(merge_trade, order)

        trade_handler.proccess(
            merge_trade, **{
                'origin_trade':
                trade,
                'first_pay_load':
                (merge_trade.sys_status == pcfg.EMPTY_STATUS
                 and merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS)
            })

        return merge_trade
Пример #25
0
    def createMergeTrade(cls, trade, *args, **kwargs):

        user = cls.getOrCreateSeller(trade)
        merge_trade, state = MergeTrade.objects.get_or_create(
            user=user, tid=trade.order_id)

        update_fields = [
            'buyer_nick', 'created', 'pay_time', 'modified', 'status'
        ]

        merge_trade.buyer_nick = trade.buyer_nick or trade.receiver_name
        merge_trade.created = trade.order_create_time
        merge_trade.modified = trade.order_create_time
        merge_trade.pay_time = trade.order_create_time
        merge_trade.status = WXOrder.mapTradeStatus(trade.order_status)

        update_address = False
        if not merge_trade.receiver_name and trade.receiver_name:
            update_address = True
            merge_trade.receiver_name = trade.receiver_name
            merge_trade.receiver_state = trade.receiver_province
            merge_trade.receiver_city = trade.receiver_city
            merge_trade.receiver_district = trade.receiver_zone
            merge_trade.receiver_address = trade.receiver_address
            merge_trade.receiver_mobile = trade.receiver_mobile
            merge_trade.receiver_phone = trade.receiver_phone

            address_fields = [
                'receiver_name', 'receiver_state', 'receiver_district',
                'receiver_city', 'receiver_address', 'receiver_mobile',
                'receiver_phone'
            ]

            update_fields.extend(address_fields)

        merge_trade.payment = (merge_trade.payment
                               or round(trade.order_total_price / 100.0, 2))
        merge_trade.total_fee = (merge_trade.total_fee
                                 or round(trade.product_price / 100.0, 2) *
                                 trade.product_count)
        merge_trade.post_fee = (merge_trade.post_fee
                                or round(trade.order_express_price / 100.0, 2))

        merge_trade.trade_from = MergeTrade.trade_from
        merge_trade.shipping_type = pcfg.EXPRESS_SHIPPING_TYPE
        merge_trade.type = pcfg.WX_TYPE

        update_model_fields(merge_trade,
                            update_fields=update_fields + [
                                'shipping_type', 'type', 'payment',
                                'total_fee', 'post_fee', 'trade_from'
                            ])

        cls.createMergeOrder(merge_trade, trade)

        _params = {
            'origin_trade':
            trade,
            'update_address':
            (update_address
             and merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS),
            'first_pay_load':
            (merge_trade.sys_status == pcfg.EMPTY_STATUS
             and merge_trade.status == pcfg.WAIT_SELLER_SEND_GOODS)
        }
        _params.update(kwargs)

        if _params.get('first_pay_load'):
            trade.confirm_payment()

        trade_handler.proccess(merge_trade, *args, **_params)

        return merge_trade