• Activiti:整合WEB版流程模型设计器Modeler


    前文链接:https://www.cnblogs.com/wwjj4811/p/16206787.html

    简介

    上面我们在 idea 上设计的流程模型,而每次要设计都要打开 idea 或其他设计流程工具来进行操作,这样不太方便。

    而实际上 Activiti 官方提供了 Web 版的流程设计工具 Activiti Modeler,可以直接整合到我们项目中。

    在 Activiti 5.10 版本把原本独立的 Activiti Modeler 模块整合到了 Activiti Explorer 模块中,两者相结合使用起来很方便, 通过 Modeler 设计的流程模型可以直接部署到引擎,也可以把已经部署的流程转换为Model从而在Modeler中编辑。

    在实际应用中也有这样的需求,把 Modeler 整合到业务系统中可以供管理员使用,或者作为BPM流程管理平台的一部分存在。

    但是在 Activiti 官方没有给出如何整合Modeler的文档,要我们自己整合。

    整合流程

    下载源码

    从github下载Activiti 5.22版本源码:

    访问:https://github.com/Activiti/Activiti/releases/tag/activiti-5.22.0

    image-20220429153247259

    拷贝目标源码

    1. 解压 Activiti-activiti-5.22.0.zip ,然后进入 Activiti-activiti-5.22.0/modules 目录,

    2. 复制 activiti-webapp-explorer2 工程中如下图画红框的文件夹和文件,

      文件夹路径:Activiti-activiti-5.22.0\modules\activiti-webapp-explorer2\src\main\webapp

    image-20220429153643661

    拷贝到springboot项目的resource/static目录下:

    image-20220429153812822

    找到 activiti-modeler 工程下的 3个类,如下:

    Activiti-activiti-5.22.0\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\main\StencilsetRestResource.java

    Activiti-activiti-5.22.0\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelEditorJsonRestResource.java

    Activiti-activiti-5.22.0\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelSaveRestResource.java

    拷贝到项目中:

    image-20220429154512999

    修改上下文路径

    找到 static/editor-app/configuration/url-config.js ,修改文件中的项目上下文路径,这样才能请求到上面3个接口

    image-20220429155006397

    汉化

    拷贝stencilset.json文件到resource/static下

    文件地址:https://wj204811.oss-cn-hangzhou.aliyuncs.com/activiti/stencilset.json

    image-20220429155534331

    修改StencilsetRestResource类,将stencilset.json文件路径配置正确:

    image-20220429155659310

    汉化按钮文字,在 resources/static/editor-app/i18n 目录下添加 zh-CN.json 文件

    文件地址:https://wj204811.oss-cn-hangzhou.aliyuncs.com/activiti/zh-CN.json

    image-20220429155818008

    修改 resources/static/editor-app/app.js 文件,将第51行$translateProvider.preferredLanguage('en'); 替换为以下内容:

    // $translateProvider.preferredLanguage('en');
    // 多语言支持
    if("zh-CN" == navigator.language){
    	$translateProvider.preferredLanguage('zh-CN');
    }else {
    	$translateProvider.preferredLanguage('en');
    }
    

    创建空的流程模型

    创建ModelController:

    @Controller
    @RequestMapping("/model")
    public class ModelController {
    
        @Autowired
        private RepositoryService repositoryService;
    
        @Autowired
        private ObjectMapper objectMapper;
    
        @GetMapping("/create")
        public void create(HttpServletRequest request, HttpServletResponse response) throws IOException {
            String name = "请假流程模型";
            String key = "leave";
            String desc = "请输入描述信息。。";
            int version = 1;
            //初始化空model
            Model model = repositoryService.newModel();
            model.setName(name);
            model.setKey(key);
            model.setVersion(version);
    
            ObjectNode objectNode = objectMapper.createObjectNode();
            objectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
            objectNode.put(ModelDataJsonConstants.MODEL_REVISION, version);
            objectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, desc);
            model.setMetaInfo(objectNode.toString());
            // 存储模型对象(表 ACT_RE_MODEL )
            repositoryService.saveModel(model);
    
            // 封装模型对象基础数据json串 {"id":"canvas","resourceId":"canvas","stencilset":{"namespace":"http://b3mn.org/stencilset/bpmn2.0#"},"properties":{"process_id":"未定义"}}
            ObjectNode editorNode = objectMapper.createObjectNode();
            //editorNode.put("resourceId", "canvas");
            ObjectNode stencilSetNode = objectMapper.createObjectNode();
            stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
            editorNode.replace("stencilset", stencilSetNode);
            // 标识key
            ObjectNode propertiesNode = objectMapper.createObjectNode();
            propertiesNode.put("process_id", key);
            editorNode.replace("properties", propertiesNode);
            // 存储模型对象基础数据(表 ACT_GE_BYTEARRAY )
            repositoryService.addModelEditorSource(model.getId(), editorNode.toString().getBytes(StandardCharsets.UTF_8));
    
            // 编辑流程模型时,只需要直接跳转此url并传递上modelId即可
            response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + model.getId());
        }
    }
    

    重启项目,访问http://localhost:8080/workflow/model/create

    会自动跳转到:http://localhost:8080/workflow/modeler.html?modelId=xxxxxxx

    image-20220429161726895

    点击保存按钮:

    image-20220429162332654

    web端绘制请假流程定义模型

    image-20220429164149217

    但是点击保存时,会报400的错误

    image-20220429164229016

    需要将ModelSaveRestResource类的saveModel方法中的@RequestBody修改为@RequestParam

    image-20220429164331893

    然后重启,再尝试保存,成功,数据库的act_re_mode也有相关数据:

    image-20220429164742939

  • 相关阅读:
    防止重复点击
    刷新当前页面的几种方法
    PHP删除数组中空值
    json转化数组
    两个不能同时共存的条件orWhere查询
    SQLSTATE[42000]
    laravel一个页面两个表格分页处理
    Hash::make与Hash::check
    unbind()清除指定元素绑定效果
    二级联动
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/16207487.html
Copyright © 2020-2023  润新知