diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/CoEDesignerVersionController.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/CoEDesignerVersionController.java new file mode 100644 index 00000000..aa54e270 --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/CoEDesignerVersionController.java @@ -0,0 +1,31 @@ +package com.actionsoft.apps.coe.pal; + +import com.actionsoft.apps.coe.pal.pal.repository.designer.dto.VersionListDTO; +import com.actionsoft.apps.coe.pal.pal.repository.designer.web.CoeDesignerVersionWeb; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * @author oYang + * @Description 设计器-流程版本对比 控制类 + * @createTime 2024年07月29日 11:04:00 + */ +@Controller +public class CoEDesignerVersionController { + + /** + * 设计器版本列表 + * + * @param uc 用户上下文 + * @param wsId 资产库Id + * @param teamId 小组Id + * @param id 模型Id + * @return 模型版本列表 + */ + @Mapping("com.actionsoft.apps.coe.pal_pl_repository_designer_version_list") + public String designerVersionList(UserContext uc, String wsId, String teamId, String id) { + VersionListDTO versionListDTO = new VersionListDTO(wsId, teamId, id); + return new CoeDesignerVersionWeb(uc).getVersionList(versionListDTO); + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/ProcessExecAPIManager.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/ProcessExecAPIManager.java new file mode 100644 index 00000000..1d06851b --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/ProcessExecAPIManager.java @@ -0,0 +1,68 @@ +package com.actionsoft.apps.coe.pal.pal.processexec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.actionsoft.apps.coe.pal.pal.processexec.constant.B2PControlModeEnum; +import com.actionsoft.apps.coe.pal.pal.processexec.constant.P2BControlModeEnum; +import com.actionsoft.apps.coe.pal.pal.repository.cache.CoeProcessLevelCorrelateCache; +import com.actionsoft.apps.coe.pal.pal.repository.model.CoeProcessLevelCorrelateModel; + +/** + * @author oYang + * @Description 梳理到执行(关联管理) 业务逻辑处理 + * @createTime 2024年09月10日 14:34:00 + */ +public class ProcessExecAPIManager { + + private static final Logger log = LoggerFactory.getLogger(ProcessExecAPIManager.class); + + private ProcessExecAPIManager() { + } + + public static ProcessExecAPIManager getInstance() { + return SingletonHolder.INSTANCE; + } + + /** + * 梳理到执行 流程层面 判断是否有控制权限(根据应用参数判定) + * + * @param plId PAL端流程ID + * @return boolean + */ + public boolean hasProcessControlPerm(String plId) { + return hasProcessControlPerm(plId, true); + } + + private static class SingletonHolder { + private static final ProcessExecAPIManager INSTANCE = new ProcessExecAPIManager(); + } + + /** + * 梳理到执行 流程层面 判断是否有控制权限(根据应用参数判定) + * + * @param plId PAL端流程ID + * @return boolean + */ + public boolean hasProcessControlPerm(String plId, boolean isPal) { + boolean hasPerm = true; + CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(plId); + if (correlateModel != null) { + int correlateType = correlateModel.getCorrelateType(); + int controlMode = correlateModel.getControlMode(); + if (correlateType == 1) { + P2BControlModeEnum controlModeEnum = P2BControlModeEnum.getByValue(controlMode); + if (controlModeEnum != null) { + return isPal ? controlModeEnum.getPalProcessHasPerm() : controlModeEnum.getBpmProcessHasPerm(); + } + } else { + B2PControlModeEnum controlModeEnum = B2PControlModeEnum.getByValue(controlMode); + if (controlModeEnum != null) { + return isPal ? controlModeEnum.getPalProcessHasPerm() : controlModeEnum.getBpmProcessHasPerm(); + } + } + } + return hasPerm; + } + +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/B2PControlModeEnum.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/B2PControlModeEnum.java new file mode 100644 index 00000000..0847eb2e --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/B2PControlModeEnum.java @@ -0,0 +1,85 @@ +package com.actionsoft.apps.coe.pal.pal.processexec.constant; + +/** + * @author oYang + * @Description BPM推送PAL 流程控制模式 + * @createTime 2024年09月20日 15:15:00 + */ +public enum B2PControlModeEnum { + + /** + * 以PAL为中心+BPM图结构只读 + */ + PAL_BPM_READ_ONLY(1, "以PAL为中心+BPM图结构只读", false, false, true, true), + + /** + * 以PAL为中心+BPM图可编辑 + */ + PAL_BPM_EDIT(2, "以PAL为中心+BPM图可编辑", false, true, true, true), + + /** + * 以BPM为中心+PAL图结构只读 + */ + BPM_PAL_READ_ONLY(3, "以BPM为中心+PAL图结构只读", true, true, false, false), + + /** + * 以BPM为中心+PAL图结构可编辑 + */ + BPM_PAL_EDIT(4, "以BPM为中心+PAL图结构可编辑", true, true, false, true), + + /** + * 不限制 + */ + NONE(5, "不限制", true, true, true, true); + + private final Integer value; + private final String desc; + private final Boolean bpmProcessHasPerm; // BPM流程层面控制权限 + private final Boolean bpmProcessDiagramHasPerm; // BPM流程图结构控制权限 + private final Boolean palProcessHasPerm; // PAL流程层面控制权限 + private final Boolean palProcessDiagramHasPerm; // PAL流程图结构控制权限 + + B2PControlModeEnum(Integer value, String desc, Boolean bpmProcessHasPerm, Boolean bpmProcessDiagramHasPerm, Boolean palProcessHasPerm, Boolean palProcessDiagramHasPerm) { + this.value = value; + this.desc = desc; + this.bpmProcessHasPerm = bpmProcessHasPerm; + this.bpmProcessDiagramHasPerm = bpmProcessDiagramHasPerm; + this.palProcessHasPerm = palProcessHasPerm; + this.palProcessDiagramHasPerm = palProcessDiagramHasPerm; + } + + public static B2PControlModeEnum getByValue(Integer value) { + for (B2PControlModeEnum mode : values()) { + if (mode.getValue().equals(value)) { + return mode; + } + } + return null; + } + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + public Boolean getBpmProcessHasPerm() { + return bpmProcessHasPerm; + } + + public Boolean getBpmProcessDiagramHasPerm() { + return bpmProcessDiagramHasPerm; + } + + public Boolean getPalProcessHasPerm() { + return palProcessHasPerm; + } + + public Boolean getPalProcessDiagramHasPerm() { + return palProcessDiagramHasPerm; + } +} + + diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/P2BControlModeEnum.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/P2BControlModeEnum.java new file mode 100644 index 00000000..b090bdcd --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/processexec/constant/P2BControlModeEnum.java @@ -0,0 +1,83 @@ +package com.actionsoft.apps.coe.pal.pal.processexec.constant; + +/** + * @author oYang + * @Description PAL端推送BPM端的流程控制模式 + * @createTime 2024年09月20日 14:55:00 + */ +public enum P2BControlModeEnum { + + /** + * 以PAL为中心+BPM图结构只读 + */ + PAL_BPM_READ_ONLY(1, "以PAL为中心+BPM图结构只读", false, false, true, true), + + /** + * 以PAL为中心+BPM图可编辑 + */ + PAL_BPM_EDIT(2, "以PAL为中心+BPM图可编辑", false, true, true, true), + + /** + * 以BPM为中心+PAL图结构只读 + */ + BPM_PAL_READ_ONLY(3, "以BPM为中心+PAL图结构只读", true, true, false, false), + + /** + * 以BPM为中心+PAL图结构可编辑 + */ + BPM_PAL_EDIT(4, "以BPM为中心+PAL图结构可编辑", true, true, false, true), + + /** + * 不限制 + */ + NONE(5, "不限制", true, true, true, true); + + private final Integer value; + private final String desc; + private final Boolean bpmProcessHasPerm; // BPM流程层面控制权限 + private final Boolean bpmProcessDiagramHasPerm; // BPM流程图结构控制权限 + private final Boolean palProcessHasPerm; // PAL流程层面控制权限 + private final Boolean palProcessDiagramHasPerm; // PAL流程图结构控制权限 + + P2BControlModeEnum(Integer value, String desc, Boolean bpmProcessHasPerm, Boolean bpmProcessDiagramHasPerm, Boolean palProcessHasPerm, Boolean palProcessDiagramHasPerm) { + this.value = value; + this.desc = desc; + this.bpmProcessHasPerm = bpmProcessHasPerm; + this.bpmProcessDiagramHasPerm = bpmProcessDiagramHasPerm; + this.palProcessHasPerm = palProcessHasPerm; + this.palProcessDiagramHasPerm = palProcessDiagramHasPerm; + } + + public static P2BControlModeEnum getByValue(Integer value) { + for (P2BControlModeEnum mode : values()) { + if (mode.getValue().equals(value)) { + return mode; + } + } + return null; + } + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + public Boolean getBpmProcessHasPerm() { + return bpmProcessHasPerm; + } + + public Boolean getBpmProcessDiagramHasPerm() { + return bpmProcessDiagramHasPerm; + } + + public Boolean getPalProcessHasPerm() { + return palProcessHasPerm; + } + + public Boolean getPalProcessDiagramHasPerm() { + return palProcessDiagramHasPerm; + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/constant/VersionStatusEnum.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/constant/VersionStatusEnum.java new file mode 100644 index 00000000..2035c0f7 --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/constant/VersionStatusEnum.java @@ -0,0 +1,52 @@ +package com.actionsoft.apps.coe.pal.pal.repository.designer.constant; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import com.actionsoft.bpms.util.UtilString; + +/** + * @author oYang + * @Description 版本状态枚举 + * @createTime 2024年07月29日 14:51:00 + */ +public enum VersionStatusEnum { + + USE("use", "设计中"), PUBLISH("publish", "已发布"), STOP("stop", "已停用"), APPROVAL("approval", "审核中"), DESIGNER("designer", "设计"); + + private static final Map codeToStatus = new HashMap<>(); + + static { + for (VersionStatusEnum status : VersionStatusEnum.values()) { + codeToStatus.put(status.code, status); + } + } + + String code; + String desc; + + VersionStatusEnum(String code, String desc) { + if (UtilString.isEmpty(code) || UtilString.isEmpty(desc)) { + throw new IllegalArgumentException("Code and Desc must not be null"); + } + this.code = code; + this.desc = desc; + } + + public static Optional getByCode(String code) { + if (UtilString.isEmpty(code)) { + throw new IllegalArgumentException("Code must not be null"); + } + VersionStatusEnum status = codeToStatus.get(code); + return Optional.ofNullable(status); + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/dto/VersionListDTO.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/dto/VersionListDTO.java new file mode 100644 index 00000000..ff485638 --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/dto/VersionListDTO.java @@ -0,0 +1,46 @@ +package com.actionsoft.apps.coe.pal.pal.repository.designer.dto; + +/** + * @author oYang + * @Description 版本列表 + * @createTime 2024年07月29日 11:12:00 + */ +public class VersionListDTO { + + private String wsId; + private String teamId; + private String id; + + public VersionListDTO() { + } + + public VersionListDTO(String wsId, String teamId, String id) { + this.wsId = wsId; + this.teamId = teamId; + this.id = id; + } + + public String getWsId() { + return wsId; + } + + public void setWsId(String wsId) { + this.wsId = wsId; + } + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/util/DesignerVersionUtil.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/util/DesignerVersionUtil.java new file mode 100644 index 00000000..e82d440b --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/util/DesignerVersionUtil.java @@ -0,0 +1,143 @@ +package com.actionsoft.apps.coe.pal.pal.repository.designer.util; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.actionsoft.apps.coe.pal.pal.processexec.ProcessExecAPIManager; +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.designer.constant.VersionStatusEnum; +import com.actionsoft.apps.coe.pal.pal.repository.designer.vo.VersionListVO; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.apps.coe.pal.pal.ws.web.VersionUtil; +import com.actionsoft.bpms.bpmn.engine.model.def.ProcessDefinition; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.sdk.local.SDK; + +/** + * @author oYang + * @Description 设计器版本工具类 + * @createTime 2024年07月29日 14:49:00 + */ +public class DesignerVersionUtil { + + private static final Logger log = LoggerFactory.getLogger(DesignerVersionUtil.class); + + /** + * 返回版本状态 + * + * @param model 当前模型 + * @return 版本状态 + */ + public static VersionStatusEnum getVersionStatus(PALRepositoryModel model) { + if (model.isUse()) { + return VersionStatusEnum.USE; + } + if (model.isApproval()) { + return VersionStatusEnum.APPROVAL; + } + if (model.isStop()) { + return VersionStatusEnum.STOP; + } + if (model.isPublish()) { + return VersionStatusEnum.PUBLISH; + } + return VersionStatusEnum.DESIGNER; + } + + /** + * 获取版本列表Vo + * + * @param id PAL模型Id + * @param mapOfProcessDefId PAL模型ID与bpm流程定义Id映射 + * @return List + */ + public static List getVersionListVoList(String id, Map mapOfProcessDefId) { + List result = new ArrayList<>(); + PALRepositoryModel model = PALRepositoryCache.getCache().get(id); + List versions = PALRepositoryCache.getByVersionId(model.getVersionId()); + versions.sort((o1, o2) -> VersionUtil.compareVersionNo(o1.getVersion(), o2.getVersion(), true)); + for (PALRepositoryModel palModel : versions) { + //隐藏与bpm关联流程 + if (mapOfProcessDefId.containsKey(palModel.getId())) { + continue; + } + VersionListVO versionListVo = getVersionListVo(palModel); + result.add(versionListVo); + } + return result; + } + + /** + * 获取版本列表Vo + * + * @param palModel pal模型 + * @return VersionListVo + */ + public static VersionListVO getVersionListVo(PALRepositoryModel palModel) { + String plId = palModel.getId(); + String verAndVerD = String.valueOf(palModel.getVersion()); + VersionStatusEnum versionStatus = getVersionStatus(palModel); + // 创建人 + String createUser = getUserName(palModel.getCreateUser()); + // 创建时间 + String createTime = getDate(palModel.getCreateDate()); + // 更新人 + String updateUser = getUserName(palModel.getModifyUser()); + // 更新时间 + String updateTime = getModifyDate(palModel.getModifyDate()); + // 梳理到执行 流程是否重命名、新建版本 受到参数管控 + boolean hasProcessControlPerm = !PALRepositoryQueryAPIManager.getInstance().isCorrelateBpms(plId, true) || ProcessExecAPIManager.getInstance().hasProcessControlPerm(plId); + return VersionListVO.VersionListBuilder.createBuilder().withPlId(plId).withVersionId(palModel.getVersionId()).withVersionNo(verAndVerD).withVersionStatus(versionStatus.getCode()).withCreateUser(createUser).withCreateTime(createTime).withUpdateUser(updateUser).withUpdateTime(updateTime).withHasCreatePerm(hasProcessControlPerm).build(); + } + + /** + * 获取版本列表Vo + * + * @param palModel pal模型 + * @param processDefinition bpm平台流程定义信息 + * @param correlateTime 关联时间 + * @return VersionListVo + */ + public static VersionListVO getVersionListVo(PALRepositoryModel palModel, ProcessDefinition processDefinition, Timestamp correlateTime) { + String plId = palModel.getId(); + String versionId = palModel.getVersionId(); + // PAL端版本号 + String palVersionNo = String.valueOf(palModel.getVersion()); + // 版本状态 + VersionStatusEnum versionStatus = getVersionStatus(palModel); + // 创建人 + String createUser = getUserName(processDefinition.getCreateUser()); + // 创建时间 + String createTime = getDate(processDefinition.getCreateTime()); + // 更新人 + String updateUser = getUserName(processDefinition.getUpdateUser()); + // 更新时间 + String updateTime = getModifyDate(processDefinition.getUpdateTime()); + // 梳理到执行 流程是否重命名、新建版本 受到参数管控 + boolean hasProcessControlPerm = !PALRepositoryQueryAPIManager.getInstance().isCorrelateBpms(plId, true) || ProcessExecAPIManager.getInstance().hasProcessControlPerm(plId); + return VersionListVO.VersionListBuilder.createBuilder().withPlId(plId).withVersionId(versionId).withVersionNo(palVersionNo).withVersionStatus(versionStatus.getCode()).withCreateUser(createUser).withCreateTime(createTime).withUpdateUser(updateUser).withUpdateTime(updateTime).withHasCreatePerm(hasProcessControlPerm).withCorrelateTime(correlateTime).build(); + } + + private static String getUserName(String userId) { + return SDK.getORGAPI().getUser(userId) == null ? userId : SDK.getORGAPI().getUser(userId).getUserNameI18N(); + } + + private static String getDate(Timestamp date) { + return UtilDate.dateFormat(date); + } + + private static String getModifyDate(Timestamp date) { + if (date == null) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf.format(date); + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/vo/VersionListVO.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/vo/VersionListVO.java new file mode 100644 index 00000000..f07aff54 --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/vo/VersionListVO.java @@ -0,0 +1,150 @@ +package com.actionsoft.apps.coe.pal.pal.repository.designer.vo; + +import java.sql.Timestamp; + +/** + * @author oYang + * @Description 版本列表 + * @createTime 2024年07月29日 11:47:00 + */ +public class VersionListVO { + + private final String plId; + private final String versionId; + private final String versionNo; + private final String versionStatus; + private final String createUser; + private final String createTime; + private final String updateUser; + private final String updateTime; + private final Boolean hasCreatePerm; // 是否有创建权限 + private final Timestamp correlateTime; + + private VersionListVO(VersionListBuilder builder) { + this.plId = builder.plId; + this.versionId = builder.versionId; + this.versionNo = builder.versionNo; + this.versionStatus = builder.versionStatus; + this.createUser = builder.createUser; + this.createTime = builder.createTime; + this.updateUser = builder.updateUser; + this.updateTime = builder.updateTime; + this.hasCreatePerm = builder.hasCreatePerm; + this.correlateTime = builder.correlateTime; + } + + public String getPlId() { + return plId; + } + + public String getVersionId() { + return versionId; + } + + public String getVersionNo() { + return versionNo; + } + + public String getVersionStatus() { + return versionStatus; + } + + public String getCreateUser() { + return createUser; + } + + public String getCreateTime() { + return createTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public String getUpdateTime() { + return updateTime; + } + + public Boolean getHasCreatePerm() { + return hasCreatePerm; + } + + public Timestamp getCorrelateTime() { + return correlateTime; + } + + public static final class VersionListBuilder { + + private String plId; + private String versionId; + private String versionNo; + private String versionStatus; + private String createUser; + private String createTime; + private String updateUser; + private String updateTime; + private Boolean hasCreatePerm; + private Timestamp correlateTime; + + private VersionListBuilder() { + } + + public static VersionListBuilder createBuilder() { + return new VersionListBuilder(); + } + + public VersionListBuilder withPlId(String plId) { + this.plId = plId; + return this; + } + + public VersionListBuilder withVersionId(String versionId) { + this.versionId = versionId; + return this; + } + + public VersionListBuilder withVersionNo(String versionNo) { + this.versionNo = versionNo; + return this; + } + + public VersionListBuilder withVersionStatus(String versionStatus) { + this.versionStatus = versionStatus; + return this; + } + + public VersionListBuilder withCreateUser(String createUser) { + this.createUser = createUser; + return this; + } + + public VersionListBuilder withCreateTime(String createTime) { + this.createTime = createTime; + return this; + } + + public VersionListBuilder withUpdateUser(String updateUser) { + this.updateUser = updateUser; + return this; + } + + public VersionListBuilder withUpdateTime(String updateTime) { + this.updateTime = updateTime; + return this; + } + + public VersionListBuilder withHasCreatePerm(Boolean hasCreatePerm) { + this.hasCreatePerm = hasCreatePerm; + return this; + } + + public VersionListBuilder withCorrelateTime(Timestamp correlateTime) { + this.correlateTime = correlateTime; + return this; + } + + public VersionListVO build() { + return new VersionListVO(this); + } + } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/web/CoeDesignerVersionWeb.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/web/CoeDesignerVersionWeb.java new file mode 100644 index 00000000..b5e0d7f3 --- /dev/null +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/designer/web/CoeDesignerVersionWeb.java @@ -0,0 +1,372 @@ +package com.actionsoft.apps.coe.pal.pal.repository.designer.web; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.actionsoft.apps.coe.pal.pal.repository.cache.CoeProcessLevelCorrelateCache; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.designer.dto.VersionListDTO; +import com.actionsoft.apps.coe.pal.pal.repository.designer.util.DesignerVersionUtil; +import com.actionsoft.apps.coe.pal.pal.repository.designer.vo.VersionListVO; +import com.actionsoft.apps.coe.pal.pal.repository.model.CoeProcessLevelCorrelateModel; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.bpms.bpmn.engine.cache.ProcessDefCache; +import com.actionsoft.bpms.bpmn.engine.model.def.ProcessDefinition; +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; + +/** + * 设计器流程版本对比 web层 + */ +public class CoeDesignerVersionWeb extends ActionWeb { + + private static final Logger LOGGER = LoggerFactory.getLogger(CoeDesignerVersionWeb.class); + + private final UserContext uc; + + public CoeDesignerVersionWeb(UserContext uc) { + super(uc); + this.uc = uc; + } + + /** + * 获取版本列表 + * + * @param versionListDTO 版本对比参数 + */ + public String getVersionList(VersionListDTO versionListDTO) { + ResponseObject ro = ResponseObject.newOkResponse(); + String id = versionListDTO.getId(); + List versionListVoList = new ArrayList<>(); + List historyVersionListVoList = new ArrayList<>(); + PALRepositoryModel palModel = PALRepositoryCache.getCache().get(id); + if (palModel != null) { + // 维护pal模型Id与bpm平台模型Id映射 + Map mapOfProcessDefId = new HashMap<>(); + List plVersionModels = PALRepositoryCache.getByVersionId(palModel.getVersionId()); + for (PALRepositoryModel model : plVersionModels) { + CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(model.getId()); + if (correlateModel == null) { + continue; + } + String processDefId = correlateModel.isCorrelate() ? correlateModel.getPlAwsId() : correlateModel.getSourceAwsId(); + if (UtilString.isEmpty(processDefId)) { + continue; + } + ProcessDefinition processDefinition = ProcessDefCache.getInstance().get(processDefId); + if (processDefinition == null) { + continue; + } + mapOfProcessDefId.put(model.getId(), processDefId); + VersionListVO versionListVo = DesignerVersionUtil.getVersionListVo(model, processDefinition, correlateModel.getCreateDate()); + versionListVoList.add(versionListVo); + } + if (!versionListVoList.isEmpty()) { + versionListVoList.sort(Comparator.comparing(VersionListVO::getCorrelateTime).reversed()); + // 历史版本 + historyVersionListVoList = DesignerVersionUtil.getVersionListVoList(id, mapOfProcessDefId); + } else { + versionListVoList = DesignerVersionUtil.getVersionListVoList(id, mapOfProcessDefId); + } + } + + ro.put("versionList", versionListVoList); + ro.put("historyList", historyVersionListVoList); + return ro.toString(); + } + +// /** +// * PAL版本管理-查询版本数据 +// * +// * @param wsId 资产库ID +// * @param teamId 小组ID +// * @param id 模型ID +// */ +// public String getPalProcessLevelVersionData(String wsId, String teamId, String id) { +// PALRepositoryModel plModel = PALRepositoryCache.getCache().get(id); +// if (plModel == null) { +// return ResponseObject.newErrResponse(I18nRes.findValue(CoEConstant.APP_ID, "文件不存在")).toString(); +// } +// ResponseObject ro = ResponseObject.newOkResponse(); +// ro.put("isCorrelatebpms", false); +// ro.put("hasHistory", false); +// ro.put("processDefId", ""); +// +// boolean isPalManage = CoeProcessLevelUtil.isPalManage(); +// boolean bpmSupportMinor = false; +// Set palVersionNoSet = new HashSet<>(); +// JSONArray array = new JSONArray(); +// JSONArray historyArray = new JSONArray(); +// boolean hasProcessControlPerm = true; +// List plVersionModels = PALRepositoryCache.getByVersionId(plModel.getVersionId()); +// for (PALRepositoryModel model : plVersionModels) { +// String plId = model.getId(); +// palVersionNoSet.add(VersionUtil.getVerAndVerD(model.getVersion(), model.getVersionD(), false)); +// CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(plId); +// if (correlateModel == null) { +// JSONObject obj = wrapperHistoryVersionObj(model); +// historyArray.add(obj); +// continue; +// } +// String processDefId = correlateModel.isCorrelate() ? correlateModel.getPlAwsId() : correlateModel.getSourceAwsId(); +// if (UtilString.isEmpty(processDefId)) { +// JSONObject obj = wrapperHistoryVersionObj(model); +// historyArray.add(obj); +// continue; +// } +// ProcessDefinition processDefinition = ProcessDefCache.getInstance().get(processDefId); +// if (processDefinition == null) { +// JSONObject obj = wrapperHistoryVersionObj(model); +// historyArray.add(obj); +// } else { +// // 判断bpm端是否支持小版本迭代 +// bpmSupportMinor = PALRepositoryQueryAPIManager.getInstance().isBpmSupportMinorVersion(processDefinition); +// JSONObject obj = wrapperCorrelateVersionObj(model, processDefinition, isPalManage); +// array.add(obj); +// ro.put("isCorrelatebpms", true); +// // 梳理到执行 流程是否重命名、新建版本 受到参数管控 +// hasProcessControlPerm = ProcessExecAPIManager.getInstance().hasProcessControlPerm(id); +// } +// } +// if (array.isEmpty()) { +// ro.put("tableData", historyArray); +// ro.put("hasProcessControlPerm", hasProcessControlPerm); +// return ro.toString(); +// } else { +// // 按时间逆序 +// array.sort(Comparator.comparingLong(o -> ((JSONObject) o).getLongValue("correlateTime")).reversed() +// // 按版本号排序 +// .thenComparing(o -> ((JSONObject) o).getString("palVersionNo"))); +// } +// ro.put("isBpmSupportMinor", bpmSupportMinor); +// ro.put("versionNoSet", palVersionNoSet); +// ro.put("hasHistory", !historyArray.isEmpty()); +// ro.put("historyData", historyArray); +// ro.put("tableData", array); +// ro.put("hasProcessControlPerm", hasProcessControlPerm); +// return ro.toString(); +// } +// +// /** +// * 组装历史版本数据 +// */ +// private JSONObject wrapperHistoryVersionObj(PALRepositoryModel plModel) { +// JSONObject history = new JSONObject(); +// history.put("id", plModel.getId()); +// // 历史版本无设计中状态 +// history.put("isUse", plModel.isUse()); +// history.put("isPublish", plModel.isPublish()); +// history.put("isStop", plModel.isStop()); +// history.put("isApproval", plModel.isApproval()); +// history.put("versionNo", VersionUtil.getVerAndVerD(plModel.getVersion(), plModel.getVersionD(), false)); +// history.put("name", plModel.getName()); +// history.put("createUser", SDK.getORGAPI().getUser(plModel.getCreateUser()) == null ? plModel.getCreateUser() : SDK.getORGAPI().getUser(plModel.getCreateUser()).getUserNameI18N()); +// history.put("createDate", UtilDate.dateFormat(plModel.getCreateDate())); +// // 历史版本状态均为未关联状态 +// history.put("bpmState", "未关联"); +// history.put("bpmStateCode", "未关联"); +// history.put("bpmStateColor", "#606266"); +// ValidateStatusEnum validateStatusEnum = ValidateStatusEnum.getInstance(plModel.getValidateStatus()); +// history.put("validateStatus", validateStatusEnum.getStatus()); +// history.put("validateStatusColor", validateStatusEnum.getStatusColor()); +// // 用于缩略图显示 +// String photoType = "image"; +// String photo = ""; +// DCContext smallPngDc = CoeDesignerDcUtil.getDefineDc(plModel.getWsId(), plModel.getId(), CoeDesignerConstant.FILE_SUFFIX_SMALL_PNG); +// if (!smallPngDc.existFile()) { +// // 生成缩略图 +// PALRepositoryQueryAPIManager.getInstance().saveImage(plModel.getId(), false, true); +// if (smallPngDc.existFile()) { +// photo = CoeDcUtil.dcContextToBase64(smallPngDc); +// } else { +// photoType = "icon"; +// photo = ""; +// } +// } +// history.put("photo", photo); +// history.put("photoType", photoType); +// history.put("hasProcessControlPerm", true); +// return history; +// +// } +// +// /** +// * 组装已关联版本数据 +// */ +// private JSONObject wrapperCorrelateVersionObj(PALRepositoryModel plModel, ProcessDefinition processDefinition, boolean isPalManage) { +// JSONObject obj = new JSONObject(); +// String versionStatus = ""; +// String color = "#4E7FF9"; +// int versionState = processDefinition.getVersionStatus(); +// if (versionState == ProcessDefinitionConst.VERSION_STATUS_CLOSED) { +// versionStatus = ProcessDefVersionUtil.getVersionName(ProcessDefinitionConst.VERSION_STATUS_CLOSED); +// color = "#D9001B"; +// } else if (versionState == ProcessDefinitionConst.VERSION_STATUS_DESIGN) { +// versionStatus = ProcessDefVersionUtil.getVersionName(ProcessDefinitionConst.VERSION_STATUS_DESIGN); +// } else if (versionState == ProcessDefinitionConst.VERSION_STATUS_RELEASE) { +// versionStatus = ProcessDefVersionUtil.getVersionName(ProcessDefinitionConst.VERSION_STATUS_RELEASE); +// color = "#1AA477"; +// } +// obj.put("versionNo", VersionUtil.getBpmVersionNo(processDefinition, false)); +// obj.put("palVersionNo", VersionUtil.getVerAndVerD(plModel.getVersion(), plModel.getVersionD(), false)); +// obj.put("name", plModel.getName()); +// obj.put("createUser", SDK.getORGAPI().getUser(processDefinition.getCreateUser()) == null ? processDefinition.getCreateUser() : SDK.getORGAPI().getUser(processDefinition.getCreateUser()).getUserNameI18N()); +// obj.put("createDate", UtilDate.dateFormat(processDefinition.getCreateTime())); +// obj.put("bpmState", I18nRes.findValue(AppsConst.SYS_APP_PLATFORM, versionStatus)); +// obj.put("bpmStateCode", versionStatus); +// obj.put("bpmStateColor", color); +// obj.put("isUse", plModel.isUse()); +// obj.put("isPublish", plModel.isPublish()); +// obj.put("isStop", plModel.isStop()); +// obj.put("isApproval", plModel.isApproval()); +// obj.put("id", plModel.getId()); +// obj.put("awsId", processDefinition.getId()); +// obj.put("isFirst", processDefinition.getId().equals(processDefinition.getVersionId())); +// obj.put("versionStatus", processDefinition.getVersionStatus()); +// ValidateStatusEnum validateStatusEnum = ValidateStatusEnum.getInstance(plModel.getValidateStatus()); +// obj.put("validateStatus", validateStatusEnum.getStatus()); +// obj.put("validateStatusColor", validateStatusEnum.getStatusColor()); +// obj.put("isCorrelate", false); +// obj.put("correlateTime", plModel.getCreateDate().getTime()); +// CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(plModel.getId()); +// if (isPalManage) { +// if (correlateModel != null && "show".equals(correlateModel.getExt1()) && correlateModel.getCorrelateType() == 1) { +// obj.put("isCorrelate", true); +// obj.put("correlateTime", correlateModel.getCreateDate().getTime()); +// } +// } +// return obj; +// } +// +// /** +// * 版本对比 +// * +// * @param versionCompareDTO 版本对比参数 +// */ +// public String designerVersionCompare(VersionCompareDTO versionCompareDTO) { +// Map macroLibraries = queryDesignerVersionCompareMap(versionCompareDTO); +// return HtmlPageTemplate.merge(CoEConstant.APP_ID, CoeDesignerConstant.DESIGNER_VERSION_COMPARE_PAGE, macroLibraries); +// } +// +// /** +// * 版本对比 +// * +// * @param versionCompareDTO 版本对比参数 +// */ +// public String designerVersionCompareParams(VersionCompareDTO versionCompareDTO) { +// // 获取对比版本的数据 +// Map macroLibraries = queryDesignerVersionCompareMap(versionCompareDTO); +// +// ResponseObject ro = ResponseObject.newOkResponse(); +// ro.setData(macroLibraries); +// return ro.toString(); +// } +// +// /** +// * 获取 版本对比 map参数 +// * +// * @param versionCompareDTO 版本对比参数 +// */ +// private Map queryDesignerVersionCompareMap(VersionCompareDTO versionCompareDTO) { +// // 获取对比版本的模型数据 +// PALRepositoryModel plModel = PALRepositoryCache.getCache().get(versionCompareDTO.getCompareVerId()); +// JSONObject versionData = DesignerVersionUtil.getVersionData(uc, versionCompareDTO.getCompareVerId(), versionCompareDTO.getTeamId()); +// if (versionData == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取待比对的版本数据失败")); +// } +// // 获取当前模型数据 +// JSONObject curData = DesignerVersionUtil.getVersionData(uc, versionCompareDTO.getCurId(), versionCompareDTO.getTeamId()); +// if (curData == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取当前使用的版本数据失败")); +// } +// return DesignerVersionUtil.queryDesignerVersionCompareMap(plModel.getWsId(), plModel.getMethodId(), plModel.getName(), versionCompareDTO.getCompareVerId(), versionData, versionCompareDTO.getCurId(), curData, false, false); +// } +// +// /** +// * 与BPM端流程对比 +// * +// * @param plId PAL 流程Id +// * @return 对比页面 +// */ +// public String compareBPMProcess(String plId) { +// CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(plId); +// if (correlateModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取流程关联信息失败")); +// } +// PALRepositoryModel plModel = PALRepositoryCache.getCache().get(plId); +// if (plModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取当前使用的版本数据失败")); +// } +// String awsId = correlateModel.getPlAwsId(); +// // 获取BPM流程对比数据 +// JSONObject curData = ProcessExecUtil.getBPMCompareData(awsId, plModel); +// // 获取PAL对比数据 +// JSONObject versionData = ProcessExecUtil.getPALCompareData(plModel); +// +// Map macroLibraries = DesignerVersionUtil.queryDesignerVersionCompareMap(plModel.getWsId(), plModel.getMethodId(), plModel.getName(), plId, versionData, plId, curData, true, false); +// return HtmlPageTemplate.merge(CoEConstant.APP_ID, CoeDesignerConstant.DESIGNER_VERSION_COMPARE_PAGE, macroLibraries); +// } +// +// /** +// * 与BPM端流程对比 +// * +// * @param plId PAL 流程Id +// * @return 对比页面 +// */ +// public String compareBPMProcessParams(String plId) { +// CoeProcessLevelCorrelateModel correlateModel = CoeProcessLevelCorrelateCache.getCache().get(plId); +// if (correlateModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取流程关联信息失败")); +// } +// PALRepositoryModel plModel = PALRepositoryCache.getCache().get(plId); +// if (plModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取当前使用的版本数据失败")); +// } +// String awsId = correlateModel.getPlAwsId(); +// // 获取BPM流程对比数据 +// JSONObject curData = ProcessExecUtil.getBPMCompareData(awsId, plModel); +// // 获取PAL对比数据 +// JSONObject versionData = ProcessExecUtil.getPALCompareData(plModel); +// +// Map macroLibraries = DesignerVersionUtil.queryDesignerVersionCompareMap(plModel.getWsId(), plModel.getMethodId(), plModel.getName(), plId, versionData, plId, curData, true, false); +// ResponseObject ro = ResponseObject.newOkResponse(); +// ro.setData(macroLibraries); +// return ro.toString(); +// } +// +// /** +// * 与BPM端流程对比页面 +// * +// * @param awsId BPM端流程Id +// * @return 对比页面 +// */ +// public String compareProcessToBPM(String awsId) { +// // 查询关联的PAL流程Id +// CoeProcessLevelCorrelateModel corrModel = CoeProcessLevelUtil.queryCorrelateModelyPlAwsId(awsId); +// if (corrModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取流程关联信息失败")); +// } +// String plId = corrModel.getPlId(); +// PALRepositoryModel plModel = PALRepositoryCache.getCache().get(plId); +// if (plModel == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取当前使用的版本数据失败")); +// } +// // 获取PAL对比数据 +// JSONObject curData = ProcessExecUtil.getPALCompareData(plModel); +// // 获取BPM流程对比数据 +// JSONObject versionData = ProcessExecUtil.getBPMCompareData(awsId, plModel); +// if (versionData == null) { +// throw new AWSException(I18nRes.findValue(CoEConstant.APP_ID, "获取流程定义信息失败")); +// } +// Map macroLibraries = DesignerVersionUtil.queryDesignerVersionCompareMap(plModel.getWsId(), plModel.getMethodId(), plModel.getName(), plId, versionData, plId, curData, true, true); +// return HtmlPageTemplate.merge(CoEConstant.APP_ID, CoeDesignerConstant.DESIGNER_VERSION_COMPARE_PAGE, macroLibraries); +// } +} diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/model/CoeProcessLevelCorrelateModel.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/model/CoeProcessLevelCorrelateModel.java index 01af783b..119fcdd7 100755 --- a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/model/CoeProcessLevelCorrelateModel.java +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/model/CoeProcessLevelCorrelateModel.java @@ -1,5 +1,7 @@ package com.actionsoft.apps.coe.pal.pal.repository.model; +import java.sql.Timestamp; + import com.actionsoft.bpms.commons.mvc.model.ModelBean; /** @@ -26,6 +28,10 @@ public class CoeProcessLevelCorrelateModel extends ModelBean{ public static final String FIELD_EXT2 = "EXT2";// add by sunlh public static final String FIELD_EXT3 = "EXT3";// add by sunlh public static final String FIELD_EXT4 = "EXT4";// add by sunlh + public static final String FIELD_SOURCEAWSID = "SOURCEAWSID"; // 来源AWS流程ID 版本迭代时,当前流程是由哪个流程新建版本而来。 + public static final String FIELD_CREATEDATE = "CREATEDATE"; + public static final String FIELD_CONTROLMODE = "CONTROLMODE"; // 流程管控模式 + private int controlMode; private String wsId; private String plId; @@ -39,6 +45,8 @@ public class CoeProcessLevelCorrelateModel extends ModelBean{ private String ext2 = ""; private String ext3 = ""; private String ext4; + private String sourceAwsId; + private Timestamp createDate; public CoeProcessLevelCorrelateModel() { this.wsId = ""; @@ -135,5 +143,25 @@ public class CoeProcessLevelCorrelateModel extends ModelBean{ public void setExt4(String ext4) { this.ext4 = ext4; } + public String getSourceAwsId() { + return sourceAwsId; + } + public void setSourceAwsId(String sourceAwsId) { + this.sourceAwsId = sourceAwsId; + } + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + public int getControlMode() { + return controlMode; + } + + public void setControlMode(int controlMode) { + this.controlMode = controlMode; + } } diff --git a/com.actionsoft.apps.coe.pal/template/page/pal.pl.repository.designer.htm b/com.actionsoft.apps.coe.pal/template/page/pal.pl.repository.designer.htm index 51514134..f7ec0dd6 100755 --- a/com.actionsoft.apps.coe.pal/template/page/pal.pl.repository.designer.htm +++ b/com.actionsoft.apps.coe.pal/template/page/pal.pl.repository.designer.htm @@ -5,12 +5,10 @@ <#fileName> - - - + + + + - + + + - + - + - + - + - - + + - - - + + + - - + + - - + + - + - - - - + + + + <#js> - - - + + + - + - + - + - + - + <#processlink_ete_js> <#batch-js> + + @@ -1081,12 +1121,13 @@ <#fileName>
-
+ + + <#versionNum> + +
@@ -1107,8 +1148,8 @@
文件封面:默认
- -
+ +
@@ -1236,15 +1277,14 @@
-
+
-
+
@@ -1273,7 +1313,7 @@
-
+