Files
zpark-ems/backend/app/models/carbon.py

116 lines
4.7 KiB
Python
Raw Normal View History

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())