From 25e02afd5fb1cebbf2f70d6c8088c08c41f1623f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E5=B7=9D?= Date: Thu, 5 May 2022 03:26:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CompanyData/CompanyDataImpl.py | 83 ++++++++---------- CompanyData/CompanyDataObj.py | 2 +- CompanyData/CompanyDataRoutes.py | 2 +- CompanyData/job_scripts.py | 2 +- RatingData/EsgReportEtl.py | 2 +- RatingData/routes.py | 2 +- RatingData/scripts/report/abstract.py | 2 +- common/utils.py => Utils/CommonUtil.py | 0 Utils/ObjUtil.py | 60 ++++++++++--- Utils/ValidateUtil.py | 115 ++++++++++++++----------- common/__init__.py | 0 11 files changed, 156 insertions(+), 114 deletions(-) rename common/utils.py => Utils/CommonUtil.py (100%) delete mode 100644 common/__init__.py diff --git a/CompanyData/CompanyDataImpl.py b/CompanyData/CompanyDataImpl.py index 76875c0..0462a34 100644 --- a/CompanyData/CompanyDataImpl.py +++ b/CompanyData/CompanyDataImpl.py @@ -9,7 +9,7 @@ from Utils.ErrorUtil import LogConditionCheckFailed from CompanyData.CompanyDataObj import CompanyData, BasicInfo, ShareHolder, MainMember, ComprehensiveCreditAnalysis, \ FinancialElementsAnalysis, BusinessElementsAnalysis, FinancialIndex, BalanceSheet, ProfitSheet, AppendixDataSheet, \ EsgRatingAnalysis, FinancialIndexs -from common.utils import sub_dict, df_iterrows +from Utils.CommonUtil import sub_dict, df_iterrows class CompanyDataImpl(CompanyData): @@ -28,10 +28,8 @@ class CompanyDataImpl(CompanyData): return True if res.status_code == 200 else False def prepare_company_init_data(self): - """""" def prepare_business_data(): - """""" data = self.db_tyc.find_single_column( "公司背景", "基本信息", @@ -56,24 +54,9 @@ class CompanyDataImpl(CompanyData): self.basic_info = basic_info - # self.db_tfse.upsert_single_data( - # "企业数据", - # "企业数据_更新汇总", - # {"企业ID": self.cid}, - # self.dict_to_save() - # ) - # - # self.db_tfse.upsert_single_data( - # "企业数据", - # "基本工商信息", - # {"企业ID": self.cid}, - # self.dict_to_save() - # ) - def prepare_share_holders(): - """""" try: - self.share_holder = list() + self.share_holders = list() data = self.db_tyc.find_single_column( "公司背景", "企业股东", @@ -113,10 +96,10 @@ class CompanyDataImpl(CompanyData): share_holder.payment_method = None share_holder.payment_time = None - self.share_holder.append(share_holder) + self.share_holders.append(share_holder) except TypeError: - self.share_holder = list() + self.share_holders = list() data = self.db_tyc.find_single_column( "公司背景", "十大股东", @@ -140,24 +123,9 @@ class CompanyDataImpl(CompanyData): share_holder.paid_amount = None share_holder.payment_method = None share_holder.payment_time = None - self.share_holder.append(share_holder) - - self.db_tfse.upsert_single_data( - "企业数据", - "企业数据_更新汇总", - {"企业ID": self.cid}, - self.dict_to_save() - ) - - self.db_tfse.upsert_single_data( - "企业数据", - "企业数据_更新汇总", - {"企业ID": self.cid}, - self.dict_to_save() - ) + self.share_holders.append(share_holder) def prepare_main_members(): - """""" self.main_members = list() @@ -179,13 +147,6 @@ class CompanyDataImpl(CompanyData): main_member.job_title = result['typeJoin'] self.main_members.append(main_member) - self.db_tfse.upsert_single_data( - "企业数据", - "企业数据_更新汇总", - {"企业ID": self.cid}, - self.dict_to_save() - ) - def prepare_industry_l1(): """一级行业数据""" db = MongoHelper("tfse_v0.21") @@ -206,11 +167,39 @@ class CompanyDataImpl(CompanyData): "远东_一级行业" ) - db.upsert_single_data( + self.industry_l1 = fecr_industry_l1 + + def save_to_basic_business_info(): + + self.db_tfse.upsert_single_data( + "企业数据", + "基本工商信息", + {"企业ID": self.cid}, + { + "企业ID": self.cid, + "企业名称": self.name, + "更新日期": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + "工商信息": self.basic_info.dict_keys_toggle(), + "股东信息": [item.dict_keys_toggle() for item in self.share_holders], + "主要成员": [item.dict_keys_toggle() for item in self.main_members] + } + + ) + + def save_to_update_summary(): + + self.update_time = { + "工商信息": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + "财务信息": None, + "综信评价": None, + "ESG评价": None, + } + + self.db_tfse.upsert_single_data( "企业数据", "企业数据_更新汇总", {"企业ID": self.cid}, - {"一级行业": fecr_industry_l1} + self.dict_keys_toggle() ) def __main__(): @@ -218,6 +207,8 @@ class CompanyDataImpl(CompanyData): prepare_share_holders() prepare_main_members() prepare_industry_l1() + save_to_basic_business_info() + save_to_update_summary() __main__() diff --git a/CompanyData/CompanyDataObj.py b/CompanyData/CompanyDataObj.py index 48a23bc..ea01f71 100644 --- a/CompanyData/CompanyDataObj.py +++ b/CompanyData/CompanyDataObj.py @@ -164,7 +164,7 @@ class CompanyData(SpecObject): industry_l1 = ValidateAttr(field='industry_l1', type=str) industry_l2 = ValidateAttr(field='industry_l2', type=str) basic_info = ValidateAttr(field='basic_info', type=BasicInfo) - share_holder = ValidateAttr(field='share_holders', instance_list=ShareHolder) + share_holders = ValidateAttr(field='share_holders', instance_list=ShareHolder) main_members = ValidateAttr(field="main_members", instance_list=MainMember) balance_sheet = ValidateAttr(field='balance_sheet', type=BalanceSheet) profit_sheet = ValidateAttr(field='profit_sheet', type=ProfitSheet) diff --git a/CompanyData/CompanyDataRoutes.py b/CompanyData/CompanyDataRoutes.py index b7bafb3..1948a86 100644 --- a/CompanyData/CompanyDataRoutes.py +++ b/CompanyData/CompanyDataRoutes.py @@ -3,7 +3,7 @@ from flask import Blueprint, request from CompanyData.CompanyDataImpl import CompanyDataImpl, CreditAnalysisImpl, FinancialAnalysisImpl, \ BusinessAnalysisImpl, EsgAnalysisImpl from Utils.ErrorUtil import ReturnConditionCheckFailed -from common.utils import verify_token +from Utils.CommonUtil import verify_token from CompanyData.job_scripts import update_process_scripts company_route = Blueprint('company', __name__) diff --git a/CompanyData/job_scripts.py b/CompanyData/job_scripts.py index e4f5780..fc29f4a 100644 --- a/CompanyData/job_scripts.py +++ b/CompanyData/job_scripts.py @@ -5,7 +5,7 @@ import requests import pandas as pd -from common.utils import read_json_file, sub_dict, df_iterrows +from Utils.CommonUtil import read_json_file, sub_dict, df_iterrows from CompanyData.db import FIND_DATA_IN_TYC, UPSERT_SINGLE_DATA, UPDATE_SINGLE_DATA, FIND_SINGLE_DATA_BY_REQ, FIND_ALL_DATA_BY_REQ from RatingData.scripts.risk_detail import associate_risk_detail, change_log_detail diff --git a/RatingData/EsgReportEtl.py b/RatingData/EsgReportEtl.py index ebe91a1..c387fef 100644 --- a/RatingData/EsgReportEtl.py +++ b/RatingData/EsgReportEtl.py @@ -1,4 +1,4 @@ -from common.utils import read_json_file +from Utils.CommonUtil import read_json_file from RatingData.scripts.common import industry_processing from RatingData.scripts.esg.environment import * from RatingData.scripts.esg.governance import * diff --git a/RatingData/routes.py b/RatingData/routes.py index 9b4da4c..7dbcfa8 100644 --- a/RatingData/routes.py +++ b/RatingData/routes.py @@ -1,5 +1,5 @@ from flask import Blueprint, request -from common.utils import verify_token +from Utils.CommonUtil import verify_token from RatingData.EsgReportEtl import EsgCleanModel from RatingData.ReportEtl import CleanModel from RatingData.scripts.common import get_tfse_data, get_esg_data diff --git a/RatingData/scripts/report/abstract.py b/RatingData/scripts/report/abstract.py index f2eded6..83ef84d 100644 --- a/RatingData/scripts/report/abstract.py +++ b/RatingData/scripts/report/abstract.py @@ -1,4 +1,4 @@ -from common.utils import read_json_file +from Utils.CommonUtil import read_json_file from RatingData.scripts.common import * diff --git a/common/utils.py b/Utils/CommonUtil.py similarity index 100% rename from common/utils.py rename to Utils/CommonUtil.py diff --git a/Utils/ObjUtil.py b/Utils/ObjUtil.py index a31e258..00b8367 100644 --- a/Utils/ObjUtil.py +++ b/Utils/ObjUtil.py @@ -5,29 +5,69 @@ class SpecObject(object): fields_map = {} - def dict_to_show(self, **kwargs): - """显示对象""" - - def dict_to_save(self, **kwargs): - """存储对象""" + def dict_keys_toggle(self, **kwargs): + """字典键值切换""" _dict_ = dict() - + default_types = ['str', 'int', 'float', 'dict', 'bool', 'tuple'] for key in self.__dict__.keys(): - if type(self.__dict__[key]).__name__ in ['str', 'int', 'float', 'dict', 'bool', 'tuple']: + if type(self.__dict__[key]).__name__ in default_types: _dict_[self.fields_map[key]] = self.__dict__[key] elif type(self.__dict__[key]).__name__ == 'list': if len(self.__dict__[key]) == 0: _dict_[self.fields_map[key]] = self.__dict__[key] - elif type(self.__dict__[key][0]).__name__ in ['str', 'int', 'float', 'dict', 'bool', 'tuple']: + elif type(self.__dict__[key][0]).__name__ in default_types: _dict_[self.fields_map[key]] = self.__dict__[key] else: - _dict_[self.fields_map[key]] = [item.dict_to_save() for item in self.__dict__[key]] + _dict_[self.fields_map[key]] = [item.dict_keys_toggle() for item in self.__dict__[key]] elif self.__dict__[key] is None: _dict_[self.fields_map[key]] = self.__dict__[key] else: - _dict_[self.fields_map[key]] = self.__dict__[key].dict_to_save() + _dict_[self.fields_map[key]] = self.__dict__[key].dict_keys_toggle() if 'columns' in kwargs: _dict_ = {key: _dict_[key] for key in kwargs['columns']} return _dict_ + + def dict_to_show(self, **kwargs): + """字典显示格式""" + return self.dict_keys_toggle(**kwargs) + + def dict_to_save(self, **kwargs): + """字典存储格式""" + return self.dict_keys_toggle(**kwargs) + + def dict_to_return(self, **kwargs): + """字典返回格式""" + + @staticmethod + def dict_to_set(**kwargs): + """实例设值""" + instance = kwargs['instance']() + fields_map = dict([v, k] for k, v in instance.fields_map.items()) + for field in list(kwargs['data'].keys()): + instance.__setattr__(fields_map[field], kwargs['data'][field]) + return instance + + @staticmethod + def instance_list_to_set(**kwargs): + """实例数组设值""" + list_ = list() + for item in list(kwargs['data']): + instance = kwargs['instance']() + fields_map = dict([v, k] for k, v in instance.fields_map.items()) + for field in list(item.keys()): + instance.__setattr__(fields_map[field], item[field]) + list_.append(instance) + + return list_ + + @staticmethod + def get_attr(_dict_, _key_, **kwargs): + """获取字典属性值""" + value = kwargs['default'] if kwargs.__contains__('default') else None + try: + value = _dict_[_key_] + except KeyError: + pass + return value diff --git a/Utils/ValidateUtil.py b/Utils/ValidateUtil.py index 32ed1ed..8db1ba2 100644 --- a/Utils/ValidateUtil.py +++ b/Utils/ValidateUtil.py @@ -4,10 +4,11 @@ from Utils.ErrorUtil import ReturnConditionCheckFailed class Validate(object): + """常用格式检查""" @staticmethod def email(param): - """""" + """邮箱格式""" regex = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$" case = (len(param) > 7) and (re.match(regex, param) is not None) result = True if case else False @@ -15,11 +16,18 @@ class Validate(object): @staticmethod def password(param): - """""" + """密码格式""" regex = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)^.{8,}$" case = (len(param) >= 8) and (re.match(regex, param) is not None) return True if case else False + @staticmethod + def telephone(param): + """手机号格式""" + regex = "(^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])d{8}$)" + case = re.match(regex, param) is not None + return True if case else False + @staticmethod def date_format(param): """yyyy-mm-dd""" @@ -36,79 +44,82 @@ class Validate(object): @staticmethod def image(param): - """""" + """图片格式""" mimetype = param.mimetype return True if mimetype in ['image/jpeg', 'image/png'] else False class ValidateAttr(object): + """对象属性值检查""" + + FIELD_ERROR_INFO = '字段【{}】异常' + FILED_MAP_ERROR = '字段未映射完整' def __init__(self, **kwargs): - """""" self.kwargs = kwargs - self.error_info = kwargs['error_info'] if 'error_info' in kwargs else ('{}异常'.format(kwargs['mark']) if 'mark' in kwargs else None) - self.error_code = kwargs['error_code'] if 'error_code' in kwargs else 200 + + self.code = kwargs['error_code'] if 'error_code' in kwargs else 200 + + if 'error_info' in kwargs: + self.info = kwargs['error_info'] + elif 'mark' in kwargs: + self.info = self.FIELD_ERROR_INFO.format(kwargs['mark']) + else: + self.info = None def __get__(self, instance, owner): if self.kwargs['field'] in instance.__dict__: return instance.__dict__[self.kwargs['field']] def __set__(self, instance, value): - """""" try: - self.error_info = '{}异常'.format(instance.fields_map[self.kwargs['field']]) + if not self.info: + self.info = self.FIELD_ERROR_INFO.format(instance.fields_map[self.kwargs['field']]) except AttributeError: - pass + raise ReturnConditionCheckFailed(self.FILED_MAP_ERROR, 200) - def not_default(): - """无默认值时属性设值检查""" + if 'type' in self.kwargs: + """检查实例的属性类型""" + if type(self.kwargs['type']) is list: + if type(value) not in self.kwargs['type']: + raise ReturnConditionCheckFailed(self.info, self.code) + else: + if not isinstance(value, self.kwargs['type']): + if value is not None and 'default' not in self.kwargs: + raise ReturnConditionCheckFailed(self.info, self.code) - if 'type' in self.kwargs: - """检查实例的属性类型""" - if type(self.kwargs['type']) is list: - if type(value) not in self.kwargs['type']: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) - else: - if not isinstance(value, self.kwargs['type']): - raise ReturnConditionCheckFailed(self.error_info, self.error_code) + if 'length' in self.kwargs: + """检查实例的属性值长度(一般是str类型)""" + if len(value) != self.kwargs['length']: + raise ReturnConditionCheckFailed(self.info, self.code) - if 'length' in self.kwargs: - """检查实例的属性值长度(一般是str类型)""" - if len(value) != self.kwargs['length']: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) + if 'in_list' in self.kwargs: + """检查实例属性是否包含于列表中(属性有列表和非列表两种情况)""" + if type(value) is not list: + if value not in self.kwargs['in_list']: + raise ReturnConditionCheckFailed(self.info, self.code) + else: + for item in value: + if item not in self.kwargs['in_list']: + raise ReturnConditionCheckFailed(self.info, self.code) - if 'in_list' in self.kwargs: - """检查实例属性是否包含于列表中(属性有列表和非列表两种情况)""" - if type(value) is not list: - if value not in self.kwargs['in_list']: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) - else: - for item in value: - if item not in self.kwargs['in_list']: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) + if 'instance_list' in self.kwargs: + """检查实例列表""" + if type(value) is not list: + raise ReturnConditionCheckFailed(self.info, self.code) + else: + for item in value: + if not isinstance(item, self.kwargs['instance_list']): + raise ReturnConditionCheckFailed(self.info, self.code) - if 'instance_list' in self.kwargs: - """检查实例列表""" - if type(value) is not list: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) - else: - for item in value: - if not isinstance(item, self.kwargs['instance_list']): - raise ReturnConditionCheckFailed(self.error_info, self.error_code) - - if 'func' in self.kwargs: - """属性检查函数""" - if not list(map(self.kwargs['func'], [value]))[0]: - raise ReturnConditionCheckFailed(self.error_info, self.error_code) - - instance.__dict__[self.kwargs['field']] = value + if 'func' in self.kwargs: + """属性检查函数""" + if not list(map(self.kwargs['func'], [value]))[0]: + raise ReturnConditionCheckFailed(self.info, self.code) if 'default' in self.kwargs: """实例属性默认值""" if value is None: value = self.kwargs['default'] - instance.__dict__[self.kwargs['field']] = value - else: - not_default() - else: - not_default() + + instance.__dict__[self.kwargs['field']] = value diff --git a/common/__init__.py b/common/__init__.py deleted file mode 100644 index e69de29..0000000