001/* 002 * Copyright 2024-2025, Warm-Flow (290631660@qq.com). 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.dromara.warm.flow.core.service.impl; 017 018import org.dromara.warm.flow.core.FlowFactory; 019import org.dromara.warm.flow.core.dao.FlowHisTaskDao; 020import org.dromara.warm.flow.core.dto.FlowParams; 021import org.dromara.warm.flow.core.entity.HisTask; 022import org.dromara.warm.flow.core.entity.Node; 023import org.dromara.warm.flow.core.entity.Task; 024import org.dromara.warm.flow.core.entity.User; 025import org.dromara.warm.flow.core.enums.CooperateType; 026import org.dromara.warm.flow.core.enums.FlowStatus; 027import org.dromara.warm.flow.core.enums.NodeType; 028import org.dromara.warm.flow.core.enums.SkipType; 029import org.dromara.warm.flow.core.orm.service.impl.WarmServiceImpl; 030import org.dromara.warm.flow.core.service.HisTaskService; 031import org.dromara.warm.flow.core.utils.*; 032 033import java.math.BigDecimal; 034import java.util.ArrayList; 035import java.util.List; 036 037/** 038 * 历史任务记录Service业务层处理 039 * 040 * @author warm 041 * @since 2023-03-29 042 */ 043public class HisTaskServiceImpl extends WarmServiceImpl<FlowHisTaskDao<HisTask>, HisTask> implements HisTaskService { 044 045 @Override 046 public HisTaskService setDao(FlowHisTaskDao<HisTask> warmDao) { 047 this.warmDao = warmDao; 048 return this; 049 } 050 051 @Override 052 public List<HisTask> listByTaskIdAndCooperateTypes(Long taskId, Integer... cooperateTypes) { 053 if (ArrayUtil.isEmpty(cooperateTypes)) { 054 return list(FlowFactory.newHisTask().setTaskId(taskId)); 055 } 056 if (cooperateTypes.length == 1) { 057 return list(FlowFactory.newHisTask().setTaskId(taskId).setCooperateType(cooperateTypes[0])); 058 } 059 return getDao().listByTaskIdAndCooperateTypes(taskId, cooperateTypes); 060 } 061 062 @Override 063 public List<HisTask> getNoReject(Long instanceId) { 064 return getDao().getNoReject(instanceId); 065 } 066 067 @Override 068 public HisTask getNoReject(String nodeCode, String targetNodeCode, List<HisTask> hisTasks) { 069 List<HisTask> hisTaskList = StreamUtils.filter(hisTasks, hisTask -> 070 (StringUtils.isEmpty(nodeCode) || nodeCode.equals(hisTask.getNodeCode())) 071 && (StringUtils.isEmpty(targetNodeCode) || targetNodeCode.equals(hisTask.getTargetNodeCode()))); 072 return CollUtil.getOne(hisTaskList); 073 } 074 075 public List<HisTask> beenProcessed(Long instanceId, String handler) { 076 List<HisTask> list = list(FlowFactory.newHisTask().setInstanceId(instanceId).setApprover(handler)); 077 return null; 078 } 079 080 @Override 081 public List<HisTask> getByInsAndNodeCodes(Long instanceId, List<String> nodeCodes) { 082 return getDao().getByInsAndNodeCodes(instanceId, nodeCodes); 083 } 084 085 @Override 086 public boolean deleteByInsIds(List<Long> instanceIds) { 087 return SqlHelper.retBool(getDao().deleteByInsIds(instanceIds)); 088 } 089 090 @Override 091 public List<HisTask> setSkipInsHis(Task task, List<Node> nextNodes, FlowParams flowParams) { 092 List<HisTask> hisTasks = new ArrayList<>(); 093 String flowStatus = getFlowStatus(flowParams); 094 for (Node nextNode : nextNodes) { 095 HisTask hisTask = FlowFactory.newHisTask() 096 .setTaskId(task.getId()) 097 .setInstanceId(task.getInstanceId()) 098 .setCooperateType(ObjectUtil.isNotNull(flowParams.getCooperateType()) 099 ? flowParams.getCooperateType() : CooperateType.APPROVAL.getKey()) 100 .setNodeCode(task.getNodeCode()) 101 .setNodeName(task.getNodeName()) 102 .setNodeType(task.getNodeType()) 103 .setDefinitionId(task.getDefinitionId()) 104 .setTargetNodeCode(nextNode.getNodeCode()) 105 .setTargetNodeName(nextNode.getNodeName()) 106 .setApprover(flowParams.getHandler()) 107 .setSkipType(NodeType.isStart(task.getNodeType()) ? SkipType.PASS.getKey() : flowParams.getSkipType()) 108 .setFlowStatus(StringUtils.isNotEmpty(flowStatus) 109 ? flowStatus : SkipType.isReject(flowParams.getSkipType()) 110 ? FlowStatus.REJECT.getKey() : FlowStatus.PASS.getKey()) 111 .setFormCustom(task.getFormCustom()) 112 .setFormPath(task.getFormPath()) 113 .setMessage(flowParams.getMessage()) 114 //业务详情添加至历史记录 115 .setExt(flowParams.getHisTaskExt()) 116 .setCreateTime(task.getCreateTime()); 117 FlowFactory.dataFillHandler().idFill(hisTask); 118 hisTasks.add(hisTask); 119 } 120 return hisTasks; 121 } 122 123 @Override 124 public List<HisTask> setCooperateHis(Task task, Node node, FlowParams flowParams 125 , List<String> collaborators) { 126 List<HisTask> hisTasks = new ArrayList<>(); 127 String flowStatus = getFlowStatus(flowParams); 128 for (String collaborator : collaborators) { 129 HisTask hisTask = FlowFactory.newHisTask() 130 .setTaskId(task.getId()) 131 .setInstanceId(task.getInstanceId()) 132 .setCooperateType(ObjectUtil.isNotNull(flowParams.getCooperateType()) 133 ? flowParams.getCooperateType() : CooperateType.APPROVAL.getKey()) 134 .setCollaborator(collaborator) 135 .setNodeCode(task.getNodeCode()) 136 .setNodeName(task.getNodeName()) 137 .setNodeType(task.getNodeType()) 138 .setDefinitionId(task.getDefinitionId()) 139 .setTargetNodeCode(node.getNodeCode()) 140 .setTargetNodeName(node.getNodeName()) 141 .setApprover(flowParams.getHandler()) 142 .setSkipType(flowParams.getSkipType()) 143 .setFlowStatus(StringUtils.isNotEmpty(flowStatus) 144 ? flowStatus : FlowStatus.APPROVAL.getKey()) 145 .setFormCustom(task.getFormCustom()) 146 .setFormPath(task.getFormPath()) 147 .setMessage(flowParams.getMessage()) 148 //业务详情添加至历史记录 149 .setExt(flowParams.getHisTaskExt()) 150 .setCreateTime(task.getCreateTime()); 151 FlowFactory.dataFillHandler().idFill(hisTask); 152 hisTasks.add(hisTask); 153 } 154 return hisTasks; 155 } 156 157 @Override 158 public HisTask setDeputeHisTask(Task task, FlowParams flowParams, User entrustedUser) { 159 String flowStatus = getFlowStatus(flowParams); 160 HisTask hisTask = FlowFactory.newHisTask() 161 .setTaskId(task.getId()) 162 .setInstanceId(task.getInstanceId()) 163 .setCooperateType(CooperateType.DEPUTE.getKey()) 164 .setNodeCode(task.getNodeCode()) 165 .setNodeName(task.getNodeName()) 166 .setNodeType(task.getNodeType()) 167 .setDefinitionId(task.getDefinitionId()) 168 .setTargetNodeCode(task.getNodeCode()) 169 .setTargetNodeName(task.getNodeName()) 170 .setApprover(entrustedUser.getProcessedBy()) 171 .setCollaborator(entrustedUser.getCreateBy()) 172 .setSkipType(flowParams.getSkipType()) 173 .setFlowStatus(StringUtils.isNotEmpty(flowStatus) 174 ? flowStatus : SkipType.isReject(flowParams.getSkipType()) 175 ? FlowStatus.REJECT.getKey() : FlowStatus.PASS.getKey()) 176 .setFormCustom(task.getFormCustom()) 177 .setFormPath(task.getFormPath()) 178 .setMessage(flowParams.getMessage()) 179 //业务详情添加至历史记录 180 .setExt(flowParams.getHisTaskExt()) 181 .setCreateTime(task.getCreateTime()); 182 FlowFactory.dataFillHandler().idFill(hisTask); 183 return hisTask; 184 } 185 186 @Override 187 public HisTask setSignHisTask(Task task, FlowParams flowParams, BigDecimal nodeRatio, boolean isPass) { 188 String flowStatus = getFlowStatus(flowParams); 189 HisTask hisTask = FlowFactory.newHisTask() 190 .setTaskId(task.getId()) 191 .setInstanceId(task.getInstanceId()) 192 .setCooperateType(CooperateType.isCountersign(nodeRatio) 193 ? CooperateType.COUNTERSIGN.getKey() : CooperateType.VOTE.getKey()) 194 .setNodeCode(task.getNodeCode()) 195 .setNodeName(task.getNodeName()) 196 .setNodeType(task.getNodeType()) 197 .setDefinitionId(task.getDefinitionId()) 198 .setApprover(flowParams.getHandler()) 199 .setMessage(flowParams.getMessage()) 200 .setSkipType(isPass ? SkipType.PASS.getKey() : SkipType.REJECT.getKey()) 201 .setFlowStatus(StringUtils.isNotEmpty(flowStatus) 202 ? flowStatus : isPass 203 ? FlowStatus.PASS.getKey() : FlowStatus.REJECT.getKey()) 204 .setFormCustom(task.getFormCustom()) 205 .setFormPath(task.getFormPath()) 206 .setMessage(flowParams.getMessage()) 207 //业务详情添加至历史记录 208 .setExt(flowParams.getHisTaskExt()) 209 .setCreateTime(task.getCreateTime()); 210 FlowFactory.dataFillHandler().idFill(hisTask); 211 return hisTask; 212 } 213 214 @Override 215 public List<HisTask> autoHisTask(FlowParams flowParams, String flowStatus, Task task, List<User> userList, Integer cooperateType) { 216 List<HisTask> hisTasks = new ArrayList<>(); 217 for (User user : userList) { 218 HisTask hisTask = FlowFactory.newHisTask() 219 .setTaskId(task.getId()) 220 .setInstanceId(task.getInstanceId()) 221 .setCooperateType(cooperateType) 222 .setNodeCode(task.getNodeCode()) 223 .setNodeName(task.getNodeName()) 224 .setNodeType(task.getNodeType()) 225 .setDefinitionId(task.getDefinitionId()) 226 .setApprover(user.getProcessedBy()) 227 .setSkipType(flowParams.getSkipType()) 228 .setFlowStatus(StringUtils.isNotEmpty(flowParams.getHisStatus()) 229 ? flowParams.getHisStatus() : flowStatus) 230 .setFormCustom(task.getFormCustom()) 231 .setFormPath(task.getFormPath()) 232 .setMessage(flowParams.getMessage()) 233 .setCreateTime(task.getCreateTime()); 234 FlowFactory.dataFillHandler().idFill(hisTask); 235 hisTasks.add(hisTask); 236 } 237 238 return hisTasks; 239 } 240 241 @Override 242 public HisTask setSkipHisTask(Task task, Node nextNode, FlowParams flowParams) { 243 String flowStatus = getFlowStatus(flowParams); 244 HisTask hisTask = FlowFactory.newHisTask() 245 .setTaskId(task.getId()) 246 .setInstanceId(task.getInstanceId()) 247 .setCooperateType(ObjectUtil.isNotNull(flowParams.getCooperateType()) 248 ? flowParams.getCooperateType() : CooperateType.APPROVAL.getKey()) 249 .setNodeCode(task.getNodeCode()) 250 .setNodeName(task.getNodeName()) 251 .setNodeType(task.getNodeType()) 252 .setDefinitionId(task.getDefinitionId()) 253 .setTargetNodeCode(nextNode.getNodeCode()) 254 .setTargetNodeName(nextNode.getNodeName()) 255 .setApprover(flowParams.getHandler()) 256 .setSkipType(flowParams.getSkipType()) 257 .setFlowStatus(StringUtils.isNotEmpty(flowStatus) 258 ? flowStatus : FlowStatus.APPROVAL.getKey()) 259 .setFormCustom(task.getFormCustom()) 260 .setFormPath(task.getFormPath()) 261 .setMessage(flowParams.getMessage()) 262 //业务详情添加至历史记录 263 .setExt(flowParams.getExt()) 264 .setCreateTime(task.getCreateTime()); 265 FlowFactory.dataFillHandler().idFill(hisTask); 266 return hisTask; 267 } 268 269 private static String getFlowStatus(FlowParams flowParams) { 270 return StringUtils.isNotEmpty(flowParams.getHisStatus()) 271 ? flowParams.getHisStatus() : flowParams.getFlowStatus(); 272 } 273}