99import com .codingapi .springboot .flow .record .FlowRecord ;
1010import com .codingapi .springboot .flow .repository .FlowBindDataRepository ;
1111import com .codingapi .springboot .flow .repository .FlowOperatorRepository ;
12+ import com .codingapi .springboot .flow .user .IFlowOperator ;
1213import lombok .Getter ;
1314
1415import java .util .List ;
@@ -20,18 +21,23 @@ class FlowNodeService {
2021 private final FlowBindDataRepository flowBindDataRepository ;
2122
2223 private final FlowRecordService2 flowRecordService2 ;
24+ private final String processId ;
2325
2426 private final FlowRecord flowRecord ;
2527 private final FlowWork flowWork ;
2628 private final FlowNode flowNode ;
2729 private final IBindData bindData ;
2830 private final Opinion opinion ;
31+ private final IFlowOperator currentOperator ;
2932
3033 // load Object
3134 @ Getter
3235 private FlowSourceDirection flowSourceDirection ;
3336 @ Getter
3437 private List <FlowRecord > childrenRecords ;
38+ @ Getter
39+ private List <FlowRecord > historyRecords ;
40+
3541 @ Getter
3642 private BindDataSnapshot snapshot ;
3743
@@ -47,35 +53,121 @@ public FlowNodeService(FlowOperatorRepository flowOperatorRepository,
4753 this .flowRecordService2 = flowRecordService2 ;
4854 this .bindData = bindData ;
4955 this .opinion = opinion ;
56+ this .currentOperator = flowRecordService2 .getCurrentOperator ();
5057
5158 this .flowRecord = flowRecordService2 .getFlowRecord ();
5259 this .flowWork = flowRecordService2 .getFlowWork ();
5360 this .flowNode = flowRecordService2 .getFlowNode ();
5461
62+ this .processId = flowRecord .getProcessId ();
63+
5564 }
5665
5766
58- public void loadFlowSourceDirection (){
59- if (opinion .isSuccess ()){
67+ /**
68+ * 解析当前的审批方向
69+ */
70+ public void loadFlowSourceDirection () {
71+ if (opinion .isSuccess ()) {
6072 flowSourceDirection = FlowSourceDirection .PASS ;
6173 }
62- if (opinion .isReject ()){
74+ if (opinion .isReject ()) {
6375 flowSourceDirection = FlowSourceDirection .REJECT ;
6476 }
6577 }
6678
79+ /**
80+ * 提交流程记录
81+ */
82+ public void submitFlowRecord () {
83+ flowRecord .submitRecord (currentOperator , snapshot , opinion , flowSourceDirection );
84+ flowRecordService2 .flowRecordRepository .update (flowRecord );
85+ }
86+
6787
6888 /**
69- * 保存流程表单数据
89+ * 重新加载审批方向
90+ * 根据会签结果判断是否需要重新设置审批方向
91+ */
92+ public void reloadFlowSourceDirection () {
93+ if (flowNode .isSign ()) {
94+ boolean allPass = historyRecords .stream ().filter (item -> !item .isTransfer ()).allMatch (FlowRecord ::isPass );
95+ if (!allPass ) {
96+ flowSourceDirection = FlowSourceDirection .REJECT ;
97+ }
98+ }
99+ }
100+
101+
102+ /**
103+ * 判断当前流程节点是否已经完成,是否可以继续流转
104+ */
105+ public boolean hasCurrentFlowNodeIsDone () {
106+ // 会签处理流程
107+ if (flowNode .isSign ()) {
108+ // 会签下所有人尚未提交时,不执行下一节点
109+ boolean allDone = historyRecords .stream ().filter (item -> !item .isTransfer ()).allMatch (FlowRecord ::isDone );
110+ if (!allDone ) {
111+ // 流程尚未审批结束直接退出
112+ return true ;
113+ }
114+ }
115+ return false ;
116+ }
117+
118+ /**
119+ * 检测当前流程是否已经完成
120+ * 即流程已经进行到了最终节点且审批意见为同意
121+ */
122+ public boolean hasCurrentFlowIsFinish () {
123+ if (flowSourceDirection == FlowSourceDirection .PASS && flowNode .isOverNode ()) {
124+ return true ;
125+ }
126+ return false ;
127+ }
128+
129+
130+ /**
131+ * 完成所有流程
132+ */
133+ public void finishFlow () {
134+ flowRecord .finish ();
135+ flowRecord .submitRecord (currentOperator , snapshot , opinion , flowSourceDirection );
136+ flowRecordService2 .flowRecordRepository .update (flowRecord );
137+ flowRecordService2 .flowRecordRepository .finishFlowRecordByProcessId (processId );
138+ }
139+
140+
141+ /**
142+ * 保存流程表单数据
70143 */
71144 public void updateSnapshot () {
72145 BindDataSnapshot snapshot = new BindDataSnapshot (flowRecord .getSnapshotId (), bindData );
73146 flowBindDataRepository .update (snapshot );
74147 }
75148
76149
150+ /**
151+ * 若非会签模式,则再第一人提交以后其他的人的流程记录将自动通过提交
152+ */
153+ public void autoSubmitUnSignReload () {
154+ // 非会签处理流程
155+ if (flowNode .isUnSign ()) {
156+ // 非会签下,默认其他将所有人未提交的流程,都自动提交然后再执行下一节点
157+ for (FlowRecord record : historyRecords ) {
158+ if (record .isTodo () && record .getId () != flowRecord .getId ()) {
159+ record .autoPass (currentOperator , snapshot );
160+ flowRecordService2 .flowRecordRepository .update (flowRecord );
161+ }
162+ }
163+ }
164+ }
165+
77166
78- public void loadSnapshot (){
167+ /**
168+ * 加载快照数据
169+ */
170+ public void loadOrCreateSnapshot () {
79171 // 保存绑定数据
80172 if (flowNode .isEditable ()) {
81173 snapshot = new BindDataSnapshot (bindData );
@@ -87,31 +179,40 @@ public void loadSnapshot(){
87179
88180
89181 /**
90- * 更新流程记录
182+ * 加载同级的审批记录
183+ * 即加载当前节点流程下产生的所有记录数据
184+ */
185+ public void loadHistoryRecords () {
186+ historyRecords = flowRecordService2 .flowRecordRepository .findFlowRecordByPreId (flowRecord .getPreId ());
187+ }
188+
189+
190+ /**
191+ * 更新流程记录
91192 */
92193 public void updateFlowRecord () {
93194 flowRecord .setOpinion (opinion );
94195 flowRecordService2 .flowRecordRepository .update (flowRecord );
95196 }
96197
97198
98- public void loadChildrenRecords (){
199+ public void loadChildrenRecords () {
99200 childrenRecords = flowRecordService2 .flowRecordRepository .findFlowRecordByPreId (flowRecord .getId ());
100201 }
101202
102203
103- public void verifyChildrenRecordsIsEmpty (){
204+ public void verifyChildrenRecordsIsEmpty () {
104205 if (!childrenRecords .isEmpty ()) {
105206 throw new IllegalArgumentException ("flow node is done" );
106207 }
107208 }
108209
109210
110211 public void verifyFlowSourceDirection () {
111- if (flowSourceDirection == null ){
212+ if (flowSourceDirection == null ) {
112213 throw new IllegalArgumentException ("flow source direction is null" );
113214 }
114- if (flowNode .isStartNode () && flowSourceDirection == FlowSourceDirection .REJECT ){
215+ if (flowNode .isStartNode () && flowSourceDirection == FlowSourceDirection .REJECT ) {
115216 throw new IllegalArgumentException ("flow node is start node" );
116217 }
117218 }
0 commit comments