116 lines
4.7 KiB
Python
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())
|