コード例 #1
0
 def __init__(self, env, serial_no):
     """
     :param env: 环境
     :param serial_no: 序列号
     """
     self.mongo = MongoUntil(env)
     self.serial_no = serial_no
コード例 #2
0
 def __init__(self, env, serial_no, mongdb='skynet'):
     self.env = env
     self.mysql = MysqlUntil(env=self.env)
     self.mongo = MongoUntil(self.env)
     result = self.mongo.query_by_user_id(mongdb, "skynet_user_info", {"serial_no": serial_no})
     if not result:
         return
     self.result = result[0]
     self.customer_id = self.result.get('customer_id')
     self.user_id = self.result.get('user_id')
     self.user_name = factor_decrypt_identity(self.result.get('encryption_user_name'))
     self.event_time = self.result.get('event_time')
     self.cert_id = factor_decrypt_identity(self.result.get('encryption_cert_id'))
     self.phone = factor_decrypt_identity(self.result.get('encryption_phone'))
     self.create_time = self.result.get('create_time')
     if self.result.get('event_time'):
         self.event_time_add8h = self.result.get('event_time') + timedelta(hours=8)
     self.product_code = self.result.get('product_code')
     self.scene_code = self.result.get('scene_code')
     if self.result.get('data',{}):
         self.old_user_id = self.result.get('data',{}).get('oldUserId')
         self.colleagueContact = self.result.get('data', {}).get('colleagueContact')
         self.relativeContact = self.result.get('data', {}).get('relativeContact')
         self.friendContact = self.result.get('data', {}).get('friendContact')
         self.homeAddress = self.result.get('data', {}).get('homeAddress')
         self.unitsName =self.result.get('data', {}).get('unitsName')
         self.unitsAddress=self.result.get('data',{}).get('unitsAddress')
コード例 #3
0
ファイル: FactorInit.py プロジェクト: xiaominwanglast/factnew
    def __init__(self, env, serial_no):
        self.env = env
        self.serial_no = serial_no
        self.info = InfoHelper(env=self.env, serial_no=self.serial_no)
        self.mysql = MysqlUntil(env=self.env)
        self.mongo = MongoUntil(env=self.env)

        #TODO 立即贷产品编号为10002
        #TODO 随心借产品编号为102
        #TODO 卡带王产品编号为101
        #TODO 即刻贷产品编号10002(老产品)
        #TODO 贷款王茶品编号很多,名单库使用100(老产品)
        #TODO 2345借款产品编号108
        # TODO 畅借款产品编号109z

        self.ql_product_id = 109
        self.ljd_product_id = 10002
        self.sxj_product_id = 102
        self.kdw_product_id = 101
        self.rota_jkd_product_id = 10002
        self.rota_dkw_product_id = 100
        self.JK_product_id = 108

        #TODO 立即贷产品code为vip_code
        #TODO 随心借产品code为sxj_code
        #TODO 卡带王产品code为kdw_code
        self.ljd_product_code = "vip_code"
        self.sxj_product_code = "sxj_code"
        self.kdw_product_code = "kdw_code"
        self.JK_product_code = 'jk_code'
        self.QL_product_code = 'ql_loan'

        #TODO -9999999:风控可接受的不可抗异常,比如:调用外部黑名单超时,设置因子为self.SET_DEFAULT_VALUE_INT_9999999,这样风控可以决定是过还是拒,而不是卡件;
        #TODO -9999998:分母为零的情况;
        #TODO -9999997:性能取舍,如:根据用户设备号获取同设备号用户的逾期情况时,同设备号匹配到的用户过多,无法在要求时间内计算出结果,评估影响后,当匹配到用户数大于999时,直接设置因子值为-9999997
        #TODO -9999996:脏数据,如:1、用户的身份证号为空(而根据业务逻辑身份证号本不应该为空);2、外部数据调用时返回的分数字段为空(本不应该为空的)
        #TODO -9999995:客观上不满足因子计算条件,如:用户登录间隔,但是用户只登陆了一次;
        #TODO -8888888:程序无法处理的异常,未知异常等,发生这些异常卡件,如:数据库查询失败、远程接口调用失败;
        self.SET_DEFAULT_VALUE_INT_9999999 = -9999999
        self.SET_DEFAULT_VALUE_INT_9999998 = -9999998
        self.SET_DEFAULT_VALUE_INT_9999997 = -9999997
        self.SET_DEFAULT_VALUE_INT_9999996 = -9999996
        self.SET_DEFAULT_VALUE_INT_9999995 = -9999995
        self.SET_DEFAULT_VALUE_INT_8888888 = -8888888

        #TODO 针对异常值为小数时的数据
        self.SET_DEFAULT_VALUE_FLOAT_9999998 = -9999998.0
        self.SET_DEFAULT_VALUE_FLOAT_9999997 = -9999997.0
        self.SET_DEFAULT_VALUE_FLOAT_9999996 = -9999996.0
        self.SET_DEFAULT_VALUE_FLOAT_9999995 = -9999995.0
        self.SET_DEFAULT_VALUE_FLOAT_9999999 = -9999999.0
        self.SET_DEFAULT_VALUE_FLOAT_9999999 = -9999999.0

        #TODO 针对时间的异常值(元年-8H)
        self.SET_DEFAULT_VALUE_STRING_DATETIME = "0000-12-29 16:00:00"

        #TODO 针对数据取0或分数取0.0,数据取1
        self.SET_DEFAULT_VALUE_INT_0 = 0
        self.SET_DEFAULT_VALUE_FLOAT_0 = 0.0
        self.SET_DEFAULT_VALUE_INT_1 = 1
コード例 #4
0
ファイル: RunnerInit.py プロジェクト: xiaominwanglast/factnew
 def decision_status_check(self):
     # pass
     # decision_result=MongoUntil(self.env).query_by_user_id(db='skynet', collection="skynet_decision_result",find={"serial_no": self.serial_no})
     # if not decision_result:
     #     print 'make decision Failure! please check door!'
     #     sys.exit()
     # if decision_result[0].get('status')=='SUCCESS':
     #     if decision_result[0].get('mock'):
     #         print "make decision mock true! Please change mock value to false!"
     #         sys.exit()
     # else:
     #     print "make decision Failure or Waiting! Please check!"
     #     sys.exit()
     decision_result=MongoUntil(self.env).query_by_user_id(db='skynet', collection="skynet_decision_result",find={"serial_no": self.serial_no})
     if not decision_result:
         print 'make decision Failure! please check door!'
         sys.exit()
     if decision_result[0].get('status')=='SUCCESS':
         if decision_result[0].get('mock'):
             print "make decision mock true! Please change mock value to false!"
             sys.exit()
     else:
         print "make decision Failure or Waiting! Please check!"
         sys.exit()
     user_info_result = MongoUntil(self.env).query_by_user_id(db='skynet', collection="skynet_user_info",find={"serial_no": self.serial_no})
     if user_info_result and user_info_result[0].get("scene_code")=="collection":
         return
     decision_result=MongoUntil(self.env).query_by_user_id(db='skynet', collection="skynet_decision_result",find={"serial_no": self.serial_no})
     if not decision_result:
         print 'make decision Failure! please check door!'
         sys.exit()
     if decision_result[0].get('status') in ("SUCCESS","MA_WAITING"):
         if decision_result[0].get('mock'):
             print "make decision mock true! Please change mock value to false!"
             sys.exit()
         if decision_result[0].get('product_code')!='jk_loan' and decision_result[0].get("main_rules").get("freeze_list_rule").get("result")==1:
             print "make decision freezed ! Please remove cerd_id from rota_freeze and take care of redis!"
             sys.exit()
     else:
         print "make decision Failure or Waiting! Please check!"
         sys.exit()
コード例 #5
0
class InfoHelper(object):
    def __init__(self, env, serial_no, mongdb='skynet'):
        self.env = env
        self.mysql = MysqlUntil(env=self.env)
        self.mongo = MongoUntil(self.env)
        result = self.mongo.query_by_user_id(mongdb, "skynet_user_info", {"serial_no": serial_no})
        if not result:
            return
        self.result = result[0]
        self.customer_id = self.result.get('customer_id')
        self.user_id = self.result.get('user_id')
        self.user_name = factor_decrypt_identity(self.result.get('encryption_user_name'))
        self.event_time = self.result.get('event_time')
        self.cert_id = factor_decrypt_identity(self.result.get('encryption_cert_id'))
        self.phone = factor_decrypt_identity(self.result.get('encryption_phone'))
        self.create_time = self.result.get('create_time')
        if self.result.get('event_time'):
            self.event_time_add8h = self.result.get('event_time') + timedelta(hours=8)
        self.product_code = self.result.get('product_code')
        self.scene_code = self.result.get('scene_code')
        if self.result.get('data',{}):
            self.old_user_id = self.result.get('data',{}).get('oldUserId')
            self.colleagueContact = self.result.get('data', {}).get('colleagueContact')
            self.relativeContact = self.result.get('data', {}).get('relativeContact')
            self.friendContact = self.result.get('data', {}).get('friendContact')
            self.homeAddress = self.result.get('data', {}).get('homeAddress')
            self.unitsName =self.result.get('data', {}).get('unitsName')
            self.unitsAddress=self.result.get('data',{}).get('unitsAddress')


    def get_mobile_location(self, phone, locatin_type='city'):
        sql = "select * from dict_mobile_location where mobile = '%s';" % str(phone)[:7]
        result = self.mysql.queryall_by_customer_id('skynet', sql)
        if len(result) > 0:
            if locatin_type == 'city':
                return result[0]['city']
            if locatin_type == 'province':
                return result[0]['province']
        else:
            return False

    def get_mobile_location_list(self, phone_list, locatin_type='city'):
        phone_location = []
        for phone in phone_list:
            phon_location = self.get_mobile_location(phone, locatin_type=locatin_type)
            if phon_location:
                phone_location.append(phon_location)
        return list(set(phone_location))

    def get_mobile_location_list_not_dict(self, phone_list):
        phone_location = []
        if len(phone_list) == 0:
            return []
        for phone in phone_list:
            phon_location = self.get_mobile_location(phone)
            if phon_location:
                phone_location.append(phon_location)
        return phone_location

    def get_mobilephone_one_after_cleaned(self, phone):
        if not phone and not isinstance(phone, str):
            return False
        phone = phone.replace('-', '').replace(' ', '').replace("\t", "").replace("\r", "").replace("\n", "").replace(
            "\r\n", "")
        if len(phone) > 11 and phone[:1] == "+":
            phone = phone[3:]
        if len(phone) > 11 and phone[:2] == "86":
            phone = phone[2:]
        if len(phone) > 11 and (phone[:5] == "17951" or phone[:5] == "12593"):
            phone = phone[5:]
        try:
            int(phone)
        except:
            return False
        if re.match("^(1[34578](\\d{9}))$", str(phone)):
            return phone
        else:
            return False

    def get_phone_one_after_cleaned(self, phone):
        phone_clean = self.get_mobilephone_one_after_cleaned(phone)
        if phone_clean:
            return phone_clean
        else:
            return phone

    def get_mobilephone_one_after_cleaned_by_oldRule(self, phone):
        if re.match("^((86)|(086)|(\+86)|(\(\+86\)))?(((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\d{8})$", str(phone)):
            return phone


    def get_mobilephone_list_after_cleaned_not_dict(self, phone_list):
        contact_mobilephone_list = []
        if not phone_list:
            return []
        for i in range(0, len(phone_list)):
            if self.get_mobilephone_one_after_cleaned(phone_list[i]):
                contact_mobilephone_list.append(self.get_mobilephone_one_after_cleaned(phone_list[i]))
        return contact_mobilephone_list

    def get_phonelist_dic(self, phonelist):
        dict_list = []
        for row in phonelist:
            if row not in dict_list:
                dict_list.append(row)
        return dict_list

    def get_mobilephone_list_after_cleaned_dict(self, phone_list):
        contact_mobilephone_list = self.get_mobilephone_list_after_cleaned_not_dict(phone_list)
        return self.get_phonelist_dic(contact_mobilephone_list)

    def get_mobilephone_list_by_contacts(self, contacts):
        contact_list = []
        for sub_contact in contacts:
            for i in range(1, 4):
                if sub_contact.get("phone" + str(i)):
                    contact_list.append(str(sub_contact.get("phone" + str(i))))
        return contact_list

    def get_mobilephone_list_by_contacts_dict_by_NameAndPhone(self, contacts, type='phone'):
        contact_list = []
        name_list = []
        list = []
        for sub_contact in contacts:
            for i in range(1, 4):
                if sub_contact.get("phone" + str(i)):
                    if (sub_contact.get("phone" + str(i)) + sub_contact.get('name')) not in list:
                        contact_list.append(str(sub_contact.get("phone" + str(i))))
                        name_list.append(sub_contact.get('name'))
                        list.append(sub_contact.get("phone" + str(i)) + sub_contact.get('name'))
        if type == 'phone':
            return contact_list
        if type == 'name':
            return name_list

    def get_mobilephone_list_by_contacts_dict_by_NameAndCleanedPhone(self, contacts, type='phone'):
        contact_list = []
        name_list = []
        list = []
        for sub_contact in contacts:
            for i in range(1, 4):
                phone_num = sub_contact.get("phone" + str(i))
                phone_num = self.get_phone_one_after_cleaned(phone_num)
                if phone_num:
                    if not sub_contact.get('name'):
                        name = ''
                    else:
                        name = sub_contact.get('name')
                    if (phone_num + name) not in list:
                        contact_list.append(str(phone_num))
                        name_list.append(name)
                        list.append(phone_num + name)
        if type == 'phone':
            return contact_list
        if type == 'name':
            return name_list

    def compare_lists(self, list1, list2):
        count = 0
        for l1 in list1:
            for l2 in list2:
                if str(l1) == str(l2):
                    count += 1
        return count, len(list1), len(list2)
コード例 #6
0
class DoorlsFactor(object):
    def __init__(self, env, serial_no):
        """
        :param env: 环境
        :param serial_no: 序列号
        """
        self.mongo = MongoUntil(env)
        self.serial_no = serial_no

    def get_Factor(self, Factor):
        """
        :param Factor: 因子名字
        :return: 无因子值时返回 None
        """
        for t in range(1, 10):
            drools_data = self.mongo.query_by_user_id(
                db='skynet',
                collection="skynet_e_factor_result",
                find={"serial_no": self.serial_no})
            if not drools_data:
                time.sleep(3)
            else:
                FactorValue = drools_data[0].get('facts').get(Factor)
                if not FactorValue:
                    return FactorValue
                try:
                    if type(FactorValue) == datetime.datetime:
                        return FactorValue + datetime.timedelta(hours=8)
                    if "," not in str(FactorValue):
                        return FactorValue
                    if "," in str(FactorValue):
                        FactorEveryList = str(FactorValue).split(",")
                        FactorEveryList.sort()
                        return ",".join(FactorEveryList)
                except Exception as e:
                    return FactorValue
                return FactorValue
        return False

    def get_Factor_v2(self, Factor):
        """
        :param Factor: 因子名字
        :return: 无因子值时返回 None
        """
        for t in range(1, 10):
            drools_data = self.mongo.query_by_user_id(
                db='skynet',
                collection="skynet_e_factor_result_v2",
                find={"serial_no": self.serial_no})
            if not drools_data:
                time.sleep(3)
            else:
                FactorValue = drools_data[0].get('facts').get(Factor)
                if not FactorValue:
                    return FactorValue
                try:
                    if type(FactorValue) == datetime.datetime:
                        return FactorValue + datetime.timedelta(hours=8)
                    if "," not in str(FactorValue):
                        return FactorValue
                    if "," in str(FactorValue):
                        FactorEveryList = str(FactorValue).split(",")
                        FactorEveryList.sort()
                        return ",".join(FactorEveryList)
                except Exception as e:
                    return FactorValue
                return FactorValue
        return False

    def testDemo(self):
        # result =self.mongo.query_by_user_id(db='skynet',collection='skynet_e_factor_result_v2',find={"serial_no": self.serial_no})
        # if not result:
        #     return
        # test_list= result[0].get("facts").keys()
        print 'serial_no:' + serial_no
        print u'借还款因子名: ' + u'V1值' + ' || ' + u'V2值'
        test_list = Test_bill_1120 + Test_bill_1120_cdw + Test_bill_cdw
        for factor in test_list:
            factor_qa = test.get_Factor(factor)
            factor_dev = test.get_Factor_v2(factor)
            if not factor_qa or not factor_dev:
                continue
            try:
                if str(factor_qa) == str(factor_dev):
                    print factor, ":", factor_qa, "|| ", factor_dev
                else:
                    print '\033[1;31m%s\033[0m' % factor, ":", '\033[1;31m%s\033[0m' % factor_qa, "|| ", '\033[1;31m%s\033[0m' % factor_dev
            except:
                print factor, ": ", factor_qa, "|| ", factor_dev
コード例 #7
0
class DoorlsFactor(object):
    def __init__(self,env,serial_no):
        """
        :param env: 环境
        :param serial_no: 序列号
        """
        self.mongo = MongoUntil(env)
        self.serial_no=serial_no

    def get_Factor(self,Factor):
        """
        :param Factor: 因子名字
        :return: 无因子值时返回 None
        """
        for t in range(1,10):
            drools_data = self.mongo.query_by_user_id(db='skynet', collection="skynet_e_factor_result",find={"serial_no": self.serial_no})
            if not drools_data:
                time.sleep(2)
            else:
                for l in range(1,3):
                    FactorValue=drools_data[0].get('facts').get(Factor,'createFactor')
                    if FactorValue=='createFactor':
                        time.sleep(1)
                    else:
                        if not FactorValue:
                            return FactorValue
                        try:
                            if type(FactorValue)==datetime.datetime:
                                return FactorValue+datetime.timedelta(hours=8)
                            if "," not in str(FactorValue):
                                return FactorValue
                            if "," in str(FactorValue):
                                FactorEveryList=str(FactorValue).split(",")
                                FactorEveryList.sort()
                                return ",".join(FactorEveryList)
                        except Exception as e:
                            return FactorValue
                        return FactorValue
        return False

    def get_Factor_v2(self,Factor):
        """
        :param Factor: 因子名字
        :return: 无因子值时返回 None
        """
        for t in range(1,10):
            drools_data = self.mongo.query_by_user_id(db='skynet', collection="skynet_e_factor_result_v2",find={"serial_no": self.serial_no})
            if not drools_data:
                time.sleep(3)
            else:
                FactorValue=drools_data[0].get('facts').get(Factor)
                if not FactorValue:
                    return FactorValue
                try:
                    if type(FactorValue)==datetime.datetime:
                        return FactorValue+datetime.timedelta(hours=8)
                    if "," not in str(FactorValue):
                        return FactorValue
                    if "," in str(FactorValue):
                        FactorEveryList=str(FactorValue).split(",")
                        FactorEveryList.sort()
                        return ",".join(FactorEveryList)
                except Exception as e:
                    return FactorValue
                return FactorValue
        return False