Beispiel #1
0
def get_card_values(first_code, last_code, card_id):
    """
    银行卡:获取卡片年度权益价值和消费收益价值
    :param random_str: 8位随机字符串
    :param token:
    :param first_code:
    :param last_code:
    :param card_id:
    :return: 卡片年度权益价值和消费收益价值
    """
    if not first_code or len(first_code) != 8 or not first_code.isdigit() or \
            not last_code or len(last_code) != 4 or not last_code.isdigit() or not card_id:
        raise ServerExceptions.FORMAT_ERROR

    end_date = time.strftime('%Y-%m-%d 00:00:00', time.localtime(time.time()))

    # TODO ORM化
    sql = 'select id, bin_code, (select sum(repay) from act  where status=1 and end_date > \'{}\' and ' \
          'id in (select act_id from act_card_ref where card_id={})) from card where id={};'.format(
           end_date, card_id, card_id)
    card_info = DBSession().execute(sql).fetchone()
    card_id, bin_code, cost_value = card_info

    # 判断bin 的前6位是不是一样的
    if not [bc for bc in bin_code if bc.startswith(first_code[:6])]:
        raise ServerExceptions.DATA_NOT_FOUND

    benefits = DBSession().query(CardBenefit.id, CardBenefit.pay, CardBenefit.repay, CardBenefit.usage_count, CardBenefit.period_type).filter(
        CardBenefitRef.benefit_id == CardBenefit.id, CardBenefitRef.card_id == card_id,
        CardBenefitRef.status == 1, CardBenefit.status == 1).all()

    benefit_keys = ("id", "pay", "repay", "usage_count", "period_type")
    benefit_data = [dict(zip(benefit_keys, cf)) for cf in benefits]
    year_benefit = 0.0
    for benefit in benefit_data:
        if benefit.get('period_type') == CardBenefit.PERIOD_TYPE_SEASON and benefit['usage_count']:
            benefit['usage_count'] *= 4
        elif benefit.get('period_type') == CardBenefit.PERIOD_TYPE_MONTH and benefit['usage_count']:
            benefit['usage_count'] *= 12
        if benefit['repay'] and float(benefit['repay']) and benefit['usage_count'] and int(benefit['usage_count']):
            year_benefit += float(benefit['repay']) * benefit['usage_count']

    return {
        'year_benefit': year_benefit,
        'cost_value': cost_value,
        'currency': u'人民币',
    }
Beispiel #2
0
def check_access_key(token, endpoint):
    config = current_app.config
    # 判断access_key是否有效, 如果redis里面有这个company id,就表示公司存在,如果没有就去数据库查找
    company_key = 'company:{}'.format(token)
    company_id = get_rds(company_key)
    if not company_id:
        companys = DBSession().query(AccessKey.company_id, TokenHistory.create_time)\
            .filter(TokenHistory.token == token, TokenHistory.status == 1,
                    AccessKey.access_key == TokenHistory.access_key, AccessKey.status == 1).first()
        if not companys:
            logger.error('没有找到用户账号, token:{}, company_id:{}'.format(
                token, company_id))
            raise ServerExceptions.TOKEN_ERROR
        company_id, token_create_time = companys
        # 判断token有没有过期
        t = token_create_time + datetime.timedelta(
            seconds=config['TOKEN_MAX_EFFECTIVE_SEC']) - datetime.datetime.now(
            )
        if t <= datetime.timedelta(seconds=0):
            TokenHistory.set_invaild_token(token)
            raise ServerExceptions.TOKEN_ERROR
        set_rds_ex(company_key, company_id, t.seconds)

    print token, endpoint, company_id
    # 判断访问接口的权限
    access_right = get_rds('access_right:{}:{}'.format(token, endpoint))
    if not access_right:
        ref = DBSession().query(Uri).filter(
            Uri.endpoint == endpoint, UriAccessRef.company_id == company_id,
            Uri.id == UriAccessRef.uri_id, Uri.status == 1,
            UriAccessRef.status == 1).first()
        if not ref:
            logger.error('没有访问权限, token:{}, company_id:{}'.format(
                token, company_id))
            raise ServerExceptions.ACCESS_RIGHT_ERROR
        set_rds_ex('access_right:{}:{}'.format(token, endpoint), 1,
                   config['RDS_TIME'])

    return company_id
Beispiel #3
0
def get_card_benefits(first_code, last_code, card_id):
    verify_and_get(first_code, last_code, card_id)
    benefits = DBSession().query(CardBenefit.id, CardBenefit.pay, CardBenefit.repay).filter(
        CardBenefitRef.card_id == card_id, CardBenefitRef.status == 1, CardBenefitRef.benefit_id == CardBenefit.id,
        CardBenefit.status == 1).all()

    benefit_keys = ("id", "pay", "repay")
    benefit_data = [dict(zip(benefit_keys, cf)) for cf in benefits]
    for benefit in benefit_data:
        benefit.update({'pay_currency': u'人民币' if benefit.get('pay') else None, 'repay_currency': u'人民币' if benefit.get('repay') else None})
    card_info = {
        'card_benefit': benefit_data,
    }
    return card_info
Beispiel #4
0
def get_card_benefits_graphics(first_code, last_code, card_id, category_style):
    if not category_style in (1, 2):
        raise ServerExceptions.FORMAT_ERROR

    verify_and_get(first_code, last_code, card_id)
    benefits = DBSession().query(CardBenefit.id, CardBenefit.pay, CardBenefit.repay, CardBenefit.tags).filter(
        CardBenefitRef.card_id == card_id, CardBenefitRef.status == 1, CardBenefitRef.benefit_id == CardBenefit.id,
        CardBenefit.status == 1).all()

    benefit_keys = ("id", "pay", "repay", "tags")
    benefit_data = [dict(zip(benefit_keys, cf)) for cf in benefits]
    all_repay = 0
    benefit_dict = {}

    for benefit in benefit_data:
        tag_list = benefit['tags']
        new_category = None
        if len(tag_list) > 1:
            if category_style == 1:
                new_category = tag_list[0]['name']
            elif category_style == 2:
                new_category = u'综合'
        else:
            new_category = tag_list[0]['name'] if len(tag_list) == 1 else u'其他'

        repay = float(benefit['repay']) if benefit['repay'] else 0.0
        all_repay += repay
        if benefit_dict.get(new_category, None):
            benefit_dict[new_category] += repay
        else:
            benefit_dict[new_category] = repay

    result = []
    for (key, val) in benefit_dict.items():
        result.append({
            'category': key,
            'rate': float(val / all_repay),
        })
    return result
Beispiel #5
0
 def mget_fields(cls, ids):
     if not ids:
         return []
     return DBSession().query(cls.id,
                              cls.repay).filter(cls.id.in_(ids),
                                                cls.status == 1).all()
Beispiel #6
0
 def mget_online(cls, ids):
     if not ids:
         return []
     return DBSession().query(cls).filter(
         cls.id.in_(ids), cls.status == 1,
         cls.end_date > datetime.datetime.today().date()).all()
Beispiel #7
0
 def mget_fields(cls, ids):
     if not ids:
         return []
     return DBSession().query(cls.id, cls.pay, cls.repay, cls.category,
                              cls.usage_scene).filter(
                                  cls.id.in_(ids), cls.status == 1).all()
Beispiel #8
0
 def set_invaild_token(cls, token):
     row = DBSession().query(cls).filter(cls.token == token).first()
     if not row:
         row.status = 0
         row.save()