fourcal/src/main/java/cn/palmte/work/service/ActModelService.java

215 lines
9.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package cn.palmte.work.service;
import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.config.activiti.ActTaskIndexEnum;
import cn.palmte.work.model.ActTaskDef;
import cn.palmte.work.model.ActTaskDefRepository;
import cn.palmte.work.pojo.ActModel;
import cn.palmte.work.utils.InterfaceUtil;
import cn.palmte.work.utils.StrKit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.delegate.BaseExecutionListener;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.Model;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.jfunc.common.db.QueryHelper;
import top.jfunc.common.db.bean.Page;
import top.jfunc.common.db.utils.Pagination;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Service
public class ActModelService {
private static final Logger logger = LoggerFactory.getLogger(ActModelService.class);
@Autowired
private RepositoryService repositoryService; //管理流程定义 与流程定义和部署对象相关的Service
@Autowired
private ActTaskDefRepository actTaskDefRepository;
@Autowired
Pagination pagination;
public Page<ActModel> list(ConcurrentHashMap<String, String> searchInfo, int pageNumber, int pageSize) {
String select = "a.ID_ as id,a.REV_ as rev,a.NAME_ as modelName,a.KEY_ as procDefKey,a.CREATE_TIME_ as createdTime,a.LAST_UPDATE_TIME_ as lastUpdatedTime";
QueryHelper queryHelper = new QueryHelper(select, " act_re_model a");
String name = searchInfo.get("name");
queryHelper.addCondition(StringUtils.isNotEmpty(name), "(a.NAME_ like ? or a.KEY_ like ?)", "'%" + name + "%'", "'%" + name + "%'");
queryHelper.addOrderProperty("a.LAST_UPDATE_TIME_", false);
return pagination.paginate(queryHelper.getSql(), ActModel.class, pageNumber, pageSize);
}
public ActModel findByProcDefKey(String procDefKey) {
return pagination.findFirst("select * from act_re_model where KEY_=? ", ActModel.class, procDefKey);
}
public void createModel(String processId, String modelName) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id", "canvs");
editorNode.put("resourceId", "canvs");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); //命名空间(禁止修改)
stencilSetNode.put("author", ""); //流程节点作者
editorNode.set("stencilset", stencilSetNode);
ObjectNode propertiesNode = objectMapper.createObjectNode();
propertiesNode.put("process_id", processId); //流程唯一标识
propertiesNode.put("process_author", InterfaceUtil.getAdmin().getUserName()); //流程作者
propertiesNode.put("name", modelName); //流程名称
editorNode.set("properties", propertiesNode);
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put("name", modelName); //模型名称
modelObjectNode.put("revision", 1); //模型版本
modelObjectNode.put("description", ""); //模型描述
Model modelData = repositoryService.newModel();
//modelData.setCategory(category); //模型分类
modelData.setDeploymentId(null);
modelData.setKey(processId);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(modelName); //模型名称
modelData.setTenantId("");
modelData.setVersion(1);
//保存模型,存储数据到表act_re_model 流程设计模型部署表
repositoryService.saveModel(modelData);
repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));//保存资源,存储数据到表act_ge_bytearray 二进制数据表
}
/**
* 删除模型
* act_re_model 和 act_ge_bytearray 两张表中相关数据都删除
*
* @param modelId
*/
public void deleteModel(String modelId) {
repositoryService.deleteModel(modelId);
}
/**
* 部署流程
*
* @param modelId
* @throws Exception
*/
public void deploy(String modelId) throws Exception {
Model modelData = repositoryService.getModel(modelId);
JSONObject metaInfo = JSON.parseObject(modelData.getMetaInfo());
String description = metaInfo.getString("description");
ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
byte[] bpmnBytes = null;
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
BpmnModel model = jsonConverter.convertToBpmnModel(modelNode);
List<ActTaskDef> taskList = new ArrayList<>();
Process process = model.getMainProcess();
Collection<FlowElement> flowElements = process.getFlowElements();
//设置流程监听器
setExecutionListener(process);
int i = 0;
ActTaskDef taskDef;
ActTaskDef first = null;
for (FlowElement element : flowElements) {
if (element instanceof UserTask) {
UserTask userTaskElement = (UserTask) element;
taskDef = new ActTaskDef();
taskDef.setTaskName(element.getName());
taskDef.setTaskKey(element.getId());
MultiInstanceLoopCharacteristics loopCharacteristics = userTaskElement.getLoopCharacteristics();
if (loopCharacteristics != null) { //多实列
taskDef.setTaskType(ActConstant.TASK_TYPE_MULTI);
}else {
taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE);
}
//任务监听器
setTaskListener(userTaskElement);
if (i == 1) {//画流程图时,要保证第一个用户任务一定要先画
taskDef.setTaskIndex(ActTaskIndexEnum.FIRST_USER_TASK.getIndex());
first = taskDef;
}
taskList.add(taskDef);
}
i ++;
}
bpmnBytes = new BpmnXMLConverter().convertToXML(model);
String processName = modelData.getName() + ".bpmn20.xml";
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name(modelData.getName()); //部署名称
deploymentBuilder.addString(processName, new String(bpmnBytes, "utf-8"));
Deployment deployment = deploymentBuilder.deploy(); //完成部署
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
for (ActTaskDef actTaskDef : taskList) {
if (first != null) {
actTaskDef.setRollbackTaskKey(first.getTaskKey());
}
actTaskDef.setProcDefId(processDefinition.getId());
actTaskDef.setProcDefName(processDefinition.getName());
actTaskDef.setProcDefKey(processDefinition.getKey());
actTaskDef.setCreatedTime(new Date());
actTaskDef.setLastUpdatedTime(new Date());
}
//更新流程定义的描述
if(StrKit.notBlank(description)){
actTaskDefRepository.updateProcDefDesc(description, processDefinition.getId());
}
actTaskDefRepository.save(taskList);
logger.info("deploy success: deploymentId:{}, procDefName:{}, procDefKey:{}", deployment.getId(), processDefinition.getName(), processDefinition.getKey());
}
private void setTaskListener(UserTask userTaskElement) {
ActivitiListener taskListener = new ActivitiListener();
taskListener.setEvent(TaskListener.EVENTNAME_CREATE);
taskListener.setImplementation("${actListenerService.create(task)}");
taskListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION);
List<ActivitiListener> taskListenerList = new ArrayList<>(1);
taskListenerList.add(taskListener);
userTaskElement.setTaskListeners(taskListenerList);
}
private void setExecutionListener(Process process) {
ActivitiListener executionListener = new ActivitiListener();
executionListener.setEvent(BaseExecutionListener.EVENTNAME_END);
executionListener.setImplementation("${actListenerService.end(execution)}");
executionListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION);
List<ActivitiListener> executionListenerList = new ArrayList<>(1);
executionListenerList.add(executionListener);
process.setExecutionListeners(executionListenerList);
}
}