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