From 3c66644fab3e626cbbf9866417cb12eedaae2cd7 Mon Sep 17 00:00:00 2001 From: martsforever Date: Sat, 23 Aug 2025 13:17:50 +0800 Subject: [PATCH] feat: ProjectModel --- app/model/ProjectModel.py | 49 +++++++++++++++++++++++++++++++++++++++ app/server.py | 2 ++ 2 files changed, 51 insertions(+) create mode 100644 app/model/ProjectModel.py diff --git a/app/model/ProjectModel.py b/app/model/ProjectModel.py new file mode 100644 index 0000000..70f1b5c --- /dev/null +++ b/app/model/ProjectModel.py @@ -0,0 +1,49 @@ +from typing import Optional + +from pydantic import computed_field +from sqlalchemy.orm import selectinload +from sqlmodel import Field, Relationship, select + +from app.model.BasicModel import BasicModel +from app.model.UserModel import UserServiceModel +from app.utils.create_module_service import create_model_service + + +class ProjectModel(BasicModel, table=True): + __tablename__ = "pl_project" + + name: str = Field(default=None, description="项目名称") + description: str = Field(default=None, description="项目描述") + budget: float = Field(default=None, description="项目预算金额") + spent: float = Field(default=None, description="项目已花费金额") + version: int = Field(default=None, description="项目版本号") + + leader_id: str = Field( + default=None, + description="项目负责人id", + foreign_key="pl_user.id", # 添加外键约束 + nullable=True + ) + + leader: Optional["UserServiceModel"] = Relationship( + sa_relationship_kwargs={ + "foreign_keys": "ProjectModel.leader_id", + "remote_side": "UserServiceModel.id", + "uselist": False + } + ) + + @computed_field + @property + def leader_name(self) -> Optional[str]: + return self.leader.full_name if self.leader else None + + @leader_name.setter + def leader_name(self, value: Optional[str]) -> None: + pass + + +ProjectService = create_model_service( + Cls=ProjectModel, + custom_query=lambda: select(ProjectModel).options(selectinload(ProjectModel.leader)), +) diff --git a/app/server.py b/app/server.py index cbb527b..cbaeb92 100644 --- a/app/server.py +++ b/app/server.py @@ -25,6 +25,7 @@ from app.model.LlmOrder import LlmOrderService from app.model.LlmProduct import LlmProductService from app.model.OrgModel import OrgService from app.model.PosModel import PosService +from app.model.ProjectModel import ProjectService from app.run_uvicorn import run_uvicorn from app.utils.ModelInputSchema import ModelInputSchema from app.utils.add_async_route import add_async_route @@ -83,6 +84,7 @@ LgMessageService.add_route(app=app, path="/lg_message") LgChatService.add_route(app=app, path="/lg_chat") OrgService.add_route(app=app, path="/org") PosService.add_route(app=app, path="/pos") +ProjectService.add_route(app=app, path="/project") if __name__ == "__main__": run_uvicorn()