From 45098d36dc51d2761a2b529dbe9bffe58b7f4fa8 Mon Sep 17 00:00:00 2001 From: martsforever Date: Sun, 24 Aug 2025 19:56:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=A5=E5=85=A5dify=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E6=9D=A5=E6=8E=A7=E5=88=B6=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/add_approve_route.py | 6 +++--- app/model/PosModel.py | 1 + app/workflow/approve.py | 31 +++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/controller/add_approve_route.py b/app/controller/add_approve_route.py index 0c902cc..b2326c3 100644 --- a/app/controller/add_approve_route.py +++ b/app/controller/add_approve_route.py @@ -5,7 +5,7 @@ from langgraph.graph import StateGraph from langgraph.types import Command 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.utils.db_utils import AsyncSessionDep from app.utils.postgres_checkpointer import AsyncPostgresSaverDep @@ -50,7 +50,7 @@ def add_approve_route(app: FastAPI): "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) + insert_approve_cls: ApproveModel = await ApproveService.item_insert(session=session, row_dict=new_approve_dict) # 将审批单与报销单管理,设置报销单的approve_id为审批单的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) 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}} ) diff --git a/app/model/PosModel.py b/app/model/PosModel.py index 797c5f5..7870f06 100644 --- a/app/model/PosModel.py +++ b/app/model/PosModel.py @@ -17,6 +17,7 @@ class PosModel(BasicModel, table=True): # parent_code: str = Field(default=None, description="父职位编码") # organization_code: str = Field(default=None, description="所属组织编码") remarks: str = Field(default=None, description="备注信息") + pos_level: int = Field(default=None, description="职位层级") # /*---------------------------------------parent_code-------------------------------------------*/ diff --git a/app/workflow/approve.py b/app/workflow/approve.py index ecd5d65..f827e8d 100644 --- a/app/workflow/approve.py +++ b/app/workflow/approve.py @@ -3,6 +3,7 @@ import json from typing import List from typing import TypedDict, Union +import httpx from langgraph.constants import START from langgraph.graph import StateGraph from langgraph.types import interrupt, Command @@ -70,12 +71,16 @@ def create_approve_graph( if approve_result.get('flag'): # 审批回执标识为通过 + # 当前审批人的id user_id = approve_result.get('user_id') + # 审批单id approve_id = state.get('input_approve_id') # 下一个准备要审批的上级主管用户 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(supervisor_user.full_name if supervisor_user else '无上级主管', user_id, approve_id) print('\n\n', ":::::::::::node_supervisor_approve end::::::::::::", '\n\n') @@ -85,6 +90,31 @@ def create_approve_graph( # 审批通过 return Command(goto="node_accept", update={}) 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( update={"update_approve": { @@ -192,6 +222,7 @@ class NodeUpdateApproveSchema(TypedDict): class ApproveGraphSchema(TypedDict): input_user_id: str input_approve_id: str + input_amount: str # 更新审批信息数据,用来执行节点:node_update_approve(入参),实际就是指派哪个用户来审批 update_approve: NodeUpdateApproveSchema