流程全景源码

This commit is contained in:
446052889@qq.com 2024-03-28 14:16:49 +08:00
parent e18acb9d0b
commit de69f94099
7 changed files with 1044 additions and 0 deletions

View File

@ -0,0 +1,83 @@
package com.actionsoft.apps.coe.pal.processmap;
import com.actionsoft.apps.coe.pal.processmap.web.CoEProcessMapWeb;
import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.server.bind.annotation.Controller;
import com.actionsoft.bpms.server.bind.annotation.Mapping;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
@Controller
public class CoEProcessMapController {
/**
* 架构全景展示
* @param me
* @param wsid
* @return
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_home")
public String processReportHome(UserContext me, String wsid) {
CoEProcessMapWeb web = new CoEProcessMapWeb(me);
return web.getHome(wsid);
}
/**
* 流程全景 home
*
* @param uc UserContext
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_panorama_home")
public String processPanoramaHome(UserContext uc, String wsId, String teamId) {
return new CoEProcessMapWeb(uc).getNewHome(wsId, teamId);
}
/**
* 流程全景获取
*
* @param uc UserContext
* @param wsId 资产库id
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_panorama_getProcessPanorama")
public String getProcessPanorama(UserContext uc, String wsId, String teamId) {
return new CoEProcessMapWeb(uc).getProcessPanorama(wsId, teamId);
}
/**
* 获取流程全景通过id 局部数据组装 鼠标点击返回的数据
*
* @param uc UserContext
* @param wsId 资产库id
* @param id 节点返回的id
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_panorama_getPanoramaTreeById")
public String getPanoramaTreeById(UserContext uc, String wsId, String teamId, String id) {
return new CoEProcessMapWeb(uc).getPanoramaTreeById(wsId, teamId, id, true);
}
/**
* 获取流程全景通过id 局部数据组装 面包屑点击返回的数据
*
* @param uc UserContext
* @param wsId 资产库id
* @param id 节点返回的id
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_panorama_getPanoramaTreeByIdToBread")
public String getPanoramaTreeByIdToBread(UserContext uc, String wsId, String teamId, String id) {
return new CoEProcessMapWeb(uc).getPanoramaTreeById(wsId, teamId, id, false);
}
/**
* 获取流程全景 通过点击 侧边 + - 控制整体输出的 层级
*
* @param uc UserContext
* @param wsId 资产库id
* @param level 层级
*/
@Mapping("com.actionsoft.apps.coe.pal.processmap_panorama_getPanoramaTreeByLevel")
public String getPanoramaTreeByLevel(UserContext uc, String wsId, String teamId, Integer level) {
return new CoEProcessMapWeb(uc).getPanoramaTreeByLevel(wsId, teamId, level);
}
}

View File

@ -0,0 +1,24 @@
package com.actionsoft.apps.coe.pal.processmap.constant;
/**
* 流程全景图常量定义
* @author 作者 wangyh
* @version 创建时间2014-3-4
*
*/
public interface CoEProcessMapConstant {
/**
* 标题
*/
public static final String PROCESSMAP_PAGE_TITLE ="流程全景图";
/**
* 流程查询时调用都流程pid
*/
String PROCESS_PID = "process";
/**
* 流程全景默认输出层级
*/
Integer DEFAULT_LEVEL = 0;
}

View File

@ -0,0 +1,64 @@
package com.actionsoft.apps.coe.pal.processmap.model;
import java.util.List;
/**
* pal 流程全景响应类
*
* @author lipt
* @date 2022/12/6
*/
public class CoEProcessMapResponse {
/**
* 资产库id
*/
private String wsId;
/**
* 资产库名称
*/
private String wsName;
/**
* 最大等级
*/
private Integer maxLevel;
/**
* 子响应类集合
*/
private List<CoEProcessMapTreeModel> coEProcessMapTreeModels;
public Integer getMaxLevel() {
return maxLevel;
}
public void setMaxLevel(Integer maxLevel) {
this.maxLevel = maxLevel;
}
public String getWsId() {
return wsId;
}
public void setWsId(String wsId) {
this.wsId = wsId;
}
public String getWsName() {
return wsName;
}
public void setWsName(String wsName) {
this.wsName = wsName;
}
public List<CoEProcessMapTreeModel> getCoEProcessMapTreeModels() {
return coEProcessMapTreeModels;
}
public void setCoEProcessMapTreeModels(List<CoEProcessMapTreeModel> coEProcessMapTreeModels) {
this.coEProcessMapTreeModels = coEProcessMapTreeModels;
}
}

View File

@ -0,0 +1,182 @@
package com.actionsoft.apps.coe.pal.processmap.model;
import java.util.List;
import java.util.Map;
/**
* pal 流程全景响应类
*
* @author lipt
* @date 2022/12/6
*/
public class CoEProcessMapTreeModel {
/**
* 资产库文件表ID
*/
private String id;
/**
* 节点名称
*/
private String name;
/**
* 节点值为子响应类的数量
*/
private Integer value;
/**
* 节点路径 path
*/
private String path;
/**
* 资产库文件父ID
*/
private String parentId;
/**
* 版本Id多个版本时一致取自第一个版本的Id
*/
private String versionId;
/**
* 流程等级编号
*/
private String processLevelNo;
/**
* 子响应类
*/
private List<CoEProcessMapTreeModel> children;
/**
* 等级
*/
private Integer level;
/**
* 流程全景中节点颜色
*/
private String color;
/**
* 流程全景中节点颜色 透明度
*/
private List<Double> colorAlpha;
/**
* itemStyle 中的参数 colorAlpha
*/
private Map<String, Object> itemStyle;
/**
* 颜色饱和度
*/
private List<Double> colorSaturation;
public String getVersionId() {
return versionId;
}
public void setVersionId(String versionId) {
this.versionId = versionId;
}
public List<Double> getColorAlpha() {
return colorAlpha;
}
public void setColorAlpha(List<Double> colorAlpha) {
this.colorAlpha = colorAlpha;
}
public Map<String, Object> getItemStyle() {
return itemStyle;
}
public void setItemStyle(Map<String, Object> itemStyle) {
this.itemStyle = itemStyle;
}
public List<Double> getColorSaturation() {
return colorSaturation;
}
public void setColorSaturation(List<Double> colorSaturation) {
this.colorSaturation = colorSaturation;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getProcessLevelNo() {
return processLevelNo;
}
public void setProcessLevelNo(String processLevelNo) {
this.processLevelNo = processLevelNo;
}
public List<CoEProcessMapTreeModel> getChildren() {
return children;
}
public void setChildren(List<CoEProcessMapTreeModel> children) {
this.children = children;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}

View File

@ -0,0 +1,40 @@
package com.actionsoft.apps.coe.pal.processmap.plugins;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.actionsoft.apps.coe.pal.processmap.web.CoEProcessMapWeb;
import com.actionsoft.apps.listener.PluginListener;
import com.actionsoft.apps.resource.AppContext;
import com.actionsoft.apps.resource.plugin.profile.AWSPluginProfile;
import com.actionsoft.apps.resource.plugin.profile.AppExtensionProfile;
/**
* 注册插件
* @author zhouxuan
*/
public class Plugins implements PluginListener {
public Plugins() {
}
public List<AWSPluginProfile> register(AppContext context) {
List<AWSPluginProfile> list = new ArrayList<AWSPluginProfile>();
// PAL应用扩展点
Map<String, Object> params0 = new HashMap<String, Object>();
params0.put("title", "流程全景");
params0.put("icon", "");
params0.put("desc", "流程全景");
params0.put("mainClass", CoEProcessMapWeb.class.getName());
params0.put("deletedClass", "");
list.add(new AppExtensionProfile("PAL流程资产库->流程全景", "aslp://com.actionsoft.apps.coe.pal/registerExtendsApp", params0));
// 注册应用扩展点
Map<String, Object> params1 = new HashMap<String, Object>();
params1.put("title", "流程全景");
params1.put("desc", "流程全景");
list.add(new AppExtensionProfile("PAL小组->流程全景", "aslp://com.actionsoft.apps.coe.pal.cooperation/registerApp", params1));
return list;
}
}

View File

@ -0,0 +1,386 @@
package com.actionsoft.apps.coe.pal.processmap.util;
import com.actionsoft.apps.coe.pal.constant.CoEConstant;
import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache;
import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager;
import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache;
import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel;
import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil;
import com.actionsoft.apps.coe.pal.processmap.constant.CoEProcessMapConstant;
import com.actionsoft.apps.coe.pal.processmap.model.CoEProcessMapTreeModel;
import com.actionsoft.bpms.util.UtilString;
import com.actionsoft.i18n.I18nRes;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 流程全景树组装工具将组装树的调用方法提取到这个类中
*
* @author lipt
* @date 2022/12/16
*/
public class ProcessMapTreeUtil {
/**
* 流程全景最大层级
*/
private static Integer processMaxLevel = 0;
/**
* 流程全景默认输出层级随着 + - 的更改而更改
*/
private static Integer defaultLevel = CoEProcessMapConstant.DEFAULT_LEVEL;
/**
* treeModelsList 集合
*/
private static List<CoEProcessMapTreeModel> treeModelsList;
/**
* 查询所有的数据 并组装到 tree 可以多次加载调用
*
* @param wsId 资产库id
*/
public static void wrapperTreeModelList(String userId, String wsId, String teamId) {
// 所有子流程及其本身的集合
List<PALRepositoryModel> allProcessList = getAllRepositoryList(wsId);
// 获取所有的权限 VersionId 集合
Set<String> permVerIds = CoeProcessLevelUtil.getPermRepositoryVersionIds(wsId, teamId, userId, null, null);
// 基础树结构数据组装 集合对象转换
List<CoEProcessMapTreeModel> treeModels = processRepToTreeModel(allProcessList);
// 从缓存中循环查询数据pal Method 的数据集合
List<String> palMethodList = getPalMethodPrem(wsId, teamId, userId);
// 组装树结构的流程全景数据
treeModelsList = wrapperPMTreePerm(palMethodList, treeModels, permVerIds);
}
/**
* 根据权限获取 palMethod
*
* @param wsId 资产库Id
* @param teamId 小组Id
* @param userId 用户Id
* @return palMethod 集合
*/
private static List<String> getPalMethodPrem(String wsId, String teamId, String userId) {
// teamId 为空则 返回全部数据
if (UtilString.isEmpty(teamId)) {
return PALMethodCache.getPALMethodList(true);
}
// 获取组权限下的 palMethod 的集合过滤重复返回
List<PALRepositoryModel> permRepositoryList = CoeProcessLevelUtil.getPermRepositoryList(wsId, teamId, userId, null, null, true, false);
return permRepositoryList.stream().map(PALRepositoryModel::getMethodCategory).distinct().collect(Collectors.toList());
}
/**
* 对象转换 PALRepositoryModel 转化为定义的树类型 CoEProcessMapTreeModel
*
* @param allProcessList PALRepositoryModel集合
* @return List<CoEProcessMapTreeModel>
*/
public static List<CoEProcessMapTreeModel> processRepToTreeModel(List<PALRepositoryModel> allProcessList) {
return allProcessList.stream().map(a -> {
CoEProcessMapTreeModel model = new CoEProcessMapTreeModel();
model.setParentId(a.getParentId());
model.setId(a.getId());
model.setName(a.getName());
model.setPath(a.getName());
model.setLevel(a.getLevel());
model.setVersionId(a.getVersionId());
return model;
}).collect(Collectors.toList());
}
/**
* 组装树结构 组装的为根节点数据
*
* @param treeModels CoEProcessMapTreeModel集合
* @return 返回树类型的集合
*/
public static List<CoEProcessMapTreeModel> wrapperPMTree(List<CoEProcessMapTreeModel> treeModels, Boolean deepFlag) {
// 从缓存中循环查询数据pal Method 的数据集合
List<String> palMethodList = PALMethodCache.getPALMethodList(true);
Map<String, CoEProcessMapTreeModel> mapTreeModelMap = treeModels.stream().collect(Collectors.toMap(CoEProcessMapTreeModel::getId, Function.identity()));
List<CoEProcessMapTreeModel> treeModelList = new ArrayList<>();
for (String palMethod : palMethodList) {
CoEProcessMapTreeModel treeModel = new CoEProcessMapTreeModel();
// 递归获取子节点的数据
treeModel.setChildren(wrapperPMChildrenTree(treeModels, palMethod, 1));
// 组装树中的数据
wrapperCommonTreeData(treeModel);
treeModel.setId(palMethod);
if (deepFlag) {
treeModel.setValue(mapTreeModelMap.get(palMethod).getValue());
}
treeModel.setName(I18nRes.findValue(CoEConstant.APP_ID, palMethod));
treeModel.setLevel(0);
treeModelList.add(treeModel);
}
return treeModelList;
}
/**
* 组装子节点数据
*
* @param treeModels CoEProcessMapTreeModel集合数据
* @param pid 父id
* @param level 当前节点所在等级
* @return 返回组装好的树集合
*/
public static List<CoEProcessMapTreeModel> wrapperPMChildrenTree(List<CoEProcessMapTreeModel> treeModels, String pid, Integer level) {
List<CoEProcessMapTreeModel> treeModelList = new ArrayList<>();
level++;
processMaxLevel = Math.max(processMaxLevel, level);
for (CoEProcessMapTreeModel treeModel : treeModels) {
if (pid.equals(treeModel.getParentId())) {
// 递归获取子节点的数据
treeModel.setLevel(level);
treeModel.setChildren(wrapperPMChildrenTree(treeModels, treeModel.getId(), level));
// 组装树中的数据
wrapperCommonTreeData(treeModel);
treeModelList.add(treeModel);
}
}
return treeModelList;
}
/**
* 组装树中的公共数据提取的方法
*
* @param treeModel 对象
*/
private static void wrapperCommonTreeData(CoEProcessMapTreeModel treeModel) {
if (treeModel.getValue() == null) {
// 组装父节点数据
int size = treeModel.getChildren().stream().mapToInt(CoEProcessMapTreeModel::getValue).sum();
if (size == 0) {
// 美化样式清楚边框的宽度
Map<String, Object> map = new HashMap<>();
map.put("borderWidth", 0);
treeModel.setItemStyle(map);
}
size = size == 0 ? 1 : size;
treeModel.setValue(size);
}
}
/**
* 获取流程最大等级
*/
public static Integer getProcessMaxLevel() {
return processMaxLevel;
}
/**
* 查询所有的数据 并组装到 tree 默认不去刷新 treeModelsList
*
* @param wsId 资产库id
*/
public static List<CoEProcessMapTreeModel> getTreeModelsList(String userId, String wsId, String teamId) {
return getTreeModelsList(userId, wsId, teamId, false);
}
/**
* 查询所有的数据 并组装到 tree
* <p>
* 只有界面初始的时候去调用该方法其余时候其余时候直接去获取已经有的数据
* 接口去获取 getPanoramaTreePidList getPanoramaTreeById 两个方法是不需要再次获取数据的
* </p>
*
* @param userId 用户id
* @param wsId 资产库id
* @param teamId 小组id
* @param flushFlag 刷新标识
*/
public static List<CoEProcessMapTreeModel> getTreeModelsList(String userId, String wsId, String teamId, Boolean flushFlag) {
if (CollectionUtils.isEmpty(treeModelsList) || flushFlag) {
wrapperTreeModelList(userId, wsId, teamId);
}
return treeModelsList;
}
/**
* 所有子流程及其本身的集合
*/
public static List<PALRepositoryModel> getAllRepositoryList(String wsId) {
// 从缓存中循环查询数据pal Method 的数据集合 存放到
List<String> palMethodList = PALMethodCache.getPALMethodList(true);
List<PALRepositoryModel> palRepositoryModels = new ArrayList<>();
// 获取当前所有流程的一级节点流程
for (String palMethod : palMethodList) {
Iterator<PALRepositoryModel> processIter = PALRepositoryCache.getByPid(wsId, palMethod);
processIter.forEachRemaining(palRepositoryModels::add);
// 排序
palRepositoryModels.sort(Comparator.comparingInt(PALRepositoryModel::getOrderIndex).reversed());
}
// 所有子流程及其本身的集合
List<PALRepositoryModel> allProcessList = new ArrayList<>();
palRepositoryModels.forEach(palRepositoryModel -> {
allProcessList.add(palRepositoryModel);
// 获取流程的所有使用中的子流程
PALRepositoryQueryAPIManager.getInstance().getAllUsedPalRepositoryModelsByPid(wsId, palRepositoryModel.getId(), allProcessList);
});
return allProcessList;
}
/**
* 获取 treeModelList 集合 通过等级
*
* @param treeModelList CoEProcessMapTreeModel集合
* @return level 等级
*/
public static List<CoEProcessMapTreeModel> getTreeModelsByLevel(List<CoEProcessMapTreeModel> treeModelList, int level) {
defaultLevel = level;
List<CoEProcessMapTreeModel> treeModels = new ArrayList<>();
for (CoEProcessMapTreeModel model : treeModelList) {
CoEProcessMapTreeModel treeModel;
treeModel = model;
if (treeModel.getLevel() >= level || CollectionUtils.isEmpty(treeModel.getChildren())) {
Map<String, Object> map = new HashMap<>();
map.put("borderWidth", 0);
treeModel.setItemStyle(map);
treeModel.setChildren(null);
} else {
treeModel.setChildren(getTreeModelsByLevel(treeModel.getChildren(), level));
}
treeModels.add(treeModel);
}
return treeModels;
}
/**
* 树型转为基础list
*/
public static List<CoEProcessMapTreeModel> treeModelToModelList(List<CoEProcessMapTreeModel> treeModelList) {
List<CoEProcessMapTreeModel> newTreeModel = new ArrayList<>();
for (CoEProcessMapTreeModel model : treeModelList) {
newTreeModel.add(model);
List<CoEProcessMapTreeModel> children = model.getChildren();
if (!CollectionUtils.isEmpty(children)) {
List<CoEProcessMapTreeModel> childrenList = treeModelToModelList(children);
newTreeModel.addAll(childrenList);
}
}
if (newTreeModel.size() > 0) {
for (CoEProcessMapTreeModel model : newTreeModel) {
model.setChildren(null);
}
}
return newTreeModel;
}
/**
* 根据id查询树中的子节点
*
* @param treeModelList 树型集合
* @param id 要查询的id
*/
public static List<CoEProcessMapTreeModel> findChildrenModelsById(List<CoEProcessMapTreeModel> treeModelList, String id) {
for (CoEProcessMapTreeModel model : treeModelList) {
if (model.getId().equals(id)) {
return model.getChildren();
} else {
if (!CollectionUtils.isEmpty(model.getChildren())) {
List<CoEProcessMapTreeModel> childModels = findChildrenModelsById(model.getChildren(), id);
if (!CollectionUtils.isEmpty(childModels)) {
return childModels;
}
}
}
}
return null;
}
/**
* 过滤树只包含一层数据拷贝不影响原本的数据
*/
public static List<CoEProcessMapTreeModel> filterModelsOneLevel(List<CoEProcessMapTreeModel> treeModels) {
if (CollectionUtils.isEmpty(treeModels)) {
return null;
}
return treeModels.stream().map(m -> {
CoEProcessMapTreeModel model = new CoEProcessMapTreeModel();
BeanUtils.copyProperties(m, model);
if (!CollectionUtils.isEmpty(model.getChildren())) {
model.setChildren(null);
}
return model;
}).collect(Collectors.toList());
}
/**
* 组装树结构 组装的为根节点数据
*
* @param treeModels CoEProcessMapTreeModel集合
* @param permVerIds 获取所有的权限 VersionId 集合
* @return 返回树类型的集合
*/
public static List<CoEProcessMapTreeModel> wrapperPMTreePerm(List<String> palMethodList, List<CoEProcessMapTreeModel> treeModels, Set<String> permVerIds) {
Map<String, CoEProcessMapTreeModel> mapTreeModelMap = treeModels.stream().collect(Collectors.toMap(CoEProcessMapTreeModel::getId, Function.identity()));
// 当前的层级
int curLevel = 0;
List<CoEProcessMapTreeModel> treeModelList = new ArrayList<>();
for (String palMethod : palMethodList) {
CoEProcessMapTreeModel model = mapTreeModelMap.get(palMethod);
if (model != null && !permVerIds.contains(model.getVersionId())) {
// 父节点不在数据中直接去添加子节点 level 也为当前节点的层级
List<CoEProcessMapTreeModel> childTreePerm = wrapperPMChildrenTreePerm(treeModels, palMethod, permVerIds, curLevel);
treeModelList.addAll(childTreePerm);
} else {
CoEProcessMapTreeModel treeModel = new CoEProcessMapTreeModel();
// 递归获取子节点的数据
treeModel.setChildren(wrapperPMChildrenTreePerm(treeModels, palMethod, permVerIds, curLevel + 1));
// 组装树中的数据
wrapperCommonTreeData(treeModel);
treeModel.setId(palMethod);
treeModel.setName(I18nRes.findValue(CoEConstant.APP_ID, palMethod));
treeModel.setLevel(curLevel);
treeModelList.add(treeModel);
}
}
return treeModelList;
}
/**
* 组装子节点数据
*
* @param treeModels CoEProcessMapTreeModel集合数据
* @param pid 父id
* @param level 当前节点所在等级
* @return 返回组装好的树集合
*/
public static List<CoEProcessMapTreeModel> wrapperPMChildrenTreePerm(List<CoEProcessMapTreeModel> treeModels, String pid, Set<String> permVerIds, Integer level) {
List<CoEProcessMapTreeModel> treeModelList = new ArrayList<>();
// 当前层级
processMaxLevel = Math.max(processMaxLevel, level);
for (CoEProcessMapTreeModel treeModel : treeModels) {
if (pid.equals(treeModel.getParentId())) {
if (!permVerIds.contains(treeModel.getVersionId())) {
treeModelList.addAll(wrapperPMChildrenTreePerm(treeModels, treeModel.getId(), permVerIds, level));
} else {
level++;
// 递归获取子节点的数据
treeModel.setLevel(level);
treeModel.setChildren(wrapperPMChildrenTreePerm(treeModels, treeModel.getId(), permVerIds, level));
// 组装树中的数据
wrapperCommonTreeData(treeModel);
treeModelList.add(treeModel);
}
}
}
return treeModelList;
}
}

View File

@ -0,0 +1,265 @@
package com.actionsoft.apps.coe.pal.processmap.web;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.actionsoft.apps.coe.pal.constant.CoEConstant;
import com.actionsoft.apps.coe.pal.log.CoEOpLogAPI;
import com.actionsoft.apps.coe.pal.log.CoEOpLogConst;
import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager;
import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache;
import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory;
import com.actionsoft.apps.coe.pal.pal.repository.model.CoeProcessLevelJsonModel;
import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel;
import com.actionsoft.apps.coe.pal.pal.repository.model.impl.PALRepositoryModelImpl;
import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil;
import com.actionsoft.apps.coe.pal.pal.ws.dao.CoeWorkSpaceDaoFactory;
import com.actionsoft.apps.coe.pal.pal.ws.model.CoeWorkSpaceModel;
import com.actionsoft.apps.coe.pal.processmap.constant.CoEProcessMapConstant;
import com.actionsoft.apps.coe.pal.processmap.model.CoEProcessMapResponse;
import com.actionsoft.apps.coe.pal.processmap.model.CoEProcessMapTreeModel;
import com.actionsoft.apps.coe.pal.processmap.util.ProcessMapTreeUtil;
import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate;
import com.actionsoft.bpms.commons.mvc.view.ActionWeb;
import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.util.UtilString;
import com.actionsoft.i18n.I18nRes;
import com.actionsoft.sdk.local.SDK;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.commons.collections.CollectionUtils;
import static com.actionsoft.apps.coe.pal.processmap.constant.CoEProcessMapConstant.DEFAULT_LEVEL;
/**
* coe 流程全景 web
*
* @date 2022/12/5 5:22 下午
*/
public class CoEProcessMapWeb extends ActionWeb {
UserContext _uc;
public CoEProcessMapWeb() {
}
public CoEProcessMapWeb(UserContext uc) {
super(uc);
_uc = uc;
}
public String mainPage(UserContext context, String wsId) {
_uc = context;
return getNewHome(wsId, "");
}
public String mainPage(UserContext context, String wsId, String teamId) {
_uc = context;
return getNewHome(wsId, teamId);
}
@Deprecated
public String getHome(String wsId) {
CoeWorkSpaceModel coeWorkSpaceModel = (CoeWorkSpaceModel) CoeWorkSpaceDaoFactory.createCoeWorkSpace().getAllModel(wsId);
Iterator<PALRepositoryModel> rootModels = PALRepositoryCache.getByPid(wsId, "process");
List<PALRepositoryModel> rootList = new ArrayList<>();
while (rootModels.hasNext()) {
PALRepositoryModel rootModel = rootModels.next();
if (rootModel.isUse()) {
rootList.add(rootModel);
}
}
Collections.sort(rootList, new Comparator<PALRepositoryModel>() {
@Override
public int compare(PALRepositoryModel o1, PALRepositoryModel o2) {
return o1.getOrderIndex() - o2.getOrderIndex();
}
});
// String rootId = "";
//
//
//
//
//
// while(rootModels.hasNext()) {
// PALRepositoryModel rootModel = rootModels.next();
// if (rootModel.isSystemFile()) {
// rootId = rootModel.getId();
// break;
// }
// }
//
// list.add(PALRepositoryCache.getCache().get(rootId));
List<PALRepositoryModel> list = new ArrayList<>();
for (PALRepositoryModel plModel : rootList) {
list.add(plModel);
PALRepositoryQueryAPIManager.getInstance().getAllUsedPalRepositoryModelsByPid(wsId, plModel.getId(), list);
}
//用于架构全景的json数据传递
List<CoeProcessLevelJsonModel> rlist = new ArrayList<>();
int count = list.size();
// 资产库文件集合
for (int i = 0; i < count; i++) {
PALRepositoryModelImpl coeProcessLevelModel = (PALRepositoryModelImpl)list.get(i);
CoeProcessLevelJsonModel model = new CoeProcessLevelJsonModel();
model.setPlLevel(coeProcessLevelModel.getLevel());
model.setPlName(I18nRes.findValue(CoEConstant.APP_ID,
_uc.getLanguage(), coeProcessLevelModel.getName().trim()));
model.setPlNo(CoeProcessLevelUtil.getProcessLevelNoByUUId(
coeProcessLevelModel.getId(),
coeProcessLevelModel.getWsId()).replace(".", ""));
model.setUuid(coeProcessLevelModel.getId());
model.setPlParentId(coeProcessLevelModel.getParentId());
model.setColor(coeProcessLevelModel.getColor());
model.setIndex(i);
model.setPlAllNo(CoeProcessLevelUtil.getProcessLevelNoByUUId(
coeProcessLevelModel.getId(),
coeProcessLevelModel.getWsId()));
rlist.add(model);
}
Map<String, Object> macroLibraries = new HashMap<String, Object>();
macroLibraries.put(
"maxLevel",
CoeProcessLevelDaoFacotory.createCoeProcessLevel().getMaxLevel(
coeWorkSpaceModel.getUUId()) + 1);
macroLibraries.put(
"wsName",
I18nRes.findValue(CoEConstant.APP_ID,
coeWorkSpaceModel.getWsName()));
macroLibraries.put("wsType", coeWorkSpaceModel.getWsTctype());
macroLibraries.put("processLevelData", JSONArray
.parseArray(JSON.toJSONString(rlist)).toString());
macroLibraries.put("uid", _uc.getUserModel().getUserName());
macroLibraries.put("iframeTitle", CoEProcessMapConstant.PROCESSMAP_PAGE_TITLE);
// 操作行为日志记录
if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) {
CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_APPCENTER, CoEOpLogConst.OP_ACCESS, CoEOpLogConst.INFO_APPCENTER_ACCESS_PREFIX + SDK.getAppAPI().getAppContext("com.actionsoft.apps.coe.pal.processmap").getName() + CoEOpLogConst.INFO_APPCENTER_ACCESS_SUFFIX);
}
return HtmlPageTemplate.merge("com.actionsoft.apps.coe.pal.processmap",
"pal.ws.architecture.panoramic.htm", macroLibraries);
}
public String getNewHome(String wsId, String teamId) {
Map<String, Object> macroLibraries = new HashMap<>();
macroLibraries.put("sessionId", _uc.getSessionId());
macroLibraries.put("settingParam", JSON.toJSON(macroLibraries));
macroLibraries.put("wsId", wsId);
macroLibraries.put("teamId", teamId);
return HtmlPageTemplate.merge("com.actionsoft.apps.coe.pal.processmap", "main.htm", macroLibraries);
}
/**
* 获取流程全景
*
* @param wsId 资产库id
* @param teamId 小组id
* @return 返回流程全景的数据
*/
public String getProcessPanorama(String wsId, String teamId) {
if (UtilString.isEmpty(wsId)) {
return ResponseObject.newErrResponse("wsId不能为空").toString();
}
ResponseObject ro = ResponseObject.newOkResponse();
// 资产库实体类
CoeWorkSpaceModel wsModel = CoeWorkSpaceDaoFactory.createCoeWorkSpace().getAllModel(wsId);
// 资产库名称
String wsName = wsModel.getWsName();
// 组装基础返回的数据
CoEProcessMapResponse coEProcessMapResponse = new CoEProcessMapResponse();
coEProcessMapResponse.setWsName(wsName);
coEProcessMapResponse.setWsId(wsId);
// 组装获取树model集合
List<CoEProcessMapTreeModel> treeModelList = ProcessMapTreeUtil.getTreeModelsList(_uc.getUID(), wsId, teamId, true);
coEProcessMapResponse.setCoEProcessMapTreeModels(treeModelList);
// 默认输出1级数据
// List<CoEProcessMapTreeModel> treeModelsByLevel = ProcessMapTreeUtil.getTreeModelsByLevel(treeModelList, DEFAULT_LEVEL);
// coEProcessMapResponse.setCoEProcessMapTreeModels(treeModelsByLevel);
coEProcessMapResponse.setMaxLevel(ProcessMapTreeUtil.getProcessMaxLevel());
ro.put("processMap", coEProcessMapResponse);
return ro.toString();
}
/**
* 获取流程全景通过id 局部数据组装 鼠标点击和面包屑点击返回的数据
*
* @param wsId 资产库id
* @param id 节点返回的id
* @param deepFlag 下钻标识 点击面包屑时只显示当前层级点击下钻时显示下一层级
*/
public String getPanoramaTreeById(String wsId, String teamId, String id, Boolean deepFlag) {
if (UtilString.isEmpty(wsId)) {
return ResponseObject.newErrResponse("wsId不能为空").toString();
}
if (UtilString.isEmpty(id)) {
return ResponseObject.newErrResponse("id不能为空").toString();
}
// 组装获取树model集合
List<PALRepositoryModel> allRepositoryList = ProcessMapTreeUtil.getAllRepositoryList(wsId);
Map<String, PALRepositoryModel> idAndModelMap = allRepositoryList.stream().collect(Collectors.toMap(PALRepositoryModel::getId, Function.identity()));
List<String> idList = new ArrayList<>();
idList.add(id);
String finalId = id;
while (idAndModelMap.get(id) != null) {
id = idAndModelMap.get(id).getParentId();
idList.add(id);
}
// 反转
Collections.reverse(idList);
List<CoEProcessMapTreeModel> treeModelList = ProcessMapTreeUtil.getTreeModelsList(_uc.getUID(), wsId, teamId, true);
// 结果集合
List<CoEProcessMapTreeModel> treeModels;
if (deepFlag) {
List<CoEProcessMapTreeModel> modelsById = ProcessMapTreeUtil.findChildrenModelsById(treeModelList, finalId);
treeModels = ProcessMapTreeUtil.filterModelsOneLevel(modelsById);
} else {
List<CoEProcessMapTreeModel> allTreeModelList = ProcessMapTreeUtil.treeModelToModelList(treeModelList);
List<String> deepIdList = new ArrayList<>();
CollectionUtils.addAll(deepIdList, new Object[idList.size()]);
Collections.copy(deepIdList, idList);
deepIdList.remove(finalId);
List<CoEProcessMapTreeModel> collect = allTreeModelList.stream()
// 过滤层级数据
.filter(m -> (m.getLevel() <= DEFAULT_LEVEL)
// 是否为下钻的数据
|| deepIdList.contains(m.getParentId()))
.collect(Collectors.toList());
treeModels = ProcessMapTreeUtil.wrapperPMTree(collect, true);
}
ResponseObject ro = ResponseObject.newOkResponse();
ro.put("treeModels", treeModels);
ro.put("idList", idList);
return ro.toString();
}
/**
* 获取流程全景 通过点击 侧边 + - 控制整体输出的 层级
*
* @param wsId 资产库id
* @param level 层级
*/
public String getPanoramaTreeByLevel(String wsId, String teamId, Integer level) {
if (ProcessMapTreeUtil.getProcessMaxLevel() < level) {
return ResponseObject.newWarnResponse("层级超出最大值").toString();
}
// 获取 存储的 treeModelList
List<CoEProcessMapTreeModel> treeModelList = ProcessMapTreeUtil.getTreeModelsList(_uc.getUID(), wsId, teamId, true);
List<CoEProcessMapTreeModel> treeModelsByLevel = ProcessMapTreeUtil.getTreeModelsByLevel(treeModelList, level);
ResponseObject ro = ResponseObject.newOkResponse();
ro.put("processMap", treeModelsByLevel);
return ro.toString();
}
}