from sqlalchemy import Column, Integer, Float, ForeignKeyConstraint from app.database import Base from app.models import FluxCdInputData, SoilData class FluxCdOutputData(Base): """ 通量镉预测模型输出数据模型 @param {int} id - 主键ID(自增) @param {int} farmland_id - 区域农业用地矢量点编号(关联Farmland_data表) @param {int} sample_id - 采样点ID(关联Farmland_data表) @param {float} in_cd - Cd输入总通量(g/ha/a) @param {float} out_cd - Cd输出总通量(g/ha/a) @param {float} net_cd - Cd净通量(g/ha/a) @param {float} end_cd - 当年Cd浓度(mg/kg) """ __tablename__ = 'FluxCd_output_data' id = Column('ID', Integer, primary_key=True, autoincrement=True) farmland_id = Column('Farmland_ID', Integer) sample_id = Column('Sample_ID', Integer) in_cd = Column('In_Cd', Float, nullable=True) out_cd = Column('Out_Cd', Float, nullable=True) net_cd = Column('Net_Cd', Float, nullable=True) end_cd = Column('End_Cd', Float, nullable=True) # 定义复合外键,关联到Farmland_data表 __table_args__ = ( ForeignKeyConstraint( ['Farmland_ID', 'Sample_ID'], ['Farmland_data.Farmland_ID', 'Farmland_data.Sample_ID'] ), {'comment': '通量镉预测模型输出数据'} ) def calculate_fluxes(self, input_data: FluxCdInputData): """根据输入数据计算通量""" self.in_cd = input_data.input_flux() self.out_cd = input_data.output_flux() # 使用输出通量方法 self.net_cd = self.in_cd - self.out_cd # 在 app/models/effcd_output.py 的 FluxCdOutputData 类中添加以下方法 def calculate_end_cd(self, db_session): """ 计算当年Cd浓度(mg/kg) 公式: (Initial_Cd + Net_Cd) / (2000 * bd020_90) @param db_session: 数据库会话 @return: 计算后的Cd浓度值 """ try: # 1. 获取初始Cd浓度(Initial_Cd) - 从FluxCdInputData表 input_data = db_session.query(FluxCdInputData).filter( FluxCdInputData.farmland_id == self.farmland_id, FluxCdInputData.sample_id == self.sample_id ).first() if not input_data: raise ValueError("未找到对应的输入通量数据") initial_cd = input_data.initial_cd # 单位: g/ha # 2. 获取土壤容重(bd020_90) - 从SoilData表 soil_data = db_session.query(SoilData).filter( SoilData.farmland_id == self.farmland_id, SoilData.sample_id == self.sample_id ).first() if not soil_data: raise ValueError("未找到对应的土壤数据") bd020_90 = soil_data.bd020_90 # 单位: g/cm³ # 3. 计算当年Cd浓度 # 注意单位转换: # - Initial_Cd和Net_Cd单位是g/ha # - 1 ha = 10,000 m² # - 假设计算深度为20cm(0.2m),所以体积为2000 m³/ha # - bd020_90单位是g/cm³ = 1000 kg/m³ # 公式推导: # (g/ha) / (2000 m³/ha * 1000 kg/m³) = (g/ha) / (2,000,000 kg/ha) = mg/kg end_cd = (initial_cd + self.net_cd) / (2000 * bd020_90) # 更新并返回结果 self.end_cd = end_cd return end_cd except Exception as e: raise ValueError(f"计算当年Cd浓度失败: {str(e)}")