From 46280dc9f63431ee7802c2b27b43bcce97caab10 Mon Sep 17 00:00:00 2001 From: wcq <744800102@qq.com> Date: Fri, 4 Aug 2023 16:59:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=84=E7=BA=A7=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/smebiz_rate/company_rate/crud.py | 36 +++++++---- .../company_rate/rate_utils/utils.py | 39 +++++++++++- mods/smebiz_rate/company_rate/router.py | 16 ++++- mods/smebiz_rate/company_rate/schemas.py | 5 ++ mods/smebiz_rate/form_file/router.py | 61 ++++++++++++++++--- requirements.txt | 1 + utils/api_data_utils.py | 4 ++ utils/rate_utils.py | 33 ++++++++-- 8 files changed, 165 insertions(+), 30 deletions(-) diff --git a/mods/smebiz_rate/company_rate/crud.py b/mods/smebiz_rate/company_rate/crud.py index 2f4884d..596032f 100644 --- a/mods/smebiz_rate/company_rate/crud.py +++ b/mods/smebiz_rate/company_rate/crud.py @@ -34,7 +34,21 @@ def load_bj_model_dict(): def company_rate_add(db: Session, data: schemas.CompanyRateAddInfo): - file_info = FormFileCrud.file_get(db, data.file_md) + item = CompanyRate(**data.dict()) + item.file_data_state = "未上传" + item.rate_state = '未评级' + item.publish_state = '未披露' + db.add(item) + db.commit() + db.refresh(item) + marge_data_to_db(db, item.id) + db.refresh(item) + return item + + +def company_rate_file_data_load(db: Session, item_id, file_md): + item = db.query(CompanyRate).filter(CompanyRate.id == item_id).first() + file_info = FormFileCrud.file_get(db, file_md) wj_data = None try: file_path = file_info.file_url @@ -43,16 +57,11 @@ def company_rate_add(db: Session, data: schemas.CompanyRateAddInfo): print_error(e) sys.stderr.write(str(e)) raise HTTPException(detail='文件解析错误,请重新上传', status_code=301) - item = CompanyRate(**data.dict()) item.wj_data = wj_data item.man_data = deepcopy(wj_data) - item.rate_state = '未评级' - item.publish_state = '未披露' - db.add(item) + item.file_md = file_md + item.file_data_state = "已就绪" db.commit() - db.refresh(item) - marge_data_to_db(db, item.id) - db.refresh(item) return item @@ -122,6 +131,7 @@ def load_api_data_to_db(db: Session, item_id): if item: item.api_data = json.dumps(load_api_data(item.company_name)) marge_data_by_item(db, item) + item.api_data_state="已就绪" db.commit() db.refresh(item) return item @@ -147,15 +157,15 @@ def check_none_in_dict_recursive(dictionary): def marge_data_by_item(db: Session, item): - wj_data = json_parse(item.wj_data) + # wj_data = json_parse(item.wj_data) api_data = json_parse(item.api_data) - man_data = json_parse(item.man_data) + # man_data = json_parse(item.man_data) # mgr_data = {**bj_model_dict, **wj_data, **api_data, **{k: v for k, v in man_data.items() if v is not None}} # item.mgr_data = json.dumps(mgr_data) mgr_data_state = '已就绪' - item.api_data_state = '未就绪' if check_none_in_dict_recursive(wj_data) else "已就绪" - item.man_data_state = '未就绪' if check_none_in_dict_recursive(man_data) else "已就绪" - item.mgr_data_state = "已就绪" if (item.api_data_state == '已就绪' and item.man_data_state == '已就绪') else "未就绪" + item.api_data_state = '未就绪' if check_none_in_dict_recursive(api_data) else "已就绪" + # item.man_data_state = '未就绪' if check_none_in_dict_recursive(man_data) else "已就绪" + item.mgr_data_state = "已就绪" if (item.api_data_state == '已就绪' and item.file_data_state == '已就绪') else "未就绪" db.commit() diff --git a/mods/smebiz_rate/company_rate/rate_utils/utils.py b/mods/smebiz_rate/company_rate/rate_utils/utils.py index b862a8f..dd7442d 100644 --- a/mods/smebiz_rate/company_rate/rate_utils/utils.py +++ b/mods/smebiz_rate/company_rate/rate_utils/utils.py @@ -48,7 +48,7 @@ def load_api_data(company_name): 成立年限 = datetime.now().year - datetime.fromtimestamp( 企业基本信息['estiblishTime'] / 1000).year if 企业基本信息 else 0 - 企业类型 = '有限责任公司' if '有限责任' in 企业基本信息['companyOrgType'].split("(")[0] else '股份制公司' + 企业类型 = '有限责任公司' if 企业基本信息 and '有限责任' in 企业基本信息['companyOrgType'].split("(")[0] else '股份制公司' 开庭公告_劳动争议 = len( [item["caseReason"] for item in filter_bg(司法风险['ktAnnouncementList'], company_name) if @@ -95,3 +95,40 @@ def load_api_data(company_name): "严重违法": 严重违法数量 } return data + + +def load_report_need_data(company_name): + 工商信息, _ = tianyancha_api.get("工商信息", {"keyword": company_name}) + data = { + "企业中文名称": company_name, + "所属国民经济行业": 工商信息['industry'], + "英文名称": 工商信息['property3'], + "工商注册号": 工商信息['regNumber'], + "组织机构代码": 工商信息['orgNumber'], + "统一社会信用代码": 工商信息['creditCode'], + "注册资本": 工商信息['regCapital'], + "企业类型": 工商信息['companyOrgType'], + "注册地址": 工商信息['regLocation'], + "成立日期": 工商信息['estiblishTime'], + "核准日期": 工商信息['approvedTime'], + "营业期限终止日期": '', + "法定代表人": 工商信息['punishList'][0]['legalPersonName'] if 工商信息['punishList'] else '', + "经营地址": '', + "邮政编码": 工商信息['reportList'][0]['postcode'] if 工商信息['reportList'] else '', + "联系电话": 工商信息['reportList'][0]['phoneNumber'] if 工商信息['reportList'] else '', + "传真号码": 工商信息['reportList'][0]['phoneNumber'] if 工商信息['reportList'] else '', + "电子邮箱": 工商信息['reportList'][0]['email'] if 工商信息['reportList'] else '', + "企业网址": '', + "经营范围": 工商信息['businessScope'], + "主要产品": '', + "历史沿革": '', + "股权结构": '', + "高管构成": '', + "企业资质": '', + "企业商标": '', + "企业专利": '', + "企业软件著作权": '', + "企业供应商": '', + "企业招投标情况": '' + } + return data diff --git a/mods/smebiz_rate/company_rate/router.py b/mods/smebiz_rate/company_rate/router.py index 678a654..90fec91 100644 --- a/mods/smebiz_rate/company_rate/router.py +++ b/mods/smebiz_rate/company_rate/router.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session -from context.common import common_db, CompanyUserTokenDataModel, company_user_auth_util +from context.common import common_db, CompanyUserTokenDataModel, company_user_auth_util, auth_util from . import schemas from . import crud from utils.sqlalchemy_common_utils import QueryParams, query_common @@ -19,6 +19,20 @@ def company_rate_add(req: schemas.CompanyRateAddReq, db: Session = Depends(commo return schemas.CompanyRateAddRes(**item.to_dict()) +@router.post("/company_rate/create", summary="创建公司评级", response_model=schemas.CompanyRateAddRes) +def company_rate_add(req: schemas.CompanyRateAddReq, db: Session = Depends(common_db.get_db), + token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)): + item = crud.company_rate_add(db, req) + return schemas.CompanyRateAddRes(**item.to_dict()) + + +@router.post("/company_rate/upload_file", summary="问卷数据上传") +def company_rate_file_data_load(req: schemas.CompanyRateFileDataLoadReq, db: Session = Depends(common_db.get_db), + token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)): + item = crud.company_rate_file_data_load(db, req.id, req.file_md) + return "成功" + + @router.post("/company_rate/delete", summary="删除公司评级数据") def company_rate_delete(req: schemas.CompanyRateDeleteReq, db: Session = Depends(common_db.get_db)): crud.company_rate_delete(db, req.id) diff --git a/mods/smebiz_rate/company_rate/schemas.py b/mods/smebiz_rate/company_rate/schemas.py index b11d4c4..652e1c7 100644 --- a/mods/smebiz_rate/company_rate/schemas.py +++ b/mods/smebiz_rate/company_rate/schemas.py @@ -56,6 +56,11 @@ class CompanyRateAddReq(CompanyRateAddInfo): pass +class CompanyRateFileDataLoadReq(BaseModel): + id: int + file_md: str + + class CompanyRateAddRes(CompanyRateInfo): pass diff --git a/mods/smebiz_rate/form_file/router.py b/mods/smebiz_rate/form_file/router.py index d5ef049..0b9a9e9 100644 --- a/mods/smebiz_rate/form_file/router.py +++ b/mods/smebiz_rate/form_file/router.py @@ -4,7 +4,7 @@ from fastapi import APIRouter, UploadFile, File, Depends, HTTPException, Header from sqlalchemy.orm import Session from . import crud from utils.common_utils import file_md5 -from context.common import common_db, company_user_auth_util, CompanyUserTokenDataModel +from context.common import common_db, company_user_auth_util, CompanyUserTokenDataModel, auth_util from . import schemas from base64 import b64decode @@ -17,9 +17,9 @@ allow_file_type = { @router.post('/license_file_upload', response_model=schemas.FormFileInfo, summary='营业执照文件上传') def license_file_upload(name: str = Header(None), file: UploadFile = File(...), - db: Session = Depends(common_db.get_db) - # token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend) - ): + db: Session = Depends(common_db.get_db) + # token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend) + ): if name: name = b64decode(name.encode('utf-8')).decode('utf-8') mime_type = file.content_type @@ -48,9 +48,9 @@ def license_file_upload(name: str = Header(None), file: UploadFile = File(...), user_id = "" form_file = crud.add_file(db, schemas.FormFileCreate(md=file_md, file_name=name or file.filename, - mime_type=mime_type, - user_id=user_id, common_type=common_type, - file_url=file_url)) + mime_type=mime_type, + user_id=user_id, common_type=common_type, + file_url=file_url)) return form_file.to_dict() @@ -89,9 +89,50 @@ def form_file_upload(name: str = Header(None), file: UploadFile = File(...), # user_id = "" form_file = crud.add_file(db, schemas.FormFileCreate(md=file_md, file_name=name or file.filename, - mime_type=mime_type, - user_id=user_id, common_type=common_type, - file_url=file_url)) + mime_type=mime_type, + user_id=user_id, common_type=common_type, + file_url=file_url)) + return form_file.to_dict() + + +@router.post('/form_file_upload_admin', response_model=schemas.FormFileInfo, summary='表单文件上传') +def form_file_upload(name: str = Header(None), file: UploadFile = File(...), + db: Session = Depends(common_db.get_db), + token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend) + ): + if name: + name = b64decode(name.encode('utf-8')).decode('utf-8') + mime_type = file.content_type + if mime_type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + raise Exception('不允许上传该类型文件') + common_type, file_type = file.content_type.split('/') + # if common_type not in allow_file_type: + # raise Exception('不允许上传该类型文件') + content_start = file.file.read(10240) + file_md = file_md5(content_start) + save_path = Path(f"static/upload_files/{common_type}/{file_type}") + file_save_path = save_path / file_md + file_url = f'/static/upload_files/{common_type}/{file_type}/{file_md}' + if not os.path.exists(save_path): + os.makedirs(save_path) + form_file = crud.get_file_by_md(db, file_md) + if not form_file: + if not os.path.exists(file_save_path): + with open(file_save_path, 'wb') as f: + f.write(content_start) + while True: + content = file.file.read(10240) + if content: + f.write(content) + else: + break + user_id = token_data.id + # user_id = "" + form_file = crud.add_file(db, + schemas.FormFileCreate(md=file_md, file_name=name or file.filename, + mime_type=mime_type, + user_id=user_id, common_type=common_type, + file_url=file_url)) return form_file.to_dict() diff --git a/requirements.txt b/requirements.txt index 40fcdb1..6be720b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,4 @@ jurigged~=0.5.5 python-jose sqlalchemy_utils numpy~=1.25.2 +openpyxl diff --git a/utils/api_data_utils.py b/utils/api_data_utils.py index 42fab8f..864c92a 100644 --- a/utils/api_data_utils.py +++ b/utils/api_data_utils.py @@ -157,6 +157,10 @@ api_config = { "企业三要素": { "type": "dict", "url": "http://open.api.tianyancha.com/services/open/ic/verify/2.0" + }, + "工商信息": { + "type": "dict", + "url": "http://open.api.tianyancha.com/services/open/cb/ic/2.0" } } diff --git a/utils/rate_utils.py b/utils/rate_utils.py index 7a0daf1..a22e001 100644 --- a/utils/rate_utils.py +++ b/utils/rate_utils.py @@ -47,9 +47,10 @@ def parse_file_data_interface(file_path): continue return { - "问卷数据": questionnaire_dict, - "财报数据": financial_dict - } + "问卷数据": questionnaire_dict, + "财报数据": financial_dict + } + def parse_file_data_interface2(file_path): file_data = { @@ -110,7 +111,7 @@ def parse_file_data_interface2(file_path): }, "财报数据": { "2021年末": { - "数据是否经过审计":"是", + "数据是否经过审计": "是", "财务数据": "2021年末", "资产负债表": None, "总资产": 6478468.9, @@ -169,6 +170,29 @@ def bj_rate_interface(rate_data): return data +def smebiz_create_flow(id): + print(f"创建评级流程:{id}") + return id + res = rq.post('http://127.0.0.1:8010/api/model_management/new_process_file', json.dumps( + {"pid": id, "model_name": "中小商业企业信用模型"}), timeout=8) + + +def smebiz_post_wj_data(pid, data): + res = rq.post('http://127.0.0.1:8010/api/model_management/upload_reference_data', json.dumps( + {"pid": pid, "data": data}), timeout=8) + print(res) + + +def smebiz_rate_interface(pid): + """ + 中小商业企业评级接口 + """ + res = rq.post('http://127.0.0.1:8010/api/model_management/score_result', json.dumps( + {"pid": pid}), timeout=8) + data = res.json() + return data + + def bj_finance_cal_interface(data): """ 财报指标计算接口 @@ -177,4 +201,3 @@ def bj_finance_cal_interface(data): {"name": '保健服务业信誉评级模型', "index": data}), timeout=8) data = res.json() return data -