package com.snow.flowable.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.BetweenFormater;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.snow.common.core.page.PageModel;
import com.snow.common.core.text.Convert;
import com.snow.common.exception.BusinessException;
import com.snow.common.utils.bean.BeanUtils;
import com.snow.flowable.common.constants.FlowConstants;
import com.snow.flowable.common.enums.FlowDefEnum;
import com.snow.flowable.common.enums.FlowInstanceEnum;
import com.snow.flowable.common.enums.FlowTypeEnum;
import com.snow.flowable.common.skipTask.TaskSkipService;
import com.snow.flowable.config.ICustomProcessDiagramGenerator;
import com.snow.flowable.domain.*;
import com.snow.flowable.domain.response.ProcessDefinitionResponse;
import com.snow.flowable.service.FlowableService;
import com.snow.flowable.service.FlowableTaskService;
import com.snow.flowable.service.FlowableUserService;
import com.snow.system.domain.ActDeModel;
import com.snow.system.domain.SysUser;
import com.snow.system.service.impl.SysUserServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.common.engine.impl.util.IoUtil;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.impl.RepositoryServiceImpl;
import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentQuery;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.DelegationState;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.ui.modeler.domain.Model;
import org.flowable.ui.modeler.service.ModelServiceImpl;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author qimingjin
* @Title:
* @Description:
* 运行时流程人员表(act_ru_identitylink)
*
* 任务参与者数据表。主要存储当前节点参与者的信息。
* @date 2020/11/19 17:27
*/
@Slf4j
@Service
public class FlowableServiceImpl implements FlowableService {
@Autowired
private IdentityService identityService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private HistoryService historyService;
@Resource
private ProcessEngine processEngine;
@Autowired
private SysUserServiceImpl sysUserService;
@Autowired
private ExpressionServiceImpl expressionService;
@Autowired
private ModelServiceImpl modelService;
@Autowired
private ObjectMapper objectMapper;
@Resource
private FlowableUserService flowableUserService;
@Resource
private FlowableTaskService flowableTaskService;
@Resource
private TaskSkipService taskSkipService;
@Override
public void saveModel(ActDeModel actDeModel) {
// 构建ModelEditorSource
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id", "canvas");
editorNode.put("resourceId", "canvas");
ObjectNode stencilNode = objectMapper.createObjectNode();
stencilNode.put("id","BPMNDiagram");
editorNode.set("stencil",stencilNode);
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
stencilSetNode.put("url","../editor/stencilsets/bpmn2.0/bpmn2.0.json");
editorNode.set("stencilset", stencilSetNode);
org.flowable.ui.modeler.domain.Model model=new org.flowable.ui.modeler.domain.Model();
model.setName(actDeModel.getName());
model.setComment(actDeModel.getModelComment());
model.setDescription(actDeModel.getDescription());
model.setCreated(new Date());
model.setLastUpdated(new Date());
model.setCreatedBy(actDeModel.getCreatedBy());
model.setKey(actDeModel.getModelKey());
model.setModelType(actDeModel.getModelType().intValue());
model.setVersion(actDeModel.getVersion().intValue());
model.setModelEditorJson(editorNode.toString());
modelService.saveModel(model);
}
@Override
public void deleteModel(String modelId) {
List<String> idList = Arrays.asList(Convert.toStrArray(modelId));
idList.forEach(t->{
//删除会保留一份历史记录
modelService.deleteModel(t);
});
}
@Override
public void exportModelXml(String modelId, HttpServletResponse response) {
try {
Model modelData = modelService.getModel(modelId);
BpmnModel bpmnModel = modelService.getBpmnModel(modelData);
// 流程非空判断
if (!CollectionUtils.isEmpty(bpmnModel.getProcesses())) {
byte[] bpmnXML = modelService.getBpmnXML(modelData);
ByteArrayInputStream in = new ByteArrayInputStream(bpmnXML);
String filename = bpmnModel.getMainProcess().getId() + ".bpmn";
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
IOUtils.copy(in, response.getOutputStream());
response.flushBuffer();
}else {
log.warn("导出model的xml文件失败,流程为null:modelId={}", modelId);
}
} catch (Exception e) {
log.error("导出model的xml文件失败:modelId={}", modelId, e);
}
}
@Override
public void showModelXml(String modelId, HttpServletResponse response) {
try {
Model modelData = modelService.getModel(modelId);
BpmnModel bpmnModel = modelService.getBpmnModel(modelData);
// 流程非空判断
if (!CollectionUtils.isEmpty(bpmnModel.getProcesses())) {
byte[] bpmnXML = modelService.getBpmnXML(modelData);
- 1
- 2
- 3
- 4
前往页