{"id":104,"date":"2024-09-27T23:29:36","date_gmt":"2024-09-27T15:29:36","guid":{"rendered":"https:\/\/blog.easitch.com\/?p=104"},"modified":"2026-04-28T17:05:39","modified_gmt":"2026-04-28T09:05:39","slug":"flowable-%e5%ad%a6%e4%b9%a0%e6%b5%81%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/blog.eastfond.com\/?p=104","title":{"rendered":"Flowable \u5b66\u4e60\u6d41\u7a0b"},"content":{"rendered":"<blockquote>\n<p>\u8fd9\u91cc\u4f7f\u7528\u7684\u662fSpringBoot3.2+Flowable6.8.0\u3002\u8fc7\u7a0b\u4e2d\u6ca1\u6709\u4f7f\u7528\u5230Flowable UI<\/p>\n<\/blockquote>\n<h1>\u6d41\u7a0b\u5206\u7c7b<\/h1>\n<blockquote>\n<p>\u5206\u7c7b\u529f\u80fd\u53ea\u662f\u7b80\u5355\u7684\u589e\u5220\u6539\u67e5\uff0c\u5c31\u4e0d\u591a\u5c55\u793a\u4ee3\u7801\u4e86\u3002<\/p>\n<\/blockquote>\n<h2>\u65b0\u589e<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987045523_202501272210416.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987045523_202501272210416.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">\/**\n * \u65b0\u589e\u6d41\u7a0b\u5206\u7c7b\n *\/\n@Operation(description = &quot;\u65b0\u589e\u6d41\u7a0b\u5206\u7c7b&quot;)\n@PostMapping(&quot;save&quot;)\npublic R&lt;Void&gt; add(@Validated(value = AddGroup.class) @RequestBody WfCategoryDTO category) {\n    return toAjax(categoryService.insert(category));\n}<\/code><\/pre>\n<h2>\u5220\u9664<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u5220\u9664\u6d41\u7a0b\u5206\u7c7b\n *\/\n@Operation(description = &quot;\u5220\u9664\u6d41\u7a0b\u5206\u7c7b&quot;)\n@PutMapping(&quot;delete\/{categoryIds}&quot;)\npublic R&lt;Void&gt; delete(@NotEmpty(message = &quot;\u4e3b\u952e\u4e0d\u80fd\u4e3a\u7a7a&quot;) @PathVariable Long[] categoryIds) {\n    return toAjax(categoryService.deleteByIds(categoryIds));\n}<\/code><\/pre>\n<h2>\u4fee\u6539<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u4fee\u6539\u6d41\u7a0b\u5206\u7c7b\n *\/\n@Operation(description = &quot;\u4fee\u6539\u6d41\u7a0b\u5206\u7c7b&quot;)\n@PutMapping(&quot;edit&quot;)\npublic R&lt;Void&gt; edit(@Validated(value = EditGroup.class)  @RequestBody WfCategoryDTO category) {\n    return toAjax(categoryService.update(category));\n}<\/code><\/pre>\n<h2>\u67e5\u8be2<\/h2>\n<pre><code class=\"language-java\">    \/**\n     * \u67e5\u8be2\u6d41\u7a0b\u5206\u7c7b\u5217\u8868(\u542b\u5206\u9875)\n     *\n     * @param category  \u67e5\u8be2\u6761\u4ef6\n     * @param pageQuery \u5206\u9875\u53c2\u6570\n     * @return\n     *\/\n    @GetMapping(&quot;list&quot;)\n    @Operation(description = &quot;\u67e5\u8be2\u6d41\u7a0b\u5206\u7c7b\u5217\u8868&quot;)\n    public TableDataInfo&lt;WfCategoryVo&gt; list(WfCategoryDTO category, PageQuery pageQuery) {\n        return categoryService.queryPageList(category, pageQuery);\n    }<\/code><\/pre>\n<h1>\u8868\u5355\u914d\u7f6e<\/h1>\n<blockquote>\n<p>\u8868\u5355\u4f7f\u7528\u7684\u5f00\u6e90\u7684vform<\/p>\n<\/blockquote>\n<h2>\u65b0\u589e<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987063732_202501272210625.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987063732_202501272210625.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">  \/**\n     * \u65b0\u589e\u6d41\u7a0b\u8868\u5355\n     *\n     * @param wfFormDTO \u8868\u5355\u5bf9\u8c61\n     *\/\n    @PostMapping(&quot;save&quot;)\n    @Operation(description = &quot;\u65b0\u589e\u6d41\u7a0b\u8868\u5355&quot;)\n    public R&lt;Void&gt; add(@Validated(value = AddGroup.class) @RequestBody WfFormDTO wfFormDTO) {\n        return toAjax(wfFormService.insert(wfFormDTO));\n    }<\/code><\/pre>\n<h2>\u5220\u9664<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u5220\u9664\u6d41\u7a0b\u8868\u5355\n *\n * @param formIds \u4e3b\u952e\u4e32\n *\/\n@Operation(description = &quot;\u5220\u9664\u6d41\u7a0b\u8868\u5355&quot;)\n@DeleteMapping(&quot;\/{formIds}&quot;)\npublic R&lt;Void&gt; remove(@NotEmpty(message = &quot;\u4e3b\u952e\u4e0d\u80fd\u4e3a\u7a7a&quot;) @PathVariable Long[] formIds) {\n    return toAjax(wfFormService.deleteByIds(Arrays.asList(formIds)) &gt; 0 ? 1 : 0);\n}<\/code><\/pre>\n<h2>\u4fee\u6539<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u4fee\u6539\u6d41\u7a0b\u8868\u5355\n *\n * @param wfFormDTO \u8868\u5355\u5bf9\u8c61\n *\/\n@Operation(description = &quot;\u7f16\u8f91\u6d41\u7a0b\u8868\u5355&quot;)\n@PutMapping(&quot;edit&quot;)\npublic R&lt;Void&gt; edit(@Validated(value = EditGroup.class) @RequestBody WfFormDTO wfFormDTO) {\n    return toAjax(wfFormService.update(wfFormDTO));\n}<\/code><\/pre>\n<h2>\u67e5\u8be2<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u67e5\u8be2\u6d41\u7a0b\u8868\u5355\u5217\u8868\n *\/\n@Operation(description = &quot;\u67e5\u8be2\u6d41\u7a0b\u8868\u5355\u5217\u8868&quot;)\n@GetMapping(&quot;\/list&quot;)\npublic TableDataInfo&lt;WfFormVo&gt; list(@Validated(QueryGroup.class) WfFormDTO wfFormDTO, PageQuery pageQuery) {\n    return wfFormService.queryPageList(wfFormDTO, pageQuery);\n}<\/code><\/pre>\n<h1>\u6d41\u7a0b\u6a21\u578b<\/h1>\n<p>\u8fd9\u4e00\u90e8\u5206\u5c31\u6d89\u53ca\u5230\u4e86flowable\u4e2d\u7684\u5185\u5bb9\u4e86\uff0c\u8fd9\u91cc\u9700\u8981\u5148\u4ecb\u7ecd\u4e00\u4e9b\u6982\u5ff5\u3002<\/p>\n<div class='admonition shadow-sm admonition-warning'><div class='admonition-body'><\/p>\n<p>Process Engine\uff08\u6d41\u7a0b\u5f15\u64ce\uff09<\/p>\n<p>Process Engine \u662f Flowable \u7684\u6838\u5fc3\uff0c\u8d1f\u8d23\u7ba1\u7406\u6d41\u7a0b\u5b9e\u4f8b\u7684\u751f\u547d\u5468\u671f\u548c\u6240\u6709\u4e0e\u6d41\u7a0b\u76f8\u5173\u7684\u64cd\u4f5c\u3002\u5b83\u4e3a\u5f00\u53d1\u8005\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684 API \u63a5\u53e3\uff0c\u80fd\u591f\u8c03\u7528\u76f8\u5173\u7684\u670d\u52a1\u6765\u8fdb\u884c\u6d41\u7a0b\u5b9a\u4e49\u3001\u6d41\u7a0b\u5b9e\u4f8b\u7684\u542f\u52a8\u3001\u4efb\u52a1\u7ba1\u7406\u3001\u8868\u5355\u5904\u7406\u7b49\u529f\u80fd\u3002<\/p>\n<p>Process Engine \u53ef\u4ee5\u88ab\u7406\u89e3\u4e3a\u6574\u4e2a\u7cfb\u7edf\u7684 \"\u4e2d\u67a2\"\uff0c\u901a\u8fc7\u5b83\u53ef\u4ee5\u8bbf\u95ee\u5176\u4ed6\u7684\u670d\u52a1\u7ec4\u4ef6\u3002\u5178\u578b\u7684\u670d\u52a1\u7ec4\u4ef6\u5305\u62ec\uff1a<\/p>\n<p>- <strong>RepositoryService<\/strong>\uff1a\u7528\u4e8e\u7ba1\u7406\u6d41\u7a0b\u5b9a\u4e49\u7684\u90e8\u7f72\u3001\u67e5\u8be2\u3001\u6302\u8d77\u3001\u5220\u9664\u7b49\u64cd\u4f5c\u3002<br \/>\n- <strong>RuntimeService<\/strong>\uff1a\u5904\u7406\u6d41\u7a0b\u5b9e\u4f8b\u7684\u542f\u52a8\u3001\u67e5\u8be2\u3001\u6682\u505c\u3001\u6062\u590d\u548c\u53d8\u91cf\u7ba1\u7406\u7b49\u64cd\u4f5c\u3002<br \/>\n- <strong>TaskService<\/strong>\uff1a\u7528\u4e8e\u7ba1\u7406\u7528\u6237\u4efb\u52a1\uff0c\u4efb\u52a1\u7684\u67e5\u8be2\u3001\u8ba4\u9886\u3001\u5b8c\u6210\u7b49\u3002<br \/>\n- <strong>IdentityService<\/strong>\uff1a\u8d1f\u8d23\u7ba1\u7406\u4e0e\u6d41\u7a0b\u76f8\u5173\u7684\u7528\u6237\u548c\u7ec4\uff08\u5982\u6743\u9650\u3001\u8eab\u4efd\u9a8c\u8bc1\uff09\u3002<br \/>\n- <strong>HistoryService<\/strong>\uff1a\u63d0\u4f9b\u5bf9\u6d41\u7a0b\u5b9e\u4f8b\u548c\u4efb\u52a1\u7684\u5386\u53f2\u8bb0\u5f55\u67e5\u8be2\u548c\u7ba1\u7406\u3002<br \/>\n- <strong>ManagementService<\/strong>\uff1a\u7528\u4e8e\u7ba1\u7406\u548c\u76d1\u63a7\u6d41\u7a0b\u5f15\u64ce\u7684\u7cfb\u7edf\u529f\u80fd\uff0c\u5982\u4f5c\u4e1a\u7684\u67e5\u8be2\u548c\u6267\u884c\u3002<\/p>\n<p><\/div><\/div>\n<h2>\u65b0\u589e<\/h2>\n<blockquote>\n<p>\u8fd9\u91cc\u6211\u662f\u5c06\u65b0\u589e\u548c\u6d41\u7a0b\u56fe\u8bbe\u8ba1\u5206\u5f00\u6765\uff0c\u9996\u5148\u5148\u65b0\u589e\u4e00\u4e2a\u6d41\u7a0b\u6a21\u578b\uff08\u5305\u62ec\u6d41\u7a0b\u6807\u8bc6\u3001\u6d41\u7a0b\u540d\u79f0\u3001\u6d41\u7a0b\u5206\u7c7b\u7b49\uff09\uff0c\u7136\u540e\u518d\u6b64\u57fa\u7840\u4e0a\u8fdb\u884c\u6d41\u7a0b\u56fe\u7684\u8bbe\u8ba1\u3002<\/p>\n<\/blockquote>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987058993_202501272210626.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987058993_202501272210626.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">@Transactional\n@Override\npublic void insert(WfModelDTO wfModelDTO) {\n    \/\/ \u521b\u5efa\u4e00\u4e2a\u6a21\u578b\uff0cModel\u662f\u7531flowable\u63d0\u4f9b\u7684\n    Model model = repositoryService.newModel();\n    model.setCategory(wfModelDTO.getCategory());\n    model.setKey(wfModelDTO.getKey());\n    model.setName(wfModelDTO.getName());\n    model.setVersion(1);\n    \/\/ \u521b\u5efa\u4e00\u4e2aModelMetaInfo\u5bf9\u8c61\uff0cMetaInfo \u662f Flowable \u4e2d\u7684 Model \u5bf9\u8c61\u7684\u4e00\u4e2a\u5c5e\u6027\uff0c\u901a\u5e38\u7528\u6765\u5b58\u50a8\u6a21\u578b\u7684\u5143\u6570\u636e\u4fe1\u606f\u3002\u8fd9\u4e9b\u5143\u6570\u636e\u901a\u5e38\u4ee5 JSON \u683c\u5f0f\u5b58\u50a8\uff0c\u7528\u6765\u63cf\u8ff0\u6a21\u578b\u7684\u989d\u5916\u4fe1\u606f\uff0c\u5305\u62ec\u6a21\u578b\u7684\u63cf\u8ff0\u4fe1\u606f\u3001\u7248\u672c\u53f7\u3001\u4f5c\u8005\u6216\u521b\u5efa\u8005\u7684\u540d\u5b57\u3001\u521b\u5efa\u65f6\u95f4\u6216\u6700\u540e\u4fee\u6539\u65f6\u95f4\u3001\u5176\u4ed6\u81ea\u5b9a\u4e49\u7684\u5143\u6570\u636e\u4fe1\u606f\n    ModelMetaInfoBO modelMetaInfoBO = new ModelMetaInfoBO();\n    modelMetaInfoBO.setCreateUser(&quot;admin&quot;);\n    modelMetaInfoBO.setCreateTime(new Date());\n    modelMetaInfoBO.setVersion(1);\n    modelMetaInfoBO.setDesc(wfModelDTO.getDesc());\n\n    model.setMetaInfo(JSON.toJSONString(modelMetaInfoBO));\n    \/\/ \u901a\u8fc7RepositoryService\u4fdd\u5b58\n    repositoryService.saveModel(model);\n}<\/code><\/pre>\n<h2>\u8bbe\u8ba1<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987067331_202501272210627.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987067331_202501272210627.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u5c31\u662f\u5bf9\u65b0\u589e\u7684\u6d41\u7a0b\u6a21\u578b\u8fdb\u884c\u6d41\u7a0b\u56fe\u8bbe\u8ba1\uff0c\u6d41\u7a0b\u56fe\u662f\u4ee5xml\u683c\u5f0f\u8fdb\u884c\u4fdd\u5b58\u7684\u3002<\/p>\n<pre><code class=\"language-java\">\/**\n * \u8fd9\u91cc\u8981\u8fd9\u6837\u7406\u89e3\uff0c\u8bbe\u8ba1\u6d41\u7a0b\u56fe\u4e0d\u80fd\u662f\u5728\u539f\u6765\u7684\u57fa\u7840\u4e0a\u4fee\u6539\uff0c\u800c\u662f\u65b0\u589e\uff0c\u5bf9\u7248\u672c\u53f7+1\uff0c\u7136\u540e\u4fdd\u5b58\uff0c\u8fd9\u91cc\u53ef\u4ee5\u770b\u5b9e\u9645\u9700\u6c42\uff0c\u6709\u4e9b\u4e1a\u52a1\u8ba4\u4e3a\u8bbe\u8ba1\u6d41\u7a0b\u56fe\u4e5f\u662f\u7b97\u5bf9\u6d41\u7a0b\u7684\u4e00\u6b21\u4fee\u6539\uff0c\u6240  * \u4ee5\u8fd9\u91cc\u770b\u81ea\u5df1\u4e1a\u52a1\u9700\u6c42\u51b3\u5b9a\n *\n * @param wfModelDTO\n *\/\n@Override\n@Transactional\npublic void saveBpmnXml(WfBpmnModelDTO wfModelDTO) {\n    \/\/\u67e5\u8be2\u6a21\u578b\u4fe1\u606f\n    String modelId = wfModelDTO.getModeId();\n    Model model = repositoryService.getModel(modelId);\n    if (ObjectUtil.isNull(model)) {\n        throw new ServiceException(&quot;\u6d41\u7a0b\u6a21\u578b\u4e0d\u5b58\u5728\uff01&quot;);\n    }\n    if (StrUtil.isBlank(wfModelDTO.getBpmnXml())) {\n        throw new RuntimeException(&quot;\u83b7\u53d6\u6a21\u578b\u8bbe\u8ba1\u56fe\u5931\u8d25\uff01&quot;);\n    }\n    BpmnModel bpmnModel = ModelUtils.getBpmnModel(wfModelDTO.getBpmnXml());\n    if (ObjectUtil.isNull(bpmnModel)) {\n        throw new RuntimeException(&quot;\u8bf7\u68c0\u67e5\u6d41\u7a0b\u8bbe\u8ba1\u56fe\uff01&quot;);\n    }\n    \/\/ \u83b7\u53d6\u5f00\u59cb\u8282\u70b9\uff0c\u56e0\u4e3a\u5728\u8bbe\u8ba1\u7684\u65f6\u5019\u5fc5\u987b\u8981\u8fdb\u884c\u8868\u5355\u7684\u7ed1\u5b9a\uff0c\u8868\u5355\u7684id\u4f1a\u5728\u5f00\u59cb\u8282\u70b9\u4e2d\u8fdb\u884c\u5c5e\u6027\u7684\u6dfb\u52a0\u6bd4\u5982\uff1a &lt;bpmn2:startEvent id=&quot;Event_11o3kf7&quot; name=&quot;\u5f00\u59cb\u8282\u70b9&quot; flowable:formKey=&quot;key_1827225021857669121&quot;&gt;\uff0c\u8fd9\u4e2akey_1827225021857669121\u5c31\u662fkey_\u8868\u5355ID\n    StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);\n    if (ObjectUtil.isNull(startEvent)) {\n        throw new RuntimeException(&quot;\u5f00\u59cb\u8282\u70b9\u4e0d\u5b58\u5728\uff0c\u8bf7\u68c0\u67e5\u6d41\u7a0b\u8bbe\u8ba1\u662f\u5426\u6709\u8bef\uff01&quot;);\n    }\n    \/\/ \u83b7\u53d6\u8868\u5355id\n    String formKey = startEvent.getFormKey();\n    if (StrUtil.isBlank(formKey)) {\n        throw new RuntimeException(&quot;\u8bf7\u914d\u7f6e\u6d41\u7a0b\u8868\u5355&quot;);\n    }\n\n    Model newModel = model;\n    \/\/ \u5982\u679c\u662f\u7b2c\u4e00\u6b21\u8bbe\u8ba1\u56fe\uff0c\u6d41\u7a0b\u7248\u672c\u4e0d\u65b0\u589e\n    if (Boolean.TRUE.equals(wfModelDTO.getNewVersion())) {\n        \/\/ \u5982\u679c\u5f53\u524d\u7248\u672c\u4e0d\u662f1\uff0c\u521b\u5efa\u65b0\u7248\u672c\n        newModel = repositoryService.newModel();\n        newModel.setName(model.getName());\n        newModel.setKey(model.getKey());\n        newModel.setCategory(model.getCategory());\n        Integer latestVersion = model.getVersion() + 1;\n        ModelMetaInfoBO modelMetaInfoBO = JSON.parseObject(model.getMetaInfo(), ModelMetaInfoBO.class);\n        long formId = Long.parseLong(StrUtil.removePrefix(formKey, &quot;key_&quot;));\n        modelMetaInfoBO.setFormId(formId);\n        newModel.setMetaInfo(rebuildMetaInfo(modelMetaInfoBO, latestVersion));\n        newModel.setVersion(latestVersion);\n    }\n    repositoryService.saveModel(newModel);\n    \/\/ \u4fdd\u5b58\u6d41\u7a0b\u56fe\n    byte[] xmlByte = StrUtil.bytes(wfModelDTO.getBpmnXml(), CharsetUtil.UTF_8);\n    repositoryService.addModelEditorSource(newModel.getId(), xmlByte);\n}<\/code><\/pre>\n<h2>\u5386\u53f2<\/h2>\n<blockquote>\n<p>\u6bcf\u4e00\u6b21\u7684\u4fee\u6539\u90fd\u8981\u8fdb\u884c\u4e00\u6b21\u7248\u672c\u53f7\u7684\u7684\u53d8\u66f4\uff0c\u6211\u4eec\u9700\u8981\u770b\u5230\u6240\u6709\u7684\u5386\u53f2\u8bbe\u8ba1<\/p>\n<\/blockquote>\n<pre><code class=\"language-java\">@Override\npublic TableDataInfo&lt;WfModelVo&gt; historyList(WfModelDTO wfModelDTO, PageQuery pageQuery) {\n    \/\/ \u6839\u636e\u5f53\u524d\u6a21\u578b\u7684key\u6784\u5efa\u6a21\u578b\u67e5\u8be2\u5668\uff0c\u5e76\u5bf9\u7248\u672c\u53f7\u5012\u5e8f\n    ModelQuery modelQuery = repositoryService.createModelQuery()\n            .modelKey(wfModelDTO.getKey())\n            .orderByModelVersion()\n            .desc();\n\n    \/\/ TODO: \u76ee\u524d\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u5728\u5386\u53f2\u6a21\u578b\u4e2d\u8fdb\u884c\u6761\u4ef6\u68c0\u7d22\uff0c\u56e0\u4e3a\u5982\u679c\u5728modelQuery\u4e2d\u6dfb\u52a0\u68c0\u7d22\u6761\u4ef6\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6392\u9664\u7684\u7b2c\u4e00\u6761\u8bb0\u5f55\u4e0d\u662f\u6700\u65b0\u7684\u8bb0\u5f55\n    \/\/ \u53bb\u6389\u6700\u65b0\u7248\n    long pageTotal = modelQuery.count() - 1;\n    if (pageTotal &lt;= 0) {\n        return TableDataInfo.build();\n    }\n    int offset = (pageQuery.getPageNum() - 1) * pageQuery.getPageSize();\n\n    \/\/ \u5982\u679c\u662f\u7b2c\u4e00\u9875\uff0c\u5219\u8df3\u8fc7\u7b2c\u4e00\u6761\u8bb0\u5f55\n    if (pageQuery.getPageNum() == 1) {\n        offset += 1;\n    }\n    int pageSize = pageQuery.getPageSize();\n\n    \/\/ \u83b7\u53d6\u5206\u9875\u6570\u636e\n    List&lt;Model&gt; models = modelQuery.listPage(offset, pageSize);\n\n    \/\/ \u6784\u5efaWfModelVo\u5217\u8868\n    List&lt;WfModelVo&gt; list = buildModelVo(models, false);\n\n    \/\/ \u521b\u5efa\u5206\u9875\u5bf9\u8c61\n    Page&lt;WfModelVo&gt; page = new Page&lt;&gt;();\n    page.setTotal(pageTotal);\n    page.setRecords(list);\n\n    \/\/ \u6784\u5efaTableDataInfo\u5bf9\u8c61\u5e76\u8fd4\u56de\n    return TableDataInfo.build(page);\n}\n\n\/**\n * \u6784\u5efamodel\u5bf9\u8c61\n *\n * @param models  model\u96c6\u5408\n * @param bpmnXml \u662f\u5426\u9700\u8981\u5c01\u88c5bpmnXml\n * @return \u6a21\u578b\u96c6\u5408\n *\/\nprivate List&lt;WfModelVo&gt; buildModelVo(List&lt;Model&gt; models, boolean bpmnXml) {\n    return models.stream().map(model -&gt; {\n        WfModelVo wfModelVo = new WfModelVo();\n\n        \/\/ \u8bbe\u7f6e\u6a21\u578bID\n        wfModelVo.setModelId(model.getId());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u540d\u79f0\n        wfModelVo.setModelName(model.getName());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u952e\n        wfModelVo.setModelKey(model.getKey());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u5206\u7c7b\n        wfModelVo.setCategory(model.getCategory());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u7248\u672c\n        wfModelVo.setVersion(model.getVersion());\n\n        String metaInfo = model.getMetaInfo();\n        if (StrUtil.isNotBlank(metaInfo)) {\n            \/\/ \u89e3\u6790\u5143\u6570\u636e\u4fe1\u606f\n            ModelMetaInfoBO modelMetaInfoBO = JSON.parseObject(metaInfo, ModelMetaInfoBO.class);\n\n            \/\/ \u8bbe\u7f6e\u6a21\u578b\u63cf\u8ff0\n            wfModelVo.setDescription(modelMetaInfoBO.getDesc());\n            \/\/ \u8bbe\u7f6e\u8868\u5355ID\n            wfModelVo.setFormId(modelMetaInfoBO.getFormId());\n            \/\/ \u8bbe\u7f6e\u521b\u5efa\u65f6\u95f4\n            wfModelVo.setCreateTime(modelMetaInfoBO.getCreateTime());\n            \/\/ \u8bbe\u7f6e\u66f4\u65b0\u65f6\u95f4\n            wfModelVo.setUpdateTime(modelMetaInfoBO.getUpdateTime());\n            \/\/ \u8bbe\u7f6e\u521b\u5efa\u7528\u6237\n            wfModelVo.setCreateUser(modelMetaInfoBO.getCreateUser());\n            \/\/ \u8bbe\u7f6e\u66f4\u65b0\u7528\u6237\n            wfModelVo.setUpdateUser(modelMetaInfoBO.getUpdateUser());\n        }\n\n        if (bpmnXml) {\n            \/\/ \u83b7\u53d6\u6a21\u578b\u7f16\u8f91\u5668\u7684\u6e90\u6570\u636e\n            byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId());\n            \/\/ \u5c06\u5b57\u8282\u6570\u7ec4\u8f6c\u6362\u4e3aUTF-8\u5b57\u7b26\u4e32\n            String bpmn = StrUtil.utf8Str(modelEditorSource);\n            \/\/ \u8bbe\u7f6eBPMN XML\n            wfModelVo.setBpmnXml(bpmn);\n        }\n\n        return wfModelVo;\n    }).collect(Collectors.toList());\n}<\/code><\/pre>\n<h2>\u6700\u65b0<\/h2>\n<p>\u6839\u636e\u5386\u53f2\u5217\u8868\u4e2d\u7684\u6a21\u578b\uff0c\u9009\u62e9\u4e00\u4e2a\u8fdb\u884c\u8bbe\u7f6e\u4e3a\u6700\u65b0\u7248\u672c\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987068545_202501272210628.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987068545_202501272210628.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">@Override\n@Transactional\npublic void latest(String modelId) {\n    \/\/ \u83b7\u53d6\u6a21\u578b\n    Model model = repositoryService.getModel(modelId);\n    if (ObjectUtil.isNull(model)) {\n        throw new ServiceException(&quot;\u6d41\u7a0b\u6a21\u578b\u4e0d\u5b58\u5728\uff01&quot;);\n    }\n    \/\/ \u83b7\u53d6\u6700\u65b0\u7684\u6a21\u578b\u7248\u672c\u53f7,\u6a21\u578b\u7684key\u662f\u4e0d\u53d8\u7684\n    String modelKey = model.getKey();\n    Model latestModel = repositoryService.createModelQuery().modelKey(modelKey).latestVersion().singleResult();\n    \/\/ \u5224\u65ad\u5f53\u524d\u6a21\u578b\u662f\u4e0d\u662f\u6700\u65b0\u7684\n    if (model.getVersion().equals(latestModel.getVersion())) {\n        throw new ServiceException(&quot;\u5f53\u524d\u6a21\u578b\u5c31\u662f\u6700\u65b0\u7248\u672c\uff01&quot;);\n    }\n    \/\/ \u6700\u65b0\u7248\u672c\u53f7\n    Integer latestVersion = latestModel.getVersion() + 1;\n    \/\/ \u5c06id\u8bbe\u7f6e\u4e3a\u7a7a\uff0c\u4fdd\u5b58\u4e3a\u65b0\u6a21\u578b\n    Model newModel = repositoryService.newModel();\n    newModel.setName(model.getName());\n    newModel.setKey(model.getKey());\n    newModel.setCategory(model.getCategory());\n    newModel.setVersion(latestVersion);\n    newModel.setMetaInfo(model.getName());\n    String metaInfo = model.getMetaInfo();\n    ModelMetaInfoBO modelMetaInfoBO = JSON.parseObject(metaInfo, ModelMetaInfoBO.class);\n    newModel.setMetaInfo(rebuildMetaInfo(modelMetaInfoBO, latestVersion));\n    \/\/ \u4fdd\u5b58\u6d41\u7a0b\u6a21\u578b\n    repositoryService.saveModel(newModel);\n}\n\n\/**\n * \u91cd\u6784MetaInfo\n *\n * @param modelMetaInfoBO \u6a21\u578b\u5143\u6570\u636e\u5bf9\u8c61\n * @param latestVersion   \u6700\u65b0\u7248\u672c\n * @return {@link ModelMetaInfoBO}\n *\/\nprivate static String rebuildMetaInfo(ModelMetaInfoBO modelMetaInfoBO, Integer latestVersion) {\n    if (ObjectUtil.isNull(modelMetaInfoBO)) {\n        return &quot;{}&quot;;\n    }\n    modelMetaInfoBO.setVersion(latestVersion);\n    modelMetaInfoBO.setUpdateTime(new Date());\n    modelMetaInfoBO.setUpdateUser(&quot;admin&quot;);\n    return JSON.toJSONString(modelMetaInfoBO);\n}<\/code><\/pre>\n<h2>\u90e8\u7f72<\/h2>\n<pre><code class=\"language-java\">@Override\npublic boolean deploy(String modelId) {\n    Model model = repositoryService.getModel(modelId);\n    if (ObjectUtil.isNull(model)) {\n        throw new ServiceException(&quot;\u6d41\u7a0b\u6a21\u578b\u4e0d\u5b58\u5728\uff01&quot;);\n    }\n\n    \/\/ \u4ee5\u5b57\u8282\u6570\u7ec4\u8fd4\u56de\u6d41\u7a0b\u8bbe\u8ba1\u56fe\n    byte[] bpmXmlByte = repositoryService.getModelEditorSource(modelId);\n    if (ArrayUtil.isEmpty(bpmXmlByte)) {\n        throw new ServiceException(&quot;\u8bf7\u5148\u8bbe\u8ba1\u6d41\u7a0b\u56fe\uff01&quot;);\n    }\n\n    \/\/ \u5c06\u5b57\u8282\u6570\u7ec4\u8f6c\u6362\u4e3aUTF-8\u7f16\u7801\u7684\u5b57\u7b26\u4e32\n    String xml = StrUtil.utf8Str(bpmXmlByte);\n\n    \/\/ \u89e3\u6790\u6d41\u7a0b\u8bbe\u8ba1\u56fe\u7684\u5b57\u7b26\u4e32\uff0c\u83b7\u53d6BpmnModel\u5bf9\u8c61\n    BpmnModel bpmnModel = ModelUtils.getBpmnModel(xml);\n\n    \/\/ \u83b7\u53d6\u6d41\u7a0b\u540d\u79f0\uff0c\u5e76\u52a0\u4e0a\u540e\u7f00\n    String processName = model.getName() + ProcessConstants.SUFFIX;\n\n    \/\/ \u521b\u5efa\u90e8\u7f72\u5bf9\u8c61\uff0c\u5e76\u8bbe\u7f6e\u76f8\u5173\u5c5e\u6027\n    Deployment deployment = repositoryService.createDeployment()\n            .category(model.getCategory())\n            .name(model.getName())\n            .key(model.getKey())\n            .addBpmnModel(processName, bpmnModel)\n            .deploy();\n\n    \/\/ \u521b\u5efa\u4e00\u4e2a\u67e5\u8be2\u6d41\u7a0b\u5bf9\u8c61\uff0c\u6839\u636e\u90e8\u7f72ID\u67e5\u8be2\uff0c\u5982\u679c\u4e0d\u6784\u5efa\u8fd9\u4e2a\u5bf9\u8c61\uff0c\u4ee5\u540e\u90e8\u7f72\u7684\u6d41\u7a0b\u65e0\u6cd5\u67e5\u8be2\n    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()\n            .deploymentId(deployment.getId())\n            .singleResult();\n\n    \/\/ \u4fee\u6539\u6d41\u7a0b\u5b9a\u4e49\u7684\u5206\u7c7b\uff0c\u4ee5\u4fbf\u4e8e\u641c\u7d22\n    repositoryService.setProcessDefinitionCategory(processDefinition.getId(), model.getCategory());\n\n    \/\/ \u8bbe\u7f6e\u6d41\u7a0b\u53d1\u8d77\u7684\u6743\u9650\uff0c\u8fd9\u91cc\u90fd\u662f\u5047\u6570\u636e\n    \/\/ \u7528\u6237\n    repositoryService.addCandidateStarterUser(processDefinition.getId(), &quot;123L&quot;);\n\n    \/\/ \u7ec4\n    repositoryService.addCandidateStarterGroup(processDefinition.getId(), &quot;321L&quot;);\n\n    \/\/ \u4fdd\u5b58\u90e8\u7f72\u8868\u5355\n    return wfDeployService.saveInternalDeployForm(deployment.getId(), bpmnModel);\n}\n\n\/**\n * \u4fdd\u5b58\u5185\u90e8\u90e8\u7f72\u8868\u5355\u4fe1\u606f\uff0c\u8fd9\u91cc\u4e0d\u4f7f\u7528flowable\u63d0\u4f9b\u7684form\u8868\uff0c\u9700\u8981\u81ea\u5df1\u521b\u5efa\u4e24\u5f20\u8868 tb_form\u3001tb_deploy_form\n *\n * @param deployId \u90e8\u7f72ID\n * @param bpmnModel BPMN\u6a21\u578b\n * @return \u4fdd\u5b58\u662f\u5426\u6210\u529f\n * @throws ServiceException \u5982\u679c\u5f00\u59cb\u8282\u70b9\u4e0d\u5b58\u5728\uff0c\u629b\u51fa\u6b64\u5f02\u5e38\n * @Transactional(rollbackFor = Exception.class) \u5982\u679c\u5728\u6267\u884c\u65b9\u6cd5\u65f6\u53d1\u751f\u5f02\u5e38\uff0c\u5219\u56de\u6eda\u4e8b\u52a1\n *\/\n@Override\n@Transactional(rollbackFor = Exception.class)\npublic boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel) {\n    \/\/ \u83b7\u53d6\u6bcf\u4e2a\u8282\u70b9\u4e0a\u7684form\u8868\u5355ID\u8fdb\u884c\u4fdd\u5b58\n    List&lt;WfDeployForm&gt; deployFormList = new ArrayList&lt;&gt;();\n    \/\/ \u83b7\u53d6\u5f00\u59cb\u8282\u70b9\n    StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);\n    if (ObjectUtil.isNull(startEvent)) {\n        throw new ServiceException(&quot;\u5f00\u59cb\u8282\u70b9\u4e0d\u5b58\u5728\uff0c\u8bf7\u68c0\u67e5\u6d41\u7a0b\u8bbe\u8ba1\u662f\u5426\u6709\u8bef\uff01&quot;);\n    }\n    \/\/ \u4fdd\u5b58\u5f00\u59cb\u8282\u70b9\u8868\u5355\u4fe1\u606f\n    WfDeployForm startDeployForm = buildDeployForm(deployId, startEvent);\n    if (ObjectUtil.isNotNull(startDeployForm)) {\n        deployFormList.add(startDeployForm);\n    }\n    \/\/ \u4fdd\u5b58\u7528\u6237\u8282\u70b9\u8868\u5355\u4fe1\u606f\n    Collection&lt;UserTask&gt; userTasks = ModelUtils.getAllUserTaskEvent(bpmnModel);\n    if (CollUtil.isNotEmpty(userTasks)) {\n        for (UserTask userTask : userTasks) {\n            WfDeployForm userTaskDeployForm = buildDeployForm(deployId, userTask);\n            if (ObjectUtil.isNotNull(userTaskDeployForm)) {\n                deployFormList.add(userTaskDeployForm);\n            }\n        }\n    }\n    \/\/ \u6279\u91cf\u65b0\u589e\u90e8\u7f72\u6d41\u7a0b\u548c\u8868\u5355\u5173\u8054\u4fe1\u606f\n    return wfDeployFormMapper.insertBatch(deployFormList);\n}<\/code><\/pre>\n<div  class='collapse-block shadow-sm collapse-block-warning collapsed hide-border-left'><div class='collapse-block-title'><span class='collapse-block-title-inner'>\u62d3\u5c55<\/span><i class='collapse-icon fa fa-angle-down'><\/i><\/div><div class='collapse-block-body' style='display:none;'><\/p>\n<table>\n<tr>\n<th>Column Name<\/th>\n<th>Type<\/th>\n<th>Comment<\/th>\n<\/tr>\n<tr>\n<td>deploy_id<\/td>\n<td>varchar(64)<\/td>\n<td>\u6d41\u7a0b\u5b9e\u4f8b\u4e3b\u952e<\/td>\n<\/tr>\n<tr>\n<td>form_key<\/td>\n<td>varchar(64)<\/td>\n<td>\u8868\u5355Key<\/td>\n<\/tr>\n<tr>\n<td>node_key<\/td>\n<td>varchar(64)<\/td>\n<td>\u8282\u70b9Key<\/td>\n<\/tr>\n<tr>\n<td>form_name<\/td>\n<td>varchar(64)<\/td>\n<td>\u8868\u5355\u540d\u79f0<\/td>\n<\/tr>\n<tr>\n<td>node_name<\/td>\n<td>varchar(255)<\/td>\n<td>\u8282\u70b9\u540d\u79f0<\/td>\n<\/tr>\n<tr>\n<td>content<\/td>\n<td>longtext<\/td>\n<td>\u8868\u5355\u5185\u5bb9<\/td>\n<\/tr>\n<\/table>\n<table>\n<tr>\n<th>Column Name<\/th>\n<th>Type<\/th>\n<th>Comment<\/th>\n<\/tr>\n<tr>\n<td>id<\/td>\n<td>bigint<\/td>\n<td>\u8868\u5355\u4e3b\u952e<\/td>\n<\/tr>\n<tr>\n<td>name<\/td>\n<td>varchar(64)<\/td>\n<td>\u8868\u5355\u540d\u79f0<\/td>\n<\/tr>\n<tr>\n<td>content<\/td>\n<td>longtext<\/td>\n<td>\u8868\u5355\u5185\u5bb9<\/td>\n<\/tr>\n<tr>\n<td>create_by<\/td>\n<td>varchar(64)<\/td>\n<td>\u521b\u5efa\u8005<\/td>\n<\/tr>\n<tr>\n<td>create_time<\/td>\n<td>datetime<\/td>\n<td>\u521b\u5efa\u65f6\u95f4<\/td>\n<\/tr>\n<tr>\n<td>update_by<\/td>\n<td>varchar(64)<\/td>\n<td>\u66f4\u65b0\u8005<\/td>\n<\/tr>\n<tr>\n<td>update_time<\/td>\n<td>datetime<\/td>\n<td>\u66f4\u65b0\u65f6\u95f4<\/td>\n<\/tr>\n<tr>\n<td>desc<\/td>\n<td>varchar(255)<\/td>\n<td>\u5907\u6ce8<\/td>\n<\/tr>\n<tr>\n<td>del_flag<\/td>\n<td>char(1)<\/td>\n<td>\u5220\u9664\u6807\u5fd7\uff080\u4ee3\u8868\u5b58\u5728 2\u4ee3\u8868\u5220\u9664\uff09<\/td>\n<\/tr>\n<\/table>\n<p><\/div><\/div>\n<h2>\u4fee\u6539<\/h2>\n<pre><code class=\"language-java\">@Override\n@Transactional\npublic void update(WfModelDTO wfModelDTO) {\n    String modelId = wfModelDTO.getId();\n    Model model = repositoryService.getModel(modelId);\n    if (ObjectUtil.isNull(model)) {\n        throw new ServiceException(&quot;\u6d41\u7a0b\u6a21\u578b\u4e0d\u5b58\u5728\uff01&quot;);\n    }\n    \/\/ \u5c06wfModelDTO\u7684\u5c5e\u6027\u590d\u5236\u5230model\u5bf9\u8c61\u4e2d\uff0c\u5ffd\u7565key\u5c5e\u6027\n    BeanUtil.copyProperties(wfModelDTO, model, CopyOptions.create(Model.class, true, &quot;key&quot;));\n\n    \/\/ \u83b7\u53d6model\u7684\u5143\u6570\u636e\u4fe1\u606f\n    \/\/ \u8fd9\u91cc\u5e76\u4e0d\u8bbe\u8ba1\u6d41\u7a0b\u7f16\u8f91\u56fe\u7f16\u8f91\uff0c\u7248\u672c\u4e0d\u589e\u52a0\n    String metaInfo = model.getMetaInfo();\n    ModelMetaInfoBO modelMetaInfoBO = JSON.parseObject(metaInfo, ModelMetaInfoBO.class);\n\n    \/\/ \u5982\u679cwfModelDTO\u7684desc\u4e0d\u4e3a\u7a7a\uff0c\u5219\u66f4\u65b0modelMetaInfoBO\u7684desc\n    if (StrUtil.isNotBlank(wfModelDTO.getDesc())) {\n        modelMetaInfoBO.setDesc(wfModelDTO.getDesc());\n    }\n\n    \/\/ \u5982\u679cwfModelDTO\u7684category\u4e0d\u4e3a\u7a7a\uff0c\u5219\u66f4\u65b0modelMetaInfoBO\u7684category\n    if (StrUtil.isNotBlank(wfModelDTO.getCategory())) {\n        modelMetaInfoBO.setCategory(wfModelDTO.getCategory());\n    }\n\n    \/\/ \u8bbe\u7f6e\u66f4\u65b0\u7528\u6237\u4e3a&quot;admin&quot;\n    modelMetaInfoBO.setUpdateUser(&quot;admin&quot;);\n\n    \/\/ \u8bbe\u7f6e\u66f4\u65b0\u65f6\u95f4\u4e3a\u5f53\u524d\u65f6\u95f4\n    modelMetaInfoBO.setUpdateTime(new Date());\n\n    \/\/ \u5c06\u66f4\u65b0\u540e\u7684modelMetaInfoBO\u8f6c\u4e3aJSON\u5b57\u7b26\u4e32\uff0c\u5e76\u8bbe\u7f6e\u7ed9model\u7684metaInfo\u5c5e\u6027\n    model.setMetaInfo(JSON.toJSONString(modelMetaInfoBO));\n\n    \/\/ \u4fdd\u5b58\u66f4\u65b0\u540e\u7684model\u5bf9\u8c61\n    repositoryService.saveModel(model);\n}<\/code><\/pre>\n<h2>\u5220\u9664<\/h2>\n<pre><code class=\"language-java\">@Transactional\n@Override\npublic void deleteByIds(List&lt;String&gt; ids) {\n    for (String id : ids) {\n        Model model = repositoryService.getModel(id);\n        if (ObjectUtil.isNull(model)) {\n            throw new ServiceException(&quot;\u6d41\u7a0b\u6a21\u578b\u4e0d\u5b58\u5728\uff01&quot;);\n        }\n        repositoryService.deleteModel(id);\n    }\n}<\/code><\/pre>\n<h2>\u67e5\u8be2<\/h2>\n<pre><code class=\"language-java\">@Override\npublic TableDataInfo&lt;WfModelVo&gt; list(WfModelDTO wfModelDTO, PageQuery pageQuery) {\n    \/\/ \u6784\u5efa\u4e00\u4e2a\u67e5\u8be2\u5bf9\u8c61\uff0c\u67e5\u8be2\u6700\u65b0\u7684\u7248\u672c\uff0c\u5386\u53f2\u7248\u672c\u5728\u5355\u72ec\u7684\u5386\u53f2\u5206\u652f\u67e5\u770b\n    ModelQuery modelQuery = repositoryService.createModelQuery().latestVersion();\n    \/\/ \u6309\u7167\u521b\u5efa\u65f6\u95f4\u964d\u5e8f\u6392\u5217\n    modelQuery.orderByCreateTime().desc();\n\n    \/\/ \u6784\u5efa\u67e5\u8be2\u6761\u4ef6\n    \/\/ \u5982\u679c\u6d41\u7a0b\u6a21\u578bkey\u4e0d\u4e3a\u7a7a\uff0c\u5219\u6dfb\u52a0\u67e5\u8be2\u6761\u4ef6\n    if (StrUtil.isNotBlank(wfModelDTO.getKey())) {\n        modelQuery.modelKey(wfModelDTO.getKey());\n    }\n    \/\/ \u5982\u679c\u6d41\u7a0b\u6a21\u578b\u540d\u79f0\u4e0d\u4e3a\u7a7a\uff0c\u5219\u6dfb\u52a0\u6a21\u7cca\u67e5\u8be2\u6761\u4ef6\n    if (StrUtil.isNotBlank(wfModelDTO.getName())) {\n        modelQuery.modelNameLike(&quot;%&quot; + wfModelDTO.getName() + &quot;%&quot;);\n    }\n    \/\/ \u5982\u679c\u6d41\u7a0b\u6a21\u578b\u5206\u7c7b\u4e0d\u4e3a\u7a7a\uff0c\u5219\u6dfb\u52a0\u6a21\u7cca\u67e5\u8be2\u6761\u4ef6\n    if (StrUtil.isNotBlank(wfModelDTO.getCategory())) {\n        modelQuery.modelCategoryLike(&quot;%&quot; + wfModelDTO.getCategory() + &quot;%&quot;);\n    }\n\n    \/\/ \u67e5\u8be2\u603b\u6570\n    long count = modelQuery.count();\n    \/\/ \u5982\u679c\u6ca1\u6709\u8bb0\u5f55\uff0c\u5219\u8fd4\u56de\u7a7a\u7684TableDataInfo\u5bf9\u8c61\n    if (count &lt;= 0) {\n        return TableDataInfo.build();\n    }\n\n    \/\/ \u8ba1\u7b97\u504f\u79fb\u91cf\n    int offset = (pageQuery.getPageNum() - 1) * pageQuery.getPageSize();\n\n    \/\/ \u6267\u884c\u5206\u9875\u67e5\u8be2\n    List&lt;Model&gt; models = modelQuery.listPage(offset, pageQuery.getPageSize());\n\n    \/\/ \u5c06\u67e5\u8be2\u7ed3\u679c\u8f6c\u6362\u4e3aWfModelVo\u5217\u8868\n    List&lt;WfModelVo&gt; modelVos = buildModelVo(models, false);\n\n    \/\/ \u521b\u5efa\u5206\u9875\u5bf9\u8c61\uff0c\u5e76\u8bbe\u7f6e\u603b\u8bb0\u5f55\u6570\u548c\u8bb0\u5f55\u5217\u8868\n    Page&lt;WfModelVo&gt; page = new Page&lt;&gt;();\n    page.setTotal(count);\n    page.setRecords(modelVos);\n\n    \/\/ \u8fd4\u56de\u5305\u542b\u5206\u9875\u4fe1\u606f\u7684TableDataInfo\u5bf9\u8c61\n    return TableDataInfo.build(page);\n}\n\/**\n * \u6784\u5efamodel\u5bf9\u8c61\n *\n * @param models  model\u96c6\u5408\n * @param bpmnXml \u662f\u5426\u9700\u8981\u5c01\u88c5bpmnXml\n * @return \u6a21\u578b\u96c6\u5408\n *\/\nprivate List&lt;WfModelVo&gt; buildModelVo(List&lt;Model&gt; models, boolean bpmnXml) {\n    return models.stream().map(model -&gt; {\n        WfModelVo wfModelVo = new WfModelVo();\n\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u4fe1\u606f\n        \/\/ \u8bbe\u7f6e\u6a21\u578bID\n        wfModelVo.setModelId(model.getId());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u540d\u79f0\n        wfModelVo.setModelName(model.getName());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u952e\n        wfModelVo.setModelKey(model.getKey());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u5206\u7c7b\n        wfModelVo.setCategory(model.getCategory());\n        \/\/ \u8bbe\u7f6e\u6a21\u578b\u7248\u672c\n        wfModelVo.setVersion(model.getVersion());\n\n        String metaInfo = model.getMetaInfo();\n        if (StrUtil.isNotBlank(metaInfo)) {\n            \/\/ \u89e3\u6790\u5143\u6570\u636e\u4fe1\u606f\n            ModelMetaInfoBO modelMetaInfoBO = JSON.parseObject(metaInfo, ModelMetaInfoBO.class);\n\n            \/\/ \u8bbe\u7f6e\u6a21\u578b\u8be6\u7ec6\u4fe1\u606f\n            \/\/ \u8bbe\u7f6e\u6a21\u578b\u63cf\u8ff0\n            wfModelVo.setDescription(modelMetaInfoBO.getDesc());\n            \/\/ \u8bbe\u7f6e\u8868\u5355ID\n            wfModelVo.setFormId(modelMetaInfoBO.getFormId());\n            \/\/ \u8bbe\u7f6e\u521b\u5efa\u65f6\u95f4\n            wfModelVo.setCreateTime(modelMetaInfoBO.getCreateTime());\n            \/\/ \u8bbe\u7f6e\u66f4\u65b0\u65f6\u95f4\n            wfModelVo.setUpdateTime(modelMetaInfoBO.getUpdateTime());\n            \/\/ \u8bbe\u7f6e\u521b\u5efa\u7528\u6237\n            wfModelVo.setCreateUser(modelMetaInfoBO.getCreateUser());\n            \/\/ \u8bbe\u7f6e\u66f4\u65b0\u7528\u6237\n            wfModelVo.setUpdateUser(modelMetaInfoBO.getUpdateUser());\n        }\n\n        if (bpmnXml) {\n            \/\/ \u5982\u679c\u9700\u8981\u5c01\u88c5bpmnXml\uff0c\u5219\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\n            \/\/ \u83b7\u53d6\u6a21\u578b\u7f16\u8f91\u5668\u7684\u6e90\u6570\u636e\n            byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId());\n            \/\/ \u5c06\u5b57\u8282\u6570\u7ec4\u8f6c\u6362\u4e3aUTF-8\u5b57\u7b26\u4e32\n            String bpmn = StrUtil.utf8Str(modelEditorSource);\n            \/\/ \u8bbe\u7f6eBPMN XML\n            wfModelVo.setBpmnXml(bpmn);\n        }\n\n        return wfModelVo;\n    }).collect(Collectors.toList());\n}<\/code><\/pre>\n<h1>\u6d41\u7a0b\u90e8\u7f72<\/h1>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987072593_202501272210629.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987072593_202501272210629.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<h2>\u67e5\u8be2<\/h2>\n<pre><code class=\"language-java\">@Override\npublic TableDataInfo&lt;WfDeployVo&gt; queryPageList(ProcessQuery processQuery, PageQuery pageQuery) {\n    \/\/ \u6bd4\u5982\u8fd9\u91cc\u67e5\u8be2\u51fa\u6765\u7528\u6237\u7684id\u548c\u7ec4\n    String userId = &quot;123L&quot;;\n    String groupId = &quot;321L&quot;;\n    \/\/ \u521b\u5efa\u67e5\u8be2\u5bf9\u8c61\n    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()\n            .startableByUserOrGroups(userId, Collections.singleton(groupId))\n            .latestVersion()\n            .orderByProcessDefinitionKey()\n            .desc();\n    \/\/ \u5c01\u88c5\u67e5\u8be2\u6761\u4ef6\n    ProcessUtils.buildProcessSearch(processDefinitionQuery, processQuery);\n    long total = processDefinitionQuery.count();\n    if (total &lt;= 0) {\n        return TableDataInfo.build();\n    }\n    int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);\n    int pageSize = pageQuery.getPageSize();\n    List&lt;ProcessDefinition&gt; processDefinitionList = processDefinitionQuery.listPage(offset, pageSize);\n\n    \/\/ \u6279\u91cf\u67e5\u8be2\u90e8\u7f72\u6d41\u7a0b\n    List&lt;Deployment&gt; deployments = repositoryService.createDeploymentQuery().deploymentIds(processDefinitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList())).list();\n    List&lt;WfDeployVo&gt; list = processDefinitionList.stream().map(processDefinition -&gt; {\n        \/\/ \u67e5\u8be2\u90e8\u7f72\n        WfDeployVo wfDeployVo = new WfDeployVo();\n        wfDeployVo.setProcessDefId(processDefinition.getId());\n        wfDeployVo.setProcessDefKey(processDefinition.getKey());\n        wfDeployVo.setProcessDefName(processDefinition.getName());\n        wfDeployVo.setVersion(processDefinition.getVersion());\n        wfDeployVo.setCategory(processDefinition.getCategory());\n        wfDeployVo.setDeployId(processDefinition.getDeploymentId());\n        wfDeployVo.setSuspended(processDefinition.isSuspended());\n        Deployment deployment = CollUtil.findOne(deployments, d -&gt; d.getId().equals(processDefinition.getDeploymentId()));\n        wfDeployVo.setDeployTime(deployment.getDeploymentTime());\n        return wfDeployVo;\n    }).collect(Collectors.toList());\n    Page&lt;WfDeployVo&gt; page = new Page();\n    page.setTotal(total);\n    page.setRecords(list);\n    return TableDataInfo.build(page);\n}<\/code><\/pre>\n<h2>\u7248\u672c\u7ba1\u7406<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987079751_202501272210630.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987079751_202501272210630.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"image-20240928103634572\" \/><\/div><\/p>\n<pre><code class=\"language-java\">\/\/ \u8fd9\u91cc\u4f1a\u4e00\u5e76\u67e5\u8be2\u51fa\u5f53\u524d\u90e8\u7f72\u7684\u6240\u6709\u7248\u672c\u4fe1\u606f\uff0c\u5305\u62ec\u6700\u65b0\u7684\n@Override\npublic TableDataInfo&lt;WfDeployVo&gt; queryPublishList(String processKey, PageQuery pageQuery) {\n    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()\n            .processDefinitionKey(processKey)\n            .orderByProcessDefinitionVersion()\n            .desc();\n    long total = processDefinitionQuery.count();\n    if (total &lt;= 0) {\n        return TableDataInfo.build();\n    }\n    \/\/ \u6839\u636e\u67e5\u8be2\u6761\u4ef6\uff0c\u67e5\u8be2\u6240\u6709\u7248\u672c\n    int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);\n    int pageSize = pageQuery.getPageSize();\n\n    List&lt;ProcessDefinition&gt; list = processDefinitionQuery.listPage(offset, pageSize);\n    \/\/\u67e5\u8be2\u90e8\u7f72\u4fe1\u606f\n    List&lt;Deployment&gt; deployments = repositoryService.createDeploymentQuery().deploymentIds(list.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList())).list();\n    if (CollUtil.isEmpty(deployments)) {\n        throw new ServiceException(&quot;\u90e8\u7f72\u4fe1\u606f\u6709\u8bef!&quot;);\n    }\n    Map&lt;String, Date&gt; dateMap = deployments.stream().collect(Collectors.toMap(deployment -&gt; deployment.getId(), deployment -&gt; deployment.getDeploymentTime()));\n    List&lt;WfDeployVo&gt; wfDeployVos = list.stream().map(item -&gt; {\n        WfDeployVo vo = new WfDeployVo();\n        vo.setProcessDefId(item.getId());\n        vo.setProcessDefKey(item.getKey());\n        vo.setProcessDefName(item.getName());\n        vo.setVersion(item.getVersion());\n        vo.setCategory(item.getCategory());\n        vo.setDeployId(item.getDeploymentId());\n        vo.setSuspended(item.isSuspended());\n        vo.setDeployTime(dateMap.get(item.getDeploymentId()));\n        return vo;\n    }).collect(Collectors.toList());\n    Page&lt;WfDeployVo&gt; page = new Page&lt;&gt;();\n    page.setRecords(wfDeployVos);\n    page.setTotal(total);\n    return TableDataInfo.build(page);\n}<\/code><\/pre>\n<h2>\u5220\u9664<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u6839\u636e\u90e8\u7f72ID\u5217\u8868\u5220\u9664\u90e8\u7f72\n *\n * @param list \u90e8\u7f72ID\u5217\u8868\n * @return \u65e0\u8fd4\u56de\u503c\n *\/\n@Override\n@Transactional\npublic void deleteByIds(List&lt;String&gt; list) {\n    for (String deployId : list) {\n        repositoryService.deleteDeployment(deployId, true);\n    }\n}<\/code><\/pre>\n<h2>\u6fc0\u6d3b\/\u6302\u8d77<\/h2>\n<pre><code class=\"language-java\">\/**\n * \u66f4\u65b0\u6d41\u7a0b\u5b9a\u4e49\u72b6\u6001\n *\n * @param definitionId \u6d41\u7a0b\u5b9a\u4e49ID\n * @param state \u6d41\u7a0b\u5b9a\u4e49\u72b6\u6001\uff08ACTIVE\u6fc0\u6d3b\u6216SUSPENDED\u6302\u8d77\uff09\n * @throws IllegalArgumentException \u5982\u679cstate\u53c2\u6570\u4e0d\u4e3aACTIVE\u6216SUSPENDED\u5219\u629b\u51fa\u6b64\u5f02\u5e38\n *\/\n@Override\n@Transactional\npublic void updateState(String definitionId, String state) {\n    if (SuspensionState.ACTIVE.toString().equals(state)) {\n        \/\/ \u6fc0\u6d3b\n        repositoryService.activateProcessDefinitionById(definitionId, true, null);\n    } else if (SuspensionState.SUSPENDED.toString().equals(state)) {\n        \/\/ \u6302\u8d77\n        repositoryService.suspendProcessDefinitionById(definitionId, true, null);\n    }\n}<\/code><\/pre>\n<h1>\u65b0\u5efa\u6d41\u7a0b<\/h1>\n<h2>\u67e5\u8be2<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987080070_202501272210631.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987080070_202501272210631.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">\/**\n * \u67e5\u8be2\u6d41\u7a0b\u5b9a\u4e49\u5217\u8868\uff0c\u8fd9\u91cc\u8981\u67e5\u8be2\u6700\u65b0\u7248\u672c\u5e76\u4e14\u662f\u6709\u53d1\u8d77\u6743\u9650\u7684\u6d41\u7a0b\n *\n * @param processQuery \u6d41\u7a0b\u67e5\u8be2\u5bf9\u8c61\n * @param pageQuery    \u5206\u9875\u67e5\u8be2\u5bf9\u8c61\n * @return \u6d41\u7a0b\u5b9a\u4e49\u5217\u8868\n *\/\n@Override\npublic TableDataInfo&lt;WfDefinitionVo&gt; selectPageStartProcessList(ProcessQuery processQuery, PageQuery pageQuery) {\n    String userId = &quot;123L&quot;;\n    String groupId = &quot;321L&quot;;\n    \/\/ \u521b\u5efa\u67e5\u8be2\u5bf9\u8c61\n    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()\n            .latestVersion()                \/\/\u6700\u65b0\u7248\u672c\n            .active()                       \/\/\u6d3b\u8dc3\u72b6\u6001\n            .orderByProcessDefinitionKey()  \/\/\u6839\u636e\u6807\u8bc6\u6392\u5e8f\n            .startableByUserOrGroups(userId, Collections.singleton(groupId))  \/\/\u6743\u9650\n            .desc();\/\/\u5012\u53d9\n\n    \/\/ \u6784\u5efa\u67e5\u8be2\u53c2\u6570\n    ProcessUtils.buildProcessSearch(processDefinitionQuery, processQuery);\n    long pageTotal = processDefinitionQuery.count();\n    if (pageTotal &lt;= 0) {\n        return TableDataInfo.build();\n    }\n    int pageSize = pageQuery.getPageSize();\n    int offset = pageSize * (pageQuery.getPageNum() - 1);\n    List&lt;ProcessDefinition&gt; processDefinitions = processDefinitionQuery.listPage(offset, pageSize);\n    \/\/ \u67e5\u8be2\u90e8\u7f72\u65f6\u95f4\n    Map&lt;String, Date&gt; deployMap = new HashMap&lt;&gt;();\n    List&lt;Deployment&gt; deployments = repositoryService.createDeploymentQuery().deploymentIds(processDefinitions.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList())).list();\n    if (CollectionUtil.isNotEmpty(deployments)) {\n        deployMap = CollUtil.toMap(deployments, deployMap, Deployment::getId, Deployment::getDeploymentTime);\n    }\n    \/\/ \u5c01\u88c5\u5bf9\u8c61\n    List&lt;WfDefinitionVo&gt; wfDefinitionVos = new ArrayList&lt;&gt;();\n    for (ProcessDefinition processDefinition : processDefinitions) {\n        WfDefinitionVo vo = new WfDefinitionVo();\n        vo.setProcessDefinitionId(processDefinition.getId());\n        vo.setProcessDefinitionKey(processDefinition.getKey());\n        vo.setProcessDefinitionName(processDefinition.getName());\n        vo.setVersion(processDefinition.getVersion());\n        vo.setCategory(processDefinition.getCategory());\n        vo.setSuspended(processDefinition.isSuspended());\n        vo.setDeploymentTime(deployMap.get(processDefinition.getDeploymentId()));\n        wfDefinitionVos.add(vo);\n    }\n    Page&lt;WfDefinitionVo&gt; page = new Page&lt;&gt;();\n    page.setTotal(pageTotal);\n    page.setRecords(wfDefinitionVos);\n    return TableDataInfo.build(page);\n}<\/code><\/pre>\n<h2>\u53d1\u8d77<\/h2>\n<p>\u70b9\u51fb\u53d1\u8d77\u540e\uff0c\u9700\u8981\u586b\u5199\u8868\u5355\u5185\u5bb9\u9700\u8981\u5148\u67e5\u8be2\u51fa\u8868\u5355\u6570\u636e\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/image.eastfond.com\/file\/1737987077105_202501272210632.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/image.eastfond.com\/file\/1737987077105_202501272210632.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<pre><code class=\"language-java\">\/**\n * \u6839\u636e\u6d41\u7a0b\u5b9a\u4e49ID\u3001\u90e8\u7f72ID\u548c\u6d41\u7a0b\u5b9e\u4f8bID\u67e5\u8be2\u5bf9\u5e94\u7684\u6d41\u7a0b\u8868\u5355\u5185\u5bb9\n *\n * @param definitionId \u6d41\u7a0b\u5b9a\u4e49ID\n * @param deployId \u90e8\u7f72ID\n * @param procInsId \u6d41\u7a0b\u5b9e\u4f8bID\n * @return \u6d41\u7a0b\u8868\u5355\u5bf9\u8c61\n *\/\n@Override\npublic ProcessFormVo selectFormContent(String definitionId, String deployId, String procInsId) {\n    \/\/ \u521d\u59cb\u5316\u6d41\u7a0b\u8868\u5355\u5bf9\u8c61\n    ProcessFormVo processFormVo = new ProcessFormVo();\n    \/\/ \u6839\u636e\u6d41\u7a0b\u5b9a\u4e49ID\u83b7\u53d6BPMN\u6a21\u578b\n    BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId);\n    \/\/ \u5982\u679cBPMN\u6a21\u578b\u4e3a\u7a7a\uff0c\u5219\u629b\u51fa\u5f02\u5e38\n    if (ObjectUtil.isNull(bpmnModel)) throw new ServiceException(&quot;\u6d41\u7a0b\u56fe\u8bbe\u8ba1\u4e3a\u7a7a\uff01&quot;);\n    \/\/ \u4eceBPMN\u6a21\u578b\u4e2d\u83b7\u53d6\u5f00\u59cb\u4e8b\u4ef6\n    StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);\n    \/\/ \u5982\u679c\u5f00\u59cb\u4e8b\u4ef6\u4e3a\u7a7a\uff0c\u5219\u629b\u51fa\u5f02\u5e38\n    if (ObjectUtil.isNull(startEvent)) throw new ServiceException(&quot;\u6d41\u7a0b\u56fe\u4e2d\u6ca1\u6709\u5f00\u59cb\u8282\u70b9\uff0c\u8bf7\u68c0\u67e5\u6d41\u7a0b\u8bbe\u8ba1\uff01&quot;);\n    \/\/ \u6839\u636e\u90e8\u7f72ID\u548c\u5f00\u59cb\u4e8b\u4ef6\u7684\u4fe1\u606f\u67e5\u8be2\u5bf9\u5e94\u7684\u6d41\u7a0b\u8868\u5355\n    WfDeployForm wfDeployForm = wfDeployFormMapper.selectOne(new LambdaQueryWrapper&lt;&gt;(WfDeployForm.class)\n            .eq(WfDeployForm::getDeployId, deployId)\n            .eq(WfDeployForm::getFormKey, startEvent.getFormKey())\n            .eq(WfDeployForm::getNodeKey, startEvent.getId()));\n    \/\/ \u5982\u679c\u67e5\u8be2\u5230\u7684\u6d41\u7a0b\u8868\u5355\u4e3a\u7a7a\uff0c\u5219\u629b\u51fa\u5f02\u5e38\n    if (ObjectUtil.isNull(wfDeployForm)) throw new ServiceException(&quot;\u6d41\u7a0b\u8868\u5355\u4e3a\u7a7a\uff01&quot;);\n    \/\/ \u83b7\u53d6\u6d41\u7a0b\u8868\u5355\u7684\u5185\u5bb9\n    String formContent = wfDeployForm.getContent();\n    \/\/ \u5982\u679c\u8868\u5355\u5185\u5bb9\u4e3a\u7a7a\u6216\u4ec5\u5305\u542b\u7a7a\u767d\u5b57\u7b26\uff0c\u5219\u629b\u51fa\u5f02\u5e38\n    if (StrUtil.isBlank(formContent)) throw new ServiceException(&quot;\u83b7\u53d6\u6d41\u7a0b\u8868\u5355\u5931\u8d25\uff01&quot;);\n    \/\/ \u5c06\u8868\u5355\u5185\u5bb9\u89e3\u6790\u4e3aMap\u5bf9\u8c61\n    Map&lt;String, Object&gt; formModel = JSON.parseObject(formContent, Map.class);\n    \/\/ \u8bbe\u7f6e\u8868\u5355\u6309\u94ae\u7684\u663e\u793a\u72b6\u6001\u4e3a\u4e0d\u663e\u793a\n    processFormVo.setFormBtns(false);\n    \/\/ \u8bbe\u7f6e\u8868\u5355\u6a21\u578b\n    processFormVo.setFormModel(formModel);\n    \/\/ \u5982\u679c\u6d41\u7a0b\u5b9e\u4f8bID\u4e0d\u4e3a\u7a7a\uff0c\u5219\u6267\u884c\u4ee5\u4e0b\u903b\u8f91\n    if (StrUtil.isNotBlank(procInsId)) {\n        \/\/ \u6839\u636e\u6d41\u7a0b\u5b9e\u4f8bID\u67e5\u8be2\u5386\u53f2\u6d41\u7a0b\u5b9e\u4f8b\u4fe1\u606f\uff0c\u5e76\u5305\u542b\u6d41\u7a0b\u53d8\u91cf\n        HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery()\n                .processInstanceId(procInsId)\n                .includeProcessVariables()\n                .singleResult();\n        \/\/ \u8bbe\u7f6e\u6d41\u7a0b\u8868\u5355\u7684\u6570\u636e\u4e3a\u5386\u53f2\u6d41\u7a0b\u5b9e\u4f8b\u4e2d\u7684\u6d41\u7a0b\u53d8\u91cf\n        processFormVo.setFormData(historicProcIns.getProcessVariables());\n    }\n    \/\/ \u8fd4\u56de\u6d41\u7a0b\u8868\u5355\u5bf9\u8c61\n    return processFormVo;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u91cc\u4f7f\u7528\u7684\u662fSpringBoot3.2+Flowable6.8.0\u3002\u8fc7\u7a0b\u4e2d\u6ca1\u6709\u4f7f\u7528\u5230Flowable UI \u6d41 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,4],"tags":[30],"class_list":["post-104","post","type-post","status-publish","format-standard","hentry","category-java","category-posts","tag-java"],"_links":{"self":[{"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/posts\/104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=104"}],"version-history":[{"count":10,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/posts\/104\/revisions"}],"predecessor-version":[{"id":461,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=\/wp\/v2\/posts\/104\/revisions\/461"}],"wp:attachment":[{"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.eastfond.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}