11package com .codingapi .flow .pojo .response ;
22
3- import com .codingapi .flow .node .IDisplayNode ;
43import com .codingapi .flow .node .IFlowNode ;
54import com .codingapi .flow .operator .IFlowOperator ;
65import com .codingapi .flow .record .FlowRecord ;
6+ import com .codingapi .flow .strategy .node .MultiOperatorAuditStrategy ;
7+ import com .codingapi .flow .strategy .node .OperatorSelectType ;
78import com .codingapi .flow .workflow .Workflow ;
89import lombok .Data ;
910import lombok .NoArgsConstructor ;
1011
1112import java .util .ArrayList ;
1213import java .util .List ;
13- import java .util .Objects ;
1414
1515/**
1616 * 流程审批节点
1919@ NoArgsConstructor
2020public class ProcessNode {
2121
22- public final static int STATE_HISTORY = -1 ;
23- public final static int STATE_CURRENT = 0 ;
24- public final static int STATE_NEXT = 1 ;
22+ /**
23+ * 记录id
24+ */
25+ private String id ;
2526
2627 /**
2728 * 节点名称
@@ -39,87 +40,147 @@ public class ProcessNode {
3940 /**
4041 * 是否呈现节点
4142 */
42- private boolean display ;
43+ private MultiOperatorAuditStrategy . Type approveStrategy ;
4344
4445 /**
45- * 记录状态
46- * -1 为历史状态
47- * 0 为当前状态
48- * 1 为后续状态
46+ * 审批状态
4947 */
50- private int state ;
48+ private ApproveState approveState ;
5149
50+ /**
51+ * 人员模式
52+ */
53+ private OperatorStrategy operatorStrategy ;
5254
5355 /**
5456 * 节点审批人
5557 */
5658 private List <FlowOperatorBody > operators ;
5759
58-
5960 public boolean isHistory () {
60- return this .state == STATE_HISTORY ;
61+ return this .approveState == ApproveState . PASS || this . approveState == ApproveState . ERROR ;
6162 }
6263
63- private ProcessNode (IFlowNode flowNode ) {
64- this .state = STATE_HISTORY ;
65- this .operators = new ArrayList <>();
66- this .nodeType = flowNode .getType ();
67- this .nodeName = flowNode .getName ();
68- this .nodeId = flowNode .getId ();
64+ public void addFlowRecordOperator (FlowRecord record ) {
65+ if (this .operators == null ) {
66+ this .operators = new ArrayList <>();
67+ }
68+ this .operators .add (new FlowOperatorBody (record ));
6969 }
7070
71- public static ProcessNode createEndNode (Workflow workflow ) {
72- IFlowNode endNode = workflow .getEndNode ();
73- return new ProcessNode (endNode );
71+ public enum OperatorStrategy {
72+ /**
73+ * 指定人员
74+ */
75+ OPERATOR_LIST ,
76+ /**
77+ * 发起人设定:流程创建时由发起人为该节点指定操作人
78+ */
79+ INITIATOR_SELECT ,
80+
81+ /**
82+ * 审批人设定:当前节点审批时,审批人为下游该节点指定操作人
83+ */
84+ APPROVER_SELECT
7485 }
7586
76- public ProcessNode ( FlowRecord flowRecord , Workflow workflow ) {
77- this . nodeId = flowRecord . getNodeId ();
78- IFlowNode flowNode = workflow . getFlowNode ( this . nodeId );
79- this . nodeName = flowNode . getName ();
80- this . nodeType = flowNode . getType ();
81- this . operators = new ArrayList <>();
82- this . display = true ;
83- this . state = STATE_HISTORY ;
84- this . operators . add ( new FlowOperatorBody ( flowRecord ));
87+ public enum ApproveState {
88+ // 审批通过
89+ PASS ,
90+ // 审批中
91+ PROCESSING ,
92+ // 未审批
93+ PENDING ,
94+ // 审批错误
95+ ERROR
8596 }
8697
98+ public void resetApproveState (FlowRecord flowRecord ) {
99+ if (flowRecord .isDone ()) {
100+ this .approveState = ApproveState .PASS ;
101+ }
87102
88- public ProcessNode (IFlowNode flowNode , List <IFlowOperator > operators ) {
89- this .nodeId = flowNode .getId ();
90- this .nodeName = flowNode .getName ();
91- this .nodeType = flowNode .getType ();
92- this .operators = operators .stream ().map (FlowOperatorBody ::new ).toList ();
93- this .state = STATE_NEXT ;
94- this .display = flowNode instanceof IDisplayNode ;
95- }
103+ if (flowRecord .isError ()) {
104+ this .approveState = ApproveState .ERROR ;
105+ }
96106
107+ if (flowRecord .isHidden ()) {
108+ this .approveState = ApproveState .PROCESSING ;
109+ }
97110
98- public boolean isFlowNode (IFlowNode currentNode ) {
99- return this .nodeId .equals (currentNode .getId ());
111+ if (flowRecord .isTodo ()) {
112+ this .approveState = ApproveState .PROCESSING ;
113+ }
100114 }
101115
102- public void setCurrentState () {
103- this .state = STATE_CURRENT ;
116+ private void resetApproveStrategy (IFlowNode flowNode ) {
117+ MultiOperatorAuditStrategy .Type type = flowNode .strategyManager ().getMultiOperatorAuditStrategyType ();
118+ if (type != null ) {
119+ this .setApproveStrategy (type );
120+ } else {
121+ this .setApproveStrategy (MultiOperatorAuditStrategy .Type .SEQUENCE );
122+ }
104123 }
105124
106125
107- @ Override
108- public boolean equals (Object target ) {
109- if (target instanceof ProcessNode ) {
110- ProcessNode targetNode = (ProcessNode ) target ;
111- return targetNode .getNodeId ().equals (this .getNodeId ());
112- }
113- return super .equals (target );
126+ public static ProcessNode createByRecord (FlowRecord flowRecord , Workflow workflow ) {
127+ IFlowNode flowNode = workflow .getFlowNode (flowRecord .getNodeId ());
128+
129+ ProcessNode processNode = new ProcessNode ();
130+ processNode .setId (String .valueOf (flowRecord .getId ()));
131+ processNode .setNodeId (flowNode .getId ());
132+ processNode .setNodeName (flowNode .getName ());
133+ processNode .setNodeType (flowNode .getType ());
134+ processNode .resetApproveState (flowRecord );
135+ processNode .resetApproveStrategy (flowNode );
136+ processNode .setOperatorStrategy (OperatorStrategy .OPERATOR_LIST );
137+
138+ List <FlowOperatorBody > flowOperatorBodyList = new ArrayList <>();
139+ flowOperatorBodyList .add (new FlowOperatorBody (flowRecord ));
140+ processNode .setOperators (flowOperatorBodyList );
141+
142+ return processNode ;
114143 }
115144
116- @ Override
117- public int hashCode () {
118- return Objects .hash (nodeId );
145+
146+ public static ProcessNode createByEndNode (IFlowNode flowNode , boolean finish ) {
147+ ProcessNode processNode = new ProcessNode ();
148+ processNode .setId (flowNode .getId ());
149+ processNode .setNodeId (flowNode .getId ());
150+ processNode .setNodeName (flowNode .getName ());
151+ processNode .setNodeType (flowNode .getType ());
152+ processNode .setApproveState (finish ? ApproveState .PASS : ApproveState .PENDING );
153+ processNode .setApproveStrategy (MultiOperatorAuditStrategy .Type .SEQUENCE );
154+ processNode .setOperatorStrategy (OperatorStrategy .OPERATOR_LIST );
155+ return processNode ;
119156 }
120157
121- public void addOperator (FlowOperatorBody operator ) {
122- this .operators .add (operator );
158+ public static ProcessNode createByNode (IFlowNode flowNode , OperatorSelectType operatorSelectType , List <IFlowOperator > operators ) {
159+ ProcessNode processNode = new ProcessNode ();
160+ processNode .setId (flowNode .getId ());
161+ processNode .setNodeId (flowNode .getId ());
162+ processNode .setNodeName (flowNode .getName ());
163+ processNode .setNodeType (flowNode .getType ());
164+ processNode .setApproveState (ApproveState .PENDING );
165+ processNode .resetApproveStrategy (flowNode );
166+
167+ if (operators != null && !operators .isEmpty ()) {
168+ List <FlowOperatorBody > flowOperatorBodyList = new ArrayList <>();
169+ for (IFlowOperator operator : operators ) {
170+ flowOperatorBodyList .add (new FlowOperatorBody (operator ));
171+ }
172+ processNode .setOperators (flowOperatorBodyList );
173+ processNode .setOperatorStrategy (OperatorStrategy .OPERATOR_LIST );
174+ } else {
175+ if (operatorSelectType == OperatorSelectType .APPROVER_SELECT ) {
176+ processNode .setOperatorStrategy (OperatorStrategy .APPROVER_SELECT );
177+ }
178+ if (operatorSelectType == OperatorSelectType .INITIATOR_SELECT ) {
179+ processNode .setOperatorStrategy (OperatorStrategy .INITIATOR_SELECT );
180+ }
181+ }
182+
183+ return processNode ;
123184 }
124185
125186 /**
@@ -139,6 +200,11 @@ public static class FlowOperatorBody {
139200 */
140201 private String signKey ;
141202
203+ /**
204+ * 审批类型
205+ */
206+ private String actionType ;
207+
142208 /**
143209 * 审批动作
144210 */
0 commit comments