|
|
|
@ -1,5 +1,6 @@
|
|
|
|
package org.dromara.workflow.dubbo;
|
|
|
|
package org.dromara.workflow.dubbo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
|
|
import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
@ -8,8 +9,7 @@ import org.dromara.workflow.api.domain.RemoteStartProcess;
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
|
|
|
|
import org.dromara.workflow.service.WorkflowService;
|
|
|
|
import org.dromara.workflow.service.WorkflowService;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* RemoteWorkflowServiceImpl
|
|
|
|
* RemoteWorkflowServiceImpl
|
|
|
|
@ -50,7 +50,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public Map<String, Object> flowHisTaskList(String businessId) {
|
|
|
|
public Map<String, Object> flowHisTaskList(String businessId) {
|
|
|
|
return workflowService.flowHisTaskList(businessId);
|
|
|
|
// Dubbo 严格序列化白名单下,业务模块 VO 不能直接跨服务返回;这里统一转换成 JDK 基础集合,避免 consumer 端反序列化失败
|
|
|
|
|
|
|
|
return sanitizeMap(workflowService.flowHisTaskList(businessId));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@ -97,4 +98,45 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
|
|
|
|
return workflowService.startCompleteTask(startProcess);
|
|
|
|
return workflowService.startCompleteTask(startProcess);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
|
|
|
private Map<String, Object> sanitizeMap(Map<String, Object> source) {
|
|
|
|
|
|
|
|
if (source == null || source.isEmpty()) {
|
|
|
|
|
|
|
|
return source;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, Object> target = new LinkedHashMap<>(source.size());
|
|
|
|
|
|
|
|
source.forEach((key, value) -> target.put(key, sanitizeValue(value)));
|
|
|
|
|
|
|
|
return target;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Object sanitizeValue(Object value) {
|
|
|
|
|
|
|
|
if (value == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value instanceof Map<?, ?> mapValue) {
|
|
|
|
|
|
|
|
Map<String, Object> target = new LinkedHashMap<>(mapValue.size());
|
|
|
|
|
|
|
|
mapValue.forEach((key, item) -> target.put(String.valueOf(key), sanitizeValue(item)));
|
|
|
|
|
|
|
|
return target;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value instanceof Collection<?> collectionValue) {
|
|
|
|
|
|
|
|
List<Object> target = new ArrayList<>(collectionValue.size());
|
|
|
|
|
|
|
|
for (Object item : collectionValue) {
|
|
|
|
|
|
|
|
target.add(sanitizeValue(item));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return target;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isDubboSafeValue(value)) {
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return sanitizeMap(BeanUtil.beanToMap(value, new LinkedHashMap<>(), false, true));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean isDubboSafeValue(Object value) {
|
|
|
|
|
|
|
|
return value instanceof String
|
|
|
|
|
|
|
|
|| value instanceof Number
|
|
|
|
|
|
|
|
|| value instanceof Boolean
|
|
|
|
|
|
|
|
|| value instanceof Character
|
|
|
|
|
|
|
|
|| value instanceof java.util.Date
|
|
|
|
|
|
|
|
|| value.getClass().isEnum();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|