feat: 接入dify工作流来控制审批流程
This commit is contained in:
@@ -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}}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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-------------------------------------------*/
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user