Esempio n. 1
0
def decode_key(key, interface_map):
    inf, carrier, area = key.split(':')
    inf_carrier = inf + '-' + carrier

    inf_name = []
    for _inf in inf.split('+'):
        inf_name.append(interface_map.get(_inf, _inf))

    carrier = escape_carrier(carrier)
    area = escape_area(area)

    return '+'.join(inf_name), carrier, area, inf_carrier
Esempio n. 2
0
def decode_product(p):
    '''
    copy & decode
    '''
    p1 = p.copy()
    p1['type_n'] = PRODUCT_TYPE.get(p1['type'])
    p1['carrier_n'] = escape.escape_carrier(str(p1['carrier']))
    p1['area_n'] = escape.escape_area(p1['area'])
    p1['use_area_n'] = escape.escape_area(p1['use_area'])
    p1['status_n'] = STATUS.get(p1['status'])

    return p1
Esempio n. 3
0
    def get_product(self):
        p = re.compile('1\d{6}')
        mobile = self.get_argument('m', None)

        user_id = self.current_user['partner_id']

        if mobile is None or not p.match(mobile):
            return self.finish(json.dumps({'status': 'fail'}))

        head = int(mobile[0:7])
        o, a = self.application.classifier.search(head)

        name = '%s%s' % (escape_area(a), escape_carrier(str(o)))

        slave = self.slave

        if 'master' in self.application.config['downstream'][user_id]:
            master_id = self.application.config['downstream'][user_id]['master']
        else:
            master_id = user_id

        plist = []
        prods = slave.keys('product:{master_id}:data:{carrier}:{area}:*'.format(master_id=master_id, carrier=o, area=a))

        if len(prods) == 0:
            a = 'CN'
            prods = slave.keys('product:{master_id}:data:{carrier}:CN:*'.format(master_id=master_id, carrier=o))

        for k in prods:
            prod = self.slave.hmget(k, ['carrier', 'value', 'name', 'discount', 'scope'])
            value = float(prod[1]) * int(prod[3]) / 10000
            scope = prod[4] or '0'
            offer = '%s:%s:%s' % (prod[0], a, prod[1])
            if scope != '0':
                offer = offer + ':' + scope

            plist.append({
                'offer': offer,
                'name': '%s' % prod[2],
                'value': '%0.3f' % value,
                'face': int(prod[1]),
                'scope': scope,
            })

        plist = sorted(plist, key=lambda p: '%s %05d' % (p['scope'], p['face']))

        self.finish(json.dumps({'status': 'ok',
                                'name': name,
                                'prod': plist}, indent=4))
Esempio n. 4
0
    def get(self):
        slave = self.slave

        user_id = self.current_user['partner_id']
        d = self.application.config['downstream'][user_id]

        master_id = d.get('master', user_id)

        product_key = slave.keys('product:%s:*' % master_id)

        product_list = {'1': [], '2': [], '3': []}

        for pid in product_key:
            info = slave.hmget(
                pid, ['offer', 'carrier', 'value', 'discount', 'name'])
            area = pid.split(':')[4]
            carrier = info[1]

            product_list[carrier].append({
                'offer':
                info[0],
                'carrier':
                carrier,
                'carrier_name':
                escape_carrier(carrier),
                'price':
                info[2],
                'value': (float(info[2]) * float(info[3]) / 10000),
                'name':
                info[4],
                'area':
                area,
                'area_name':
                escape_area(area),
            })

        self.finish(json.dumps({'msg': 'ok', 'product': product_list}))
Esempio n. 5
0
    def post_list(self):
        domain_id = self.json_args.get('domain_id')
        up_domain_id = self.json_args.get('up_domain_id')

        filter_id = self.json_args.get('id', None)
        filter_price = self.json_args.get('price', None)
        filter_name = self.json_args.get('name', None)
        filter_type = self.json_args.get('type', None)
        filter_carrier = self.json_args.get('carrier', None)
        filter_area = self.json_args.get('area', None)
        filter_status = self.json_args.get('status', None)

        page = int(self.json_args['page'])
        size = int(self.json_args['size'])

        session = self.session('repo')

        try:
            if up_domain_id:
                up_domain = session.query(RepoDomain).filter(
                    RepoDomain.domain_id == domain_id).filter(
                        RepoDomain.up_domain == up_domain_id).first()

                if up_domain is None:
                    raise RuntimeError('CANNOT FOUND %s <= %s' %
                                       (domain_id, up_domain_id))

            q = session.query(RepoProduct).filter(
                RepoProduct.domain_id == domain_id)

            if filter_id:
                q = q.filter(RepoProduct.product_id.like('%' + filter_id +
                                                         '%'))

            if filter_price:
                q = q.filter(RepoProduct.price == filter_price)

            if filter_name:
                q = q.filter(RepoProduct.name.like('%' + filter_name + '%'))

            if filter_type:
                q = q.filter(RepoProduct.type == filter_type)

            if filter_carrier:
                q = q.filter(RepoProduct.carrier == filter_carrier)

            if filter_area:
                q = q.filter(RepoProduct.area == filter_area)

            if filter_status:
                q = q.filter(RepoProduct.status == filter_status)

            count = q.count()
            max_page = int(math.ceil(count / size))

            product_list = []
            q = q.order_by(RepoProduct.carrier, RepoProduct.area,
                           RepoProduct.scope, RepoProduct.value).offset(
                               (page - 1) * size).limit(size)

            for p in q.all():
                product_list.append({
                    'id':
                    p.product_id,
                    'name':
                    p.name,
                    'type':
                    p.type,
                    'carrier':
                    p.carrier,
                    'price':
                    p.price,
                    'area':
                    p.area,
                    'use_area':
                    p.use_area,
                    'status':
                    p.status,
                    'value':
                    p.value,
                    'notes':
                    p.notes,
                    'tsp':
                    str(p.update_time),
                    'p1':
                    p.p1,
                    'p2':
                    p.p2,
                    'p3':
                    p.p3,
                    'p4':
                    p.p4,
                    'p5':
                    p.p5,
                    'scope':
                    p.scope,
                    'legacy':
                    p.legacy_id,
                    'routing':
                    p.routing,
                    'type_n':
                    PRODUCT_TYPE.get(p.type),
                    'carrier_n':
                    escape.escape_carrier(str(p.carrier)),
                    'area_n':
                    escape.escape_area(p.area),
                    'use_area_n':
                    escape.escape_area(p.use_area),
                    'status_n':
                    STATUS.get(p.status),
                })

            self.finish(
                json.dumps({
                    'status': 'success',
                    'page': page,
                    'max': max_page,
                    'list': product_list
                }))

        except Exception as e:
            self.finish(json.dumps({'status': 'fail', 'msg': str(e)}))

        finally:
            session.close()
Esempio n. 6
0
    def get_list(self):
        domain_id = self.get_argument('domain_id')

        session = self.session('repo')
        try:
            product_list = []
            q = session.query(RepoProduct).filter(
                RepoProduct.domain_id == domain_id).order_by(
                    RepoProduct.carrier, RepoProduct.area, RepoProduct.scope,
                    RepoProduct.value).all()

            for p in q:
                product_list.append({
                    'id':
                    p.product_id,
                    'name':
                    p.name,
                    'type':
                    p.type,
                    'carrier':
                    p.carrier,
                    'price':
                    p.price,
                    'area':
                    p.area,
                    'use_area':
                    p.use_area,
                    'status':
                    p.status,
                    'value':
                    p.value,
                    'notes':
                    p.notes,
                    'tsp':
                    str(p.update_time),
                    'p1':
                    p.p1,
                    'p2':
                    p.p2,
                    'p3':
                    p.p3,
                    'p4':
                    p.p4,
                    'p5':
                    p.p5,
                    'scope':
                    p.scope,
                    'legacy':
                    p.legacy_id,
                    'routing':
                    p.routing,
                    'type_n':
                    PRODUCT_TYPE.get(p.type),
                    'carrier_n':
                    escape.escape_carrier(str(p.carrier)),
                    'area_n':
                    escape.escape_area(p.area),
                    'use_area_n':
                    escape.escape_area(p.use_area),
                    'status_n':
                    STATUS.get(p.status),
                })

            self.finish(json.dumps(product_list))

        finally:
            session.close()
Esempio n. 7
0
    def post(self):
        args = self.json_args
        page = args.get('page')
        size = args.get('size')

        interface_map = self.application.config.get('interface')

        try:
            # find
            order_collection = self.application.glados_client.GLaDOS.order

            filter_dict = {}

            #订单类型
            if 'supply_type' in args and args['supply_type']:
                filter_dict['truman_order.supply_type'] = args['supply_type']

            #订单编号
            if 'id' in args and args['id']:
                filter_dict['_id'] = args['id']

            # 采购商
            if 'user_id' in args and args['user_id']:
                filter_dict['user_id'] = args['user_id']

            #供货商
            if 'supply_user_id' in args and args['supply_user_id']:
                filter_dict['truman_order.user_id'] = args['supply_user_id']

            #产品  [流量,话费,油卡]
            if 'product' in args and args['product']:
                filter_dict['product'] = args['product']

            #充值账号
            if 'phone' in args and args['phone']:
                filter_dict['mobile'] = args['phone']

            #起始与结束时间
            if 'start' in args and 'end' in args and args['start'] and args[
                    'end']:
                # 2015/08/02 09:49:32
                start = datetime.datetime.strptime(args['start'],
                                                   '%Y/%m/%d %H:%M:%S')
                end = datetime.datetime.strptime(args['end'],
                                                 '%Y/%m/%d %H:%M:%S')
                filter_dict['req_time'] = {'$gte': start, '$lte': end}

            #订单状态
            if 'state' in args and args['state']:
                # -1 and processing
                if args['state'] == 'processing':
                    filter_dict['$and'] = [{
                        'result': {
                            '$in': ['00000', '0']
                        }
                    }, {
                        'back_result': None
                    }]

                # 1 and finish
                elif args['state'] == 'success':
                    filter_dict['$or'] = [{
                        'back_result': '1'
                    }, {
                        'result': '1'
                    }, {
                        'back_result': '00000'
                    }]

                # fail
                elif args['state'] == 'fail':
                    filter_dict['$or'] = [{
                        '$and': [{
                            'back_result': None
                        }, {
                            'result': {
                                '$nin': ['00000', '0']
                            }
                        }]
                    }, {
                        'back_result': {
                            '$nin': [None, '00000', '1']
                        }
                    }]

            #运营商
            if 'carrier' in args and args['carrier']:
                if 'area' in args and args['area']:
                    filter_dict['area'] = '%s:%s' % (args['carrier'],
                                                     args['area'])
                else:
                    filter_dict['area'] = {
                        '$regex': ('^' + args['carrier'] + ':.{2}')
                    }
            else:
                if 'area' in args and args['area']:
                    filter_dict['area'] = {
                        '$regex': ('.:' + args['area'] + '$')
                    }

            #上游路由
            if args.get('route'):
                filter_dict['up_order.route'] = args.get('route')

            if len(filter_dict) == 0:
                return self.write(
                    json.dumps({
                        'status': 'fail',
                        'msg': '您未选择任何过滤条件,请至少输入一个'
                    }))

            count = yield order_collection.find(filter_dict).count()

            max_page = int(math.ceil(count / int(args['size'])))

            cursor = order_collection.find(filter_dict).sort([
                ('req_time', pymongo.DESCENDING)
            ]).skip((page - 1) * size).limit(size)

            data_list = []
            product_cache = dict()  # per-handler cache

            while (yield cursor.fetch_next):
                order_doc = cursor.next_object()

                # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号  订单状态	备注
                o = {
                    'id':
                    order_doc.get('_id'),
                    'sp_id':
                    order_doc.get('sp_order_id'),
                    'shard':
                    order_doc.get('shard'),
                    'phone':
                    order_doc.get('mobile'),
                    # 'value': (order_doc.get('value') is not None and '%.3f' % (order_doc.get('value') / 10000)) or '-',
                    'create':
                    str(order_doc.get('req_time')),
                    'update':
                    order_doc.get('back_time')
                    and str(order_doc.get('back_time')),
                    # 'balance': (order_doc.get('balance') is not None and '%0.03f' % (
                    #    order_doc.get('balance') / 10000)) or '-',
                    'product':
                    order_doc.get('product'),
                    'result':
                    order_doc.get('result'),
                    'price':
                    order_doc.get('price'),
                    'scope':
                    order_doc.get('scope'),
                    'back_result':
                    order_doc.get('back_result'),
                    'area':
                    order_doc.get('area'),
                    'user_id':
                    order_doc.get('user_id'),  #采购商
                    'supply_user_id':
                    order_doc.get('truman_order', {}).get('user_id'),  #供货商
                    'value':
                    order_doc.get('value'),  #采购价
                    'sell_value':
                    order_doc.get('truman_order', {}).get('sell_price'),  #供货价
                }

                if order_doc.get('up_order'):
                    route = order_doc.get('up_order')[-1].get('route')
                    o['route'] = interface_map.get(route, route)

                user_id = order_doc.get('user_id')
                supply_user_id = o['supply_user_id']

                if 'user_id' in self.application.config['downstream'] and 'master' in \
                        self.application.config['downstream'][user_id]:
                    master_id = self.application.config['downstream'][user_id][
                        'master']
                else:
                    master_id = user_id

                carrier = ''
                carrier_name = ''
                area = ''

                if order_doc.get('area') and ':' in order_doc.get('area'):
                    carrier, area = order_doc['area'].split(':')
                    carrier_name = escape_carrier(carrier)
                    area_name = escape_area(area)

                o['result'] = decode_status(order_doc)
                o['name'] = decode_name(self.slave, order_doc, carrier,
                                        carrier_name, area, area_name,
                                        master_id, product_cache)

                o['carrier'] = area_name + carrier_name

                service_url = None
                if user_id in self.application.config['downstream']:
                    o['user_name'] = self.application.config['downstream'][
                        user_id]['name']
                    service_url = self.application.config['downstream'][
                        user_id]['shard']

                if supply_user_id in self.application.config['downstream']:
                    o['supply_user_name'] = self.application.config[
                        'downstream'][supply_user_id]['name']

                if not o.get('route') and service_url:
                    _id = order_doc.get('_id')
                    url = 'http://%s/admin/info?order_id=%s' % (service_url,
                                                                _id)
                    result = yield get_route(url)

                    if result:
                        route = result.get('route/1')
                        if route:
                            o['route'] = '_' + str(
                                interface_map.get(route, route))

                data_list.append(o)

            self.finish(
                json.dumps({
                    'data': data_list,
                    'max': max_page,
                    'page': page,
                    'size': size
                }))

        except Exception:
            request_log.exception('QUERY CHAIN')
            self.send_error(500)
Esempio n. 8
0
    def post_update(self):
        domain_id = self.json_args.get('domain_id')

        product_id = self.json_args.get('id')
        value = self.json_args.get('value', None)
        status = self.json_args.get('status', None)

        p1 = self.json_args.get('p1', None)
        p2 = self.json_args.get('p2', None)
        p3 = self.json_args.get('p3', None)
        p4 = self.json_args.get('p4', None)
        p5 = self.json_args.get('p5', None)

        session = self.session('repo')
        try:
            q = session.query(RepoProduct).filter(
                RepoProduct.domain_id == domain_id).filter(
                    RepoProduct.product_id == product_id)

            product = q.first()

            if product is None:
                raise ValueError('NOT FOUND')

            if value:
                product.value = value

            if status:
                product.status = status

            if p1:
                product.p1 = p1
            if p2:
                product.p2 = p2
            if p3:
                product.p3 = p3
            if p4:
                product.p4 = p4
            if p5:
                product.p5 = p5

            session.add(product)
            session.commit()

            self.finish(
                json.dumps({
                    'status': 'ok',
                    'msg': 'update',
                    'product': {
                        'id': product.product_id,
                        'name': product.name,
                        'type': product.type,
                        'carrier': product.carrier,
                        'price': product.price,
                        'area': product.area,
                        'use_area': product.use_area,
                        'status': product.status,
                        'value': product.value,
                        'notes': product.notes,
                        'tsp': str(product.update_time),
                        'p1': product.p1,
                        'p2': product.p2,
                        'p3': product.p3,
                        'p4': product.p4,
                        'p5': product.p5,
                        'scope': product.scope,
                        'legacy': product.legacy_id,
                        'routing': product.routing,
                        'type_n': PRODUCT_TYPE.get(product.type),
                        'carrier_n':
                        escape.escape_carrier(str(product.carrier)),
                        'area_n': escape.escape_area(product.area),
                        'use_area_n': escape.escape_area(product.use_area),
                        'status_n': STATUS.get(product.status),
                    }
                }))

            # yield core.sync_pricing(session, domain_id, filter_product=product_id)
            self.master.lpush(
                'list:sync:pricing',
                '{domain_id},{product_id},{user_id}'.format(
                    domain_id=domain_id, product_id=product_id, user_id=''))

        except Exception as e:
            self.finish(json.dumps({'status': 'fail', 'msg': str(e)}))

        finally:
            session.close()
Esempio n. 9
0
def escape_carrier(carrier_str):
    carrier_list = []
    for carrier in carrier_str.split(','):
        carrier_list.append(escape.escape_carrier(carrier))

    return ', '.join(carrier_list)
Esempio n. 10
0
    def post(self, path):
        if 'admin-routing' not in self.current_user['roles']:
            self.finish()
            return

        if path == '/all':
            user_id = self.json_args.get('user_id')
            carrier = self.json_args.get('carrier')
            area = self.json_args.get('area')
            price = self.json_args.get('price')

            cfg = self.application.config['madeira']
            r = redis.Redis(host=cfg['ip'], port=cfg['port'], db=cfg['db'], decode_responses=True)

            routing_list = []
            try:
                session = self.session('purus')
                q = session.query(Routing).filter(
                    Routing.carrier == carrier)

                if user_id:
                    q = q.filter(Routing.user_id == user_id)

                if price:
                    q = q.filter(Routing.price == price)

                if area:
                    q = q.filter(Routing.area == area)

                q = q.order_by(Routing.user_id, Routing.area, Routing.price)

                for routing in q.all():
                    k = 'route:{user_id}:fee:{carrier}:{area}:{price}'.format(
                        user_id=routing.user_id,
                        carrier=routing.carrier,
                        area=routing.area,
                        price=routing.price)

                    v = r.get(k)

                    request_log.info('GET %s = %s', k, v)

                    if v is None:
                        status = 'OFF'
                    elif v == routing.routing:
                        status = 'ON'
                    else:
                        status = 'UNKNOWN(%s)' % v

                    carrier_name = escape_carrier(str(routing.carrier))
                    area_name = escape_area(routing.area)
                    routing_list.append({'id': routing.id,
                                         'user_id': routing.user_id,
                                         'carrier': carrier_name,
                                         'area': area_name,
                                         'price': routing.price,
                                         'routing': routing.routing,
                                         'status': status})

                session.close()

                self.finish(json.dumps({'status': 'ok', 'routing': routing_list}))
            except Exception as e:
                self.finish(json.dumps({'status': 'fail', 'msg': repr(e)}))

        elif path == '/set':
            routing_id = self.json_args['id']
            func = self.json_args['func']

            cfg = self.application.config['madeira']
            r = redis.Redis(host=cfg['ip'], port=cfg['port'], db=cfg['db'], decode_responses=True)

            try:

                session = self.session('purus')
                routing = session.query(Routing).filter(Routing.id == routing_id).one()
                session.close()

                k = 'route:{user_id}:fee:{carrier}:{area}:{price}'.format(
                    user_id=routing.user_id,
                    carrier=routing.carrier,
                    area=routing.area,
                    price=routing.price)

                if func == 'ON':
                    request_log.debug('SET %s %s' % (k, routing.routing))
                    r.set(k, routing.routing)
                elif func == 'OFF':
                    request_log.debug('DEL %s' % k)
                    r.delete(k)

                self.finish(json.dumps({'status': 'ok'}))
            except Exception as e:
                self.finish(json.dumps({'status': 'fail', 'msg': repr(e)}))

        elif path == '/setall':
            user_id = self.json_args.get('user_id')
            carrier = self.json_args.get('carrier')
            price = self.json_args.get('price')
            area = self.json_args.get('area')
            func = self.json_args['func']

            cfg = self.application.config['madeira']
            r = redis.Redis(host=cfg['ip'], port=cfg['port'], db=cfg['db'], decode_responses=True)

            try:
                session = self.session('purus')
                q = session.query(Routing).filter(Routing.carrier == carrier)

                if user_id:
                    q = q.filter(Routing.user_id == user_id)

                if area:
                    q = q.filter(Routing.area == area)

                if price:
                    q = q.filter(Routing.price == price)

                q = q.order_by(Routing.user_id, Routing.area, Routing.price)

                for routing in q.all():
                    k = 'route:{user_id}:fee:{carrier}:{area}:{price}'.format(
                        user_id=routing.user_id,
                        carrier=routing.carrier,
                        area=routing.area,
                        price=routing.price)

                    if func == 'ON':
                        request_log.debug('SET %s %s' % (k, routing.routing))
                        r.set(k, routing.routing)
                    elif func == 'OFF':
                        request_log.debug('DEL %s' % k)
                        r.delete(k)

                session.close()

                self.finish(json.dumps({'status': 'ok'}))
            except Exception as e:
                self.finish(json.dumps({'status': 'fail', 'msg': repr(e)}))

        else:
            self.finish('')
Esempio n. 11
0
    def post_list_supply(self):
        domain_id = self.json_args.get('domain_id')
        user_id = self.json_args.get('user_id', None)
        product_id = self.json_args.get('product_id', None)
        area = self.json_args.get('area', None)
        carrier = self.json_args.get('carrier', None)

        page = int(self.json_args['page'])
        size = int(self.json_args['size'])

        session = self.session('repo')

        try:
            q = session.query(RepoSpecial, RepoProduct, RepoRouteSupply, RepoUser).filter(
                RepoProduct.domain_id == domain_id).filter(
                    RepoSpecial.product_id == RepoProduct.product_id).filter(
                        RepoSpecial.user_id == RepoUser.user_id).filter(
                            RepoSpecial.supply == RepoRouteSupply.id).filter(
                                RepoSpecial.supply != None)

            if area:
                q = q.filter(RepoProduct.area == area)

            if carrier:
                q = q.filter(RepoProduct.carrier == carrier)

            if user_id:
                q = q.filter(RepoSpecial.user_id == user_id)

            if product_id:
                q = q.filter(RepoSpecial.product_id == product_id)

            count = q.count()
            max_page = int(math.ceil(count / size))

            product_list = []
            q = q.order_by(RepoProduct.carrier, RepoProduct.area, RepoProduct.scope, RepoProduct.value).offset(
                (page - 1) * size).limit(
                    size)

            for sp, pr, su, ur in q:
                product_list.append({
                    'id': pr.product_id,
                    'name': pr.name,
                    'type': pr.type,
                    'carrier': pr.carrier,
                    'price': pr.price,
                    'area': pr.area,
                    'use_area': pr.use_area,
                    'status': pr.status,
                    'p1': pr.p1,
                    'p2': pr.p2,
                    'p3': pr.p3,
                    'p4': pr.p4,
                    'p5': pr.p5,
                    'scope': pr.scope,
                    'legacy': pr.legacy_id,
                    'routing': sp.supply,
                    'routing_n': su.name,
                    'type_n': PRODUCT_TYPE.get(pr.type),
                    'carrier_n': escape.escape_carrier(str(pr.carrier)),
                    'area_n': escape.escape_area(pr.area),
                    'use_area_n': escape.escape_area(pr.use_area),
                    'status_n': STATUS.get(pr.status),
                    'product_value': sp.value,
                    'user_id': sp.user_id,
                    'user_name': ur.name,
                    'product_id': pr.product_id,
                    'value': pr.value,
                    'tsp': str(sp.update_time),
                    'tsp_status': str(sp.update_status_time),
                    'tsp_supply': str(sp.update_supply_time),
                    'tsp_value': str(sp.update_value_time),
                    'notes': sp.notes
                })

            self.finish(json.dumps({
                'status': 'success',
                'page': page,
                'max': max_page,
                'list': product_list
            }))

        finally:
            session.close()
Esempio n. 12
0
    def post(self, product):

        args = self.json_args
        page = args.get('page')
        size = args.get('size')
        max_page = 0

        product_cache = dict()
        result = []

        try:
            if 'admin' not in self.current_user['roles']:
                user_id = self.current_user['partner_id']
            else:
                user_id = args.get('user_id')

            criteria = {'product': product}

            if user_id:
                criteria['user_id'] = user_id

            if args.get('account'):
                criteria['mobile'] = args.get('account')

            if args.get('start') and args.get('end'):
                start = datetime.strptime(args.get('start'), '%Y/%m/%d %H:%M:%S')
                end = datetime.strptime(args.get('end'), '%Y/%m/%d %H:%M:%S')


                criteria['req_time'] = {'$gte': start, '$lt': end}

            if args.get('result'):
                if args.get('result') == 'processing':
                    criteria['$and'] = [{'result': {'$in': ['00000', '0']}}, {'back_result': None}]

                # 1 and finish
                elif args.get('result') == 'success':
                    criteria['$or'] = [{'back_result': '1'}, {'result': '1'}, {'back_result': '00000'}]

                # fail
                elif args.get('result') == 'fail':
                    criteria['$or'] = [{'$and': [{'back_result': None}, {'result': {'$nin': ['00000', '0']}}]},
                                       {'back_result': {'$nin': [None, '00000', '1']}}]

            if args.get('id'):
                criteria['_id'] = args.get('id')

            if args.get('sp_id'):
                criteria['sp_order_id'] = args.get('sp_id')

            if args.get('carrier'):
                if args.get('area'):
                    criteria['area'] = '%s:%s' % (args.get('carrier'), args.get('area'))
                else:
                    criteria['area'] = {'$regex': ('^' + args.get('carrier') + ':.{2}')}

            elif args.get('area'):
                criteria['area'] = {'$regex': ('.:' + args.get('area') + '$')}

            if len(criteria) <= 1:
                return self.write(json.dumps({'status': 'fail', 'msg': '您未选择任何过滤条件,请至少输入一个'}))

            order_collection = self.application.glados_client.GLaDOS.order

            count = yield order_collection.find(criteria).count()

            max_page = int(math.ceil(count / int(args['size'])))

            cursor = order_collection.find(criteria).sort([('req_time', pymongo.DESCENDING)]).skip(
                (page - 1) * size).limit(size)

            # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号	订单状态	备注
            while (yield cursor.fetch_next):
                order_doc = cursor.next_object()

                carrier = ''
                carrier_name = ''
                area = order_doc.get('area')
                if area and ':' in area:
                    carrier, area = area.split(':')
                    carrier_name = escape_carrier(carrier)
                    area_name = escape_area(area)

                if user_id in self.application.config['downstream']:
                    master_id = self.application.config['downstream'][user_id].get('master')
                else:
                    master_id = user_id

                o = {
                    'id': order_doc.get('_id'),
                    'sp_id': order_doc.get('sp_order_id'),
                    'account': order_doc.get('mobile'),
                    'price': str(order_doc.get('price') or '-'),
                    'value': (order_doc.get('value') and '%.3f' % (order_doc.get('value') / 10000)) or '-',
                    'create': str(order_doc.get('req_time')),
                    'update': str(order_doc.get('back_time') or ''),
                    'result': decode_status(order_doc),
                    'name': decode_name(self.slave, order_doc, carrier, carrier_name, area, area_name, master_id,
                                        product_cache),
                    'carrier': area_name + carrier_name,
                    'balance': (order_doc.get('balance') and '%0.03f' % (order_doc.get('balance') / 10000)) or '-',
                }

                result.append(o)
        except:
            request_log.exception('FAIL ON QUERY2')

        self.write(json.dumps({
            'count': count,
            'data': result,
            'max': max_page,
            'page': page,
            'size': size
        }))
Esempio n. 13
0
    def post(self):
        args = self.json_args

        page = int(args['page'])
        size = int(args['size'])

        # if 'admin' in self.current_user['roles'] and 'user_id' in args:
        #     user_id = args['user_id']
        # else:
        #     user_id = self.current_user['partner_id']
        user_id = args['user_id']

        session = self.session('madeira')

        result = []

        if 'shard_id' in self.application.config['downstream'][user_id]:
            master_id = self.application.config['downstream'][user_id][
                'shard_id']
        elif 'master' in self.application.config['downstream'][user_id]:
            master_id = self.application.config['downstream'][user_id][
                'master']
        else:
            master_id = user_id

        trans_cls = get_trans_shard(master_id)
        q = session.query(trans_cls).filter(trans_cls.user_id == user_id)
        f = False
        # filter
        if args['account']:
            q = q.filter(trans_cls.account == args['account'])
            f = True
        if args['start'] and args['end']:
            start = time.strptime(args['start'], '%Y/%m/%d %H:%M:%S')
            end = time.strptime(args['end'], '%Y/%m/%d %H:%M:%S')
            q = q.filter(trans_cls.create_time >= start) \
                .filter(trans_cls.create_time < end)
            f = True
        # if args['name']:
        # q = q.filter(trans_cls.status == args['name'])
        # f = True
        if args['type']:
            q = q.filter(trans_cls.type == args['type'])
            f = True

        if not f:
            return self.write(
                json.dumps({
                    'status': 'fail',
                    'msg': '您未选择任何过滤条件,请至少输入一个'
                }))

        count = q.count()
        # print(count)

        max_page = int(math.ceil(count / int(args['size'])))

        q = q.order_by(desc(trans_cls.create_time), desc(trans_cls.id)) \
            .offset((page - 1) * size) \
            .limit(size)

        # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号	订单状态	备注
        '''
            id = Column(Integer, primary_key=True)
            trans_id = Column(String)
            type = Column(String)
            income = Column(Integer)
            outcome = Column(Integer)
            balance = Column(Integer)
            order_id = Column(String)
            user_id = Column(String)
            account = Column(String)
            name = Column(String)
            create_time = Column(DateTime)
            notes = Column(String)
        '''
        for trans in q:
            name = ''
            if trans.name:
                n = trans.name.split(':')
                if len(n) == 3:
                    c = escape_carrier(n[0])
                    p = escape_area(n[1])
                    v = n[2]
                    name = '%s%s%s元直充' % (p, c, v)

            o = {
                'id': trans.trans_id,
                'type': escape_finance_type(trans.type),
                'value': '%.3f' % ((trans.income - trans.outcome) / 10000),
                'balance': '%.3f' % (trans.balance / 10000),
                'order_id': trans.order_id,
                'account': trans.account,
                'time': str(trans.create_time),
                'name': name,
                'notes': trans.notes or '',
            }
            result.append(o)

        session.close()

        self.write(
            json.dumps({
                'data': result,
                'max': max_page,
                'page': page,
                'size': size
            }))
Esempio n. 14
0
    def post_product_supply_list(self):
        domain_id = self.json_args.get('domain_id')

        product_list = list()
        supply_list = list()

        filter_id = self.json_args.get('id', None)
        filter_price = self.json_args.get('price', None)
        filter_name = self.json_args.get('name', None)
        filter_type = self.json_args.get('type', None)
        filter_carrier = self.json_args.get('carrier', None)
        filter_area = self.json_args.get('area', None)
        filter_status = self.json_args.get('status', None)

        page = int(self.json_args['page'])
        size = int(self.json_args['size'])

        session = self.session('repo')

        try:
            #
            supply_map = {}
            q = session.query(RepoRouteSupply).filter(
                RepoRouteSupply.domain_id == domain_id).order_by(
                    RepoRouteSupply.id)

            for supply in q.all():
                supply_map[str(supply.id)] = supply.name

                supply_list.append({'id': supply.id, 'name': supply.name})

            q = session.query(RepoProduct).filter(
                RepoProduct.domain_id == domain_id)

            if filter_id:
                q = q.filter(RepoProduct.product_id == filter_id)

            if filter_price:
                q = q.filter(RepoProduct.price == filter_price)

            if filter_name:
                q = q.filter(RepoProduct.name == filter_name)

            if filter_type:
                q = q.filter(RepoProduct.type == filter_type)

            if filter_carrier:
                q = q.filter(RepoProduct.carrier == filter_carrier)

            if filter_area:
                q = q.filter(RepoProduct.area == filter_area)

            if filter_status:
                q = q.filter(RepoProduct.status == filter_status)

            count = q.count()
            max_page = int(math.ceil(count / size))

            q = q.order_by(RepoProduct.carrier, RepoProduct.area,
                           RepoProduct.scope, RepoProduct.value).offset(
                               (page - 1) * size).limit(size)

            for p in q:
                product_list.append({
                    'id':
                    p.product_id,
                    'name':
                    p.name,
                    'type':
                    p.type,
                    'carrier':
                    p.carrier,
                    'price':
                    p.price,
                    'area':
                    p.area,
                    'use_area':
                    p.use_area,
                    'status':
                    p.status,
                    'value':
                    p.value,
                    'notes':
                    p.notes,
                    'tsp':
                    str(p.update_time),
                    'p1':
                    p.p1,
                    'p2':
                    p.p2,
                    'p3':
                    p.p3,
                    'p4':
                    p.p4,
                    'p5':
                    p.p5,
                    'scope':
                    p.scope,
                    'legacy':
                    p.legacy_id,
                    'routing':
                    p.routing,
                    'routing_n':
                    supply_map.get(p.routing, '(无效的货源)'),
                    'type_n':
                    PRODUCT_TYPE.get(p.type),
                    'carrier_n':
                    escape.escape_carrier(str(p.carrier)),
                    'area_n':
                    escape.escape_area(p.area),
                    'use_area_n':
                    escape.escape_area(p.use_area),
                    'status_n':
                    STATUS.get(p.status),
                })

            resp = json.dumps({
                'status': 'success',
                'page': page,
                'max': max_page,
                'product': product_list,
                'supply': supply_list
            })
        except:
            request_log.exception('LIST PRODUCT-SUPPLY FAIL')
            resp = json.dumps({'status': 'fail'})
        finally:
            session.close()

        self.finish(resp)
Esempio n. 15
0
    def post(self):
        args = self.json_args

        page = int(args['page'])
        size = int(args['size'])

        user_id = args['user_id']

        try:
            # find
            #db = self.mongo.GLaDOS.transaction
            db = self.application.mongo1.GLaDOS.transaction
            f = False
            filter_dict = {}
            #filter_dict['user_id'] = user_id
            if args['account']:
                filter_dict['account'] = args['account']
                f = True
            if args['start'] and args['end']:
                import datetime

                start = time.strptime(args['start'], '%Y/%m/%d %H:%M:%S')
                start = datetime.datetime(start.tm_year, start.tm_mon,
                                          start.tm_mday, start.tm_hour,
                                          start.tm_min)
                end = time.strptime(args['end'], '%Y/%m/%d %H:%M:%S')
                end = datetime.datetime(end.tm_year, end.tm_mon, end.tm_mday,
                                        end.tm_hour, end.tm_min)
                filter_dict['create_time'] = {'$gte': start, '$lte': end}
                f = True
            if args['type']:
                filter_dict['type'] = args['type']
                f = True
            if not f:
                return self.write(
                    json.dumps({
                        'status': 'fail',
                        'msg': '您未选择任何过滤条件,请至少输入一个'
                    }))

            count = db.find(filter_dict).count()
            max_page = int(math.ceil(count / int(args['size'])))
            orders = db.find(filter_dict) \
                .sort([('req_time', pymongo.DESCENDING)]) \
                .skip((page - 1) * size) \
                .limit(size)
            # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号	订单状态	备注
            '''
                id = Column(Integer, primary_key=True)
                trans_id = Column(String)
                type = Column(String)
                income = Column(Integer)
                outcome = Column(Integer)
                balance = Column(Integer)
                order_id = Column(String)
                user_id = Column(String)
                account = Column(String)
                name = Column(String)
                create_time = Column(DateTime)
                notes = Column(String)
            '''
            result = []
            if orders:
                for order in orders:
                    name = ''
                    if order.get('name'):
                        n = order.get('name').split(':')
                        if len(n) == 4:
                            p = n[0]
                            if p == 'data':
                                p = '流量'
                            elif p == 'fee':
                                p = '话费'
                            c = escape_carrier(n[1])
                            a = escape_area(n[2])
                            v = n[3]
                            name = '%s%s%s元%s充值' % (a, c, v, p)

                    o = {
                        'id':
                        order.get('_id'),
                        'type':
                        escape_finance_type(order.get('type')),
                        'value':
                        '%.3f' %
                        ((order.get('income') - order.get('outcome')) / 10000),
                        'balance':
                        '%.3f' % (order.get('balance') / 10000),
                        'order_id':
                        order.get('order_id'),
                        'account':
                        order.get('account'),
                        'time':
                        str(order.get('create_time')),
                        'name':
                        name,
                        'notes':
                        order.get('notes') or '',
                    }
                    result.append(o)

        except Exception:
            request_log.exception('QUERY MONGO ERROR')
            self.send_error(500)
            return
        finally:
            print(
                '--------------------------------finish---------------------------------------'
            )

        self.write(
            json.dumps({
                'data': result,
                'max': max_page,
                'page': page,
                'size': size
            }))
Esempio n. 16
0
    def post(self, product):
        #### SAFTY ######
        safety = self.application.config.get('safety')
        if safety is None:
            request_log.error('CONFIG FAIL (NO SAFETY)')
            return self.send_error(500)

        # verify ip in white list
        if self.request.remote_ip not in safety['white_list']:
            request_log.error("CONFIG FAIL ('%s' NOT IN WHITELIST)",
                              self.request.remote_ip)
            return self.send_error(500)
        #### SAFTY ######

        if product not in PRODUCT_LIST:
            return self.finish()

        product_cache = dict()

        args = self.json_args

        user_id = args['user_id']

        if 'master' in self.application.config['downstream'][user_id]:
            master_id = self.application.config['downstream'][user_id][
                'master']
        else:
            master_id = user_id

        if 'shard_id' in self.application.config['downstream'][user_id]:
            shard_id = self.application.config['downstream'][user_id][
                'shard_id']
        else:
            shard_id = master_id

        session = self.session('madeira')

        order_cls = get_order_shard(shard_id)

        q = session.query(order_cls).filter(
            order_cls.product == product).filter(order_cls.user_id == user_id)
        f = False
        # filter
        if 'number' in args and args['number']:
            q = q.filter(order_cls.mobile == args['number'])
            f = True
        if 'start' in args and 'end' in args and args['start'] and args['end']:
            start = time.strptime(args['start'], '%Y/%m/%d %H:%M:%S')
            end = time.strptime(args['end'], '%Y/%m/%d %H:%M:%S')
            q = q.filter(order_cls.req_time >= start).filter(
                order_cls.req_time < end)
            f = True
        if 'result' in args and args['result']:
            if product == 'fee':
                if args['result'] == '-1':
                    q = q.filter(
                        and_(order_cls.result == '0',
                             order_cls.back_result == None))
                else:
                    q = q.filter(
                        or_(order_cls.back_result == args['result'],
                            order_cls.result == args['result']))
            elif product == 'data':
                if args['result'] == 'finish':
                    q = q.filter(
                        or_(order_cls.back_result == '00000',
                            order_cls.back_result == '1'))
                elif args['result'] == 'processing':
                    q = q.filter(
                        and_(order_cls.result == '00000',
                             order_cls.back_result == None))
                elif args['result'] == 'fail':
                    q = q.filter(
                        or_(
                            and_(order_cls.back_result == None,
                                 order_cls.result != '00000'),
                            and_(order_cls.back_result != None,
                                 order_cls.back_result != '00000',
                                 order_cls.back_result != '1')))
            f = True
        if 'id' in args and args['id']:
            q = q.filter(order_cls.order_id == args['id'])
            f = True
        if 'sp_id' in args and args['sp_id']:
            q = q.filter(order_cls.sp_order_id == args['sp_id'])
            f = True

        if not f:
            return self.write(
                json.dumps({
                    'status': 'fail',
                    'msg': '您未选择任何过滤条件,请至少输入一个'
                }))

        q = q.order_by(desc(order_cls.req_time)).limit(100000)

        path = 'exports/export_%s.xlsx' % user_id
        workbook = xlsxwriter.Workbook(path, {'constant_memory': True})
        worksheet = workbook.add_worksheet()

        worksheet.write(0, 0, '订单编号')
        worksheet.write(0, 1, '代理商订单编号')
        worksheet.write(0, 2, '手机号')
        worksheet.write(0, 3, '产品名称')
        worksheet.write(0, 4, '运营商')
        worksheet.write(0, 5, '面值')
        worksheet.write(0, 6, '采购金额')
        worksheet.write(0, 7, '开始时间')
        worksheet.write(0, 8, '订单状态')
        worksheet.write(0, 9, '状态时间')
        worksheet.write(0, 10, '余额')

        row = 1
        # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号	订单状态	备注
        for order in q:
            carrier = ''
            carrier_name = ''
            area = ''
            if order.area and ':' in order.area:
                carrier, area = order.area.split(':')
                carrier_name = escape_carrier(carrier)
                area_name = escape_area(area)

            worksheet.write(row, 0, order.order_id)
            worksheet.write(row, 1, order.sp_order_id)
            worksheet.write(row, 2, order.mobile)
            worksheet.write(
                row, 3,
                decode_name(self.slave, order, carrier, carrier_name, area,
                            area_name, master_id, product_cache))
            worksheet.write(row, 4, area_name + carrier_name)
            worksheet.write(row, 5, int(order.price))
            worksheet.write(row, 6,
                            (order.value is not None and (order.value / 10000))
                            or '-')
            worksheet.write(row, 7, str(order.req_time))
            worksheet.write(row, 8, decode_status(order))
            worksheet.write(row, 9, order.back_time and str(order.back_time)
                            or '')
            worksheet.write(row, 10, (order.balance is not None and
                                      (order.balance / 10000)) or '-')
            row += 1

            if row % 1000 == 0:
                yield gen.moment

        workbook.close()
        session.close()

        self.write(json.dumps({'status': 'ok', 'path': path}))
Esempio n. 17
0
    def post(self, product):
        #### SAFTY ######
        safety = self.application.config.get('safety')
        if safety is None:
            request_log.error('CONFIG FAIL (NO SAFETY)')
            return self.send_error(500)

        # verify ip in white list
        if self.direct is None and self.request.remote_ip not in safety[
                'white_list']:
            request_log.error("CONFIG FAIL ('%s'NOT IN WHITELIST)",
                              self.request.remote_ip)
            return self.send_error(500)
        #### SAFTY ######

        if product not in PRODUCT_LIST:
            return self.finish()

        product_cache = dict()

        args = self.json_args

        page = int(args['page'])
        size = int(args['size'])

        user_id = args['user_id']

        ### RELOAD ###
        if user_id not in self.application.config['downstream']:
            cfg = yaml.load(open('downstream.yaml', 'r', encoding='utf8'))
            self.application.config['downstream'] = cfg['downstream']

        if user_id not in self.application.config['downstream']:
            return self.send_error(500)

        session = self.session('madeira')
        try:
            result = []

            if 'master' in self.application.config['downstream'][user_id]:
                master_id = self.application.config['downstream'][user_id][
                    'master']
            else:
                master_id = user_id

            if 'shard_id' in self.application.config['downstream'][user_id]:
                shard_id = self.application.config['downstream'][user_id][
                    'shard_id']
            else:
                shard_id = master_id

            order_cls = get_order_shard(shard_id)

            q = session.query(order_cls).filter(
                order_cls.product == product).filter(
                    order_cls.user_id == user_id)
            f = False
            # filter
            if 'number' in args and args['number']:
                q = q.filter(order_cls.mobile == args['number'])
                f = True
            if 'start' in args and 'end' in args and args['start'] and args[
                    'end']:
                start = time.strptime(args['start'], '%Y/%m/%d %H:%M:%S')
                end = time.strptime(args['end'], '%Y/%m/%d %H:%M:%S')
                q = q.filter(order_cls.req_time >= start).filter(
                    order_cls.req_time < end)
                f = True
            if 'result' in args and args['result']:
                if product == 'fee' or product == 'sinopec':
                    if args['result'] == '-1':
                        q = q.filter(
                            and_(order_cls.result == '0',
                                 order_cls.back_result == None))
                    else:
                        q = q.filter(
                            or_(order_cls.back_result == args['result'],
                                order_cls.result == args['result']))
                elif product == 'data':
                    if args['result'] == 'finish':
                        q = q.filter(
                            or_(order_cls.back_result == '00000',
                                order_cls.back_result == '1'))
                    elif args['result'] == 'processing':
                        q = q.filter(
                            and_(order_cls.result == '00000',
                                 order_cls.back_result == None))
                    elif args['result'] == 'fail':
                        q = q.filter(
                            or_(
                                and_(order_cls.back_result == None,
                                     order_cls.result != '00000'),
                                and_(order_cls.back_result != None,
                                     order_cls.back_result != '00000',
                                     order_cls.back_result != '1')))
                f = True
            if 'id' in args and args['id']:
                q = q.filter(order_cls.order_id == args['id'])
                f = True
            if 'sp_id' in args and args['sp_id']:
                q = q.filter(order_cls.sp_order_id == args['sp_id'])
                f = True
            if 'carrier' in args and args['carrier']:
                if 'area' in args and args['area']:
                    q = q.filter(order_cls.area == '%s:%s' %
                                 (args['carrier'], args['area']))
                else:
                    q = q.filter(order_cls.area.like(args['carrier'] + ':%'))
                f = True
            else:
                if 'area' in args and args['area']:
                    q = q.filter(order_cls.area.like('%:' + args['area']))
                f = True

            if not f and not (page == 1 and size <= 10):
                return self.write(
                    json.dumps({
                        'status': 'fail',
                        'msg': '您未选择任何过滤条件,请至少输入一个'
                    }))

            count = q.count()
            # print(count)

            max_page = int(math.ceil(count / int(args['size'])))

            q = q.order_by(desc(order_cls.req_time)) \
                .offset((page - 1) * size) \
                .limit(size)

            # 订单编号	手机号	产品名称	运营商	面值	采购金额	开始时间	状态时间	批次号	订单状态	备注
            for order in q:
                carrier = ''
                carrier_name = ''
                area = ''
                if order.area and ':' in order.area:
                    carrier, area = order.area.split(':')
                    carrier_name = escape_carrier(carrier)
                    area_name = escape_area(area)

                o = {
                    'id':
                    order.order_id,
                    'sp_id':
                    order.sp_order_id,
                    'phone':
                    order.mobile,
                    'price':
                    str(order.price or '-'),
                    'value': (order.value is not None and '%.3f' %
                              (order.value / 10000)) or '-',
                    'create':
                    str(order.req_time),
                    'update':
                    order.back_time and str(order.back_time),
                    'result':
                    decode_status(order),
                    'name':
                    decode_name(self.slave, order, carrier, carrier_name, area,
                                area_name, master_id, product_cache),
                    'carrier':
                    area_name + carrier_name,
                    'balance': (order.balance is not None and '%0.03f' %
                                (order.balance / 10000)) or '-',
                }
                result.append(o)

        finally:
            session.close()

        self.write(
            json.dumps({
                'data': result,
                'max': max_page,
                'page': page,
                'size': size
            }))
Esempio n. 18
0
    def post(self, product):

        args = self.json_args

        if 'admin' not in self.current_user['roles'] or 'user_id' not in args:
            args['user_id'] = self.current_user['partner_id']

        if 'admin' in self.current_user['roles'] and args['user_id'] == '':
            http_client = AsyncHTTPClient()
            try:
                url = '%s/query/mongo/%s' % (
                    self.application.config['blocking']['mongo'], product)
                request = HTTPRequest(url=url,
                                      method='POST',
                                      body=json.dumps(args),
                                      request_timeout=120)
                response = yield http_client.fetch(request)

                if response.code == 200:
                    product_cache = dict()  # per-handler cache

                    body = response.body.decode()
                    r = json.loads(body)
                    r1 = []
                    for order in r.get('data'):
                        user_id = order.get('user_id')
                        if user_id not in self.application.config[
                                'downstream']:
                            continue

                        if 'master' in self.application.config['downstream'][
                                user_id]:
                            master_id = self.application.config['downstream'][
                                user_id]['master']
                        else:
                            master_id = user_id

                        carrier = ''
                        carrier_name = ''
                        area = ''
                        if order.get('area') and ':' in order.get('area'):
                            carrier, area = order['area'].split(':')
                            carrier_name = escape_carrier(carrier)
                            area_name = escape_area(area)

                        _adapter = OrderAdapter(product, order)

                        order['result'] = decode_status(_adapter)
                        order['name'] = decode_name(self.slave, _adapter,
                                                    carrier, carrier_name,
                                                    area, area_name, master_id,
                                                    product_cache)
                        order['carrier'] = area_name + carrier_name
                        if order.product == 'sinopec':
                            order['carrier'] = carrier_name
                        order['user_name'] = self.application.config[
                            'downstream'][user_id]['name']
                        r1.append(order)
                    r['data'] = r1
                    self.finish(json.dumps(r))
                else:
                    self.send_error(500)
            except Exception:
                request_log.exception('QUERY CHAIN')
                self.send_error(500)

            finally:
                http_client.close()

        elif self.application.config.get(
                'blocking') and self.application.config['blocking'].get('url'):
            url = '%s/query/block/%s' % (
                self.application.config['blocking']['url'], product)
            http_client = AsyncHTTPClient()
            try:
                request = HTTPRequest(url=url,
                                      method='POST',
                                      body=json.dumps(args),
                                      request_timeout=120)
                response = yield http_client.fetch(request)

                if response.code == 200:
                    body = response.body.decode('utf8')
                    self.finish(body)
                else:
                    self.send_error(500)
            except Exception:
                request_log.exception('QUERY CHAIN')
                self.send_error(500)

            finally:
                http_client.close()

        else:
            # fallback
            o = OrderBlockingQueryHandler(self.application, self.request)
            o.json_args = args
            o.direct = True
            o.post(product)
            self._headers = o._headers
            self._status_code = o._status_code
            self._write_buffer = o._write_buffer
            self.finish()
Esempio n. 19
0
    def post_add_or_update(self):
        domain_id = self.json_args.get('domain_id')
        user_id = self.json_args.get('user_id')
        product_id = self.json_args.get('product_id')
        value = self.json_args.get('value')
        status = self.json_args.get('status')
        supply = self.json_args.get('supply')
        notes = self.json_args.get('notes')

        session = self.session('repo')
        try:
            special = session.query(RepoSpecial).filter(RepoSpecial.user_id == user_id).filter(
                RepoSpecial.product_id == product_id).first()

            product = session.query(RepoProduct).filter(RepoProduct.domain_id == domain_id).filter(
                RepoProduct.product_id == product_id).one()

            is_new = False
            if special:
                if value:
                    special.value = value
                    special.update_value_time = dt.now()
                if status:
                    special.status = status
                    special.update_status_time = dt.now()
                if supply:
                    special.supply = supply
                    special.update_supply_time = dt.now()
                if notes:
                    special.notes = notes

                special.update_time = dt.now()

            else:
                special = RepoSpecial()
                special.user_id = user_id
                special.value = value
                special.status = status or product.status
                special.supply = supply
                special.notes = notes
                special.product_id = product_id
                special.update_time = dt.now()
                special.update_status_time = dt.now()
                special.update_supply_time = dt.now()
                special.update_value_time = dt.now()
                is_new = True

            session.add(special)
            session.commit()
            status, status_n = escape_status(product.status, special.status)
            data = {
                'id': product.product_id,
                'name': product.name,
                'type': product.type,
                'carrier': product.carrier,
                'price': product.price,
                'area': product.area,
                'use_area': product.use_area,
                'status': status,
                'p1': product.p1,
                'p2': product.p2,
                'p3': product.p3,
                'p4': product.p4,
                'p5': product.p5,
                'scope': product.scope,
                'legacy': product.legacy_id,
                'routing': product.routing,
                'type_n': PRODUCT_TYPE.get(product.type),
                'carrier_n': escape.escape_carrier(str(product.carrier)),
                'area_n': escape.escape_area(product.area),
                'use_area_n': escape.escape_area(product.use_area),
                'status_n': STATUS.get(status),
                'product_value': special.value,
                'user_id': special.user_id,
                'user_name': special.user_id,
                'product_id': product.product_id,
                'value': int(special.value or product.value),
                'tsp': str(special.update_time),
                'tsp_status': str(special.update_status_time),
                'tsp_supply': str(special.update_supply_time),
                'tsp_value': str(special.update_value_time),
                'notes': special.notes
            }

            self.finish(json.dumps({'status': 'ok', 'is_new': is_new, 'data': data}))

            # yield core.sync_pricing(session, domain_id, filter_product=product_id, filter_user=user_id)
            self.master.lpush('list:sync:pricing',
                              '{domain_id},{product_id},{user_id}'.format(
                                  domain_id=domain_id, product_id=product_id, user_id=user_id))

        except ValueError as e:
            self.finish(json.dumps({'status': 'fail', 'msg': str(e)}))

        finally:
            session.close()
Esempio n. 20
0
    def post_list_value(self):
        domain_id = self.json_args.get('domain_id')
        user_id = self.json_args.get('user_id', None)
        product_id = self.json_args.get('product_id', None)

        #新增加的密价搜索条件 type 为系统保留字,加个前缀
        product_type = self.json_args.get('type', None)
        carrier = self.json_args.get('carrier', None)
        price = self.json_args.get('price', None)
        value = self.json_args.get('value', None)
        area = self.json_args.get('area', None)
        use_area = self.json_args.get('use_area', None)
        name = self.json_args.get('name', None)
        status = self.json_args.get('status', None)
        page = int(self.json_args['page'])
        size = int(self.json_args['size'])
        session = self.session('repo')

        user_level = {}
        try:
            if user_id:
                # by-user
                q = session.query(RepoProduct, RepoSpecial).outerjoin(
                    RepoSpecial, and_(
                        RepoSpecial.product_id == RepoProduct.product_id,
                        RepoSpecial.user_id == user_id
                    )).filter(RepoProduct.domain_id == domain_id)
            else:
                q = session.query(RepoProduct, RepoSpecial).filter(RepoProduct.domain_id == domain_id).filter(
                    RepoSpecial.product_id == RepoProduct.product_id).filter(RepoSpecial.value >= 0)

            if product_type:
                q = q.filter(RepoProduct.type == product_type)

            if carrier:
                q = q.filter(RepoProduct.carrier == carrier)

            if price:
                q = q.filter(RepoProduct.price == price)

            if value:
                q = q.filter(RepoProduct.value == value)

            if area:
                q = q.filter(RepoProduct.area == area)

            if use_area:
                q = q.filter(RepoProduct.use_area == use_area)

            if name:
                q = q.filter( RepoProduct.name.like('%'+name+'%') )

            if status:
                q = q.filter(RepoProduct.status == status)

            if product_id:
                q = q.filter(RepoSpecial.product_id == product_id)

            count = q.count()
            max_page = int(math.ceil(count / size))

            product_list = []
            if user_id:
                q = q.order_by(RepoProduct.carrier, RepoProduct.area, RepoProduct.scope,
                               RepoProduct.value).offset((page - 1) * size).limit(size)
            else:
                q = q.order_by(RepoSpecial.user_id, RepoProduct.carrier, RepoProduct.area, RepoProduct.scope,
                               RepoProduct.value).offset((page - 1) * size).limit(size)

            for p, s in q:
                if s:
                    if s.user_id in user_level:
                        level = user_level.get(s.user_id)
                    else:
                        level = self.get_level(session, s.user_id)
                        user_level[s.user_id] = level
                elif user_id:
                    if user_id in user_level:
                        level = user_level.get(user_id)
                    else:
                        level = self.get_level(session, user_id)
                        user_level[user_id] = level

                product_list.append({
                    'id': p.product_id,
                    'name': p.name,
                    'type': p.type,
                    'carrier': p.carrier,
                    'price': p.price,
                    'area': p.area,
                    'use_area': p.use_area,
                    'status': p.status,
                    'p1': p.p1,
                    'p2': p.p2,
                    'p3': p.p3,
                    'p4': p.p4,
                    'p5': p.p5,
                    'scope': p.scope,
                    'legacy': p.legacy_id,
                    'routing': p.routing,
                    'type_n': PRODUCT_TYPE.get(p.type),
                    'carrier_n': escape.escape_carrier(str(p.carrier)),
                    'area_n': escape.escape_area(p.area),
                    'use_area_n': escape.escape_area(p.use_area),
                    'status_n': STATUS.get(p.status),
                    'product_value': getattr(p, level),
                    'user_id': s and s.user_id or user_id,
                    'user_name': s and s.user_id or user_id,
                    'product_id': p.product_id,
                    'value': s and s.value and int(s.value),
                    'tsp': s and s.update_time and str(s.update_time),
                    'tsp_status': s and s.update_status_time and str(s.update_status_time),
                    'tsp_supply': s and s.update_supply_time and str(s.update_supply_time),
                    'tsp_value': s and s.update_value_time and str(s.update_value_time),
                    'notes': s and s.notes,
                })

            self.finish(json.dumps({
                'status': 'success',
                'page': page,
                'max': max_page,
                'list': product_list
            }))

        finally:
            session.close()
Esempio n. 21
0
    def post_list_product(self):
        domain_id = self.json_args.get('domain_id')
        user_id = self.json_args.get('user_id')

        filter_id = self.json_args.get('id')
        filter_price = self.json_args.get('price')
        filter_name = self.json_args.get('name')
        filter_type = self.json_args.get('type')
        filter_carrier = self.json_args.get('carrier')
        filter_area = self.json_args.get('area')
        filter_status = self.json_args.get('status')

        session = self.session('repo')

        try:
            q = session.query(RepoProduct).filter(RepoProduct.domain_id == domain_id)
            if filter_id:
                q = q.filter(RepoProduct.product_id.like('%'+filter_id+'%'))

            if filter_price:
                q = q.filter(RepoProduct.price == filter_price)

            if filter_name:
                q = q.filter(RepoProduct.name.like('%'+filter_name+'%'))

            if filter_type:
                q = q.filter(RepoProduct.type == filter_type)

            if filter_carrier:
                q = q.filter(RepoProduct.carrier == filter_carrier)

            if filter_area:
                q = q.filter(RepoProduct.area == filter_area)

            if filter_status:
                q = q.filter(RepoProduct.status == filter_status)

            count = q.count()

            page = int(self.json_args['page'])
            size = int(self.json_args['size'])

            max_page = int(math.ceil(count / size))

            product_list = []
            q = q.order_by(RepoProduct.carrier, RepoProduct.area, RepoProduct.scope, RepoProduct.value).offset(
                (page - 1) * size).limit(
                    size)

            # special status ...
#            enabled_set = set()
#            disabled_set = set()

            enabled_set = {}
            disabled_set = {}

            qs = session.query(RepoSpecial).filter(RepoSpecial.user_id == user_id).filter(
                RepoSpecial.status != None)

            for s in qs.all():
                if s.status == 'enabled':
#                    enabled_set.add(s.product_id)
                    enabled_set[s.product_id] = str(s.update_status_time)
                else:
#                    disabled_set.add(s.product_id)
                    disabled_set[s.product_id] = str(s.update_status_time)

            for p in q:
                if p.status == 'disabled':
                    if p.product_id in enabled_set:
                        status = 'forced-enabled'
                    else:
                        status = 'n/a'
                    tsp = enabled_set.get(p.product_id, None)
                else:
                    if p.product_id in disabled_set:
                        status = 'disabled'
                    else:
                        status = 'enabled'
                    tsp = disabled_set.get(p.product_id, None)

                product_list.append({
                    'id': p.product_id,
                    'name': p.name,
                    'type': p.type,
                    'carrier': p.carrier,
                    'price': p.price,
                    'area': p.area,
                    'use_area': p.use_area,
                    'status': status,
                    'value': p.value,
                    'notes': p.notes,
#                    'tsp': str(p.update_time),
                    'tsp': tsp,
                    'p1': p.p1,
                    'p2': p.p2,
                    'p3': p.p3,
                    'p4': p.p4,
                    'p5': p.p5,
                    'scope': p.scope,
                    'legacy': p.legacy_id,
                    'routing': p.routing,
                    'type_n': PRODUCT_TYPE.get(p.type),
                    'carrier_n': escape.escape_carrier(str(p.carrier)),
                    'area_n': escape.escape_area(p.area),
                    'use_area_n': escape.escape_area(p.use_area),
                    'status_n': STATUS.get(status),
                    'user_id': user_id,
                })

            self.finish(json.dumps({
                'status': 'ok',
                'page': page,
                'max': max_page,
                'list': product_list
            }))

        finally:
            session.close()
Esempio n. 22
0
    def get(self, path):
        if 'admin-route' not in self.current_user['roles']:
            self.send_error(403)
            return

        http_client = AsyncHTTPClient()

        if path == 'supply/list':

            try:
                base_url = self.application.config['connection']['repo']

                url = base_url + '/api/route/supply/list?domain_id=' + self.current_user[
                    'domain_id']
                response = yield http_client.fetch(url, method='GET')
                resp = response.body.decode()
                self.finish(resp)

            finally:
                http_client.close()

        elif path == 'maintain/list':

            try:
                partner_id = self.current_user['partner_id']
                base_url = self.application.config['downstream'][partner_id][
                    'shard']
                url = 'http://%s/admin/config?keys=%s&with_ttl=true' % (
                    base_url, quote("maintain:*"))
                response = yield http_client.fetch(url, method='GET')

                body = response.body.decode()

                if_map = self.application.config.get('interface')
                downstream = self.application.config.get('downstream')

                maintain_list = []
                for line in sorted(body.strip().split('\n')):
                    request_log.debug('MAINTAIN {%s}', line)

                    if line != '':
                        key, notes, ttl = line.split(' ')
                        values = key.split(':')
                        if len(values) < 4 or len(values) > 5:
                            request_log.error('UNKNOWN MAINTAIN FORMAT %s',
                                              line)
                            continue

                        ttl_name = self.get_name(ttl)

                        route = values[1]
                        route_n = if_map.get(route, route)
                        carrier = values[2]
                        carrier_n = escape_carrier(carrier)
                        area = values[3]
                        area_n = escape_area(area)
                        if len(values) > 4:
                            user_id = values[4]
                            user_name = downstream.get(user_id, {
                                'name:': '*'
                            }).get('name')
                        else:
                            user_id = None
                            user_name = '(全部)'

                        maintain_list.append({
                            'key': key,
                            'route': route,
                            'route_n': route_n,
                            'carrier': carrier,
                            'carrier_n': carrier_n,
                            'area': area,
                            'area_n': area_n,
                            'user_id': user_id,
                            'user_name': user_name,
                            'ttl_name': ttl_name,
                            'notes': unquote(notes)
                        })

                self.finish(json.dumps(maintain_list))

            finally:
                http_client.close()

        elif path == 'pool/list':
            try:
                partner_id = self.current_user['partner_id']
                base_url = self.application.config['downstream'][partner_id][
                    'shard']
                url = 'http://%s/admin/config?keys=%s' % (base_url,
                                                          quote("pool:*"))
                response = yield http_client.fetch(url, method='GET')

                body = response.body.decode()
                r_db0 = self.application.sentinel.master_for('madeira', db=0)
                keys_list = r_db0.keys("pool:*")
                datapool_list = []
                for line in sorted(body.strip().split('\n')):
                    if line != '':
                        madeira_key, value = line.split(' ')
                        for key in keys_list:
                            if key == madeira_key:
                                tmp_dict = r_db0.hgetall(key)
                                tmp_dict['key'] = key
                                datapool_list.append(tmp_dict)
                                tmp_dict['number'] = value
                                datapool_list.append(tmp_dict)

                resp_data = {'status': "ok", 'data': datapool_list}
                self.finish(json.dumps(resp_data))

            except Exception as e:
                request_log.exception('QUERY POOL FAIL')
                #self.finish(json.dumps({"msg": "查询异常:" + repr(e)}))
                self.send_error(500)
            finally:
                http_client.close()

        elif path == 'pool/interface':
            try:
                r_db0 = self.application.sentinel.master_for('madeira', db=0)
                keys_list = r_db0.keys("pool:*")

                datapool_interface_list = []
                for key in keys_list:
                    tmp_dict = r_db0.hgetall(key)
                    tmp_dict['key'] = key
                    datapool_interface_list.append(tmp_dict)

                resp_data = {'status': "ok", 'data': datapool_interface_list}
                self.finish(json.dumps(resp_data))

            except Exception as e:
                request_log.exception('QUERY POOL INTERFACE FAIL')
                #self.finish(json.dumps({"msg": "查询异常:" + repr(e)}))
                self.send_error(500)

        else:
            self.send_error(404)
Esempio n. 23
0
    def post(self):

        args = self.json_args
        page = args.get('page')
        size = args.get('size')
        max_page = 0

        result = []

        try:
            if 'admin' not in self.current_user['roles']:
                user_id = self.current_user['partner_id']
            else:
                user_id = args.get('user_id')

            criteria = {}

            if user_id:
                criteria['user_id'] = user_id

            if args.get('order_id'):
                criteria['order_id'] = args.get('order_id')

            if args.get('account'):
                criteria['account'] = args.get('account')

            if args.get('start') and args.get('end'):
                start = datetime.strptime(args.get('start'), '%Y/%m/%d %H:%M:%S')
                end = datetime.strptime(args.get('end'), '%Y/%m/%d %H:%M:%S')


                criteria['create_time'] = {'$gte': start, '$lt': end}

            if args.get('type'):
                criteria['type'] = args.get('type')

            if len(criteria) <= 1:
                return self.write(json.dumps({'status': 'fail', 'msg': '您未选择任何过滤条件,请至少输入一个'}))

            trans_collection = self.application.glados_client.GLaDOS.transaction

            request_log.info('QUERY FINANCE %s', criteria)

            count = yield trans_collection.find(criteria).count()

            request_log.info('QUERY FINANCE COUNT=%d', count)

            max_page = int(math.ceil(count / int(args['size'])))

            cursor = trans_collection.find(criteria).sort([('_id', -1)]).skip((page - 1) * size).limit(size)

            while (yield cursor.fetch_next):
                trans_doc = cursor.next_object()

                name = ''
                if trans_doc.get('name'):
                    n = trans_doc.get('name').split(':')
                    if len(n) == 3:
                        c = escape_carrier(n[0])
                        p = escape_area(n[1])
                        v = n[2]
                        name = '%s%s%s元直充' % (p, c, v)

                t = {
                    'id': trans_doc.get('_id'),
                    'user_id': trans_doc.get('user_id'),
                    'type': escape_finance_type(trans_doc.get('type')),
                    'value': '%.3f' % ((trans_doc.get('income') - trans_doc.get('outcome')) / 10000),
                    'balance': '%.3f' % (trans_doc.get('balance') / 10000),
                    'order_id': trans_doc.get('order_id'),
                    'account': trans_doc.get('account'),
                    'time': str(trans_doc.get('create_time')),

                    'name': trans_doc.get('name'),
                    'notes': trans_doc.get('notes') or ''
                }

                result.append(t)

        except:
            request_log.exception('FAIL ON QUERY2')

        self.write(json.dumps({
            'data': result,
            'max': max_page,
            'page': page,
            'size': size
        }))