feat: 审批流程跑通

This commit is contained in:
martsforever
2025-08-24 18:39:25 +08:00
parent 8f6964411b
commit a28aadf219
2 changed files with 159 additions and 92 deletions
+30 -15
View File
@@ -1,6 +1,7 @@
from fastapi import FastAPI
from langchain_core.runnables import RunnableConfig
from langgraph.func import entrypoint
from langgraph.constants import START
from langgraph.graph import StateGraph
from langgraph.types import Command
from pydantic import BaseModel, Field
@@ -8,7 +9,7 @@ from app.model.ApproveModel import ApproveService
from app.model.ReimburseModel import ReimburseService, ReimburseModel
from app.utils.db_utils import AsyncSessionDep
from app.utils.postgres_checkpointer import AsyncPostgresSaverDep
from app.workflow.approve import create_approve_workflow, ApproveWorkflowInputs, ApproveResult
from app.workflow.approve import ApproveResult, create_approve_graph, ApproveGraphSchema
def add_approve_route(app: FastAPI):
@@ -54,14 +55,14 @@ def add_approve_route(app: FastAPI):
# 将审批单与报销单管理,设置报销单的approve_id为审批单的id
await ReimburseService.item_update(session=session, row_dict={"id": reimburse_id, "approve_id": insert_approve_cls.id}, )
reimburse_workflow = create_reimburse_workflow(session=session, checkpointer=checkpointer)
reimburse_graph = create_reimburse_graph(session=session, checkpointer=checkpointer)
await reimburse_workflow.ainvoke(
{"reimburse_user_id": reimburse_cls.user.id, "approve_id": insert_approve_cls.id},
graph_state = await reimburse_graph.ainvoke(
{"input_user_id": reimburse_cls.user.id, "input_approve_id": insert_approve_cls.id},
config={"configurable": {"thread_id": insert_approve_cls.id}}
)
return {"message": "报销单提交成功!"}
return {"message": "报销单提交成功!", "graph_state": graph_state}
class ProcessApproveClass(BaseModel):
flag: bool = Field(..., description="审批标识,是审批通过还是审批驳回")
@@ -76,26 +77,40 @@ def add_approve_route(app: FastAPI):
session: AsyncSessionDep,
checkpointer: AsyncPostgresSaverDep,
):
reimburse_workflow = create_reimburse_workflow(session=session, checkpointer=checkpointer)
reimburse_graph = create_reimburse_graph(session=session, checkpointer=checkpointer)
approve_result: ApproveResult = {
"flag": body.flag,
"reason": body.reason,
"user_id": body.user_id,
}
await reimburse_workflow.ainvoke(Command(resume=approve_result), config={"configurable": {"thread_id": body.approve_id}})
print('\n\n', ":::::::::::process_approve start::::::::::::", '\n\n')
print(approve_result)
print('\n\n', ":::::::::::process_approve end::::::::::::", '\n\n')
return await reimburse_graph.ainvoke(Command(resume=approve_result), config={"configurable": {"thread_id": body.approve_id}})
def create_reimburse_workflow(
def create_reimburse_graph(
checkpointer: AsyncPostgresSaverDep,
session: AsyncSessionDep,
):
approve_workflow = create_approve_workflow(checkpointer, session)
approve_graph = create_approve_graph(checkpointer, session)
@entrypoint(checkpointer=checkpointer)
async def reimburse_workflow(input_dict: ApproveWorkflowInputs, config: RunnableConfig):
approve_flag = await approve_workflow.ainvoke(input_dict, config=config)
builder = StateGraph(ApproveGraphSchema)
async def node(state: ApproveGraphSchema, config: RunnableConfig):
print('\n\n', ":::::::::::node start::::::::::::", '\n\n')
print(state)
print('\n\n', ":::::::::::node end::::::::::::", '\n\n')
graph_state = await approve_graph.ainvoke(state, config=config)
approve_flag = graph_state.get('approve_flag')
# 这里审批结束之后可以做一些事情,比如发送邮件、短信、微信消息等通知用户,因为没有实现对应的模块,这里就不做任何处理
print("报销单审批流执行结束::::::::::>>>>>>>>>>>", approve_flag)
return None
return {}
return reimburse_workflow
builder.add_node("node", node)
builder.add_edge(START, "node")
return builder.compile(checkpointer=checkpointer)