feat: 支持发起人撤回审批

- 在我发起和审批详情中提供申请人撤回操作并恢复资源状态

- 补齐审批说明列表展示、动作权限校验和防重复提交

- 为审批决策增加行锁并补充撤回权限回归测试
This commit is contained in:
2026-07-23 16:28:45 +08:00
parent ebfd91eeab
commit 3e8ee66ab6
6 changed files with 465 additions and 42 deletions

View File

@@ -17,6 +17,7 @@ import {
ElTag,
} from 'element-plus';
import { hasPermission } from '#/api/common/hasPermission';
import { api } from '#/api/request';
import { $t } from '#/locales';
import { router } from '#/router';
@@ -41,11 +42,24 @@ const actionLabelMap: Record<string, string> = {
PUBLISH: $t('approval.action.publish'),
};
const canApproveAction = computed(
() =>
!!detail.value?.canApprove &&
hasPermission(['/api/v1/approvalInstance/approve']),
);
const canRejectAction = computed(
() =>
!!detail.value?.canReject &&
hasPermission(['/api/v1/approvalInstance/reject']),
);
const canRevokeAction = computed(
() =>
!!detail.value?.canRevoke &&
hasPermission(['/api/v1/approvalInstance/revoke']),
);
const canOperate = computed(() => {
return (
!!detail.value?.canApprove ||
!!detail.value?.canReject ||
!!detail.value?.canRevoke
canApproveAction.value || canRejectAction.value || canRevokeAction.value
);
});
@@ -258,7 +272,7 @@ function formatEventInfo(row: Record<string, any>) {
<div v-if="canOperate" class="flex items-center gap-3">
<ElButton
v-if="detail?.canApprove"
v-if="canApproveAction"
type="success"
:disabled="Boolean(approvalActionLoading)"
:loading="approvalActionLoading === 'approve'"
@@ -267,7 +281,7 @@ function formatEventInfo(row: Record<string, any>) {
{{ $t('approval.action.approve') }}
</ElButton>
<ElButton
v-if="detail?.canReject"
v-if="canRejectAction"
type="danger"
:disabled="Boolean(approvalActionLoading)"
:loading="approvalActionLoading === 'reject'"
@@ -276,7 +290,7 @@ function formatEventInfo(row: Record<string, any>) {
{{ $t('approval.action.reject') }}
</ElButton>
<ElButton
v-if="detail?.canRevoke"
v-if="canRevokeAction"
type="warning"
:disabled="Boolean(approvalActionLoading)"
:loading="approvalActionLoading === 'revoke'"