R7E-16D 审批动作二次确认

Refs: R7E-16D BIZ8-12B QAOPS8-17
这个提交包含在:
2026-05-15 21:20:49 +08:00
父节点 ff58b0d697
当前提交 96488d8052
共修改 20 个文件,包含 611 行新增和 67 行删除
+46 -3
查看文件
@@ -17,6 +17,7 @@ import { useAuth } from "../auth/AuthContext";
import { hasPermission } from "../auth/permissions";
import { buildMobileApprovalsPath, shouldPreferMobileApprovalExperience } from "../pwa";
import { CardSkeleton } from "../components/common/CardSkeleton";
import { ConfirmDialog } from "../components/common/ConfirmDialog";
import { StatusBadge } from "../components/common/StatusBadge";
import { DetailSideMeta } from "../components/patterns/DetailSideMeta";
import { EntityOverviewHero } from "../components/patterns/EntityOverviewHero";
@@ -27,6 +28,7 @@ import { SectionPanel } from "../components/patterns/SectionPanel";
import { Button } from "../components/ui/button";
import { Textarea } from "../components/ui/textarea";
import { resolvePurchaseDisplayCode } from "../lib/approvalDisplay";
import { getWorkflowConfirmCopy, type WorkflowConfirmAction } from "../lib/workflowActionConfirm";
function entityTitle(entityType: string | undefined) {
if (entityType === "leave") {
@@ -114,6 +116,7 @@ export function WorkflowTaskDetailPage() {
const [transferReason, setTransferReason] = useState("当前事项需转交对应审批人处理,请尽快处理。");
const [selectedApprover, setSelectedApprover] = useState("");
const [actionError, setActionError] = useState("");
const [confirmAction, setConfirmAction] = useState<WorkflowConfirmAction | null>(null);
const detailQuery = useQuery({
enabled: Boolean(taskId),
@@ -184,6 +187,23 @@ export function WorkflowTaskDetailPage() {
},
});
const confirmCopy = confirmAction ? getWorkflowConfirmCopy(confirmAction) : null;
function requestWorkflowAction(action: WorkflowConfirmAction) {
if (action === "reject" && rejectComment.trim().length < 1) {
setActionError("驳回必须填写意见");
return;
}
if (action === "return" && returnComment.trim().length < 1) {
setActionError("退回必须填写意见");
return;
}
setActionError("");
setConfirmAction(action);
}
if (!taskId) {
return (
<div className="card-std p-6">
@@ -229,6 +249,7 @@ export function WorkflowTaskDetailPage() {
const businessStatusLabel = workflowInstanceStatusLabel(detail.workflowInstance?.currentStatus);
return (
<>
<PageScaffold>
<EntityOverviewHero
title={`任务详情 ${detail.task.stepName}`}
@@ -365,7 +386,7 @@ export function WorkflowTaskDetailPage() {
<Button
data-testid="workflow-task-approve"
disabled={!allowedActions.has("approve") || mutation.isPending}
onClick={() => mutation.mutate("approve")}
onClick={() => requestWorkflowAction("approve")}
type="button"
>
通过
@@ -384,7 +405,7 @@ export function WorkflowTaskDetailPage() {
data-testid="workflow-task-reject"
variant="secondary"
disabled={!allowedActions.has("reject") || mutation.isPending || rejectComment.trim().length < 1}
onClick={() => mutation.mutate("reject")}
onClick={() => requestWorkflowAction("reject")}
type="button"
>
提交驳回
@@ -403,7 +424,7 @@ export function WorkflowTaskDetailPage() {
data-testid="workflow-task-return"
variant="secondary"
disabled={!allowedActions.has("return") || mutation.isPending || returnComment.trim().length < 1}
onClick={() => mutation.mutate("return")}
onClick={() => requestWorkflowAction("return")}
type="button"
>
提交退回
@@ -482,5 +503,27 @@ export function WorkflowTaskDetailPage() {
</div>
</div>
</PageScaffold>
<ConfirmDialog
open={Boolean(confirmCopy)}
onOpenChange={(open) => {
if (!open) {
setConfirmAction(null);
}
}}
title={confirmCopy?.title ?? ""}
description={confirmCopy?.description}
confirmLabel={confirmCopy?.confirmLabel}
variant={confirmCopy?.variant}
testId="workflow-action-confirm-dialog"
confirmTestId="workflow-action-confirm-submit"
cancelTestId="workflow-action-confirm-cancel"
onConfirm={async () => {
if (!confirmAction) {
return;
}
await mutation.mutateAsync(confirmAction);
}}
/>
</>
);
}