diff --git a/src/api/approval/instance/index.ts b/src/api/approval/instance/index.ts index 7f20ac8..5c58c4a 100644 --- a/src/api/approval/instance/index.ts +++ b/src/api/approval/instance/index.ts @@ -4,7 +4,8 @@ import type { ApprovalExportFile, ApprovalInstance, ApprovalItem, - ApprovalQueryParam + ApprovalQueryParam, + ApprovalTodoParam } from './model'; import { THINK_API_URL } from '@/config/setting'; @@ -22,6 +23,20 @@ export async function pageInstances(params: ApprovalQueryParam) { return Promise.reject(new Error(res.data.message)); } +/** + * 我的待办分页 + */ +export async function pageApprovalTodo(params: ApprovalTodoParam) { + const res = await request.get>>( + THINK_API_URL + '/approval/todo/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + /** * 单据详情(只读) */ diff --git a/src/api/approval/instance/model/index.ts b/src/api/approval/instance/model/index.ts index a0397e8..5463d00 100644 --- a/src/api/approval/instance/model/index.ts +++ b/src/api/approval/instance/model/index.ts @@ -182,3 +182,38 @@ export interface ApprovalExportFile { contentType?: string; url?: string; } + +/** + * 待办/已办查询条件 + */ +export interface ApprovalTodoParam extends PageParam { + // 单据状态 + status?: string; + // 单据类型 + docType?: string; + // 关键词:单号、名称或标题、实施单位 + keywords?: string; +} + +/** + * 待办改派参数 + */ +export interface ApprovalAssignParam { + // 改派对象用户id + targetUserId: number; + // 改派原因 + reason: string; +} + +/** + * 改派结果 + */ +export interface ApprovalAssignResult { + instanceId?: number; + taskId?: number; + originalAssigneeId?: number; + originalAssigneeName?: string; + assigneeId?: number; + assigneeName?: string; + reason?: string; +} diff --git a/src/api/approval/task/index.ts b/src/api/approval/task/index.ts new file mode 100644 index 0000000..1bb21a6 --- /dev/null +++ b/src/api/approval/task/index.ts @@ -0,0 +1,78 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import { THINK_API_URL } from '@/config/setting'; +import type { + ApprovalAssignParam, + ApprovalAssignResult +} from '../instance/model'; + +/** + * 通过任务 + */ +export async function approveApprovalTask(id: number, opinion?: string) { + const res = await request.post>( + THINK_API_URL + '/approval/task/' + id + '/approve', + { opinion } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 驳回任务(意见必填) + */ +export async function rejectApprovalTask(id: number, opinion: string) { + const res = await request.post>( + THINK_API_URL + '/approval/task/' + id + '/reject', + { opinion } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 存档确认 + */ +export async function confirmApprovalTask(id: number) { + const res = await request.post>( + THINK_API_URL + '/approval/task/' + id + '/confirm' + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 归档 + */ +export async function archiveApprovalTask(id: number) { + const res = await request.post>( + THINK_API_URL + '/approval/task/' + id + '/archive' + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 改派待办 + */ +export async function assignApprovalTask( + id: number, + data: ApprovalAssignParam +) { + const res = await request.post>( + THINK_API_URL + '/approval/task/' + id + '/assign', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/src/views/approval/todo/components/detail-drawer.vue b/src/views/approval/todo/components/detail-drawer.vue new file mode 100644 index 0000000..09a882c --- /dev/null +++ b/src/views/approval/todo/components/detail-drawer.vue @@ -0,0 +1,561 @@ + + + + + + + + diff --git a/src/views/approval/todo/format.ts b/src/views/approval/todo/format.ts new file mode 100644 index 0000000..f1e8936 --- /dev/null +++ b/src/views/approval/todo/format.ts @@ -0,0 +1,46 @@ +import { toDateString } from 'ele-admin-pro'; + +/** + * 审批时间统一展示:兼容 ISO 字符串与时间戳 + */ +export function formatApprovalTime(value?: string | number | null): string { + if (value === undefined || value === null || value === '') { + return ''; + } + if (typeof value === 'number') { + return toDateString(value, 'yyyy-MM-dd HH:mm:ss'); + } + return String(value).replace('T', ' ').slice(0, 19); +} + +/** + * 附件大小展示 + */ +export function formatFileSize(length?: number): string { + if (!length || length <= 0) { + return '0 KB'; + } + if (length < 1024 * 1024) { + return (length / 1024).toFixed(1) + ' KB'; + } + return (length / 1024 / 1024).toFixed(1) + ' MB'; +} + +/** + * 单据状态标签颜色 + */ +export function approvalStatusColor(status?: string): string { + if (status === 'PENDING' || status === 'DRAFT') { + return 'blue'; + } + if (status === 'REJECTED') { + return 'red'; + } + if (status === 'WITHDRAWN') { + return 'orange'; + } + if (status === 'APPROVED') { + return 'green'; + } + return 'default'; +} diff --git a/src/views/approval/todo/index.vue b/src/views/approval/todo/index.vue new file mode 100644 index 0000000..dd5eb33 --- /dev/null +++ b/src/views/approval/todo/index.vue @@ -0,0 +1,218 @@ + + + + + + + +