Files
ai-admin-server/app/model/ReimburseModel.py
T

144 lines
4.1 KiB
Python

import decimal
from decimal import Decimal
from typing import Optional, List
from pydantic import computed_field
from sqlalchemy.orm import selectinload
from sqlmodel import Field, Relationship, select
from app.model.ApproveModel import ApproveModel
from app.model.BasicModel import BasicModel
from app.model.ProjectModel import ProjectModel
from app.model.ReimburseOtherModel import ReimburseOtherModel
from app.model.ReimburseTravelModel import ReimburseTravelModel
from app.utils.create_module_service import create_model_service
class ReimburseModel(BasicModel, table=True):
__tablename__ = "pl_reimburse"
title: str = Field(default=None, description="标题")
remarks: str = Field(default=None, description="备注信息")
# /*---------------------------------------project-------------------------------------------*/
proj_id: str = Field(
default=None,
description="所属项目id",
foreign_key="pl_project.id", # 添加外键约束
nullable=True
)
proj_rel: Optional["ProjectModel"] = Relationship(
sa_relationship_kwargs={
"foreign_keys": "ReimburseModel.proj_id",
"remote_side": "ProjectModel.id",
"uselist": False
}
)
@computed_field
@property
def project(self) -> Optional[ProjectModel]:
return self.proj_rel
@project.setter
def project(self, value: Optional[ProjectModel]) -> None:
pass
# /*---------------------------------------travel_list-------------------------------------------*/
# 新增:与ReimburseTravelModel的一对多关系
travel_list_rel: Optional[List["ReimburseTravelModel"]] = Relationship(
sa_relationship_kwargs={
"foreign_keys": "ReimburseTravelModel.reimburse_id",
"primaryjoin": "ReimburseModel.id == ReimburseTravelModel.reimburse_id",
}
)
@computed_field
@property
def travel_list(self) -> Optional[List["ReimburseTravelModel"]]:
return self.travel_list_rel
@travel_list.setter
def travel_list(self, value: Optional[List["ReimburseTravelModel"]]) -> None:
pass
# /*---------------------------------------other_list-------------------------------------------*/
other_list_rel: Optional[List["ReimburseOtherModel"]] = Relationship(
sa_relationship_kwargs={
"foreign_keys": "ReimburseOtherModel.reimburse_id",
"primaryjoin": "ReimburseModel.id == ReimburseOtherModel.reimburse_id",
}
)
@computed_field
@property
def other_list(self) -> Optional[List["ReimburseOtherModel"]]:
return self.other_list_rel
@other_list.setter
def other_list(self, value: Optional[List["ReimburseOtherModel"]]) -> None:
pass
# /*---------------------------------------amount-------------------------------------------*/
@computed_field
@property
def amount(self) -> Decimal:
ret = Decimal(0)
for other_item in (self.other_list or []):
ret = ret + Decimal(other_item.amount)
for travel_item in (self.travel_list or []):
ret = ret + Decimal(travel_item.amount)
return ret
@amount.setter
def amount(self, value: decimal) -> None:
pass
# /*---------------------------------------approve_id-------------------------------------------*/
approve_id: str = Field(
default=None,
description="关联审批单的ID",
foreign_key="pl_approve.id", # 添加外键约束
nullable=True
)
approve_rel: Optional["ApproveModel"] = Relationship(
sa_relationship_kwargs={
"foreign_keys": "ReimburseModel.approve_id",
"remote_side": "ApproveModel.id",
"uselist": False
}
)
@computed_field
@property
def approve(self) -> Optional[ApproveModel]:
return self.approve_rel
@approve.setter
def approve(self, value: Optional[ApproveModel]) -> None:
pass
ReimburseService = create_model_service(
Cls=ReimburseModel,
custom_query=lambda: select(ReimburseModel)
.options(
selectinload(ReimburseModel.proj_rel).
selectinload(ProjectModel.leader),
selectinload(ReimburseModel.travel_list_rel),
selectinload(ReimburseModel.other_list_rel),
selectinload(ReimburseModel.approve_rel).
selectinload(ApproveModel.proj_rel).
selectinload(ProjectModel.leader),
)
)