package jnpf.dmsService; import jnpf.dmsEntity.qianpiye.DmsQianpiyeOnlyOfficeConstants; import jnpf.util.JsonUtil; import jnpf.util.TicketUtil; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.Map; /** 校验签批页标注插件调用流程节点接口时携带的 Ticket。 */ @Service public class DmsQianpiyeTicketService { private final TicketParser ticketParser; public DmsQianpiyeTicketService() { this(TicketUtil::parseTicket); } DmsQianpiyeTicketService(TicketParser ticketParser) { this.ticketParser = ticketParser; } public TicketContext validate(String ticket) { if (!StringUtils.hasText(ticket)) { throw new InvalidQianpiyeTicketException(); } Object raw; try { raw = ticketParser.parse(ticket); } catch (RuntimeException e) { throw new InvalidQianpiyeTicketException(); } if (!(raw instanceof String) || !StringUtils.hasText((String) raw)) { throw new InvalidQianpiyeTicketException(); } Map payload; try { payload = JsonUtil.getJsonToBean((String) raw, Map.class); } catch (RuntimeException e) { throw new InvalidQianpiyeTicketException(); } if (payload == null || !DmsQianpiyeOnlyOfficeConstants.SCOPE.equals(value(payload, "scope")) || !DmsQianpiyeOnlyOfficeConstants.BIZ_MODULE.equals(value(payload, "bizModule")) || !DmsQianpiyeOnlyOfficeConstants.BIZ_SCENE.equals(value(payload, "bizScene")) || !DmsQianpiyeOnlyOfficeConstants.PLUGIN_GUID.equals(value(payload, "pluginGuid"))) { throw new InvalidQianpiyeTicketException(); } return new TicketContext(value(payload, "tenantId"), value(payload, "userId"), value(payload, "fileId"), optionalValue(payload, "fileType", "annex")); } private static String value(Map payload, String key) { Object value = payload.get(key); if (!(value instanceof String) || !StringUtils.hasText((String) value)) { throw new InvalidQianpiyeTicketException(); } return (String) value; } private static String optionalValue(Map payload, String key, String defaultValue) { Object value = payload.get(key); if (value == null) return defaultValue; if (!(value instanceof String) || !StringUtils.hasText((String) value)) { throw new InvalidQianpiyeTicketException(); } return (String) value; } interface TicketParser { Object parse(String ticket); } public static final class TicketContext { private final String tenantId; private final String userId; private final String fileId; private final String fileType; TicketContext(String tenantId, String userId, String fileId, String fileType) { this.tenantId = tenantId; this.userId = userId; this.fileId = fileId; this.fileType = fileType; } public String getTenantId() { return tenantId; } public String getUserId() { return userId; } public String getFileId() { return fileId; } public String getFileType() { return fileType; } } public static class InvalidQianpiyeTicketException extends RuntimeException { private static final long serialVersionUID = 1L; public InvalidQianpiyeTicketException() { super("签批页标注 Ticket 无效"); } } }