from typing import TypedDict from fastapi import FastAPI from langgraph.graph import StateGraph from app.model.ApproveModel import ApproveModel, ApproveService from app.model.ReimburseModel import ReimburseService, ReimburseModel from app.utils.db_utils import AsyncSessionDep def add_approve_route(app: FastAPI): # 提交报销单接口 @app.post('/submit_reimburse') async def submit_reimburse(reimburse: dict, session: AsyncSessionDep): 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": "title", "description": "description", "status": "status", "amount": "amount", "logs": "logs", "user_id": "user_id", "proj_id": "proj_id", } return def create_approve_graph(session: AsyncSessionDep): class StateSchema(TypedDict): status: str insert_approve_id: str # 要新建的审批单信息 input_approve: dict builder = StateGraph(StateSchema) async def node_create_approve(state: StateSchema): new_approve_dict = state.get('input_approve') if not new_approve_dict: raise Exception('缺少审批单信息参数!') insert_approve_cls = await ApproveService.item_insert(session=session, row_dict=new_approve_dict) return {"insert_approve_id": insert_approve_cls.id} return