import request from '@/utils/http' const BASE = '/web/admin/oa-approval' // --------------------------------------------------------------------------- // 工作流角色 // --------------------------------------------------------------------------- export function fetchOaRoleList(params?: { keyword?: string; status?: string }) { return request.get<{ list: any[] }>({ url: `${BASE}/roles`, params }) } export function fetchEnsureOaRolePresets() { return request.post<{ createdCount: number }>({ url: `${BASE}/roles/ensure-presets`, showSuccessMessage: true }) } export function fetchCreateOaRole(data: { roleName: string roleCode: string status?: string orderNum?: number remark?: string }) { return request.post({ url: `${BASE}/roles`, data, showSuccessMessage: true }) } export function fetchUpdateOaRole( id: string, data: Partial<{ roleName: string status: string orderNum: number remark: string }> ) { return request.put({ url: `${BASE}/roles/${id}`, data, showSuccessMessage: true }) } export function fetchDeleteOaRole(id: string) { return request.del({ url: `${BASE}/roles/${id}`, showSuccessMessage: true }) } export function fetchOaRoleUsers(roleId: string) { return request.get<{ list: any[] }>({ url: `${BASE}/roles/${roleId}/users` }) } export function fetchReplaceOaRoleUsers(roleId: string, userIds: string[]) { return request.put<{ list: any[] }>({ url: `${BASE}/roles/${roleId}/users`, data: { userIds }, showSuccessMessage: true }) } // --------------------------------------------------------------------------- // 分组 / 应用 / 草稿 / 发布 // --------------------------------------------------------------------------- export function fetchOaGroupList() { return request.get<{ list: any[] }>({ url: `${BASE}/groups` }) } export function fetchCreateOaGroup(data: { groupName: string orderNum?: number remark?: string }) { return request.post({ url: `${BASE}/groups`, data, showSuccessMessage: true }) } export function fetchUpdateOaGroup( id: string, data: Partial<{ groupName: string; orderNum: number; remark: string }> ) { return request.put({ url: `${BASE}/groups/${id}`, data, showSuccessMessage: true }) } export function fetchDeleteOaGroup(id: string) { return request.del({ url: `${BASE}/groups/${id}`, showSuccessMessage: true }) } export function fetchOaAppList(params?: { groupId?: string keyword?: string status?: string }) { return request.get<{ list: any[] }>({ url: `${BASE}/apps`, params }) } export function fetchCreateOaApp(data: Record) { return request.post({ url: `${BASE}/apps`, data, showSuccessMessage: true }) } export function fetchUpdateOaApp(id: string, data: Record) { return request.put({ url: `${BASE}/apps/${id}`, data, showSuccessMessage: true }) } export function fetchDeleteOaApp(id: string) { return request.del({ url: `${BASE}/apps/${id}`, showSuccessMessage: true }) } export function fetchOaAppDraft(appId: string) { return request.get({ url: `${BASE}/apps/${appId}/draft` }) } export function fetchSaveOaAppDraft( appId: string, data: { basic?: Record formSchemaJson?: any flowTreeJson?: any advancedSettingsJson?: any } ) { return request.put({ url: `${BASE}/apps/${appId}/draft`, data, showSuccessMessage: true }) } export function fetchPublishOaApp(appId: string) { return request.post({ url: `${BASE}/apps/${appId}/publish`, showSuccessMessage: true }) } // --------------------------------------------------------------------------- // 运行时 // --------------------------------------------------------------------------- export function fetchOaTemplates() { return request.get<{ list: any[] }>({ url: `${BASE}/templates` }) } export function fetchOaTemplateDetail(appId: string) { return request.get({ url: `${BASE}/templates/${appId}` }) } /** 发起前审批流预览(条件齐后返回最终路径) */ export function fetchOaFlowPreview( appId: string, opts?: { formData?: Record; initiatorSelectUserIds?: string[] } ) { return request.post<{ resolved: boolean message?: string steps: OaFlowPreviewStep[] }>({ url: `${BASE}/templates/${appId}/flow-preview`, data: { formData: opts?.formData || {}, initiatorSelectUserIds: opts?.initiatorSelectUserIds || undefined }, showSuccessMessage: false }) } export type OaFlowPreviewStep = { id: string type: 'start' | 'approval' | 'cc' | 'branch' | 'end' | string name: string signMode?: string assigneeType?: string meta?: string people?: Array<{ id: string; nickName: string }> resolveError?: string } export function fetchStartOaInstance(data: { appId: string formData?: Record title?: string initiatorDeptId?: string initiatorSelectUserIds?: string[] relatedInstanceIds?: string[] }) { return request.post({ url: `${BASE}/instances`, data, showSuccessMessage: true }) } /** 详情审批进度投影项(后端 build_progress_items) */ export interface OaProgressItem { kind: 'submit' | 'task' | 'pending_node' | 'terminal' | string roundNo?: number title?: string status?: string assigneeUserId?: string assigneeUserName?: string timestamp?: string commentText?: string nodeKey?: string taskType?: string resolveSource?: string taskId?: string } export function fetchOaInstanceDetail(id: string) { return request.get<{ progress?: OaProgressItem[]; tasks?: any[] } & Record>({ url: `${BASE}/instances/${id}` }) } export function fetchOaTasks(kind: 'pending' | 'done' | 'mine' | 'cc') { return request.get<{ list: any[] }>({ url: `${BASE}/tasks/${kind}` }) } export function fetchApproveOaTask(taskId: string, comment?: string) { return request.post({ url: `${BASE}/tasks/${taskId}/approve`, data: { comment }, showSuccessMessage: true }) } export function fetchRejectOaTask(taskId: string, comment?: string) { return request.post({ url: `${BASE}/tasks/${taskId}/reject`, data: { comment }, showSuccessMessage: true }) } export function fetchReturnOaTask(taskId: string, comment: string) { return request.post({ url: `${BASE}/tasks/${taskId}/return`, data: { comment }, showSuccessMessage: true }) } export function fetchAddSignOaTask( taskId: string, data: { userIds: string[]; comment?: string } ) { return request.post({ url: `${BASE}/tasks/${taskId}/add-sign`, data, showSuccessMessage: true }) } export function fetchWithdrawOaInstance(instanceId: string) { return request.post({ url: `${BASE}/instances/${instanceId}/withdraw`, showSuccessMessage: true }) }