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

回到顶部