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

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"> <option name="namespacePackageFolders">
<list> <list>
<option value="$MODULE_DIR$/Mods" /> <option value="$MODULE_DIR$/Mods" />
<option value="$MODULE_DIR$/ThirdPartyApi" />
</list> </list>
</option> </option>
</component> </component>

View File

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

View File

@ -3,6 +3,7 @@ from logging import getLogger
from sqlalchemy.orm import declarative_base from sqlalchemy.orm import declarative_base
from ThirdPartyApi.Tianyancha.Apis import TianyanchaApi
from Utils.AuthUtils import AuthUtil, TokenDataModel from Utils.AuthUtils import AuthUtil, TokenDataModel
from Utils.MongoUtils import MongoConnect from Utils.MongoUtils import MongoConnect
from Utils.RedisUtils import RedisPool 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) 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 sqlalchemy.orm import Session
from .Mods.CompanyIndexMain.Models import CompanyIndexMain from .Mods.CompanyIndexMain.Models import CompanyIndexMain
from .Mods.CompanyBaseInfo.Models import CompanyBaseInfo from .Mods.CompanyBaseInfo.Models import CompanyBaseInfo
from .Mods.CompanyPlusProperty.Models import CompanyPlusProperty from .Mods.CompanyPlusProperty.Models import CompanyPlusProperty
from .Mods.CompanyControl.Models import CompanyControl from .Mods.CompanyControl.Models import CompanyControl
from .Mods.CompanyShareholder.Models import CompanyShareholder
from . import Schemas from . import Schemas
from Utils.SqlAlchemyUtils import query_common_core 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): 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() company_info_dict[item.company_id][key] = item.to_dict()
items = list(company_info_dict.values()) items = list(company_info_dict.values())
return count, items 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="法定代表人") legal_person = Column(String(50), comment="法定代表人")
reg_capital = Column(String(50), comment="注册资本") reg_capital = Column(String(50), comment="注册资本")
paid_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="核准日期") approved_date = Column(Date, comment="核准日期")
license_duration = Column(String(50), comment="营业期限") license_duration = Column(String(50), comment="营业期限")
reg_status = Column(String(50), comment="经营状态") reg_status = Column(String(50), comment="经营状态")

View File

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

View File

@ -9,11 +9,14 @@ class CompanyShareholder(common_db.Base):
__tablename__ = "company_shareholder" __tablename__ = "company_shareholder"
id = Column(Integer, primary_key=True, comment="股东信息id") id = Column(Integer, primary_key=True, comment="股东信息id")
company_id = Column(Integer, comment="企业ID") company_id = Column(Integer, comment="企业ID")
name = Column(String(255), comment="平台重要性") name = Column(String(255), comment="股东名称")
type = Column(String(50), comment="平台重要性") type = Column(String(50), comment="股东类型")
amount = Column(Double, comment="认缴金额") amount = Column(Double, comment="认缴金额")
reg_date = Column(Date, comment="认缴时间") reg_date = Column(Date, comment="认缴时间")
percent = Column(Double, comment="持股比例") percent = Column(Double, comment="持股比例")
number = Column(Double, comment="持股数量")
shareholder_code = Column(Integer, comment="股东代码")
def to_dict(self): def to_dict(self):
data = {c.name: getattr(self, c.name) for c in self.__table__.columns} 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] amount: Optional[float]
reg_date: Optional[date] reg_date: Optional[date]
percent: Optional[float] percent: Optional[float]
number: Optional[int]
class CompanyShareholderAddInfo(BaseModel): class CompanyShareholderAddInfo(BaseModel):
@ -21,6 +22,7 @@ class CompanyShareholderAddInfo(BaseModel):
amount: Optional[float] amount: Optional[float]
reg_date: Optional[date] reg_date: Optional[date]
percent: Optional[float] percent: Optional[float]
number: Optional[int]
class CompanyShareholderAddReq(CompanyShareholderAddInfo): 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.CompanyIndexMain import Router as CompanyIndexMainRouter
from .Mods.CompanyShareholder import Router as CompanyShareholderRouter from .Mods.CompanyShareholder import Router as CompanyShareholderRouter
from .Mods.CompanyEquityPenetration import Router as CompanyEquityPenetrationRouter 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 from . import Crud, Schemas
router = APIRouter( 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)): def company_all_info_query(req: Schemas.CompanyAllInfoQueryReq, db: Session = Depends(common_db.get_db)):
count, items = Crud.company_all_info_query(db, req) count, items = Crud.company_all_info_query(db, req)
return Schemas.CompanyAllInfoQueryRes(count=count, items=items) 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): class CompanyAllInfoQueryRes(BaseModel):
count: int count: int
items: List[CompanyAllInfo] 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__)