package jnpf.controller; import cn.dev33.satoken.same.SaSameUtil; import jnpf.base.ActionResult; import jnpf.base.ActionResultCode; import jnpf.exception.DataException; import jnpf.file.WorkflowFileTicketApi; import jnpf.fileStorage.WorkflowFileTicketService; import jnpf.model.PreviewParams; import jnpf.model.fileaccess.WorkflowFileGrant; import jnpf.model.fileaccess.WorkflowFileRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.*; /** 流程附件入口只增加动作准入,执行委托原公共接口,不另建文件传输路径。 */ @RestController @RequiredArgsConstructor public class WorkflowFileController implements WorkflowFileTicketApi { private final WorkflowFileTicketService tickets; // 原打包与下载签发实现在该控制器;直接复用,避免改动公共接口或复制实现。 private final UtilsController files; @PostMapping("/WorkflowFile/download") public ActionResult> download(@RequestBody List sources) throws Exception { List grants = tickets.authorizeDownloads(sources); Map result = new LinkedHashMap<>(); if (grants.size() == 1) { WorkflowFileGrant grant = grants.get(0); result.put("downloadVo", data(files.downloadUrl("annex", grant.getContext().getFileId()))); result.put("downloadName", grant.getFile().get("name")); } else { List> entries = new ArrayList<>(); for (WorkflowFileGrant grant : grants) { Map entry = new LinkedHashMap<>(); entry.put("fileId", grant.getContext().getFileId()); entry.put("fileName", Objects.toString(grant.getFile().get("name"), "附件")); entries.add(entry); } Object packed = data(files.packDownloadUrl("annex", entries)); if (!(packed instanceof Map)) throw new DataException("获取附件下载地址失败"); result.putAll((Map) packed); } return ActionResult.success(result); } @PostMapping("/WorkflowFile/preview") public ActionResult> preview(@RequestBody WorkflowFileRequest request, @RequestParam(value = "mode", defaultValue = "office") String mode) { if (!Arrays.asList("office", "platform").contains(mode)) throw new DataException("预览方式无效"); WorkflowFileGrant grant = tickets.authorizePreview(request); Map file = grant.getFile(); String name = Objects.toString(file.get("name"), "附件"); String extension = name.substring(name.lastIndexOf('.') + 1).toLowerCase(Locale.ROOT); Map result = new LinkedHashMap<>(); result.put("file", file); result.put("fileName", name); if (Arrays.asList("png", "jpg", "jpeg", "bmp", "gif").contains(extension)) { result.put("kind", "image"); result.put("url", file.get("url")); } else if ("office".equals(mode)) { result.put("kind", "office"); result.put("ticket", tickets.previewTicket(grant)); } else { PreviewParams params = new PreviewParams(); params.setFileName(grant.getContext().getFileId()); params.setFileDownloadUrl(Objects.toString(file.get("url"), "")); params.setFileVersionId((String) file.get("fileVersionId")); result.put("kind", "platform"); result.put("url", data(files.preview(params))); } return ActionResult.success(result); } @Override @PostMapping("/WorkflowFile/preview-access") public ActionResult previewAccess(@RequestParam("ticket") String ticket) { SaSameUtil.checkCurrentRequestToken(); return ActionResult.success(tickets.previewAccess(ticket)); } private static Object data(ActionResult response) { if (response == null || !ActionResultCode.SUCCESS.getCode().equals(response.getCode()) || response.getData() == null) throw new DataException(response == null ? "文件服务暂不可用" : response.getMsg()); return response.getData(); } }