# 业务关系和简单场景

# 流程是和业务组的关系
COL_SUMMARY表记录整个协同的数据,主要关注processId和caseId
CTP_AFFAIR事项表,每条协同数据,有多少人就有多少数据(正常情况下,除了撤销,回退等操作产生的数据),主要关注sub_object_id(WF_WORKITEM_RUN表的主键ID),activity_id(节点ID),processId以及caseId

1653287533498.png

# 简单的闭环流程(提交场景)

1653287561097.png

# 流程不满足的分支节点怎么屏蔽
分支条件解析满足的接口:ActionRunner.getConditionValue
分支条件计算:WorkflowFunctions.java
提交的时候日志信息:
14:45:30 [H-92]  INFO: ProcessEngineImpl: - chen,W_I:=2755396907718623273; W_N:=; 	W_C:={"matchRequestToken":"7373653295765867504","condition":[{"nodeId":"163274129988710","isDelete":"false"},{"nodeId":"163274129988711","isDelete":"true"}]}; W_M:=; readyObject:=null;NodeConditionChangeInfoMap:{}

重要信息:"condition":[{"nodeId":"163274129988710","isDelete":"false"},	{"nodeId":"163274129988711","isDelete":"true"}]
isDelete等于true表示当前节点所在分支不满足条件

//将节点是否需要激活放入context
WorkflowUtil.putNodeConditionToContext(context, activity, "isDelete", isDelete)
//从context中取出该节点的状态
WorkflowApiUtil.getNodeConditionFromContext(context,activittty,"isDelete");

实际流转,将能流转到的节点和不能流转到的节点信息放入WF_CASE_RUN表的case_content字段的	wf_node_condition_change_key属性见下面的数据:
{
"datamap":{
    "appName":"collaboration",
    "wf_node_condition_change_key":{
        "16327412955304":{
            "isDelete":"false"
        },
        "163274129988710":{
            "isDelete":"false"
        },
        "163274129988711":{
            "isDelete":"true"
        },
        "16327412998866":{
            "isDelete":"false"
        },
        "16327412998867":{
            "isDelete":"false"
        }
    }
}
}

前端查看流程图的时候会从wf_case_run中取出节点信息,动态的设置节点的状态:BPMSeeyonPolicy.setIsDelete(String isDelete);

public Map<String, String> getConditionMapFromCase(BPMCase theCase, String nodeId) {
    Object result = theCase == null ? null : theCase.getData(WorkFlowConstants.WF_NODE_CONDITION_CHANGE_KEY);
    Map<String, String> nodeData = result == null ? null : ((Map<String, Map<String, String>>) result).get(nodeId);
    return nodeData == null ? new HashMap<>() : nodeData;
}

1653287656465.png

# 流程图添加删除节点
原理:BPMProcess已经封装好了节点和线之间的关系
添加节点:串行添加 在A节点后面添加B节点  s----A-b-----c---e
process.addChild(BNode); 向流程中添加节点
BPMTransition transition = new BPMTransition(ANode,BNode);//建立A节点和B节点之间的线
process.addLink(transition);//将线加入流程
BPMTransition aDowLink = ANode.getDownTransitions().get(0);//获取A节点原来的down线
BNode.addDownTransition(aDowLink);//B节点和down线建立联系
aDowLink.setFrom(BNode);//线和B节点建立联系

添加并行节点:split和join节点总是成对出现,需要建立两者之间的关系
创建split节点:BPMAndRouter split= new BPMAndRouter(splitId, "split");
创建join节点:BPMAndRouter join = new BPMAndRouter(joinId,"join");
split.setStartAnd(true);
join.setStartAnd(false);
split.setParallelismNodeId(relevancyId);
join.setParallelismNodeId(relevancyId);
编撰人:chenxd、admin