changes
This commit is contained in:
parent
81e199bf78
commit
15f8fa97c2
|
@ -0,0 +1,64 @@
|
|||
import gridfs
|
||||
from bson import ObjectId
|
||||
from pymongo.database import Database
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy.orm import Session
|
||||
from . import Schemas
|
||||
from .Models import CompanyReport
|
||||
|
||||
|
||||
def company_report_add(db: Session, data: dict):
|
||||
item = CompanyReport(**data)
|
||||
db.add(item)
|
||||
db.commit()
|
||||
db.refresh(item)
|
||||
return item
|
||||
|
||||
|
||||
def company_report_delete(db: Session, item_id: int):
|
||||
db.query(CompanyReport).filter_by(company_id=item_id).delete()
|
||||
db.commit()
|
||||
|
||||
|
||||
def company_report_get(db: Session, item_id: int):
|
||||
item = db.query(CompanyReport).filter_by(company_id=item_id).first()
|
||||
return item
|
||||
|
||||
|
||||
def company_report_query(db: Session, schema: Schemas.CompanyReportQuery):
|
||||
param = schema.dict()
|
||||
company_id = param.get('company_id')
|
||||
company = param.get('company')
|
||||
date = param.get('date')
|
||||
page = param.get('page')
|
||||
pagesize = param.get('pagesize')
|
||||
|
||||
items = db.query(CompanyReport).filter(
|
||||
or_(CompanyReport.company == company, company is None),
|
||||
or_(CompanyReport.date == date, date is None),
|
||||
or_(CompanyReport.company_id == company_id, company_id is None)).offset(
|
||||
(page - 1) * pagesize).limit(pagesize).all()
|
||||
count = db.query(CompanyReport).filter(
|
||||
or_(CompanyReport.company == company, company is None),
|
||||
or_(CompanyReport.date == date, date is None),
|
||||
or_(CompanyReport.company_id == company_id, company_id is None)
|
||||
).count()
|
||||
|
||||
return items, count
|
||||
|
||||
|
||||
def insert_file(db, file: bytes):
|
||||
fs = gridfs.GridFS(db, 'docx')
|
||||
return fs.put(file)
|
||||
|
||||
|
||||
def get_file(db, fid: str):
|
||||
fs = gridfs.GridFS(db, 'docx')
|
||||
gf = fs.get(ObjectId(fid))
|
||||
return gf.read()
|
||||
|
||||
|
||||
def delete_file(db, fid: str):
|
||||
fs = gridfs.GridFS(db, 'docx')
|
||||
fs.delete(ObjectId(fid))
|
||||
return True
|
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"公司名称": "远东执信企业征信有限公司",
|
||||
"成立时间": "2006-03-01",
|
||||
"注册资本": "6500万人民币",
|
||||
"注册地址": "上海市杨浦区国通路127号16层(集中登记地)",
|
||||
"区县": "高新区",
|
||||
"省": "四川省",
|
||||
"市": "成都市",
|
||||
"近三年经济数据": {
|
||||
"2020": {
|
||||
"GDP": "100万亿元",
|
||||
"GDP增长率": "6.5%",
|
||||
"人均GDP": "7万元",
|
||||
"常住人口": "14亿",
|
||||
"一般公共预算收入": "18万亿元",
|
||||
"税收收入": "15万亿元",
|
||||
"税收占比": "80%",
|
||||
"转移性收入": "3万亿元",
|
||||
"一般公共预算支出": "20万亿元",
|
||||
"土地出让收入": "4万亿元",
|
||||
"政府性基金收入": "2万亿元",
|
||||
"财政自给率": "90%",
|
||||
"地方政府债务余额": "15万亿元",
|
||||
"地方政府债务限额": "20万亿元",
|
||||
"城投有息债务合计": "3万亿元",
|
||||
"负债率": "60%",
|
||||
"区域宽口径债务率": "75%",
|
||||
"新房销售价格": "15000元/平米",
|
||||
"住宅土地楼面价": "10000元/平米"
|
||||
},
|
||||
"2021": {
|
||||
"GDP": "105万亿元",
|
||||
"GDP增长率": "7%",
|
||||
"人均GDP": "7.5万元",
|
||||
"常住人口": "14.1亿",
|
||||
"一般公共预算收入": "20万亿元",
|
||||
"税收收入": "16万亿元",
|
||||
"税收占比": "80%",
|
||||
"转移性收入": "4万亿元",
|
||||
"一般公共预算支出": "22万亿元",
|
||||
"土地出让收入": "5万亿元",
|
||||
"政府性基金收入": "2.5万亿元",
|
||||
"财政自给率": "91%",
|
||||
"地方政府债务余额": "16万亿元",
|
||||
"地方政府债务限额": "22万亿元",
|
||||
"城投有息债务合计": "3.5万亿元",
|
||||
"负债率": "55%",
|
||||
"区域宽口径债务率": "70%",
|
||||
"新房销售价格": "16000元/平米",
|
||||
"住宅土地楼面价": "11000元/平米"
|
||||
},
|
||||
"2022": {
|
||||
"GDP": "110万亿元",
|
||||
"GDP增长率": "7.5%",
|
||||
"人均GDP": "8万元",
|
||||
"常住人口": "14.2亿",
|
||||
"一般公共预算收入": "22万亿元",
|
||||
"税收收入": "18万亿元",
|
||||
"税收占比": "82%",
|
||||
"转移性收入": "4万亿元",
|
||||
"一般公共预算支出": "24万亿元",
|
||||
"土地出让收入": "6万亿元",
|
||||
"政府性基金收入": "3万亿元",
|
||||
"财政自给率": "92%",
|
||||
"地方政府债务余额": "18万亿元",
|
||||
"地方政府债务限额": "25万亿元",
|
||||
"城投有息债务合计": "4万亿元",
|
||||
"负债率": "50%",
|
||||
"区域宽口径债务率": "65%",
|
||||
"新房销售价格": "17000元/平米",
|
||||
"住宅土地楼面价": "12000元/平米"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,146 @@
|
|||
{
|
||||
"公司名称": "",
|
||||
"外部级别": "",
|
||||
"报告时间": "",
|
||||
"历次上会意见": [],
|
||||
"成立时间": "",
|
||||
"注册资本": "",
|
||||
"注册地址": "",
|
||||
"截至年份": "",
|
||||
"总资产": "",
|
||||
"所有者权益": "",
|
||||
"实收资本": "",
|
||||
"营业收入": "",
|
||||
"净利润": "",
|
||||
"省": "",
|
||||
"市": "",
|
||||
"区县": "",
|
||||
"地区简介": "",
|
||||
"区域近三年经济数据": [
|
||||
[
|
||||
"项目",
|
||||
"2020",
|
||||
"2021",
|
||||
"2022"
|
||||
]
|
||||
],
|
||||
"与上级政府、兄弟区市(县)对比表": [
|
||||
[
|
||||
"区域",
|
||||
"标的区域",
|
||||
"上级政府",
|
||||
"对比市(县)1",
|
||||
"对比市(县)2",
|
||||
"对比市(县)3"
|
||||
]
|
||||
],
|
||||
"区域负面舆情搜集": [
|
||||
[
|
||||
"时间",
|
||||
"区域",
|
||||
"新闻标题",
|
||||
"预警分类",
|
||||
"超链接"
|
||||
]
|
||||
],
|
||||
"区域内城投平台对比表": [
|
||||
[
|
||||
"序号",
|
||||
"公司名称",
|
||||
"最新级别",
|
||||
"评级机构",
|
||||
"总资产(亿元)",
|
||||
"净资产(亿元)",
|
||||
"总有息债务(亿元)",
|
||||
"资产负债率(%)",
|
||||
"营业收入(亿元)"
|
||||
]
|
||||
],
|
||||
"主营业务明细": [
|
||||
[
|
||||
"",
|
||||
"2020年",
|
||||
"",
|
||||
"2021年",
|
||||
"",
|
||||
"2022年",
|
||||
"",
|
||||
"备注"
|
||||
],
|
||||
[
|
||||
"业务",
|
||||
"收入(单位:亿元)",
|
||||
"占比(%)",
|
||||
"收入(单位:亿元)",
|
||||
"占比(%)",
|
||||
"收入(单位:亿元)",
|
||||
"占比(%)",
|
||||
""
|
||||
]
|
||||
],
|
||||
"财务数据表": [
|
||||
[
|
||||
"科目",
|
||||
"2020年",
|
||||
"2021年",
|
||||
"2022年"
|
||||
],
|
||||
[
|
||||
"财务数据",
|
||||
"",
|
||||
"",
|
||||
""
|
||||
]
|
||||
],
|
||||
"发债情况": [
|
||||
[
|
||||
"债券",
|
||||
"类型",
|
||||
"发行日期",
|
||||
"到期日",
|
||||
"发行规模",
|
||||
"债券余额",
|
||||
"利率"
|
||||
]
|
||||
],
|
||||
"授信情况": "",
|
||||
"对外担保": "",
|
||||
"受限资产": "",
|
||||
"司法诉讼": "",
|
||||
"公司及子公司负面舆情": "",
|
||||
"打分表": [
|
||||
[
|
||||
"要素",
|
||||
"指标",
|
||||
"权重",
|
||||
"档位"
|
||||
]
|
||||
],
|
||||
"合并资产负债表": [
|
||||
[
|
||||
"财务数据",
|
||||
"2020",
|
||||
"2021",
|
||||
"2022",
|
||||
"2023.3"
|
||||
]
|
||||
],
|
||||
"合并利润表": [
|
||||
[
|
||||
"财务数据",
|
||||
"2020",
|
||||
"2021",
|
||||
"2022",
|
||||
"2023.3"
|
||||
]
|
||||
],
|
||||
"合并现金流量表": [
|
||||
[
|
||||
"财务数据",
|
||||
"2020",
|
||||
"2021",
|
||||
"2022",
|
||||
"2023.3"
|
||||
]
|
||||
]
|
||||
}
|
|
@ -0,0 +1,162 @@
|
|||
{
|
||||
"得分级别标准": {
|
||||
"AAA": 98,
|
||||
"AA+": 96,
|
||||
"AA": 94,
|
||||
"AA-": 92,
|
||||
"A+": 90,
|
||||
"A": 88,
|
||||
"A-": 86,
|
||||
"BBB+": 84,
|
||||
"BBB": 82,
|
||||
"BBB-": 80,
|
||||
"BB+": 78,
|
||||
"BB": 76,
|
||||
"BB-": 74,
|
||||
"B+": 72,
|
||||
"B": 70,
|
||||
"B-": 68,
|
||||
"CCC": 66,
|
||||
"CC": 64,
|
||||
"C": 62
|
||||
},
|
||||
"档位得分标准": {
|
||||
"第一档": 1,
|
||||
"第二档": 5,
|
||||
"第三档": 11,
|
||||
"第四档": 17,
|
||||
"第五档": 23,
|
||||
"第六档": 29,
|
||||
"第七档": 33,
|
||||
"第八档": 37
|
||||
},
|
||||
"指标及权重": [
|
||||
{
|
||||
"指标": "业务稳定性",
|
||||
"指标类型": "定性指标",
|
||||
"一级指标": "业务状况",
|
||||
"二级指标": "业务稳定性",
|
||||
"档位": {
|
||||
"第一档": "地方政府将相关领域的大量专营性业务授权给公司运营",
|
||||
"第二档": "地方政府将相关领域的主要专营性业务授权给公司运营",
|
||||
"第三档": "地方政府将相关领域的较多专营性业务授权给公司运营",
|
||||
"第四档": "地方政府将相关领域的一定量专营性业务授权给公司运营",
|
||||
"第五档": "地方政府将相关领域的部分专营性业务授权给公司运营",
|
||||
"第六档": "地方政府将相关领域的少量专营性业务授权给公司运营",
|
||||
"第七档": "地方政府授权给公司运营的专营性业务较少",
|
||||
"第八档": "地方政府授权给公司运营的专营性业务很少"
|
||||
},
|
||||
"权重": 20
|
||||
},
|
||||
{
|
||||
"指标": "业务公益性",
|
||||
"指标类型": "定性指标",
|
||||
"一级指标": "业务状况",
|
||||
"二级指标": "业务公益性",
|
||||
"档位": {
|
||||
"第一档": "公益性业务占比极高",
|
||||
"第二档": "公益性业务占比很高",
|
||||
"第三档": "公益性业务占比高",
|
||||
"第四档": "公益性业务占比较高",
|
||||
"第五档": "公益性业务占比一般",
|
||||
"第六档": "公益性业务占比较低",
|
||||
"第七档": "公益性业务占比低",
|
||||
"第八档": "公益性业务占比很低"
|
||||
},
|
||||
"权重": 20
|
||||
},
|
||||
{
|
||||
"指标": "融资渠道",
|
||||
"指标类型": "定性指标",
|
||||
"一级指标": "融资能力",
|
||||
"二级指标": "融资渠道",
|
||||
"档位": {
|
||||
"第一档": "融资渠道极畅通",
|
||||
"第二档": "融资渠道很畅通",
|
||||
"第三档": "融资渠道畅通",
|
||||
"第四档": "融资渠道较畅通",
|
||||
"第五档": "融资渠道尚可",
|
||||
"第六档": "融资渠道一般",
|
||||
"第七档": "融资渠道受限",
|
||||
"第八档": "基本无融资渠道"
|
||||
},
|
||||
"权重": 20
|
||||
},
|
||||
{
|
||||
"指标": "所有者权益(亿元)",
|
||||
"指标类型": "定量指标",
|
||||
"一级指标": "资本结构",
|
||||
"二级指标": "所有者权益(亿元)",
|
||||
"档位": {
|
||||
"第一档": "[500,+inf)",
|
||||
"第二档": "[300,500)",
|
||||
"第三档": "[100,300)",
|
||||
"第四档": "[40,100)",
|
||||
"第五档": "[20,40)",
|
||||
"第六档": "[10,20)",
|
||||
"第七档": "[5,10)",
|
||||
"第八档": "(-inf,5)"
|
||||
},
|
||||
"权重": 15
|
||||
},
|
||||
{
|
||||
"指标": "总债务资本化比率(%)",
|
||||
"指标类型": "定量指标",
|
||||
"一级指标": "资本结构",
|
||||
"二级指标": "总债务资本化比率(%)",
|
||||
"档位": {
|
||||
"第一档": "[0, 30]",
|
||||
"第二档": "(30,50]",
|
||||
"第三档": "(50,60]",
|
||||
"第四档": "(60,70]",
|
||||
"第五档": "(70,75]",
|
||||
"第六档": "(75,80]",
|
||||
"第七档": "(80,85]",
|
||||
"第八档": "(85,+inf)"
|
||||
},
|
||||
"权重": 15
|
||||
},
|
||||
{
|
||||
"指标": "EBITDA利息保障倍数(倍)",
|
||||
"指标类型": "定量指标",
|
||||
"一级指标": "偿债能力",
|
||||
"二级指标": "EBITDA利息保障倍数(倍)",
|
||||
"档位": {
|
||||
"第一档": "[8,+inf)",
|
||||
"第二档": "[4,8)",
|
||||
"第三档": "[2,4)",
|
||||
"第四档": "[1,2)",
|
||||
"第五档": "[0.4,1)",
|
||||
"第六档": "[0.1,0.4)",
|
||||
"第七档": "[0.05,0.1)",
|
||||
"第八档": "(-inf,0.05)"
|
||||
},
|
||||
"权重": 10
|
||||
}
|
||||
],
|
||||
"评级调整": [
|
||||
{
|
||||
"调整因素": "政策因素",
|
||||
"简介": "城投企业的特殊属性决定了其业务运营与政府关系密切,城投企业所承建的项目多数是由政府授权建设或运营,其收入来源主要为地方政府及其他部门和机构。因此,行业政策和监管政策变化或调整,对城投企业的经营、融资和发展产生较大影响,从而影响城投企业的信用基本面。"
|
||||
},
|
||||
{
|
||||
"调整因素": "ESG与管理因素",
|
||||
"简介": "ESG 因素一般通过环境、社会责任和公司治理三个方面进行评价。通常,城投企业面临环境和社会责任风险较小。公司治理与管理方面,远东资信主要关注城投企业内控制度、项目管理、融资管理、对子公司管控能力等。"
|
||||
},
|
||||
{
|
||||
"调整因素": "平台整合",
|
||||
"简介": "区域城投平台整合是关系城投企业信用水平的重要因素,政府主导下的平台整合影响受评城投企业的规模和定位,进而影响其未来获得政府支持的力度。"
|
||||
},
|
||||
{
|
||||
"调整因素": "资产质量",
|
||||
"简介": "资产质量主要分析城投企业的资产是否被明显高估或存在大量无效资产,需要重视土地使用权、林权、海域使用权、滩涂使用权、河道采砂权、品牌特许经营权等资产的盈利性。"
|
||||
},
|
||||
{
|
||||
"调整因素": "其他调整因素",
|
||||
"简介": "对于其他调整因素(包括但不限于:突发信用事件冲击区域融资环境、被担保企业经营情况恶化或存在严重负面事件、重大诉讼、群体性事件等),远东资信将视具体情况予以评估。"
|
||||
}
|
||||
],
|
||||
"外部支持": {
|
||||
"类型": "政府"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
from Context.common import common_db
|
||||
from sqlalchemy import Column, Integer, String, Text, Date, Double
|
||||
|
||||
|
||||
class CompanyReport(common_db.Base):
|
||||
"""
|
||||
前期研报
|
||||
"""
|
||||
__tablename__ = "company_report"
|
||||
company_id = Column(Integer, primary_key=True, comment="企业ID")
|
||||
company = Column(String(128), comment="企业名称")
|
||||
date = Column(Date, comment="研报日期")
|
||||
file_id = Column(String(24), comment="文件ID")
|
||||
|
||||
def to_dict(self):
|
||||
data = {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||
return data
|
|
@ -0,0 +1,323 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import copy
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from starlette.background import BackgroundTask
|
||||
from starlette.responses import FileResponse
|
||||
|
||||
from Mods.BasicInformation.Mods import CompanyIndexMain
|
||||
from Mods.BasicInformation.Mods import CompanyBaseInfo
|
||||
from Mods.BasicInformation.Mods import CompanyPlusProperty
|
||||
from Mods.BasicInformation.Mods import CompanySearchMain
|
||||
from Mods.BasicInformation.Mods.CompanyIndexMain.Crud import company_index_main_get
|
||||
from Mods.BasicInformation.Mods.CompanyBaseInfo.Crud import company_base_info_get
|
||||
from Mods.BasicInformation.Mods.CompanyPlusProperty.Crud import company_plus_property_get
|
||||
from Mods.IndepthResearch.Mods import CompanyMeetingRecord
|
||||
from Mods.OtherInformation.Mods import CompanyCreditRating
|
||||
from Mods.OtherInformation.Mods import CompanyFinance
|
||||
from Mods.OtherInformation.Mods import CompanyBusinessCompose
|
||||
from Mods.OtherInformation.Mods import CompanyFinanceMain
|
||||
from Mods.OtherInformation.Mods import CompanyBond
|
||||
from Mods.OtherInformation.Mods import CompanyCredit
|
||||
from Mods.OtherInformation.Mods import CompanyGuarantee
|
||||
from Mods.OtherInformation.Mods import CompanyRestrictedAssets
|
||||
from Mods.OtherInformation.Mods import CompanyJudicialDocument
|
||||
from Mods.RegionalEconomies.Mods import AreaFiscalRevenue
|
||||
from Mods.CommonInformation.Mods import OpinionInformation
|
||||
|
||||
from docx import Document
|
||||
from docxtpl import DocxTemplate
|
||||
|
||||
from Mods.RegionalEconomies.Mods.AreaIndexMain.Crud import area_index_main_get
|
||||
from Mods.RegionalEconomies.models import t_area_report
|
||||
from Utils.MongoUtils import MongoConnect
|
||||
from . import Schemas
|
||||
from . import Crud
|
||||
|
||||
from Context.common import common_db, mg_db
|
||||
|
||||
|
||||
def del_file(path):
|
||||
os.remove(path)
|
||||
|
||||
|
||||
router = APIRouter(tags=["前期研报"])
|
||||
|
||||
|
||||
@router.post("/company_report/query", summary="查询研报", response_model='')
|
||||
def company_score_add(schemas: Schemas.CompanyReportQuery, db: Session = Depends(common_db.get_db)):
|
||||
items, total = Crud.company_report_query(db=db, schema=schemas)
|
||||
return {
|
||||
"code": 200,
|
||||
"message": "查询成功",
|
||||
"content": {"items": items, "total": total}
|
||||
}
|
||||
|
||||
|
||||
@router.post("/company_report/get", summary="查看研报", response_model='')
|
||||
def company_score_add(company_id: int = "企业ID", db: Session = Depends(common_db.get_db),
|
||||
mongo_db: Session = Depends(mg_db.get_db)):
|
||||
company = CompanyIndexMain.Crud.company_index_main_get(db=db, item_id=company_id)
|
||||
if company:
|
||||
raise HTTPException(status_code=202, detail="企业ID不存在")
|
||||
|
||||
report = Crud.company_report_get(db=db, item_id=company_id)
|
||||
if not report:
|
||||
raise HTTPException(status_code=404, detail="报告不存在")
|
||||
|
||||
file_name = "{}前期研究报告.docx".format(company.company_name)
|
||||
path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'generate',
|
||||
file_name)
|
||||
result = Crud.get_file(mongo_db, fid=str(report.file_id))
|
||||
myfile = open(path, mode='wb')
|
||||
myfile.write(result)
|
||||
task = BackgroundTask(del_file, path)
|
||||
return FileResponse(path, filename=file_name, media_type='application/octet-stream', background=task)
|
||||
|
||||
|
||||
@router.get("/company_report/generate", summary="生成研报")
|
||||
def company_score_add(company_id: int = "企业ID", db: Session = Depends(common_db.get_db),
|
||||
mongo_db: MongoConnect = Depends(mg_db.get_db)):
|
||||
company = CompanyIndexMain.Crud.company_index_main_get(db=db, item_id=company_id)
|
||||
if not company:
|
||||
raise HTTPException(status_code=202, detail="企业ID不存在")
|
||||
|
||||
def download(fid):
|
||||
"""根据file_id下载报告"""
|
||||
file_name = "{}前期研究报告.docx".format(company.company_name)
|
||||
path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'generate',
|
||||
file_name)
|
||||
result = Crud.get_file(mongo_db, fid=str(fid))
|
||||
myfile = open(path, mode='wb')
|
||||
myfile.write(result)
|
||||
task = BackgroundTask(del_file, path)
|
||||
return FileResponse(path, filename=file_name, media_type='application/octet-stream', background=task)
|
||||
|
||||
report = Crud.company_report_get(db=db, item_id=company_id)
|
||||
if report:
|
||||
res = download(fid=report.file_id)
|
||||
return res
|
||||
|
||||
# 读取数据模板
|
||||
template_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'template',
|
||||
'report_data_template.json')
|
||||
with open(template_path, encoding='utf-8') as f:
|
||||
template = json.load(f)
|
||||
if not template:
|
||||
raise HTTPException(status_code=401, detail="数据模板读取失败")
|
||||
|
||||
template['公司名称'] = company.company_name
|
||||
template['报告时间'] = datetime.datetime.now().strftime("%Y年%m月%d日")
|
||||
|
||||
# 外部级别
|
||||
company_credit_rating = CompanyCreditRating.Crud.company_credit_rating_query(db=db,
|
||||
params=CompanyCreditRating.Schemas.CompanyCreditRatingQuery(
|
||||
company_id=company_id))
|
||||
template['外部级别'] = company_credit_rating[1].all()[0].result if company_credit_rating else '-'
|
||||
|
||||
# 历史上会记录
|
||||
company_meeting_record = CompanyMeetingRecord.Crud.company_meeting_record_query(db=db,
|
||||
params=CompanyMeetingRecord.Schemas.CompanyMeetingRecordQuery(
|
||||
company_id=company_id))
|
||||
|
||||
meeting_record = [["上会时间", "项目类型", "上会意见"]]
|
||||
for item in company_meeting_record[1]:
|
||||
item_list = list()
|
||||
item_list.append(item.metting_time)
|
||||
item_list.append(item.project_type)
|
||||
item_list.append(item.result)
|
||||
meeting_record.append(item_list)
|
||||
|
||||
template['历次上会意见'] = meeting_record
|
||||
|
||||
# 工商信息
|
||||
company_base_info = CompanyBaseInfo.Crud.company_base_info_query(db=db,
|
||||
params=CompanyBaseInfo.Schemas.CompanyBaseInfoQuery(
|
||||
company_id=company_id))
|
||||
template['成立时间'] = company_base_info[1][0].estiblish_date
|
||||
template['注册资本'] = company_base_info[1][0].reg_capital
|
||||
template['注册地址'] = company_base_info[1][0].reg_location
|
||||
|
||||
# 财务数据
|
||||
# company_base_info = CompanyFinance.Crud.company_finance_query(db=mongo_db, type_name=None, params=[])
|
||||
|
||||
# 城投属性
|
||||
company_plus_property = CompanyPlusProperty.Crud.company_plus_property_query(db=db,
|
||||
params=CompanyPlusProperty.Schemas.CompanyPlusPropertyQuery(
|
||||
company_id=company_id))
|
||||
|
||||
# 区域财政收支
|
||||
# area_fiscal_revenue = AreaFiscalRevenue.Crud.area_fiscal_revenue_get(db=db, item_id=company_id)
|
||||
|
||||
# 舆情资讯
|
||||
# opinion_information = OpinionInformation.Crud.opinion_information_get(db=db, item_id=company_id)
|
||||
|
||||
# 城投查询数据表
|
||||
# company_search_main = CompanySearchMain.Crud.company_search_main_get(db=db, item_id=company_id)
|
||||
|
||||
# 业务构成
|
||||
# company_business_compose = CompanyBusinessCompose.Crud.company_business_compose_get(db=db, item_id=company_id)
|
||||
|
||||
# 财务报表
|
||||
# company_finance_main = CompanyFinanceMain.Crud.company_finance_main_get(db=db, item_id=company_id)
|
||||
|
||||
# 发债情况
|
||||
# company_bond = CompanyBond.Crud.company_bond_get(db=db, item_id=company_id)
|
||||
|
||||
# 授信情况
|
||||
# company_credit = CompanyCredit.Crud.company_credit_get(db=db, item_id=company_id)
|
||||
|
||||
# 提供担保
|
||||
# company_guarantee = CompanyGuarantee.Crud.company_guarantee_get(db=db, item_id=company_id)
|
||||
|
||||
# 受限资产
|
||||
# company_restricted_assets = CompanyRestrictedAssets.Crud.company_restricted_assets_get(db=db, item_id=company_id)
|
||||
|
||||
# 裁判文书
|
||||
# company_judicial_document = CompanyJudicialDocument.Crud.company_judicial_document_get(db=db, item_id=company_id)
|
||||
|
||||
# 处理对应数据
|
||||
report_data = {}
|
||||
|
||||
# 生成word研报
|
||||
doc_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'template',
|
||||
'前期研究报告(城投模板).docx')
|
||||
doc = DocxTemplate(doc_path)
|
||||
# 模板数据替换
|
||||
doc.render(report_data)
|
||||
file_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'template',
|
||||
'前期研究报告.docx')
|
||||
# 报告表格处理
|
||||
doc.save(file_path)
|
||||
file = Document(file_path)
|
||||
file.save(file_path)
|
||||
|
||||
# 保存报告到mongodb,并返回obj_id
|
||||
with open(file_path, 'rb') as f:
|
||||
file_id = Crud.insert_file(mongo_db, file=f.read())
|
||||
insert_data = {
|
||||
"company": company.company_name,
|
||||
"company_id": company_id,
|
||||
"date": datetime.datetime.now().strftime("%Y-%m-%d"),
|
||||
"file_id": str(file_id)
|
||||
}
|
||||
Crud.company_report_add(db, data=insert_data)
|
||||
os.remove(file_path)
|
||||
# 下载报告
|
||||
response = download(fid=str(file_id))
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@router.get("/company_report/generate_report", summary="生成前期研报")
|
||||
def company_score_add(company_id: int = "企业id", db: Session = Depends(common_db.get_db),
|
||||
mongo_db: MongoConnect = Depends(mg_db.get_db)):
|
||||
# 根据企业id查询企业名称
|
||||
company_index_main = company_index_main_get(db=db, item_id=company_id)
|
||||
|
||||
# 根据企业id查询工商信息
|
||||
company_base_info = company_base_info_get(db=db, item_id=company_id)
|
||||
|
||||
# 根据企业id查询区县信息
|
||||
company_plus_property = company_plus_property_get(db=db, item_id=company_id)
|
||||
|
||||
# 读取数据模板
|
||||
template_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'template',
|
||||
'data_temp.json')
|
||||
|
||||
with open(template_path, encoding='gbk') as f:
|
||||
template = json.load(f)
|
||||
if not template:
|
||||
raise HTTPException(status_code=401, detail="数据模板读取失败")
|
||||
|
||||
# 查询数据库数据
|
||||
report_data = copy.deepcopy(template)
|
||||
report_data['公司名称'] = company_index_main.company_name
|
||||
report_data['成立时间'] = company_base_info.estiblish_date
|
||||
report_data['注册资本'] = company_base_info.reg_capital
|
||||
report_data['注册地址'] = company_base_info.reg_location
|
||||
area_id = company_plus_property.area
|
||||
province_id = company_plus_property.province
|
||||
city_id = company_plus_property.city
|
||||
report_data['区县'] = area_index_main_get(db=db, item_id=area_id).name if area_id else None
|
||||
report_data['省'] = area_index_main_get(db=db, item_id=province_id).name if province_id else None
|
||||
report_data['市'] = area_index_main_get(db=db, item_id=city_id).name if city_id else None
|
||||
|
||||
# area_id查询
|
||||
# query_id = city_id if city_id else province_id
|
||||
# data_year = db.query(t_area_report).filter(t_area_report.c['area_id'] == query_id)
|
||||
# data = [dict(zip(t_area_report.c.keys(), item)) for item in data_year]
|
||||
# result = {
|
||||
# "2020": {},
|
||||
# "2021": {},
|
||||
# "2022": {}
|
||||
# }
|
||||
#
|
||||
# for d in data:
|
||||
# year = d["年份"]
|
||||
# if str(year) not in result:
|
||||
# continue
|
||||
# result[str(year)]["GDP"] = d["GDP(亿元)"]
|
||||
# result[str(year)]["GDP增长率"] = d["GDP增速(%)"]
|
||||
# report_data['近三年经济数据'] = result
|
||||
|
||||
# 写入模板docx
|
||||
# 生成word研报
|
||||
|
||||
# 处理非表格部分
|
||||
doc_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'template',
|
||||
'前期研究报告(城投模板).docx')
|
||||
doc = DocxTemplate(doc_path)
|
||||
doc.render(report_data)
|
||||
file_path = os.path.join(os.getcwd(), 'Mods', 'IndepthResearch', 'Mods', 'CompanyReport', 'File', 'generate',
|
||||
'前期研究报告.docx')
|
||||
doc.save(file_path)
|
||||
|
||||
# 处理表格部分
|
||||
document = Document(file_path)
|
||||
|
||||
data = report_data.get('近三年经济数据')
|
||||
result1 = [["近三年经济数据", "2020", "2021", "2022"]]
|
||||
|
||||
for k, v in data["2020"].items():
|
||||
r = [k, v, data["2021"][k], data["2022"][k]]
|
||||
result1.append(r)
|
||||
|
||||
table = document.tables[0]
|
||||
rows = len(table.rows)
|
||||
cols = len(table.columns)
|
||||
for row in range(rows):
|
||||
for col in range(cols):
|
||||
table.cell(row, col).text = str(result1[row][col])
|
||||
|
||||
document.save(file_path)
|
||||
|
||||
temp_path = "Mods/IndepthResearch/Mods/CompanyReport/File/generate"
|
||||
if not os.path.exists(temp_path):
|
||||
os.makedirs(temp_path)
|
||||
file_name = "前期调研报告.docx"
|
||||
file_path = f"{temp_path}/{file_name}"
|
||||
return {"url": "/" + file_path}
|
||||
|
||||
|
||||
@router.post("/company_report/delete", summary="删除研报", response_model='')
|
||||
def company_score_add(company_id: int = "企业ID", db: Session = Depends(common_db.get_db),
|
||||
mongo_db: MongoConnect = Depends(mg_db.get_db)):
|
||||
report = Crud.company_report_get(db=db, item_id=company_id)
|
||||
if not report:
|
||||
raise HTTPException(status_code=404, detail="报告不存在")
|
||||
|
||||
# 根据file_id删除mongodb的数据
|
||||
Crud.delete_file(mongo_db, fid=report.file_id)
|
||||
|
||||
# 根据company_id 删除mysql的数据
|
||||
Crud.company_report_delete(db, item_id=company_id)
|
||||
|
||||
return {
|
||||
"code": 200,
|
||||
"message": "删除成功"
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
from typing import List, Optional
|
||||
from datetime import date
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class CompanyReportAdd(BaseModel):
|
||||
company_id: int
|
||||
company: str
|
||||
file_id: Optional[str]
|
||||
date: str
|
||||
|
||||
|
||||
class CompanyReportQuery(BaseModel):
|
||||
company_id: int = None
|
||||
company: str = None
|
||||
date: str = None
|
||||
page: Optional[int]
|
||||
pagesize: Optional[int]
|
|
@ -1,3 +1,6 @@
|
|||
import json
|
||||
import os
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
|
@ -40,4 +43,20 @@ def company_score_query(req: Schemas.CompanyScoreQueryReq, db: Session = Depends
|
|||
items = [Schemas.CompanyScoreInfo(**item.to_dict()) for item in query]
|
||||
return Schemas.CompanyScoreQueryRes(count=count, items=items)
|
||||
|
||||
|
||||
@router.get("/company_score/model", summary="查询打分模型")
|
||||
def company_score_query():
|
||||
try:
|
||||
path = os.path.join(os.getcwd(), 'static', 'urban_investment_model.json')
|
||||
with open(path, encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
return {
|
||||
"code": 200,
|
||||
"message": "新建成功",
|
||||
"data": data
|
||||
}
|
||||
except FileNotFoundError:
|
||||
raise HTTPException(detail="未查询到模型", status_code=404)
|
||||
|
||||
|
||||
#########
|
||||
|
|
|
@ -2,14 +2,16 @@ from fastapi import APIRouter, Depends
|
|||
from .Mods.CompanyScore import Router as CompanyScoreRouter
|
||||
from .Mods.CompanyConclusion import Router as CompanyConclusionRouter
|
||||
from .Mods.CompanyMeetingRecord import Router as CompanyMeetingRecordRouter
|
||||
from .Mods.CompanyReport import Router as CompanyReport
|
||||
|
||||
from Context.common import auth_util
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/indepth_research",
|
||||
dependencies=[Depends(auth_util.token_data_depend)]
|
||||
# dependencies=[Depends(auth_util.token_data_depend)]
|
||||
)
|
||||
|
||||
router.include_router(CompanyScoreRouter.router)
|
||||
router.include_router(CompanyConclusionRouter.router)
|
||||
router.include_router(CompanyMeetingRecordRouter.router)
|
||||
router.include_router(CompanyReport.router)
|
||||
|
|
|
@ -2,7 +2,7 @@ from sqlalchemy import Column, Float, Integer, MetaData, Table
|
|||
from Context.common import common_db
|
||||
|
||||
t_area_report = Table(
|
||||
'area_report', common_db.Base,
|
||||
'area_report', common_db.Base.metadata,
|
||||
Column('area_id', Integer),
|
||||
Column('年份', Integer),
|
||||
Column('GDP(亿元)', Float),
|
||||
|
|
|
@ -12,4 +12,6 @@ pymysql==1.0.2
|
|||
fastapi-crudrouter==0.8.6
|
||||
redis==4.5.1
|
||||
jurigged==0.5.5
|
||||
pymongo==4.3.3
|
||||
pymongo==4.3.3
|
||||
docxtpl~=0.16.6
|
||||
python-docx~=0.8.11
|
Loading…
Reference in New Issue