Files
tp-ems/backend/app/models/carbon.py
Du Wenbo d8e4449f10 Squashed 'core/' content from commit 92ec910
git-subtree-dir: core
git-subtree-split: 92ec910a132e379a3a6e442a75bcb07cac0f0010
2026-04-04 18:16:49 +08:00

116 lines
4.7 KiB
Python

from sqlalchemy import Column, Integer, String, Float, DateTime, Text, Boolean, Date, JSON, ForeignKey
from sqlalchemy.sql import func
from app.core.database import Base
class EmissionFactor(Base):
"""碳排放因子"""
__tablename__ = "emission_factors"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False)
energy_type = Column(String(50), nullable=False) # electricity, natural_gas, diesel, etc.
factor = Column(Float, nullable=False) # kgCO2/单位
unit = Column(String(20), nullable=False) # kWh, m³, L, etc.
region = Column(String(50), default="north_china") # 区域电网
scope = Column(Integer, nullable=False) # 1, 2, 3
source = Column(String(200)) # 数据来源
year = Column(Integer)
created_at = Column(DateTime(timezone=True), server_default=func.now())
class CarbonTarget(Base):
"""碳减排目标"""
__tablename__ = "carbon_targets"
id = Column(Integer, primary_key=True, autoincrement=True)
year = Column(Integer, nullable=False)
month = Column(Integer, nullable=True) # NULL for annual target
target_emission_tons = Column(Float, nullable=False)
actual_emission_tons = Column(Float, default=0)
status = Column(String(20), default="on_track") # on_track / warning / exceeded
created_at = Column(DateTime(timezone=True), server_default=func.now())
class CarbonReduction(Base):
"""碳减排活动"""
__tablename__ = "carbon_reductions"
id = Column(Integer, primary_key=True, autoincrement=True)
source_type = Column(String(50), nullable=False) # pv_generation / heat_pump_cop / energy_saving
date = Column(Date, nullable=False, index=True)
reduction_tons = Column(Float, nullable=False)
equivalent_trees = Column(Float, default=0)
methodology = Column(String(200))
verified = Column(Boolean, default=False)
verification_date = Column(DateTime(timezone=True), nullable=True)
device_id = Column(Integer, ForeignKey("devices.id"), nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
class GreenCertificate(Base):
"""绿证管理"""
__tablename__ = "green_certificates"
id = Column(Integer, primary_key=True, autoincrement=True)
certificate_type = Column(String(20), nullable=False) # GEC / IREC / CCER
certificate_number = Column(String(100), unique=True, nullable=False)
issue_date = Column(Date, nullable=False)
expiry_date = Column(Date, nullable=True)
energy_mwh = Column(Float, nullable=False)
price_yuan = Column(Float, default=0)
status = Column(String(20), default="active") # active / used / expired / traded
source_device_id = Column(Integer, ForeignKey("devices.id"), nullable=True)
notes = Column(Text)
created_at = Column(DateTime(timezone=True), server_default=func.now())
class CarbonReport(Base):
"""碳排放报告"""
__tablename__ = "carbon_reports"
id = Column(Integer, primary_key=True, autoincrement=True)
report_type = Column(String(20), nullable=False) # monthly / quarterly / annual
period_start = Column(Date, nullable=False)
period_end = Column(Date, nullable=False)
generated_at = Column(DateTime(timezone=True), server_default=func.now())
scope1_tons = Column(Float, default=0)
scope2_tons = Column(Float, default=0)
scope3_tons = Column(Float, nullable=True)
total_tons = Column(Float, default=0)
reduction_tons = Column(Float, default=0)
net_tons = Column(Float, default=0)
report_data = Column(JSON, nullable=True)
file_path = Column(String(500), nullable=True)
class CarbonBenchmark(Base):
"""行业碳排放基准"""
__tablename__ = "carbon_benchmarks"
id = Column(Integer, primary_key=True, autoincrement=True)
industry = Column(String(100), nullable=False)
metric_name = Column(String(100), nullable=False)
benchmark_value = Column(Float, nullable=False)
unit = Column(String(50), nullable=False)
year = Column(Integer)
source = Column(String(200))
notes = Column(Text)
class CarbonEmission(Base):
"""碳排放记录"""
__tablename__ = "carbon_emissions"
id = Column(Integer, primary_key=True, autoincrement=True)
date = Column(DateTime(timezone=True), nullable=False, index=True)
scope = Column(Integer, nullable=False) # 1, 2, 3
category = Column(String(50), nullable=False) # electricity, gas, heat, etc.
emission = Column(Float, nullable=False) # kgCO2e
reduction = Column(Float, default=0) # 减排量 kgCO2e (光伏、热泵节能等)
energy_consumption = Column(Float) # 对应能耗量
energy_unit = Column(String(20))
emission_factor_id = Column(Integer)
note = Column(Text)
created_at = Column(DateTime(timezone=True), server_default=func.now())