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

215 lines
9.6 KiB
Java
Raw Normal View History

2021-11-09 07:26:08 +00:00
package cn.palmte.work.service;
import cn.palmte.work.config.activiti.ActConstant;
2022-12-23 09:44:31 +00:00
import cn.palmte.work.config.activiti.ActTaskIndexEnum;
2021-11-09 07:26:08 +00:00
import cn.palmte.work.model.ActTaskDef;
import cn.palmte.work.model.ActTaskDefRepository;
import cn.palmte.work.pojo.ActModel;
import cn.palmte.work.utils.InterfaceUtil;
2023-01-12 08:43:46 +00:00
import cn.palmte.work.utils.StrKit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
2021-11-09 07:26:08 +00:00
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;
2022-12-21 03:13:42 +00:00
import org.activiti.engine.delegate.BaseExecutionListener;
2021-11-09 07:26:08 +00:00
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");
2023-01-12 08:43:46 +00:00
queryHelper.addCondition(StringUtils.isNotEmpty(name), "(a.NAME_ like ? or a.KEY_ like ?)", "'%" + name + "%'", "'%" + name + "%'");
2021-11-09 07:26:08 +00:00
queryHelper.addOrderProperty("a.LAST_UPDATE_TIME_", false);
return pagination.paginate(queryHelper.getSql(), ActModel.class, pageNumber, pageSize);
}
2022-12-21 03:13:42 +00:00
public ActModel findByProcDefKey(String procDefKey) {
return pagination.findFirst("select * from act_re_model where KEY_=? ", ActModel.class, procDefKey);
}
2021-11-09 07:26:08 +00:00
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);
2023-01-12 08:43:46 +00:00
JSONObject metaInfo = JSON.parseObject(modelData.getMetaInfo());
String description = metaInfo.getString("description");
2021-11-09 07:26:08 +00:00
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();
2022-12-21 03:13:42 +00:00
//设置流程监听器
setExecutionListener(process);
2021-11-09 07:26:08 +00:00
int i = 0;
2021-11-12 01:15:33 +00:00
ActTaskDef taskDef;
2021-11-09 07:26:08 +00:00
ActTaskDef first = null;
for (FlowElement element : flowElements) {
if (element instanceof UserTask) {
2021-11-12 01:15:33 +00:00
UserTask userTaskElement = (UserTask) element;
2021-11-09 07:26:08 +00:00
2021-11-12 01:15:33 +00:00
taskDef = new ActTaskDef();
taskDef.setTaskName(element.getName());
taskDef.setTaskKey(element.getId());
2021-11-15 03:12:34 +00:00
2021-11-12 01:15:33 +00:00
MultiInstanceLoopCharacteristics loopCharacteristics = userTaskElement.getLoopCharacteristics();
2021-11-15 03:12:34 +00:00
if (loopCharacteristics != null) { //多实列
taskDef.setTaskType(ActConstant.TASK_TYPE_MULTI);
2021-11-12 01:15:33 +00:00
}else {
2021-11-15 03:12:34 +00:00
taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE);
2021-11-09 07:26:08 +00:00
}
2022-12-21 03:13:42 +00:00
//任务监听器
setTaskListener(userTaskElement);
2021-11-09 07:26:08 +00:00
2021-11-15 03:12:34 +00:00
if (i == 1) {//画流程图时,要保证第一个用户任务一定要先画
2022-12-23 09:44:31 +00:00
taskDef.setTaskIndex(ActTaskIndexEnum.FIRST_USER_TASK.getIndex());
2021-11-12 01:15:33 +00:00
first = taskDef;
2021-11-09 07:26:08 +00:00
}
2021-11-15 03:12:34 +00:00
2021-11-12 01:15:33 +00:00
taskList.add(taskDef);
2021-11-09 07:26:08 +00:00
}
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());
}
2023-01-12 08:43:46 +00:00
//更新流程定义的描述
if(StrKit.notBlank(description)){
actTaskDefRepository.updateProcDefDesc(description, processDefinition.getId());
}
2021-11-09 07:26:08 +00:00
actTaskDefRepository.save(taskList);
logger.info("deploy success: deploymentId:{}, procDefName:{}, procDefKey:{}", deployment.getId(), processDefinition.getName(), processDefinition.getKey());
}
2022-12-21 03:13:42 +00:00
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);
}
2021-11-09 07:26:08 +00:00
}