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}