150 lines
5.8 KiB
Python
150 lines
5.8 KiB
Python
"""
|
|
一个接口按 domain 返回项目聚合数据。
|
|
"""
|
|
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from ..construction.construction import ConstructionResponse
|
|
from ..construction.construction_detail import ConstructionDetailResponse
|
|
from ..contract.contract import ContractResponse
|
|
from ..contract_settlement.contract_settlement import (
|
|
ContractSettlementResponse,
|
|
)
|
|
from ..contract_settlement.contract_settlement_detail import (
|
|
ContractSettlementDetailResponse,
|
|
)
|
|
from ..material.material import MaterialResponse
|
|
from ..material.material_detail import MaterialDetailResponse
|
|
from ..power.power import PowerResponse
|
|
from ..power.power_detail import PowerDetail
|
|
from ..project.project_base import ProjectResponseBase
|
|
from ..project_extensions.contract_change import ContractChangeResponse
|
|
from ..project_extensions.generator_unit import GeneratorUnitProject
|
|
from ..project_extensions.lar import (
|
|
LarChangeDetailSchema,
|
|
LarDetailSchema,
|
|
)
|
|
from ..project_extensions.preparation import PreparationDetail
|
|
from ..project_extensions.production import ProductionDetail
|
|
from ..project_extensions.project_detail import ProjectDetailProject
|
|
from ..project_multi_type import (
|
|
GasTurbineExtension,
|
|
HydropowerExtension,
|
|
OffShoreWindExtension,
|
|
OnShoreWindExtension,
|
|
PhotovoltaicExtension,
|
|
PumpedStorageExtension,
|
|
ThermalPowerExtension,
|
|
)
|
|
|
|
|
|
ProjectAggregateDomain = Literal[
|
|
"project",
|
|
"project_detail",
|
|
"generator_units",
|
|
"lar",
|
|
"lar_change",
|
|
"contract_changes",
|
|
"photovoltaic_extension",
|
|
"onshore_wind_extension",
|
|
"offshore_wind_extension",
|
|
"hydropower_extension",
|
|
"pumped_storage_extension",
|
|
"gas_turbine_extension",
|
|
"thermal_power_extension",
|
|
"production_list",
|
|
"preparation_list",
|
|
"contracts",
|
|
"materials",
|
|
"material_details",
|
|
"constructions",
|
|
"construction_details",
|
|
"contract_settlements",
|
|
"contract_settlement_details",
|
|
"power",
|
|
"power_details",
|
|
]
|
|
|
|
|
|
ALL_PROJECT_AGGREGATE_DOMAINS: list[ProjectAggregateDomain] = [
|
|
"project",
|
|
"project_detail",
|
|
"generator_units",
|
|
"lar",
|
|
"lar_change",
|
|
"contract_changes",
|
|
"photovoltaic_extension",
|
|
"onshore_wind_extension",
|
|
"offshore_wind_extension",
|
|
"hydropower_extension",
|
|
"pumped_storage_extension",
|
|
"gas_turbine_extension",
|
|
"thermal_power_extension",
|
|
"production_list",
|
|
"preparation_list",
|
|
"contracts",
|
|
"materials",
|
|
"material_details",
|
|
"constructions",
|
|
"construction_details",
|
|
"contract_settlements",
|
|
"contract_settlement_details",
|
|
"power",
|
|
"power_details",
|
|
]
|
|
|
|
|
|
class ProjectAggregateData(BaseModel):
|
|
"""按 domain 组织的项目聚合数据。"""
|
|
|
|
project: ProjectResponseBase | None = Field(None, description="项目基本信息")
|
|
project_detail: list[ProjectDetailProject] = Field(default_factory=list, description="项目容量信息")
|
|
generator_units: list[GeneratorUnitProject] = Field(default_factory=list, description="发电单元信息")
|
|
lar: LarDetailSchema | None = Field(None, description="移民征地信息")
|
|
lar_change: list[LarChangeDetailSchema] = Field(default_factory=list, description="移民变更信息")
|
|
contract_changes: list[ContractChangeResponse] = Field(default_factory=list, description="合同变更信息")
|
|
|
|
photovoltaic_extension: PhotovoltaicExtension | None = Field(None, description="光伏项目扩展信息")
|
|
onshore_wind_extension: OnShoreWindExtension | None = Field(None, description="陆风项目扩展信息")
|
|
offshore_wind_extension: OffShoreWindExtension | None = Field(None, description="海风项目扩展信息")
|
|
hydropower_extension: HydropowerExtension | None = Field(None, description="水电项目扩展信息")
|
|
pumped_storage_extension: PumpedStorageExtension | None = Field(None, description="抽蓄项目扩展信息")
|
|
gas_turbine_extension: GasTurbineExtension | None = Field(None, description="燃气轮机项目扩展信息")
|
|
thermal_power_extension: ThermalPowerExtension | None = Field(None, description="火电项目扩展信息")
|
|
|
|
production_list: list[ProductionDetail] = Field(default_factory=list, description="投产节点列表")
|
|
preparation_list: list[PreparationDetail] = Field(default_factory=list, description="里程碑节点列表")
|
|
|
|
contracts: list[ContractResponse] = Field(default_factory=list, description="合同列表")
|
|
materials: list[MaterialResponse] = Field(default_factory=list, description="物资主表列表")
|
|
material_details: list[MaterialDetailResponse] = Field(default_factory=list, description="物资明细列表")
|
|
constructions: list[ConstructionResponse] = Field(default_factory=list, description="施工主表列表")
|
|
construction_details: list[ConstructionDetailResponse] = Field(default_factory=list, description="施工明细列表")
|
|
contract_settlements: list[ContractSettlementResponse] = Field(default_factory=list, description="合同结算主表列表")
|
|
contract_settlement_details: list[ContractSettlementDetailResponse] = Field(default_factory=list, description="合同结算明细列表")
|
|
power: list[PowerResponse] = Field(default_factory=list, description="力能主表列表")
|
|
power_details: list[PowerDetail] = Field(default_factory=list, description="力能明细列表")
|
|
|
|
|
|
class ProjectAggregateMeta(BaseModel):
|
|
"""聚合请求回显和截断信息。"""
|
|
|
|
project_id: str = Field(..., description="项目ID")
|
|
requested_domains: list[ProjectAggregateDomain] = Field(
|
|
default_factory=lambda: list(ALL_PROJECT_AGGREGATE_DOMAINS),
|
|
description="本次请求的 domain 列表",
|
|
)
|
|
domain_limit: int = Field(10000, description="每个 domain 的最大返回条数")
|
|
truncated_domains: list[ProjectAggregateDomain] = Field(default_factory=list, description="被截断的 domain 列表")
|
|
|
|
|
|
class ProjectAggregateResponse(BaseModel):
|
|
"""项目聚合同步响应。"""
|
|
|
|
meta: ProjectAggregateMeta = Field(..., description="请求元信息")
|
|
data: ProjectAggregateData = Field(
|
|
default_factory=lambda: ProjectAggregateData.model_construct(),
|
|
description="按 domain 分组的数据",
|
|
) |