Merge commit 'd8e4449f1009bc03b167c0e5667413585b2b3e53' as 'core'
This commit is contained in:
115
core/backend/app/models/carbon.py
Normal file
115
core/backend/app/models/carbon.py
Normal file
@@ -0,0 +1,115 @@
|
||||
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())
|
||||
Reference in New Issue
Block a user