activiti流程更新、修改
activiti 版本 5.17.0,主要通过activiti API 实现对底层数据的修改
相关联的表:ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF 和 ACT_GE_BYTEARRAY
ACT_RE_DEPLOYMENT:部署信息表,主要包括“部署ID_(ID_)”、“部署时间(DEPLOY_TIME_)
ACT_RE_PROCDEF :流程定义数据表,和 ACT_RE_DEPLOYMENT 是一对一的关系,通过“部署ID( DEPLOYMENT_ID_ )”关联,每一个流程文件部署都会在这两个表中插入两条数据,主要包括部署流程的基本信息“流程名称(NAME_)”、“流程定义KEY(KEY_)”、“部署ID( DEPLOYMENT_ID_ )”、“版本( VERSION_ )”
**ACT_GE_BYTEARRAY:**流程部署二进制数据表,activiti流程文件是以流的形式保存在数据库的,和 ACT_RE_DEPLOYMENT 是多对一的关系,通过“部署ID(DEPLOYMENT_ID_ )”关联,每个流程文件部署会生成两条数据,一条流程文件数据,一条流程图的图片数据
相关代码:直接修改 ACT_GE_BYTEARRAY 中的数据,需要修改流程文件数据和流程图的图片数据
**流程定义列表:**这里是从流程定义管理界面进行操作,勾选要更新的流程数据,点击“更新流程”按钮进行更新
代码实现:
/**
* 更新单个流程
* @param processDefinitionId 流程定义ID
* @return
*/
@RequestMapping("/update")
@ResponseBody
public Result update(String processDefinitionId){
InputStream bpmnInput=null;
InputStream pngInput=null;
try {
if (!StringUtil.isEmpty(processDefinitionId)){
//根据流程定义ID查找
ProcessDefinition processDefinition=repositoryService.getProcessDefinition(processDefinitionId);
//根据流程定义的资源路径查找流程文件,也可以通过文件上传的方式
String path=request.getServletContext().getRealPath(processDefinition.getResourceName());
File file=new File(path);
if(null!=file && file.exists() && file.isFile()){
//每个流程文件部署会生成两条数据,一条流程文件数据,一条流程图的图片数据
//更新流程文件数据,generated="0"为流程文件数据
List<ActGeByteArray> listBpmn=actGeByteArrayMng.find("from ActGeByteArray Where deploymentId = ? and generated = "0"",
new Object[]{processDefinition.getDeploymentId()});
if(null!=listBpmn && listBpmn.size()==1) {
ActGeByteArray actGba=listBpmn.get(0);
byte[] fileBytes=new byte[(int)file.length()];
//读取新的流程文件更新到数据库
bpmnInput=new FileInputStream(file);
bpmnInput.read(fileBytes);
actGba.setBytes(fileBytes);
actGeByteArrayMng.save(actGba);
}
//更新流程图数据,generated="1"为流程图的图片数据
List<ActGeByteArray> listPng=actGeByteArrayMng.find("from ActGeByteArray Where deploymentId = ? and generated = "1"",
new Object[]{processDefinition.getDeploymentId()});
if(null!=listPng && listPng.size()==1) {
ActGeByteArray actGba=listPng.get(0);
pngInput=processEngine.getManagementService().executeCommand(new ProcessInstanceDiagramPng(processEngine,processDefinitionId));
byte[] pngBytes=new byte[pngInput.available()];
pngInput.read(pngBytes);
actGba.setBytes(pngBytes);
actGeByteArrayMng.save(actGba);
}
}
}
} catch (Exception e) {
// TODO: handle exception
logger.error("", e);
return getJsonResult(false,"更新失败,请联系管理员!");
}finally {
try {
bpmnInput.close();
pngInput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
log.error("",e);
}
}
return getJsonResult(true,"更新成功!");
}
/**
* 更新流程时重新生成流程图
* @author zhou_liang
*
*/
public class ProcessInstanceDiagramPng implements Command<InputStream>{
private ProcessEngine processEngine;
private String processDefinitionId;
public ProcessInstanceDiagramPng(ProcessEngine processEngine,String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
this.processEngine = processEngine;
}
public InputStream execute(CommandContext commandContext) {
GetBpmnModelCmd getBpmnModelCmd = new GetBpmnModelCmd(processDefinitionId);
BpmnModel bpmnModel = getBpmnModelCmd.execute(commandContext);
InputStream is = new DefaultProcessDiagramGenerator().generateDiagram(
bpmnModel, "png",null,new ArrayList<String>(),
processEngine.getProcessEngineConfiguration().getActivityFontName(),
processEngine.getProcessEngineConfiguration().getLabelFontName(),
processEngine.getProcessEngineConfiguration().getClassLoader(),1.0);
return is;
}
}
对应的实体类和业务类根据 ACT_GE_BYTEARRAY 映射就可以了
重点:数据修改完原流程可以按新流程图直接运行。
以上是 activiti流程更新、修改 的全部内容, 来源链接: utcz.com/z/515938.html