/** * 审批流服务 - 与后端审批API交互 */ import type { AdminRole } from '../auth/roles' export interface ApprovalFlow { id: number flowCode: string flowName: string moduleCode: string description?: string status: number createdAt: string updatedAt?: string } export interface ApprovalRecord { id: number flowId: number bizType: string bizId: string title: string applicantId: number applicantName: string currentStatus: string currentNodeId: number currentNodeName: string applyReason?: string applyAttachments?: string createdAt: string updatedAt?: string } export interface ApprovalNode { id: number flowId: number nodeName: string nodeType: 'start' | 'approver' | 'condition' | 'cc' | 'end' approverType: 'user' | 'role' | 'department_leader' approverIds?: string approverRoles?: string condition?: string timeout: number action: string sortOrder: number } export interface ApprovalHistory { id: number recordId: number nodeId: number nodeName: string action: 'submit' | 'approve' | 'reject' | 'transfer' | 'callback' operatorId: number operatorName: string comment?: string attachments?: string createdAt: string } export interface CreateFlowRequest { flowCode: string flowName: string moduleCode: string description?: string } export interface UpdateFlowRequest extends Partial { id: number status?: number } export interface ApiResponse { code: number data: T message?: string } /** * 审批流服务类 */ class ApprovalService { private baseUrl = '/api' /** * 获取所有审批流 */ async getFlows(): Promise { const response = await fetch(`${this.baseUrl}/approval/flows`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '获取审批流失败') } return result.data } /** * 获取审批流详情 */ async getFlowById(id: number): Promise { const response = await fetch(`${this.baseUrl}/approval/flows/${id}`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { return null } return result.data } /** * 创建审批流 */ async createFlow(data: CreateFlowRequest): Promise { const response = await fetch(`${this.baseUrl}/approval/flows`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify(data) }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '创建审批流失败') } return result.data } /** * 更新审批流 */ async updateFlow(data: UpdateFlowRequest): Promise { const response = await fetch(`${this.baseUrl}/approval/flows/${data.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify(data) }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '更新审批流失败') } } /** * 删除审批流 */ async deleteFlow(id: number): Promise { const response = await fetch(`${this.baseUrl}/approval/flows/${id}`, { method: 'DELETE', credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '删除审批流失败') } } /** * 获取待审批列表 */ async getPendingApprovals(userId: number): Promise { const response = await fetch(`${this.baseUrl}/approval/pending?userId=${userId}`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '获取待审批列表失败') } return result.data } /** * 获取已审批列表 */ async getApprovedList(userId: number): Promise { const response = await fetch(`${this.baseUrl}/approval/processed?userId=${userId}`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '获取已审批列表失败') } return result.data } /** * 获取我发起的审批 */ async getMyApplications(userId: number): Promise { const response = await fetch(`${this.baseUrl}/approval/my?userId=${userId}`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '获取我发起的审批失败') } return result.data } /** * 审批操作 */ async approve(data: { recordId: number action: 'APPROVE' | 'REJECT' | 'TRANSFER' operatorId: number comment?: string }): Promise { const response = await fetch(`${this.baseUrl}/approval/handle`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify(data) }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '审批操作失败') } } /** * 提交审批申请 */ async submitApproval(data: { flowId: number bizType: string bizId: number title: string applicantId: number applyReason: string }): Promise { const response = await fetch(`${this.baseUrl}/approval/submit`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify(data) }) const result = await response.json() as ApiResponse<{ recordId: number }> if (result.code !== 200) { throw new Error(result.message || '提交审批失败') } return result.data.recordId } /** * 取消审批 */ async cancelApproval(recordId: number, operatorId: number): Promise { const response = await fetch(`${this.baseUrl}/approval/cancel`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ recordId, operatorId }) }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '取消审批失败') } } /** * 获取审批记录详情 */ async getRecordById(id: number): Promise { const response = await fetch(`${this.baseUrl}/approval/records/${id}`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { return null } return result.data } /** * 获取审批历史 */ async getApprovalHistory(recordId: number): Promise { const response = await fetch(`${this.baseUrl}/approval/records/${recordId}/history`, { credentials: 'include' }) const result = await response.json() as ApiResponse if (result.code !== 200) { throw new Error(result.message || '获取审批历史失败') } return result.data } } export const approvalService = new ApprovalService() export default approvalService