from fastapi import FastAPI from langchain_core.runnables import RunnableConfig from langgraph.func import entrypoint 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 def add_approve_route(app: FastAPI): # 提交报销单接口 @app.post('/submit_reimburse') async def submit_reimburse( reimburse: dict, session: AsyncSessionDep, checkpointer: AsyncPostgresSaverDep, ): reimburse_id = reimburse.get('id') # 先查一遍报销单信息 reimburse_cls: ReimburseModel = await ReimburseService.query_item(session=session, row_dict={"id": reimburse_id}) # 1. 没有审批单—— # 2. 审批单为审批中状态——不处理 # 3. 审批单为已通过状态——不处理 # 4. 审批单为已驳回状态—— # 5. 审批单为已撤回状态—— # 2,3 的情况下不再提交报销单 if reimburse_cls.approve: if reimburse_cls.approve.status == 'approving': return {"message": "报销单已提交审批,请勿重复提交!"} if reimburse_cls.approve.status == 'approved': return {"message": "报销单已通过审批,请勿重复提交!"} # 1,4,5 的情况下新建审批单 # 创建审批单,使用新的审批单走审批流程 new_approve_dict = { "title": f"{reimburse_cls.user.full_name} - 报销单审批", "description": reimburse_cls.title + (f" / {reimburse_cls.remarks}" if reimburse_cls.remarks else ""), "status": "approving", "amount": reimburse_cls.amount, "logs": "[]", "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) # 将审批单与报销单管理,设置报销单的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) await reimburse_workflow.ainvoke({"reimburse_user_id": reimburse_cls.user, "approve_id": insert_approve_cls.id}) return {"message": "报销单提交成功!"} def create_reimburse_workflow( checkpointer: AsyncPostgresSaverDep, session: AsyncSessionDep, ): approve_workflow = create_approve_workflow(checkpointer, session) @entrypoint(checkpointer=checkpointer) async def reimburse_workflow(input_dict: ApproveWorkflowInputs, config: RunnableConfig): approve_flag = await approve_workflow.ainvoke(input_dict, config=config) # 这里审批结束之后可以做一些事情,比如发送邮件、短信、微信消息等通知用户,因为没有实现对应的模块,这里就不做任何处理 print("报销单审批流执行结束::::::::::>>>>>>>>>>>", approve_flag) return None return reimburse_workflow