编写企业新建接口与第三方接口

This commit is contained in:
wcq 2023-03-23 15:31:16 +08:00
parent 180efb2cb7
commit ccc0b38338
13 changed files with 210 additions and 7 deletions

View File

@ -16,6 +16,7 @@
<option name="namespacePackageFolders">
<list>
<option value="$MODULE_DIR$/Mods" />
<option value="$MODULE_DIR$/ThirdPartyApi" />
</list>
</option>
</component>

View File

@ -35,3 +35,5 @@ status_call_back = ""
[app]
port = 8003
[tianyancha]
token = ""

View File

@ -3,6 +3,7 @@ from logging import getLogger
from sqlalchemy.orm import declarative_base
from ThirdPartyApi.Tianyancha.Apis import TianyanchaApi
from Utils.AuthUtils import AuthUtil, TokenDataModel
from Utils.MongoUtils import MongoConnect
from Utils.RedisUtils import RedisPool
@ -50,3 +51,6 @@ phone_msg_send = PhoneMsgSend(conf['hw_msg']['url'],
)
phone_verify_code = PhoneVerifyCode(redis_pool, phone_msg_send)
# 天眼查接口
tianyancha_api = TianyanchaApi(conf['tianyancha']['token'])

View File

@ -1,10 +1,14 @@
from fastapi import HTTPException
from sqlalchemy.orm import Session
from .Mods.CompanyIndexMain.Models import CompanyIndexMain
from .Mods.CompanyBaseInfo.Models import CompanyBaseInfo
from .Mods.CompanyPlusProperty.Models import CompanyPlusProperty
from .Mods.CompanyControl.Models import CompanyControl
from .Mods.CompanyShareholder.Models import CompanyShareholder
from . import Schemas
from Utils.SqlAlchemyUtils import query_common_core
from Context.common import tianyancha_api
from ..RegionalEconomies.Mods.AreaIndexMain.Models import AreaIndexMain
def company_all_info_query(db: Session, query_params: Schemas.CompanyAllInfoQueryParams):
@ -35,3 +39,44 @@ def company_all_info_query(db: Session, query_params: Schemas.CompanyAllInfoQuer
company_info_dict[item.company_id][key] = item.to_dict()
items = list(company_info_dict.values())
return count, items
def create_company(db: Session, req: Schemas.CreateCompanyReq):
company_name = req.company_name
if db.query(CompanyIndexMain).filter(CompanyIndexMain.company_name == company_name).first():
raise HTTPException(detail="公司名称已经存在", status_code=403)
res = tianyancha_api.企业基本信息(company_name)
company_index_main = CompanyIndexMain(company_id=res.id, company_name=res.name)
db.add(company_index_main)
if not db.query(CompanyBaseInfo).filter(CompanyBaseInfo.company_id == res.id).first():
company_base_info = CompanyBaseInfo(company_id=res.id,
legal_person=res.legalPersonName,
reg_capital=res.regCapital,
# paid_capital
estiblish_date=res.estiblishTime,
approved_date=res.approvedTime,
# license_duration
reg_status=res.regStatus,
reg_location=res.regLocation,
credit_code=res.creditCode,
social_staff_num=res.socialStaffNum,
business_scope=res.businessScope
)
db.add(company_base_info)
# company_control=CompanyControl(company_id=res.id,name=res.legalPersonName)
if not db.query(CompanyPlusProperty).filter(CompanyPlusProperty.company_id == res.id).first():
city_item = db.query(AreaIndexMain).filter(name=res.city).first()
area_item = db.query(AreaIndexMain).filter(name=res.district).first()
company_plus_property = CompanyPlusProperty(company_id=res.id,
# administrative_level
# background
# equity_relationship
# importance
industry=res.industry,
province=city_item.belong if city_item else None,
city=city_item.area_id if city_item else None,
area=area_item.area_id if area_item else None
)
db.add(company_plus_property)
# company_share_holder = CompanyShareholder()
db.commit()

View File

@ -11,7 +11,7 @@ class CompanyBaseInfo(common_db.Base):
legal_person = Column(String(50), comment="法定代表人")
reg_capital = Column(String(50), comment="注册资本")
paid_capital = Column(String(50), comment="实缴资本")
establish_date = Column(Date, comment="成立日期")
estiblish_date = Column(Date, comment="成立日期")
approved_date = Column(Date, comment="核准日期")
license_duration = Column(String(50), comment="营业期限")
reg_status = Column(String(50), comment="经营状态")

View File

@ -9,7 +9,7 @@ class CompanyBaseInfoInfo(BaseModel):
legal_person: Optional[str]
reg_capital: Optional[str]
paid_capital: Optional[str]
establish_date: Optional[date]
estiblish_date: Optional[date]
approved_date: Optional[date]
license_duration: Optional[str]
reg_status: Optional[str]
@ -24,7 +24,7 @@ class CompanyBaseInfoAddInfo(BaseModel):
legal_person: Optional[str]
reg_capital: Optional[str]
paid_capital: Optional[str]
establish_date: Optional[date]
estiblish_date: Optional[date]
approved_date: Optional[date]
license_duration: Optional[str]
reg_status: Optional[str]

View File

@ -9,11 +9,14 @@ class CompanyShareholder(common_db.Base):
__tablename__ = "company_shareholder"
id = Column(Integer, primary_key=True, comment="股东信息id")
company_id = Column(Integer, comment="企业ID")
name = Column(String(255), comment="平台重要性")
type = Column(String(50), comment="平台重要性")
name = Column(String(255), comment="股东名称")
type = Column(String(50), comment="股东类型")
amount = Column(Double, comment="认缴金额")
reg_date = Column(Date, comment="认缴时间")
percent = Column(Double, comment="持股比例")
number = Column(Double, comment="持股数量")
shareholder_code = Column(Integer, comment="股东代码")
def to_dict(self):
data = {c.name: getattr(self, c.name) for c in self.__table__.columns}
return data
return data

View File

@ -12,6 +12,7 @@ class CompanyShareholderInfo(BaseModel):
amount: Optional[float]
reg_date: Optional[date]
percent: Optional[float]
number: Optional[int]
class CompanyShareholderAddInfo(BaseModel):
@ -21,6 +22,7 @@ class CompanyShareholderAddInfo(BaseModel):
amount: Optional[float]
reg_date: Optional[date]
percent: Optional[float]
number: Optional[int]
class CompanyShareholderAddReq(CompanyShareholderAddInfo):

View File

@ -7,7 +7,7 @@ from .Mods.CompanyPlusProperty import Router as CompanyPlusPropertyRouter
from .Mods.CompanyIndexMain import Router as CompanyIndexMainRouter
from .Mods.CompanyShareholder import Router as CompanyShareholderRouter
from .Mods.CompanyEquityPenetration import Router as CompanyEquityPenetrationRouter
from Context.common import auth_util, common_db
from Context.common import auth_util, common_db, tianyancha_api
from . import Crud, Schemas
router = APIRouter(
@ -27,3 +27,17 @@ router.include_router(CompanyEquityPenetrationRouter.router)
def company_all_info_query(req: Schemas.CompanyAllInfoQueryReq, db: Session = Depends(common_db.get_db)):
count, items = Crud.company_all_info_query(db, req)
return Schemas.CompanyAllInfoQueryRes(count=count, items=items)
@router.post("/company_create", summary="城投信息新建", tags=["城投详细信息"],
response_model=Schemas.CreateCompanyRes)
def create_company(req: Schemas.CreateCompanyReq, db: Session = Depends(common_db.get_db)):
Crud.create_company(db, req)
return "创建成功"
@router.post("/company_search", summary="公司搜索", tags=["城投详细信息"],
response_model=Schemas.CompanySearchRes)
def company_search(req: Schemas.CompanySearchReq):
company_name_list = tianyancha_api.公司搜索(req.company_name)
return Schemas.CompanySearchRes(company_name_list=company_name_list)

View File

@ -31,3 +31,19 @@ class CompanyAllInfoQueryReq(CompanyAllInfoQueryParams):
class CompanyAllInfoQueryRes(BaseModel):
count: int
items: List[CompanyAllInfo]
class CreateCompanyReq(BaseModel):
company_name: str
class CreateCompanyRes(BaseModel):
pass
class CompanySearchReq(BaseModel):
company_name: str
class CompanySearchRes(BaseModel):
company_name_list: List[str]

View File

@ -0,0 +1,34 @@
from typing import List
from .Schemas import 企业基本信息Res
from Utils.DataUtils import JsDict
class TianyanchaConfig:
企业基本信息url = "http://open.api.tianyancha.com/services/open/ic/baseinfo/normal"
搜索url = "http://open.api.tianyancha.com/services/open/search/2.0"
class TianyanchaApi:
def __init__(self, token: str, config: TianyanchaConfig = TianyanchaConfig):
self.config = config
self.token = token
def 企业基本信息(self, keyword) -> 企业基本信息Res:
url = f"{self.config.企业基本信息}?keyword={keyword}"
headers = {'Authorization': self.token}
res = self.rq.get(url, headers=headers)
data = res.json()
if data['error_code'] == 0:
return JsDict(data['result'])
def 公司搜索(self, keyword) -> List[str]:
url = f"{self.config.搜索url}?keyword={keyword}"
headers = {'Authorization': self.token}
res = self.rq.get(url, headers=headers)
data = res.json()
company_names = []
if data['error_code'] == 0:
company_names = [item["name"] for item in data['result']['items'] if item["matchType"] == '公司名称匹配']
return company_names

View File

@ -0,0 +1,58 @@
from typing import List
from pydantic import BaseModel
class 企业基本信息Res:
id: int #
name: str # 企业名
historyNames: str # 曾用名
historyNameList: List[str] # 曾用名
fromTime: int # 经营开始时间
estiblishTime: int # 成立日期
legalPersonName: str # 法人
type: int # 法人类型1 人 2 公司
companyOrgType: str # 企业类型
regStatus: str # 企业状态
regCapital: str # 注册资本
city: str # 市
district: str # 区
staffNumRange: str # 人员规模
bondNum: int # 股票号
bondName: str # 股票名
usedBondName: str # 股票曾用名
bondType: str # 股票类型
revokeDate: int # 吊销日期
updateTimes: int # 更新时间
revokeReason: str # 吊销原因
compForm: int # 组成形式1-个人经营、2-家庭经营
regNumber: int # 注册号
creditCode: str # 统一社会信用代码
property3: str # 英文名
approvedTime: int # 核准时间
socialStaffNum: int # 参保人数
actualCapitalCurrency: str # 实收注册资本币种
alias: str # 简称
cancelReason: str # 注销原因
cancelDate: int # 注销日期
orgNumber: int # 组织机构代码
toTime: int # 经营结束时间
actualCapital: str # 实收注册资金
regInstitute: str # 登记机关
businessScope: str # 经营范围
taxNumber: str # 纳税人识别号
regLocation: str # 注册地址
regCapitalCurrency: str # 注册资本币种
tags: str
percentileScore: int # 企业评分
base: str # 省份简称
industry: str # 行业
class industryAll:
categoryMiddle: str # 国民经济行业分类门类
categoryBig: str # 国民经济行业分类大类
category: str # 国民经济行业分类门类
categorySmall: str # 国民经济行业分类小类
isMicroEnt: int # 是否是小微企业 0不是 1是

24
Utils/DataUtils.py Normal file
View File

@ -0,0 +1,24 @@
# python字典增强
# python字典转js字典
class JsDict(dict):
def __new__(cls, *args, **kwargs):
cls.__setitem__ = cls.__setattr__
return super().__new__(cls)
def __init__(self, dic):
for key, value in dic.items():
self.__setattr__(key, value)
def __make_item__(self, item):
if type(item) == dict:
item = JsDict(item)
elif type(item) == list:
item = [self.__make_item__(one) for one in item]
return item
def __setattr__(self, key, item):
dict.__setattr__(self, key, self.__make_item__(item))
self.update(self.__dict__)