AP6 增加审批催办与效率摘要

这个提交包含在:
2026-05-12 10:41:47 +08:00
父节点 f99fbce3d8
当前提交 72e38db4e5
共修改 23 个文件,包含 1362 行新增和 12 行删除
+15
查看文件
@@ -167,6 +167,21 @@ export function mapApiErrorMessage(
return "自己的申请不能审批,请等待下一审批人处理。";
}
if (details?.workflow === "self_remind_not_allowed") {
return "不能催办分配给自己的审批任务。";
}
if (details?.workflow === "remind_owner_required") {
return "只有申请人或提交人可以催办该审批。";
}
if (details?.workflow === "remind_too_frequent") {
const nextAllowedAt = typeof details?.nextAllowedAt === "string" ? details.nextAllowedAt : null;
return nextAllowedAt
? `24 小时内已催办过,请在 ${nextAllowedAt.slice(0, 19).replace("T", " ")} 后再试。`
: "24 小时内已催办过。";
}
if (details?.workflow === "business_approval_role_required") {
return "系统管理员不自动获得业务审批权,请配置正式审批角色后处理。";
}
+42
查看文件
@@ -35,6 +35,31 @@ export type WorkflowTaskListResponse = {
items: WorkflowTaskSummary[];
};
export type WorkflowTaskSummaryBucket = {
key: string;
pendingTotal: number;
overdueTotal: number;
};
export type WorkflowTaskProductivitySummary = {
scope: "mine" | "system";
pendingTotal: number;
overdueTotal: number;
earliestPendingAt: string | null;
averagePendingAgeHours: number;
byEntityType: WorkflowTaskSummaryBucket[];
byStep: WorkflowTaskSummaryBucket[];
byAssigneeRole: WorkflowTaskSummaryBucket[];
};
export type WorkflowTaskRemindResponse = {
taskId: string;
outcome: "reminded";
workflowInstanceId: string;
nextAllowedAt: string;
notificationCount: number;
};
export type WorkflowHistoryItem = {
id: string;
taskId: string | null;
@@ -208,6 +233,10 @@ export type WorkflowTaskListQuery = {
pageSize?: number;
};
export type WorkflowTaskSummaryQuery = {
scope?: "mine" | "system";
};
export type WorkflowApproverQuery = {
keyword?: string;
page?: number;
@@ -249,6 +278,12 @@ export async function fetchWorkflowTasks(query: WorkflowTaskListQuery) {
return apiRequestData<WorkflowTaskListResponse>(`/api/workflow/tasks${toQueryString(query)}`);
}
export async function fetchWorkflowTaskSummary(query: WorkflowTaskSummaryQuery = {}) {
return apiRequestData<WorkflowTaskProductivitySummary>(
`/api/workflow/tasks/summary${toQueryString(query)}`,
);
}
export async function fetchWorkflowTaskDetail(taskId: string) {
return apiRequestData<WorkflowTaskDetail>(`/api/workflow/tasks/${taskId}`);
}
@@ -266,6 +301,13 @@ export async function approveWorkflowTask(taskId: string) {
});
}
export async function remindWorkflowTask(taskId: string, comment?: string) {
return apiRequestData<WorkflowTaskRemindResponse>(`/api/workflow/tasks/${taskId}/remind`, {
method: "POST",
body: JSON.stringify(comment ? { comment } : {}),
});
}
export async function rejectWorkflowTask(taskId: string, comment: string) {
return apiRequestData<Record<string, unknown>>(`/api/workflow/tasks/${taskId}/reject`, {
method: "POST",