12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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)}")
|