Index: forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManagerImpl.java =================================================================== diff -u -r21900 -r21911 --- forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManagerImpl.java (.../NodeDefinitionManagerImpl.java) (revision 21900) +++ forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManagerImpl.java (.../NodeDefinitionManagerImpl.java) (revision 21911) @@ -1,56 +1,54 @@ package com.forgon.workflow.service; -import java.sql.ResultSet; -import java.sql.SQLException; - +import java.util.List; +import org.apache.commons.collections4.CollectionUtils; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; -import com.forgon.tools.string.StringTools; import com.forgon.workflow.model.NodeDefinition; import com.forgon.workflow.model.WorkFlow; public class NodeDefinitionManagerImpl extends BasePoManagerImpl implements NodeDefinitionManager { - + @Override - public NodeDefinition getNextNodeDefinition(String formType, Long formId) { - NodeDefinition nextNodeDefinition = null; - if (StringTools.isNotBlank(formType) && DatabaseUtil.isPoIdValid(formId)) { - WorkFlow workFlow = (WorkFlow) objectDao.getBySql(WorkFlow.class.getSimpleName(), String.format("where po.invoicePlanType='%s' ", formType)); - if (workFlow != null) { - String sequenceNumberSql = ""; - Long currentNodeDefinitionId = getCurrentNodeDefinitionIdByFormId(formId); - if (DatabaseUtil.isPoIdValid(currentNodeDefinitionId)) { - sequenceNumberSql = String.format("(select nd.sequenceNumber from NodeDefinition nd where nd.id=%s)", currentNodeDefinitionId); - } else { - sequenceNumberSql = "0"; - } - nextNodeDefinition = (NodeDefinition) objectDao.getBySql(NodeDefinition.class.getSimpleName(), - String.format("where po.workFlow.id=%s and po.sequenceNumber > %s order by po.sequenceNumber", workFlow.getId(), sequenceNumberSql)); + public NodeDefinition getFirstNodeDefinition(String formType) { + NodeDefinition firstNodeDefinition = null; + WorkFlow workFlow = (WorkFlow) objectDao.getBySql(WorkFlow.class.getSimpleName(), String.format("where po.invoicePlanType='%s' ", formType)); + if (workFlow != null) { + List nodeDefinitions = workFlow.getNodeDefinitions(objectDao); + if (CollectionUtils.isNotEmpty(nodeDefinitions)) { + firstNodeDefinition = nodeDefinitions.get(0); } - } else { - throw new RuntimeException("参数异常!"); } - return nextNodeDefinition; + return firstNodeDefinition; } + + @Override + public NodeDefinition getNextNodeDefinition(Long nodeDefinitionId) { + return getSpecifyNodeDefinition(nodeDefinitionId, true); + } + @Override + public NodeDefinition getLastNodeDefinition(Long nodeDefinitionId) { + return getSpecifyNodeDefinition(nodeDefinitionId, false); + } + /** - * 根据申请单id获取此申请单当前的审批节点id - * @param formId + * 通过当前节点id获取上一个或者下一个审批节点对象. + * @param nodeDefinitionId 当前节点id + * @param next 为true则获取下一个,为false则获取上一个 * @return */ - private Long getCurrentNodeDefinitionIdByFormId(Long formId) { - ResultSet result = objectDao.executeSql(String.format("select ip.currentNodeDefinitionId from InvoicePlan ip where ip.id=%s", formId)); - try { - while(result.next()){ - return result.getLong("currentNodeDefinitionId"); - } - } catch (SQLException e) { - e.printStackTrace(); - }finally { - DatabaseUtil.closeResultSetAndStatement(result); + private NodeDefinition getSpecifyNodeDefinition(Long nodeDefinitionId, boolean next) { + NodeDefinition nodeDefinition = null; + if (DatabaseUtil.isPoIdValid(nodeDefinitionId)) { + String sequenceNumberSql = String.format(" and po.sequenceNumber %s (select nd.sequenceNumber from NodeDefinition nd where nd.id=%s)", + (next ? ">" : "<"), nodeDefinitionId); + String whereSql = String.format("where po.workFlow.id=(select nd.workFlow.id from NodeDefinition nd where nd.id=%s) %s order by po.sequenceNumber", + nodeDefinitionId, sequenceNumberSql); + nodeDefinition = (NodeDefinition) objectDao.getBySql(NodeDefinition.class.getSimpleName(), whereSql); } - throw new RuntimeException(String.format("id为%s的申请单不存在", formId)); + return nodeDefinition; } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java =================================================================== diff -u -r21908 -r21911 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java (.../ExpensiveGoodsApplicationManagerImpl.java) (revision 21908) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/expensivegoodsapplication/service/ExpensiveGoodsApplicationManagerImpl.java (.../ExpensiveGoodsApplicationManagerImpl.java) (revision 21911) @@ -100,12 +100,12 @@ //如果是提交操作立即启动审批流程 if (commit && (StringTools.isBlank(expensiveGoodsApplication.getProcessStatus()) || expensiveGoodsApplication.getProcessStatus().equals(ExpensiveGoodsApplication.PROCESSSTATUS_NOT_STARTED))) { - NodeDefinition nextNodeDefinition = nodeDefinitionManager.getNextNodeDefinition(InvoicePlan.TYPE_EXPENSIVEGOODS_FORM, expensiveGoodsApplication.getId()); - expensiveGoodsApplication.setCurrentNodeDefinitionId(nextNodeDefinition.getId()); - expensiveGoodsApplication.setCurrentNodeDefinitionName(nextNodeDefinition.getName()); + NodeDefinition firstNodeDefinition = nodeDefinitionManager.getFirstNodeDefinition(InvoicePlan.TYPE_EXPENSIVEGOODS_FORM); + expensiveGoodsApplication.setCurrentNodeDefinitionId(firstNodeDefinition.getId()); + expensiveGoodsApplication.setCurrentNodeDefinitionName(firstNodeDefinition.getName()); expensiveGoodsApplication.setProcessStatus(InvoicePlan.PROCESSSTATUS_START_PROCESS); objectDao.saveOrUpdate(expensiveGoodsApplication); - createWorkFlowApprovalTask(expensiveGoodsApplication, nextNodeDefinition); + createWorkFlowApprovalTask(expensiveGoodsApplication, firstNodeDefinition); } } else { throw new RuntimeException("申请项不能为空!"); @@ -189,7 +189,7 @@ setTousseItem(expensiveGoodsApplication, items); //2、设置下一个审批节点的信息 - NodeDefinition nextNodeDefinition = nodeDefinitionManager.getNextNodeDefinition(InvoicePlan.TYPE_EXPENSIVEGOODS_FORM, expensiveGoodsApplication.getId()); + NodeDefinition nextNodeDefinition = nodeDefinitionManager.getNextNodeDefinition(expensiveGoodsApplication.getCurrentNodeDefinitionId()); if (nextNodeDefinition != null) { expensiveGoodsApplication.setCurrentNodeDefinitionId(nextNodeDefinition.getId()); expensiveGoodsApplication.setCurrentNodeDefinitionName(nextNodeDefinition.getName()); Index: forgon-core/src/main/java/com/forgon/workflow/model/WorkFlow.java =================================================================== diff -u -r21786 -r21911 --- forgon-core/src/main/java/com/forgon/workflow/model/WorkFlow.java (.../WorkFlow.java) (revision 21786) +++ forgon-core/src/main/java/com/forgon/workflow/model/WorkFlow.java (.../WorkFlow.java) (revision 21911) @@ -1,5 +1,6 @@ package com.forgon.workflow.model; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -10,13 +11,16 @@ import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; +import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; /** * 流程定义 @@ -131,7 +135,20 @@ this.lastUpdateTime = lastUpdateTime; } - + /** + * 获取此流程的所有节点对象(按sequenceNumber属性正序排列). + * @param objectDao + * @return + */ + @Transient + public List getNodeDefinitions(ObjectDao objectDao) { + List nodeDefinitions = new ArrayList(); + if (DatabaseUtil.isPoIdValid(id)) { + nodeDefinitions = objectDao.findBySql(NodeDefinition.class.getSimpleName(), + String.format("where po.workFlow.id=%s order by po.sequenceNumber", id)); + } + return nodeDefinitions; + } } Index: forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManager.java =================================================================== diff -u -r21900 -r21911 --- forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManager.java (.../NodeDefinitionManager.java) (revision 21900) +++ forgon-core/src/main/java/com/forgon/workflow/service/NodeDefinitionManager.java (.../NodeDefinitionManager.java) (revision 21911) @@ -12,11 +12,24 @@ public interface NodeDefinitionManager extends BasePoManager { /** - * 获取申请单下一个审批节点对象(如果返回空则说明审批流程已经结束了). + * 获取某种单类型的第一个审批节点对对象. * @param formType 申请单类型 - * @param formId 申请单id * @return */ - public NodeDefinition getNextNodeDefinition(String formType, Long formId); + public NodeDefinition getFirstNodeDefinition(String formType); + /** + * 通过当前节点id获取下一个审批节点对象(如果返回空则说明当前节点已经是最后一个,即审批流程已经结束). + * @param nodeDefinitionId 当前节点id + * @return + */ + public NodeDefinition getNextNodeDefinition(Long nodeDefinitionId); + + /** + * 通过当前节点id获取上一个审批节点对象(如果返回空则说明当前节点是第一个节点). + * @param nodeDefinitionId 当前节点id + * @return + */ + public NodeDefinition getLastNodeDefinition(Long nodeDefinitionId); + }