feat: 接入dify工作流来控制审批流程

This commit is contained in:
martsforever
2025-08-24 19:56:36 +08:00
parent a28aadf219
commit 45098d36dc
3 changed files with 35 additions and 3 deletions
+3 -3
View File
@@ -5,7 +5,7 @@ from langgraph.graph import StateGraph
from langgraph.types import Command from langgraph.types import Command
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from app.model.ApproveModel import ApproveService from app.model.ApproveModel import ApproveService, ApproveModel
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 from app.utils.postgres_checkpointer import AsyncPostgresSaverDep
@@ -50,7 +50,7 @@ def add_approve_route(app: FastAPI):
"user_id": reimburse_cls.user_id, # 先把审批人的id设置为申请人 "user_id": reimburse_cls.user_id, # 先把审批人的id设置为申请人
"proj_id": reimburse_cls.proj_id, "proj_id": reimburse_cls.proj_id,
} }
insert_approve_cls = await ApproveService.item_insert(session=session, row_dict=new_approve_dict) insert_approve_cls: ApproveModel = await ApproveService.item_insert(session=session, row_dict=new_approve_dict)
# 将审批单与报销单管理,设置报销单的approve_id为审批单的id # 将审批单与报销单管理,设置报销单的approve_id为审批单的id
await ReimburseService.item_update(session=session, row_dict={"id": reimburse_id, "approve_id": insert_approve_cls.id}, ) await ReimburseService.item_update(session=session, row_dict={"id": reimburse_id, "approve_id": insert_approve_cls.id}, )
@@ -58,7 +58,7 @@ def add_approve_route(app: FastAPI):
reimburse_graph = create_reimburse_graph(session=session, checkpointer=checkpointer) reimburse_graph = create_reimburse_graph(session=session, checkpointer=checkpointer)
graph_state = await reimburse_graph.ainvoke( graph_state = await reimburse_graph.ainvoke(
{"input_user_id": reimburse_cls.user.id, "input_approve_id": insert_approve_cls.id}, {"input_user_id": reimburse_cls.user.id, "input_approve_id": insert_approve_cls.id, "input_amount": str(insert_approve_cls.amount)},
config={"configurable": {"thread_id": insert_approve_cls.id}} config={"configurable": {"thread_id": insert_approve_cls.id}}
) )
+1
View File
@@ -17,6 +17,7 @@ class PosModel(BasicModel, table=True):
# parent_code: str = Field(default=None, description="父职位编码") # parent_code: str = Field(default=None, description="父职位编码")
# organization_code: str = Field(default=None, description="所属组织编码") # organization_code: str = Field(default=None, description="所属组织编码")
remarks: str = Field(default=None, description="备注信息") remarks: str = Field(default=None, description="备注信息")
pos_level: int = Field(default=None, description="职位层级")
# /*---------------------------------------parent_code-------------------------------------------*/ # /*---------------------------------------parent_code-------------------------------------------*/
+31
View File
@@ -3,6 +3,7 @@ import json
from typing import List from typing import List
from typing import TypedDict, Union from typing import TypedDict, Union
import httpx
from langgraph.constants import START from langgraph.constants import START
from langgraph.graph import StateGraph from langgraph.graph import StateGraph
from langgraph.types import interrupt, Command from langgraph.types import interrupt, Command
@@ -70,12 +71,16 @@ def create_approve_graph(
if approve_result.get('flag'): if approve_result.get('flag'):
# 审批回执标识为通过 # 审批回执标识为通过
# 当前审批人的id
user_id = approve_result.get('user_id') user_id = approve_result.get('user_id')
# 审批单id
approve_id = state.get('input_approve_id') approve_id = state.get('input_approve_id')
# 下一个准备要审批的上级主管用户 # 下一个准备要审批的上级主管用户
supervisor_user = await aget_supervisor_user(user_id=user_id, session=session) supervisor_user = await aget_supervisor_user(user_id=user_id, session=session)
user_cls: UserServiceModel = await UserService.query_item(session=session, row_dict={"id": user_id})
print('\n\n', ":::::::::::node_supervisor_approve start::::::::::::", '\n\n') print('\n\n', ":::::::::::node_supervisor_approve start::::::::::::", '\n\n')
print(supervisor_user.full_name if supervisor_user else '无上级主管', user_id, approve_id) print(supervisor_user.full_name if supervisor_user else '无上级主管', user_id, approve_id)
print('\n\n', ":::::::::::node_supervisor_approve end::::::::::::", '\n\n') print('\n\n', ":::::::::::node_supervisor_approve end::::::::::::", '\n\n')
@@ -85,6 +90,31 @@ def create_approve_graph(
# 审批通过 # 审批通过
return Command(goto="node_accept", update={}) return Command(goto="node_accept", update={})
else: else:
async with httpx.AsyncClient() as client:
response = await client.post(
url="http://110.42.233.30:8055/v1/workflows/run",
headers={
"Authorization": f"Bearer app-ujHKbO9PFFmgarVutW5TdBaC"
},
json={
"inputs": {
"approve_pos_level": user_cls.pos.pos_level,
"amount": state.get('input_amount')
},
"user": "abc-123"
},
)
result = response.json()
print('\n\n', ":::::::::::httpx.AsyncClient start::::::::::::", '\n\n')
print(result)
print('\n\n', ":::::::::::httpx.AsyncClient end::::::::::::", '\n\n')
is_need_supervisor_approve = result.get('data').get('outputs').get('flag')
if is_need_supervisor_approve == "Y":
# 审批通过
return Command(goto="node_accept", update={})
# 还有上级主管,继续触发下一个上级主管审批 # 还有上级主管,继续触发下一个上级主管审批
return Command( return Command(
update={"update_approve": { update={"update_approve": {
@@ -192,6 +222,7 @@ class NodeUpdateApproveSchema(TypedDict):
class ApproveGraphSchema(TypedDict): class ApproveGraphSchema(TypedDict):
input_user_id: str input_user_id: str
input_approve_id: str input_approve_id: str
input_amount: str
# 更新审批信息数据,用来执行节点:node_update_approve(入参),实际就是指派哪个用户来审批 # 更新审批信息数据,用来执行节点:node_update_approve(入参),实际就是指派哪个用户来审批
update_approve: NodeUpdateApproveSchema update_approve: NodeUpdateApproveSchema