feat: 准备实现图来处理审批流

This commit is contained in:
martsforever
2025-08-24 14:08:15 +08:00
parent 4cc090b55c
commit f53ed7d16f
+42 -20
View File
@@ -1,17 +1,23 @@
from typing import TypedDict from typing import TypedDict
from fastapi import FastAPI from fastapi import FastAPI
from langgraph.constants import START, END
from langgraph.graph import StateGraph from langgraph.graph import StateGraph
from app.model.ApproveModel import ApproveModel, ApproveService from app.model.ApproveModel import ApproveModel, ApproveService
from app.model.ReimburseModel import ReimburseService, ReimburseModel from app.model.ReimburseModel import ReimburseService, ReimburseModel
from app.utils.db_utils import AsyncSessionDep from app.utils.db_utils import AsyncSessionDep
from app.utils.postgres_checkpointer import AsyncPostgresSaverDep
def add_approve_route(app: FastAPI): def add_approve_route(app: FastAPI):
# 提交报销单接口 # 提交报销单接口
@app.post('/submit_reimburse') @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_id = reimburse.get('id')
# 先查一遍报销单信息 # 先查一遍报销单信息
reimburse_cls: ReimburseModel = await ReimburseService.query_item(session=session, row_dict={"id": reimburse_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": "报销单已通过审批,请勿重复提交!"} return {"message": "报销单已通过审批,请勿重复提交!"}
# 1,4,5 的情况下新建审批单 # 1,4,5 的情况下新建审批单
# 新建审批单,使用新的审批单走审批流程 # 创建审批单,使用新的审批单走审批流程
new_approve_dict = { new_approve_dict = {
"title": "title", "title": f"{reimburse_cls.user.full_name} - 报销单审批",
"description": "description", "description": reimburse_cls.title + (f" / {reimburse_cls.remarks}" if reimburse_cls.remarks else ""),
"status": "status", "status": "approving",
"amount": "amount", "amount": reimburse_cls.amount,
"logs": "logs", "logs": "[]",
"user_id": "user_id", "user_id": reimburse_cls.user_id, # 先把审批人的id设置为申请人
"proj_id": "proj_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): class StateSchema(TypedDict):
input_reimburse_user_id: str
input_approve_dict: dict
status: str status: str
insert_approve_id: str
# 要新建的审批单信息
input_approve: dict
builder = StateGraph(StateSchema) builder = StateGraph(StateSchema)
async def node_create_approve(state: StateSchema): async def node_create_approve(state: StateSchema):
new_approve_dict = state.get('input_approve') pass
if not new_approve_dict:
raise Exception('缺少审批单信息参数!')
insert_approve_cls = await ApproveService.item_insert(session=session, row_dict=new_approve_dict)
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