feat: update audit platform workspace
This commit is contained in:
@@ -76,7 +76,9 @@ class CrossReviewController(BaseController):
|
||||
"""查询当前用户参与的交叉评查任务。"""
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["task_read"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有查看交叉评查任务权限", "data": None})
|
||||
Data = await self.CrossReviewService.GetUserTasks(CurrentUserId=int(payload["user_id"]), Body=Body)
|
||||
UserId = int(payload["user_id"])
|
||||
CanViewProgress = await self._check_permission(UserId, [self._PERMISSIONS["progress_view"]])
|
||||
Data = await self.CrossReviewService.GetUserTasks(CurrentUserId=UserId, Body=Body, CanViewProgress=CanViewProgress)
|
||||
return Result.success(data=Data)
|
||||
|
||||
@self.router.get("/tasks/{TaskId}/progress", response_model=Result[CrossReviewTaskProgressVO])
|
||||
|
||||
@@ -4,6 +4,7 @@ import json
|
||||
from typing import Any
|
||||
|
||||
from fastapi import Depends, File, Form, Query, UploadFile
|
||||
from fastapi.responses import JSONResponse
|
||||
from pydantic import BaseModel, Field
|
||||
from sqlalchemy import text
|
||||
|
||||
@@ -34,6 +35,8 @@ from fastapi_modules.fastapi_leaudit.domian.vo.reviewPointVo import (
|
||||
)
|
||||
from fastapi_modules.fastapi_leaudit.services import IDocumentService
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.documentServiceImpl import DocumentServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
|
||||
|
||||
|
||||
class QueueStatusVO(BaseModel):
|
||||
@@ -51,6 +54,8 @@ class ReviewPointAuditDTO(BaseModel):
|
||||
class DocumentController(BaseController):
|
||||
"""文档控制器。"""
|
||||
|
||||
_CROSS_REVIEW_DOCUMENT_READ_PERMISSION = "cross_review:document:read"
|
||||
|
||||
@staticmethod
|
||||
def _tenant_context(payload: dict[str, Any]) -> dict[str, str | None]:
|
||||
return {
|
||||
@@ -61,6 +66,7 @@ class DocumentController(BaseController):
|
||||
def __init__(self):
|
||||
super().__init__(prefix="", tags=["文档"])
|
||||
self.DocumentService: IDocumentService = DocumentServiceImpl()
|
||||
self.PermissionService: IPermissionService = PermissionServiceImpl()
|
||||
|
||||
@self.router.post("/upload", response_model=Result[DocumentUploadVO])
|
||||
async def UploadDocument(
|
||||
@@ -69,6 +75,8 @@ class DocumentController(BaseController):
|
||||
typeId: int | None = Form(None, description="文档类型ID"),
|
||||
typeCode: str | None = Form(None, description="文档类型编码"),
|
||||
groupId: int | None = Form(None, description="二级分组ID"),
|
||||
entryModuleId: int | None = Form(None, description="入口模块ID"),
|
||||
entry_module_id: int | None = Form(None, description="入口模块ID,兼容蛇形字段"),
|
||||
region: str | None = Form(None, description="所属租户/地区"),
|
||||
tenant_code: str | None = Form(None, description="租户编码"),
|
||||
fileRole: str = Form("primary", description="文件角色"),
|
||||
@@ -97,6 +105,7 @@ class DocumentController(BaseController):
|
||||
TypeId=typeId,
|
||||
TypeCode=typeCode,
|
||||
GroupId=groupId,
|
||||
EntryModuleId=entryModuleId or entry_module_id,
|
||||
Region=region,
|
||||
FileRole=fileRole,
|
||||
CreatedBy=int(payload["user_id"]),
|
||||
@@ -194,7 +203,11 @@ class DocumentController(BaseController):
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""获取单个文档详情(带数据隔离校验)。"""
|
||||
Data = await self.DocumentService.GetDocument(CurrentUserId=int(payload["user_id"]), Id=DocumentId)
|
||||
userId = int(payload["user_id"])
|
||||
deniedResponse = await self._deny_cross_review_document_without_permission(userId, DocumentId)
|
||||
if deniedResponse:
|
||||
return deniedResponse
|
||||
Data = await self.DocumentService.GetDocument(CurrentUserId=userId, Id=DocumentId)
|
||||
return Result.success(data=Data)
|
||||
|
||||
@self.router.get("/v3/review-points/{DocumentId}", response_model=Result[ReviewPointsAggregateVO])
|
||||
@@ -203,7 +216,11 @@ class DocumentController(BaseController):
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""获取评查详情页聚合数据(带数据隔离校验)。"""
|
||||
Data = await self.DocumentService.GetReviewPoints(CurrentUserId=int(payload["user_id"]), DocumentId=DocumentId)
|
||||
userId = int(payload["user_id"])
|
||||
deniedResponse = await self._deny_cross_review_document_without_permission(userId, DocumentId)
|
||||
if deniedResponse:
|
||||
return deniedResponse
|
||||
Data = await self.DocumentService.GetReviewPoints(CurrentUserId=userId, DocumentId=DocumentId)
|
||||
return Result.success(data=Data)
|
||||
|
||||
@self.router.patch("/v3/review-points/{ReviewPointResultId}/audit", response_model=Result[ReviewPointAuditVO])
|
||||
@@ -400,3 +417,17 @@ class DocumentController(BaseController):
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
async def _deny_cross_review_document_without_permission(self, UserId: int, DocumentId: int) -> JSONResponse | None:
|
||||
if not await self.DocumentService.IsCrossReviewDocument(DocumentId):
|
||||
return None
|
||||
hasPermission = await self.PermissionService.HasAnyPermission(
|
||||
UserId=UserId,
|
||||
PermissionKeys=[self._CROSS_REVIEW_DOCUMENT_READ_PERMISSION],
|
||||
)
|
||||
if hasPermission:
|
||||
return None
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "msg": "当前用户没有查看交叉评查结果权限", "data": None},
|
||||
)
|
||||
|
||||
@@ -1,155 +1,40 @@
|
||||
"""评查点控制器。"""
|
||||
"""Legacy evaluation point API.
|
||||
|
||||
The current rule configuration flow is backed by leaudit_evaluation_point_groups
|
||||
and rule version tables. The old evaluation_points table is no longer present
|
||||
in the active schema, so keep this route explicit and non-destructive.
|
||||
"""
|
||||
|
||||
from fastapi import Depends, Query
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from fastapi_common.fastapi_common_security.security import verify_access_token
|
||||
from fastapi_common.fastapi_common_web.controller import BaseController
|
||||
from fastapi_modules.fastapi_leaudit.domian.Dto.evaluationPointDto import (
|
||||
EvaluationPointCreateDTO,
|
||||
EvaluationPointUpdateDTO,
|
||||
)
|
||||
from fastapi_modules.fastapi_leaudit.services.evaluationPointService import IEvaluationPointService
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.evaluationPointServiceImpl import EvaluationPointServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
|
||||
|
||||
|
||||
class EvaluationPointController(BaseController):
|
||||
"""评查点控制器。"""
|
||||
|
||||
_PERMISSIONS = {
|
||||
"list": "evaluation_point:list:read",
|
||||
"detail": "evaluation_point:detail:read",
|
||||
"create": "evaluation_point:create:write",
|
||||
"update": "evaluation_point:update:write",
|
||||
"delete": "evaluation_point:delete:delete",
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _tenant_context(payload: dict) -> dict[str, str | None]:
|
||||
return {
|
||||
"UserArea": payload.get("area"),
|
||||
"UserRole": payload.get("user_role"),
|
||||
"TenantCode": payload.get("tenant_code"),
|
||||
"TenantName": payload.get("tenant_name"),
|
||||
}
|
||||
"""Deprecated legacy evaluation point controller."""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(prefix="/v3/evaluation-points", tags=["评查点"])
|
||||
self.PointService: IEvaluationPointService = EvaluationPointServiceImpl()
|
||||
self.PermissionService: IPermissionService = PermissionServiceImpl()
|
||||
super().__init__(prefix="/v3/evaluation-points", tags=["旧评查点接口"])
|
||||
|
||||
@self.router.get("")
|
||||
async def ListEvaluationPoints(
|
||||
name: str | None = Query(None, description="名称模糊搜索"),
|
||||
code: str | None = Query(None, description="编码模糊搜索"),
|
||||
risk: str | None = Query(None, description="风险等级"),
|
||||
is_enabled: bool | None = Query(None, description="是否启用"),
|
||||
evaluation_point_groups_pid: int | None = Query(None, description="一级分组ID"),
|
||||
evaluation_point_groups_id: int | None = Query(None, description="二级分组ID"),
|
||||
document_attribute_type: str | None = Query(None, description="文档属性类型"),
|
||||
area: str | None = Query(None, description="地区/兼容租户展示值"),
|
||||
tenant_code: str | None = Query(None, description="租户编码"),
|
||||
tenant_name: str | None = Query(None, description="租户名称(兼容筛选)"),
|
||||
page: int = Query(1, ge=1, description="页码"),
|
||||
page_size: int = Query(20, ge=1, le=500, description="分页大小"),
|
||||
payload: dict = Depends(verify_access_token),
|
||||
):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["list"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有评查点查看权限", "data": None})
|
||||
tenant_context = self._tenant_context(payload)
|
||||
data = await self.PointService.ListPoints(
|
||||
int(payload["user_id"]),
|
||||
tenant_context["UserArea"],
|
||||
tenant_context["UserRole"],
|
||||
tenant_context["TenantCode"],
|
||||
tenant_context["TenantName"],
|
||||
name,
|
||||
code,
|
||||
risk,
|
||||
is_enabled,
|
||||
evaluation_point_groups_pid,
|
||||
evaluation_point_groups_id,
|
||||
document_attribute_type,
|
||||
area,
|
||||
tenant_code,
|
||||
tenant_name,
|
||||
page,
|
||||
page_size,
|
||||
)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
@self.router.api_route("", methods=["GET", "POST"])
|
||||
async def LegacyEvaluationPointsRoot():
|
||||
return self._gone()
|
||||
|
||||
@self.router.get("/attribute-types")
|
||||
async def GetEvaluationPointAttributeTypes(payload: dict = Depends(verify_access_token)):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["list"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有评查点查看权限", "data": None})
|
||||
data = await self.PointService.GetAttributeTypes()
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
@self.router.api_route("/attribute-types", methods=["GET"])
|
||||
async def LegacyEvaluationPointAttributeTypes():
|
||||
return self._gone()
|
||||
|
||||
@self.router.get("/{PointId}")
|
||||
async def GetEvaluationPoint(PointId: int, payload: dict = Depends(verify_access_token)):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["detail"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有评查点查看权限", "data": None})
|
||||
tenant_context = self._tenant_context(payload)
|
||||
data = await self.PointService.GetPoint(
|
||||
int(payload["user_id"]),
|
||||
tenant_context["UserArea"],
|
||||
tenant_context["UserRole"],
|
||||
tenant_context["TenantCode"],
|
||||
tenant_context["TenantName"],
|
||||
PointId,
|
||||
)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
@self.router.api_route("/{PointId}", methods=["GET", "PUT", "DELETE"])
|
||||
async def LegacyEvaluationPointDetail(PointId: int):
|
||||
return self._gone()
|
||||
|
||||
@self.router.post("")
|
||||
async def CreateEvaluationPoint(body: EvaluationPointCreateDTO, payload: dict = Depends(verify_access_token)):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["create"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有创建评查点权限", "data": None})
|
||||
tenant_context = self._tenant_context(payload)
|
||||
data = await self.PointService.CreatePoint(
|
||||
int(payload["user_id"]),
|
||||
tenant_context["UserArea"],
|
||||
tenant_context["UserRole"],
|
||||
tenant_context["TenantCode"],
|
||||
tenant_context["TenantName"],
|
||||
body,
|
||||
)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
|
||||
@self.router.put("/{PointId}")
|
||||
async def UpdateEvaluationPoint(PointId: int, body: EvaluationPointUpdateDTO, payload: dict = Depends(verify_access_token)):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["update"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有更新评查点权限", "data": None})
|
||||
tenant_context = self._tenant_context(payload)
|
||||
data = await self.PointService.UpdatePoint(
|
||||
int(payload["user_id"]),
|
||||
tenant_context["UserArea"],
|
||||
tenant_context["UserRole"],
|
||||
tenant_context["TenantCode"],
|
||||
tenant_context["TenantName"],
|
||||
PointId,
|
||||
body,
|
||||
)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
|
||||
@self.router.delete("/{PointId}")
|
||||
async def DeleteEvaluationPoint(PointId: int, payload: dict = Depends(verify_access_token)):
|
||||
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["delete"]]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有删除评查点权限", "data": None})
|
||||
tenant_context = self._tenant_context(payload)
|
||||
data = await self.PointService.DeletePoint(
|
||||
int(payload["user_id"]),
|
||||
tenant_context["UserArea"],
|
||||
tenant_context["UserRole"],
|
||||
tenant_context["TenantCode"],
|
||||
tenant_context["TenantName"],
|
||||
PointId,
|
||||
)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
|
||||
async def _check_permission(self, user_id: int, permission_keys: list[str]) -> bool:
|
||||
for permission_key in permission_keys:
|
||||
if await self.PermissionService.CheckPermission(user_id, permission_key):
|
||||
return True
|
||||
return False
|
||||
@staticmethod
|
||||
def _gone() -> JSONResponse:
|
||||
return JSONResponse(
|
||||
status_code=410,
|
||||
content={
|
||||
"code": 410,
|
||||
"msg": "旧评查点接口已下线,请使用规则组/规则配置接口",
|
||||
"data": None,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -35,24 +35,26 @@ class EvaluationPointGroupController(BaseController):
|
||||
code: str | None = Query(None, description="分组编码模糊搜索"),
|
||||
is_enabled: bool | None = Query(None, description="是否启用"),
|
||||
pid: int | None = Query(None, description="父分组ID,0 表示一级分组"),
|
||||
entry_module_id: int | None = Query(None, description="入口模块ID"),
|
||||
page: int = Query(1, ge=1, description="页码"),
|
||||
page_size: int = Query(20, ge=1, le=500, description="分页大小"),
|
||||
payload: dict = Depends(verify_access_token),
|
||||
):
|
||||
if not await self._check_permission(int(payload["user_id"]), ["evaluation_group:list:read", "rules:list:read"]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有评查点分组查看权限", "data": None})
|
||||
data = await self.GroupService.ListGroups(name, code, is_enabled, pid, page, page_size, int(payload["user_id"]))
|
||||
data = await self.GroupService.ListGroups(name, code, is_enabled, pid, page, page_size, int(payload["user_id"]), entry_module_id)
|
||||
return JSONResponse(status_code=200, content=data.model_dump())
|
||||
|
||||
@self.router.get("/all")
|
||||
async def ListAllEvaluationPointGroups(
|
||||
include_disabled: bool = Query(False, description="是否包含禁用分组"),
|
||||
with_rule_count: bool = Query(True, description="是否返回评查点数"),
|
||||
entry_module_id: int | None = Query(None, description="入口模块ID"),
|
||||
payload: dict = Depends(verify_access_token),
|
||||
):
|
||||
if not await self._check_permission(int(payload["user_id"]), ["evaluation_group:list:read", "rules:list:read"]):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有评查点分组查看权限", "data": None})
|
||||
data = await self.GroupService.ListAllGroups(include_disabled, with_rule_count, int(payload["user_id"]))
|
||||
data = await self.GroupService.ListAllGroups(include_disabled, with_rule_count, int(payload["user_id"]), entry_module_id)
|
||||
return JSONResponse(status_code=200, content=[item.model_dump() for item in data])
|
||||
|
||||
@self.router.get("/by-document-types")
|
||||
|
||||
@@ -8,6 +8,7 @@ from __future__ import annotations
|
||||
from typing import Any
|
||||
|
||||
from fastapi import Depends, File, Form, Query, UploadFile
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from fastapi_common.fastapi_common_security.security import verify_access_token
|
||||
from fastapi_common.fastapi_common_web.controller import BaseController
|
||||
@@ -15,6 +16,8 @@ from fastapi_common.fastapi_common_web.domain.responses import Result
|
||||
|
||||
from fastapi_modules.fastapi_leaudit.services import IGovdocService
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.govdocServiceImpl import GovdocServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
|
||||
|
||||
|
||||
class GovdocController(BaseController):
|
||||
@@ -23,6 +26,7 @@ class GovdocController(BaseController):
|
||||
def __init__(self):
|
||||
super().__init__(prefix="/govdoc", tags=["内部公文"])
|
||||
self.GovdocService: IGovdocService = GovdocServiceImpl()
|
||||
self.PermissionService: IPermissionService = PermissionServiceImpl()
|
||||
|
||||
# ── 文档 ──────────────────────────────────────────
|
||||
|
||||
@@ -30,6 +34,7 @@ class GovdocController(BaseController):
|
||||
async def UploadDocument(
|
||||
file: UploadFile = File(...),
|
||||
typeId: int | None = Form(default=None),
|
||||
entry_module_id: int | None = Form(default=None, description="入口模块ID"),
|
||||
region: str | None = Form(default=None, description="兼容保留字段:租户展示值/旧地区"),
|
||||
tenant_code: str | None = Form(default=None, description="租户编码"),
|
||||
autoRun: bool = Form(default=True),
|
||||
@@ -41,9 +46,12 @@ class GovdocController(BaseController):
|
||||
|
||||
创建文档主档记录,engine_type 标记为 govdoc,可选自动触发审查。
|
||||
"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "govdoc:document:create"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有上传公文权限", "data": None})
|
||||
result = await self.GovdocService.UploadDocument(
|
||||
file=file,
|
||||
typeId=typeId,
|
||||
entryModuleId=entry_module_id,
|
||||
region=region,
|
||||
tenantCode=tenant_code,
|
||||
autoRun=autoRun,
|
||||
@@ -61,6 +69,9 @@ class GovdocController(BaseController):
|
||||
fileExt: str | None = Query(default=None),
|
||||
region: str | None = Query(default=None, description="兼容保留字段:租户展示值/旧地区"),
|
||||
tenant_code: str | None = Query(default=None, description="租户编码"),
|
||||
entry_module_id: int | None = Query(default=None, description="按入口模块ID过滤"),
|
||||
type_ids: str | None = Query(default=None, description="按文档类型ID列表过滤,逗号分隔"),
|
||||
document_type_id: int | None = Query(default=None, description="按单个文档类型ID过滤"),
|
||||
status: str | None = Query(default=None),
|
||||
resultStatus: str | None = Query(default=None),
|
||||
createdBy: int | None = Query(default=None),
|
||||
@@ -72,6 +83,18 @@ class GovdocController(BaseController):
|
||||
|
||||
后端自动附加 engine_type='govdoc' 过滤条件。
|
||||
"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "govdoc:document:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有查看公文列表权限", "data": None})
|
||||
typeIdList: list[int] = []
|
||||
if type_ids:
|
||||
typeIdList = [
|
||||
int(item.strip())
|
||||
for item in type_ids.split(",")
|
||||
if item.strip().isdigit() and int(item.strip()) > 0
|
||||
]
|
||||
if document_type_id is not None and document_type_id > 0:
|
||||
typeIdList.append(document_type_id)
|
||||
|
||||
result = await self.GovdocService.ListDocuments(
|
||||
page=page,
|
||||
pageSize=pageSize,
|
||||
@@ -79,6 +102,8 @@ class GovdocController(BaseController):
|
||||
fileExt=fileExt,
|
||||
region=region,
|
||||
tenantCode=tenant_code,
|
||||
entryModuleId=entry_module_id,
|
||||
typeIds=typeIdList or None,
|
||||
status=status,
|
||||
resultStatus=resultStatus,
|
||||
createdBy=createdBy,
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
from typing import Any
|
||||
|
||||
from fastapi import Depends
|
||||
from fastapi import Depends, Query
|
||||
|
||||
from fastapi_common.fastapi_common_security.security import verify_access_token
|
||||
from fastapi_common.fastapi_common_web.controller import BaseController
|
||||
from fastapi_common.fastapi_common_web.domain.responses import Result
|
||||
|
||||
from fastapi_modules.fastapi_leaudit.domian.vo.homeVo import HomeEntryModuleVO
|
||||
from fastapi_modules.fastapi_leaudit.domian.vo.homeVo import HomeDashboardStatisticsVO, HomeEntryModuleVO
|
||||
from fastapi_modules.fastapi_leaudit.services import IHomeService
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.homeServiceImpl import HomeServiceImpl
|
||||
|
||||
@@ -25,3 +25,24 @@ class HomeController(BaseController):
|
||||
"""获取当前用户可见的首页入口模块。"""
|
||||
Data = await self.HomeService.GetEntryModules(UserId=int(payload["user_id"]))
|
||||
return Result.success(data=Data)
|
||||
|
||||
@self.router.get("/statistics/dashboard", response_model=Result[HomeDashboardStatisticsVO])
|
||||
async def GetDashboardStatistics(
|
||||
today: str | None = Query(None, description="统计基准日期,格式 YYYY-MM-DD"),
|
||||
type_ids: str | None = Query(None, description="文档类型ID,逗号分隔"),
|
||||
entry_module_id: int | None = Query(None, description="入口模块ID"),
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""获取首页统计卡片数据。"""
|
||||
typeIds = [
|
||||
int(item)
|
||||
for item in str(type_ids or "").split(",")
|
||||
if item.strip().isdigit() and int(item.strip()) > 0
|
||||
]
|
||||
Data = await self.HomeService.GetDashboardStatistics(
|
||||
UserId=int(payload["user_id"]),
|
||||
Today=today,
|
||||
TypeIds=typeIds,
|
||||
EntryModuleId=entry_module_id,
|
||||
)
|
||||
return Result.success(data=Data)
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
"""企查查控制器。"""
|
||||
|
||||
from typing import Any
|
||||
|
||||
from fastapi import Depends, Query
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from fastapi_common.fastapi_common_security.security import verify_access_token
|
||||
from fastapi_common.fastapi_common_web.controller import BaseController
|
||||
from fastapi_common.fastapi_common_web.domain.responses import Result
|
||||
from fastapi_modules.fastapi_leaudit.domian.Dto.qichachaDto import QichachaBatchQueryDTO, QichachaCompanyQueryDTO
|
||||
from fastapi_modules.fastapi_leaudit.domian.vo.qichachaVo import (
|
||||
QichachaBatchQueryVO,
|
||||
QichachaCompanyQueryVO,
|
||||
QichachaRecordStatusVO,
|
||||
)
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.qichachaServiceImpl import QichachaServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
|
||||
from fastapi_modules.fastapi_leaudit.services.qichachaService import IQichachaService
|
||||
|
||||
|
||||
class QichachaController(BaseController):
|
||||
"""企查查控制器。"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(prefix="/v2/qichacha", tags=["企查查"])
|
||||
self.QichachaService: IQichachaService = QichachaServiceImpl()
|
||||
self.PermissionService: IPermissionService = PermissionServiceImpl()
|
||||
|
||||
@self.router.post("/company", response_model=Result[QichachaCompanyQueryVO])
|
||||
async def QueryCompany(Body: QichachaCompanyQueryDTO, payload: dict[str, Any] = Depends(verify_access_token)):
|
||||
"""查询企业完整信息。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "qichacha:company:query"):
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "message": "当前用户没有查询企业信息权限", "data": None},
|
||||
)
|
||||
data = await self.QichachaService.QueryCompany(
|
||||
Keyword=Body.keyword,
|
||||
ForceRefresh=Body.forceRefresh,
|
||||
)
|
||||
return Result.success(data=data)
|
||||
|
||||
@self.router.post("/enterprise", response_model=Result[QichachaCompanyQueryVO])
|
||||
async def QueryEnterprise(Body: QichachaCompanyQueryDTO, payload: dict[str, Any] = Depends(verify_access_token)):
|
||||
"""仅查询企业工商信息。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "qichacha:company:query"):
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "message": "当前用户没有查询企业信息权限", "data": None},
|
||||
)
|
||||
data = await self.QichachaService.QueryEnterpriseOnly(
|
||||
Keyword=Body.keyword,
|
||||
ForceRefresh=Body.forceRefresh,
|
||||
)
|
||||
return Result.success(data=data)
|
||||
|
||||
@self.router.post("/dishonesty", response_model=Result[QichachaCompanyQueryVO])
|
||||
async def QueryDishonesty(Body: QichachaCompanyQueryDTO, payload: dict[str, Any] = Depends(verify_access_token)):
|
||||
"""仅查询企业失信信息。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "qichacha:company:query"):
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "message": "当前用户没有查询企业信息权限", "data": None},
|
||||
)
|
||||
data = await self.QichachaService.QueryDishonestyOnly(
|
||||
Keyword=Body.keyword,
|
||||
ForceRefresh=Body.forceRefresh,
|
||||
)
|
||||
return Result.success(data=data)
|
||||
|
||||
@self.router.post("/batch", response_model=Result[QichachaBatchQueryVO])
|
||||
async def BatchQuery(Body: QichachaBatchQueryDTO, payload: dict[str, Any] = Depends(verify_access_token)):
|
||||
"""批量查询企业信息。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "qichacha:company:query"):
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "message": "当前用户没有查询企业信息权限", "data": None},
|
||||
)
|
||||
data = await self.QichachaService.BatchQuery(
|
||||
Keywords=Body.keywords,
|
||||
ForceRefresh=Body.forceRefresh,
|
||||
)
|
||||
return Result.success(data=data)
|
||||
|
||||
@self.router.get("/status", response_model=Result[QichachaRecordStatusVO])
|
||||
async def GetRecordStatus(
|
||||
keyword: str = Query(..., min_length=2, description="企业名称或统一社会信用代码"),
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""查询企业缓存状态。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "qichacha:status:read"):
|
||||
return JSONResponse(
|
||||
status_code=403,
|
||||
content={"code": 403, "message": "当前用户没有查看企业缓存状态权限", "data": None},
|
||||
)
|
||||
data = await self.QichachaService.GetRecordStatus(Keyword=keyword)
|
||||
return Result.success(data=data)
|
||||
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
from typing import Any
|
||||
|
||||
from fastapi import Depends, Query
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from fastapi_common.fastapi_common_security.security import verify_access_token
|
||||
from fastapi_common.fastapi_common_web.controller import BaseController
|
||||
@@ -18,7 +19,9 @@ from fastapi_modules.fastapi_leaudit.domian.vo.usageStatsVo import (
|
||||
UsageStatsTrendVO,
|
||||
UsageStatsUserPageVO,
|
||||
)
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.impl.usageStatsServiceImpl import UsageStatsServiceImpl
|
||||
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
|
||||
from fastapi_modules.fastapi_leaudit.services.usageStatsService import IUsageStatsService
|
||||
|
||||
|
||||
@@ -28,6 +31,7 @@ class UsageStatsController(BaseController):
|
||||
def __init__(self):
|
||||
super().__init__(prefix="/v3/usage-stats", tags=["系统使用统计"])
|
||||
self.UsageStatsService: IUsageStatsService = UsageStatsServiceImpl()
|
||||
self.PermissionService: IPermissionService = PermissionServiceImpl()
|
||||
|
||||
@self.router.get("/overview", response_model=Result[UsageStatsOverviewVO])
|
||||
async def GetOverview(
|
||||
@@ -39,6 +43,9 @@ class UsageStatsController(BaseController):
|
||||
documentTypeId: int | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""查询系统使用统计总览。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:overview:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看统计总览权限", "data": None})
|
||||
data = await self.UsageStatsService.GetOverview(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
@@ -64,6 +71,9 @@ class UsageStatsController(BaseController):
|
||||
documentTypeId: int | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""查询系统使用统计趋势。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:trends:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看统计趋势权限", "data": None})
|
||||
data = await self.UsageStatsService.GetTrends(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
@@ -92,6 +102,9 @@ class UsageStatsController(BaseController):
|
||||
dateTo: str | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""按用户维度查询系统使用统计。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:users:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看用户统计权限", "data": None})
|
||||
data = await self.UsageStatsService.GetUsers(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
@@ -119,6 +132,9 @@ class UsageStatsController(BaseController):
|
||||
dateTo: str | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""按部门维度查询系统使用统计。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:departments:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看部门统计权限", "data": None})
|
||||
data = await self.UsageStatsService.GetDepartments(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
@@ -144,6 +160,9 @@ class UsageStatsController(BaseController):
|
||||
documentTypeId: int | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""按地区维度查询系统使用统计。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:areas:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看地区统计权限", "data": None})
|
||||
data = await self.UsageStatsService.GetAreas(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
@@ -173,6 +192,9 @@ class UsageStatsController(BaseController):
|
||||
dateTo: str | None = None,
|
||||
payload: dict[str, Any] = Depends(verify_access_token),
|
||||
):
|
||||
"""查询系统使用统计明细。"""
|
||||
if not await self.PermissionService.CheckPermission(int(payload["user_id"]), "usage_stats:details:read"):
|
||||
return JSONResponse(status_code=403, content={"code": 403, "message": "当前用户没有查看统计明细权限", "data": None})
|
||||
data = await self.UsageStatsService.GetDetails(
|
||||
CurrentUserId=int(payload["user_id"]),
|
||||
Filters={
|
||||
|
||||
Reference in New Issue
Block a user