feat: update audit platform workspace

This commit is contained in:
wren
2026-05-25 09:50:01 +08:00
parent ba8e93c0d3
commit 68d0b4c878
73 changed files with 12196 additions and 367 deletions
@@ -0,0 +1,174 @@
"""企查查服务实现。"""
from __future__ import annotations
from fastapi_admin.config import QICHACHA_CACHE_DAYS
from fastapi_common.fastapi_common_logger import logger
from fastapi_common.fastapi_common_sqlalchemy.database import GetAsyncSession
from fastapi_common.fastapi_common_web.domain.responses import StatusCodeEnum
from fastapi_common.fastapi_common_web.exception.QichachaException import QichachaException
from fastapi_modules.fastapi_leaudit.domian.vo.qichachaVo import (
QichachaBatchQueryVO,
QichachaCompanyQueryVO,
QichachaRecordStatusVO,
)
from fastapi_modules.fastapi_leaudit.models.qichachaCompanyInfo import QichachaCompanyInfo
from fastapi_modules.fastapi_leaudit.services.impl.qichachaClient import QichachaClient
from fastapi_modules.fastapi_leaudit.services.impl.qichachaVoAssembler import QichachaVoAssembler
from fastapi_modules.fastapi_leaudit.services.qichachaService import IQichachaService
class QichachaServiceImpl(IQichachaService):
"""企查查服务实现。"""
def __init__(self, Client: QichachaClient | None = None, CacheDays: int | None = None) -> None:
"""初始化企查查服务。"""
self.Client = Client if Client is not None else QichachaClient()
self.CacheDays = CacheDays if CacheDays is not None else int(QICHACHA_CACHE_DAYS)
async def QueryCompany(self, Keyword: str, ForceRefresh: bool = False) -> QichachaCompanyQueryVO:
"""查询企业完整信息。"""
keyword = Keyword.strip()
if not keyword:
raise QichachaException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "查询关键词不能为空")
async with GetAsyncSession() as session:
record = await QichachaCompanyInfo.FindByKeyword(session, keyword)
if record is not None and not ForceRefresh and QichachaCompanyInfo.GetAgeDays(record) <= self.CacheDays:
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
enterprise, dishonesty, credit_code, company_name = await self.Client.QueryCompany(keyword)
record = await QichachaCompanyInfo.Upsert(
session,
SearchKey=keyword,
CreditCode=credit_code,
CompanyName=company_name,
Enterprise=enterprise,
Dishonesty=dishonesty,
)
logger.info(f"企查查企业信息已更新: {keyword}")
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
async def QueryEnterpriseOnly(self, Keyword: str, ForceRefresh: bool = False) -> QichachaCompanyQueryVO:
"""仅查询企业工商信息。"""
keyword = Keyword.strip()
async with GetAsyncSession() as session:
record = await QichachaCompanyInfo.FindByKeyword(session, keyword)
if (
record is not None
and record.enterprise is not None
and not ForceRefresh
and QichachaCompanyInfo.GetAgeDays(record) <= self.CacheDays
):
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
enterprise = await self.Client.GetEnterpriseInfo(keyword)
credit_code = str(enterprise.get("CreditCode")) if enterprise and enterprise.get("CreditCode") else None
company_name = str(enterprise.get("Name")) if enterprise and enterprise.get("Name") else None
record = await QichachaCompanyInfo.Upsert(
session,
SearchKey=keyword,
CreditCode=credit_code,
CompanyName=company_name,
Enterprise=enterprise,
Dishonesty=record.dishonesty if record is not None else None,
)
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
async def QueryDishonestyOnly(self, Keyword: str, ForceRefresh: bool = False) -> QichachaCompanyQueryVO:
"""仅查询企业失信信息。"""
keyword = Keyword.strip()
async with GetAsyncSession() as session:
record = await QichachaCompanyInfo.FindByKeyword(session, keyword)
if (
record is not None
and record.dishonesty is not None
and not ForceRefresh
and QichachaCompanyInfo.GetAgeDays(record) <= self.CacheDays
):
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
dishonesty = await self.Client.GetDishonestyInfo(keyword)
record = await QichachaCompanyInfo.Upsert(
session,
SearchKey=keyword,
CreditCode=record.creditCode if record is not None else None,
CompanyName=record.companyName if record is not None else keyword,
Enterprise=record.enterprise if record is not None else None,
Dishonesty=dishonesty,
)
return QichachaCompanyQueryVO(
success=True,
message="查询成功",
data=QichachaVoAssembler.BuildCompanyInfo(record),
)
async def BatchQuery(self, Keywords: list[str], ForceRefresh: bool = False) -> QichachaBatchQueryVO:
"""批量查询企业信息。"""
results: list[QichachaCompanyQueryVO] = []
for keyword in Keywords:
try:
results.append(await self.QueryCompany(keyword, ForceRefresh))
except Exception as exc:
results.append(
QichachaCompanyQueryVO(
success=False,
message=str(exc),
data=None,
errorCode="QICHACHA_QUERY_FAILED",
)
)
success_count = len([item for item in results if item.success])
return QichachaBatchQueryVO(
success=success_count == len(results),
total=len(results),
successCount=success_count,
failedCount=len(results) - success_count,
results=results,
)
async def GetRecordStatus(self, Keyword: str) -> QichachaRecordStatusVO:
"""查询企业缓存状态。"""
keyword = Keyword.strip()
async with GetAsyncSession() as session:
record = await QichachaCompanyInfo.FindByKeyword(session, keyword)
if record is None:
return QichachaRecordStatusVO(
exists=False,
searchKey=keyword,
refreshThresholdDays=self.CacheDays,
needRefresh=True,
)
age_days = QichachaCompanyInfo.GetAgeDays(record)
return QichachaRecordStatusVO(
exists=True,
searchKey=record.searchKey,
creditCode=record.creditCode,
companyName=record.companyName,
hasEnterprise=record.enterprise is not None,
hasDishonesty=record.dishonesty is not None,
updatedAt=QichachaVoAssembler.FormatDatetime(record.updated_at),
ageDays=age_days,
refreshThresholdDays=self.CacheDays,
needRefresh=age_days > self.CacheDays,
)