def __init__(self, env, serial_no): """ :param env: 环境 :param serial_no: 序列号 """ self.mongo = MongoUntil(env) self.serial_no = serial_no
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 __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
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()
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)
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
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