AP6 增加审批催办与效率摘要
这个提交包含在:
@@ -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 "系统管理员不自动获得业务审批权,请配置正式审批角色后处理。";
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
在新工单中引用
屏蔽一个用户