package jnpf.flowable.model.filepermission; import lombok.Data; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; /** 独立于所查看历史节点的文件权限;不包含规则、参与人或附件下载地址。 */ @Data public class FilePermissionView { private boolean enabled = true; private String taskId; private String formId; private String status = "error"; private String revision; private String reason; private Map fields = new LinkedHashMap<>(); @Data public static class FieldAccess { private String status = "error"; /** 仅显式配置审阅的流程附件显示批注;不授予任何写权限。 */ private boolean reviewEnabled; private Map actions = Collections.emptyMap(); } public static FilePermissionView unavailable(String taskId, String formId, String reason) { FilePermissionView view = new FilePermissionView(); view.setTaskId(taskId); view.setFormId(formId); view.setReason(reason); return view; } public static FilePermissionView legacy(String taskId, String formId) { FilePermissionView view = unavailable(taskId, formId, null); view.setEnabled(false); view.setStatus("ready"); return view; } /** 响应缺失、错误、字段缺失均不能解释为原权限。调用前还须真实资源归属校验。 */ public boolean allows(String field, FilePermissionPolicy.Action action) { if (!enabled) return "ready".equals(status); FieldAccess access = fields == null ? null : fields.get(field); return "ready".equals(status) && revision != null && !revision.isEmpty() && access != null && "ready".equals(access.getStatus()) && access.getActions() != null && Boolean.TRUE.equals(access.getActions().get(action)); } }