diff --git a/app/controller/add_approve_route.py b/app/controller/add_approve_route.py index a477cf9..468d7c0 100644 --- a/app/controller/add_approve_route.py +++ b/app/controller/add_approve_route.py @@ -1,17 +1,23 @@ from typing import TypedDict from fastapi import FastAPI +from langgraph.constants import START, END from langgraph.graph import StateGraph from app.model.ApproveModel import ApproveModel, ApproveService from app.model.ReimburseModel import ReimburseService, ReimburseModel from app.utils.db_utils import AsyncSessionDep +from app.utils.postgres_checkpointer import AsyncPostgresSaverDep def add_approve_route(app: FastAPI): # 提交报销单接口 @app.post('/submit_reimburse') - async def submit_reimburse(reimburse: dict, session: AsyncSessionDep): + async def submit_reimburse( + reimburse: dict, + session: AsyncSessionDep, + checkpointer: AsyncPostgresSaverDep, + ): reimburse_id = reimburse.get('id') # 先查一遍报销单信息 reimburse_cls: ReimburseModel = await ReimburseService.query_item(session=session, row_dict={"id": reimburse_id}) @@ -31,36 +37,52 @@ def add_approve_route(app: FastAPI): return {"message": "报销单已通过审批,请勿重复提交!"} # 1,4,5 的情况下新建审批单 - # 新建审批单,使用新的审批单走审批流程 + # 创建审批单,使用新的审批单走审批流程 new_approve_dict = { - "title": "title", - "description": "description", - "status": "status", - "amount": "amount", - "logs": "logs", - "user_id": "user_id", - "proj_id": "proj_id", + "title": f"{reimburse_cls.user.full_name} - 报销单审批", + "description": reimburse_cls.title + (f" / {reimburse_cls.remarks}" if reimburse_cls.remarks else ""), + "status": "approving", + "amount": reimburse_cls.amount, + "logs": "[]", + "user_id": reimburse_cls.user_id, # 先把审批人的id设置为申请人 + "proj_id": reimburse_cls.proj_id, } + insert_approve_cls = await ApproveService.item_insert(session=session, row_dict=new_approve_dict) - return + # 将审批单与报销单管理,设置报销单的approve_id为审批单的id + await ReimburseService.item_update(session=session, row_dict={"id": reimburse_id, "approve_id": insert_approve_cls.id}, ) + + graph = create_approve_graph(session, checkpointer) + + await graph.ainvoke({ + "input_approve_dict": insert_approve_cls.model_dump(), + "input_reimburse_user_id": reimburse_cls.user_id + }) + + return {"message": "报销单提交成功!"} -def create_approve_graph(session: AsyncSessionDep): +# 创建一个图来处理审批流 +def create_approve_graph( + session: AsyncSessionDep, + checkpointer: AsyncPostgresSaverDep, +): class StateSchema(TypedDict): + input_reimburse_user_id: str + input_approve_dict: dict + status: str - insert_approve_id: str - # 要新建的审批单信息 - input_approve: dict builder = StateGraph(StateSchema) async def node_create_approve(state: StateSchema): - new_approve_dict = state.get('input_approve') - if not new_approve_dict: - raise Exception('缺少审批单信息参数!') - insert_approve_cls = await ApproveService.item_insert(session=session, row_dict=new_approve_dict) + pass - return {"insert_approve_id": insert_approve_cls.id} + builder.add_node(node_create_approve) + builder.add_edge(START, 'node_create_approve') + builder.add_edge('node_create_approve', END) - return + graph = builder.compile(checkpointer=checkpointer) + + return graph