{"id":10006839,"date":"2022-11-08T21:21:50","date_gmt":"2022-11-08T13:21:50","guid":{"rendered":"https:\/\/ityet.com\/?p=10006839"},"modified":"2022-11-08T21:21:50","modified_gmt":"2022-11-08T13:21:50","slug":"flowable-%e5%b7%b2%e7%bb%8f%e6%89%a7%e8%a1%8c%e5%ae%8c%e6%af%95%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8e%bb%e5%93%aa%e6%89%be%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10006839","title":{"rendered":"Flowable \u5df2\u7ecf\u6267\u884c\u5b8c\u6bd5\u7684\u6d41\u7a0b\u53bb\u54ea\u627e\uff1f"},"content":{"rendered":"<p>@[toc]<br \/>\u5728\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\u677e\u54e5\u548c\u5c0f\u4f19\u4f34\u4eec\u804a\u8fc7\uff0c\u6b63\u5728\u6267\u884c\u7684\u6d41\u7a0b\u4fe1\u606f\u662f\u4fdd\u5b58\u5728\u4ee5 <code>ACT_RU_<\/code> \u4e3a\u524d\u7f00\u7684\u8868\u4e2d\uff0c\u6267\u884c\u5b8c\u6bd5\u7684\u6d41\u7a0b\u4fe1\u606f\u5219\u4fdd\u5b58\u5728\u4ee5 <code>ACT_HI_<\/code> \u4e3a\u524d\u7f00\u7684\u8868\u4e2d\uff0c\u4e5f\u5c31\u662f\u6d41\u7a0b\u5386\u53f2\u4fe1\u606f\u8868\uff0c\u5f53\u7136\u8fd9\u4e2a\u5386\u53f2\u4fe1\u606f\u8868\u7ee7\u7eed\u7ec6\u5206\u7684\u8bdd\uff0c\u8fd8\u6709\u597d\u591a\u79cd\uff0c\u4eca\u5929\u6211\u4eec\u5c31\u6765\u804a\u4e00\u804a\u8fd9\u4e2a\u8bdd\u9898\u3002<\/p>\n<p>\u5047\u8bbe\u6211\u6709\u5982\u4e0b\u4e00\u4e2a\u6d41\u7a0b\uff1a<\/p>\n<p><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042772982\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u5f53\u8fd9\u4e2a\u6d41\u7a0b\u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u4ee5 <code>ACT_RU_<\/code> \u4e3a\u524d\u7f00\u7684\u8868\u4e2d\u7684\u6570\u636e\u5747\u5df2\u6e05\u7a7a\uff0c\u73b0\u5728\u5982\u679c\u60f3\u67e5\u770b\u521a\u521a\u6267\u884c\u8fc7\u7684\u6d41\u7a0b\u4fe1\u606f\uff0c\u6211\u4eec\u5c31\u5f97\u53bb\u4ee5 <code>ACT_HI_<\/code> \u4e3a\u524d\u7f00\u7684\u8868\u4e2d\u3002<\/p>\n<h2>1. \u5386\u53f2\u6d41\u7a0b\u4fe1\u606f<\/h2>\n<p>\u5386\u53f2\u6d41\u7a0b\u4fe1\u606f\u67e5\u770b\uff0c\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test05() {\n    List&lt;HistoricProcessInstance&gt; list = historyService.createHistoricProcessInstanceQuery().finished().list();\n    for (HistoricProcessInstance hpi : list) {\n        logger.info(&quot;name:{},startTime:{},endTime:{}&quot;,hpi.getName(),hpi.getStartTime(),hpi.getEndTime());\n    }\n}<\/code><\/pre>\n<p>\u8c03\u7528\u7684\u65f6\u5019\u6267\u884c\u7684 <code>finished()<\/code> \u65b9\u6cd5\u8868\u793a\u67e5\u8be2\u5df2\u7ecf\u6267\u884c\u5b8c\u6bd5\u7684\u6d41\u7a0b\u4fe1\u606f\uff08\u4ece\u8fd9\u91cc\u4e5f\u53ef\u4ee5\u770b\u51fa\uff0c\u5bf9\u4e8e\u672a\u6267\u884c\u5b8c\u6bd5\u7684\u6d41\u7a0b\u4fe1\u606f\u4e5f\u4f1a\u4fdd\u5b58\u5728\u5386\u53f2\u8868\u4e2d\uff09\u3002<\/p>\n<p>\u6211\u4eec\u6765\u770b\u4e0b\u8fd9\u4e2a\u67e5\u8be2\u5bf9\u5e94\u7684 SQL\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ is not NULL order by RES.ID_ asc<\/code><\/pre>\n<p>\u4ece\u8fd9\u4e2a SQL \u4e2d\u53ef\u4ee5\u770b\u5230\uff0c\u8fd9\u4e2a\u67e5\u8be2\u672c\u8d28\u4e0a\u5c31\u662f\u67e5\u8be2\u7684 <code>ACT_HI_PROCINST<\/code> \u8868\u3002\u5982\u4e0b\u56fe\uff1a<\/p>\n<p><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042772983\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u5982\u679c\u6211\u4eec\u5728\u67e5\u8be2\u7684\u65f6\u5019\u4e0d\u9650\u5236\u6d41\u7a0b\u662f\u5426\u6267\u884c\u5b8c\u6bd5\uff0c\u90a3\u4e48\u6211\u4eec\u7684\u67e5\u8be2\u65b9\u6cd5\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test05() {\n    List&lt;HistoricProcessInstance&gt; list = historyService.createHistoricProcessInstanceQuery().list();\n    for (HistoricProcessInstance hpi : list) {\n        logger.info(&quot;name:{},startTime:{},endTime:{}&quot;,hpi.getName(),hpi.getStartTime(),hpi.getEndTime());\n    }\n}<\/code><\/pre>\n<p>\u5bf9\u5e94\u7684\u67e5\u8be2 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ order by RES.ID_ asc<\/code><\/pre>\n<p>\u548c\u524d\u9762\u7684 SQL \u76f8\u6bd4\uff0c\u540e\u9762\u7684 SQL \u5c11\u4e86 <code>WHERE RES.END_TIME_ is not NULL<\/code> \u6761\u4ef6\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5224\u65ad\u4e00\u4e2a\u6d41\u7a0b\u662f\u5426\u6267\u884c\u5b8c\u6bd5\uff0c\u5c31\u770b\u5b83\u7684 <code>END_TIME_<\/code> \u662f\u5426\u4e3a\u7a7a\uff0c\u4e0d\u4e3a\u7a7a\u5c31\u8868\u793a\u6d41\u7a0b\u5df2\u7ecf\u6267\u884c\u7ed3\u675f\u4e86\uff0c\u4e3a\u7a7a\u5c31\u8868\u793a\u6d41\u7a0b\u5c1a\u5728\u6267\u884c\u4e2d\u3002<\/p>\n<h2>2. \u5386\u53f2\u4efb\u52a1\u67e5\u8be2<\/h2>\n<p>\u521a\u521a\u6211\u4eec\u67e5\u8be2\u7684\u662f\u5386\u53f2\u6d41\u7a0b\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u770b\u4e0b\u5386\u53f2\u4efb\u52a1\uff0c\u4e5f\u5c31\u662f\u67e5\u8be2\u4e00\u4e2a\u6d41\u7a0b\u4e2d\u6267\u884c\u8fc7\u7684 Task \u4fe1\u606f\uff0c\u5982\u4e0b\u8868\u793a\u67e5\u8be2\u6240\u6709\u7684\u5386\u53f2\u6d41\u7a0b\u4efb\u52a1\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test06() {\n    List&lt;HistoricTaskInstance&gt; list = historyService.createHistoricTaskInstanceQuery().list();\n    for (HistoricTaskInstance hti : list) {\n        logger.info(&quot;name:{},assignee:{},createTime:{},endTime:{}&quot;,hti.getName(),hti.getAssignee(),hti.getCreateTime(),hti.getEndTime());\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u67e5\u8be2\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_TASKINST RES order by RES.ID_ asc<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u5386\u53f2\u4efb\u52a1\u8868\u5c31\u662f <code>ACT_HI_TASKINST<\/code>\uff0c\u5982\u4e0b\u56fe\uff1a<\/p>\n<p><img decoding=\"async\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000042772984\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u5f53\u7136\uff0c\u8fd9\u91cc\u8fd8\u6709\u5f88\u591a\u5176\u4ed6\u7684\u73a9\u6cd5\uff0c\u4f8b\u5982\u67e5\u8be2\u67d0\u4e00\u4e2a\u6d41\u7a0b\u5df2\u7ecf\u6267\u884c\u5b8c\u6bd5\u7684\u5386\u53f2\u4efb\u52a1\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test07() {\n    List&lt;HistoricProcessInstance&gt; instanceList = historyService.createHistoricProcessInstanceQuery().list();\n    for (HistoricProcessInstance hpi : instanceList) {\n        List&lt;HistoricTaskInstance&gt; list = historyService.createHistoricTaskInstanceQuery().processInstanceId(hpi.getId()).finished().list();\n        for (HistoricTaskInstance hti : list) {\n            logger.info(&quot;name:{},assignee:{},createTime:{},endTime:{}&quot;, hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime());\n        }\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u91cc\u8fb9\u7684\u67e5\u8be2\u5386\u53f2\u4efb\u52a1\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? and RES.END_TIME_ is not null order by RES.ID_ asc<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u8ddf\u524d\u9762\u76f8\u6bd4\uff0c\u591a\u4e86\u4e24\u4e2a\u6761\u4ef6\uff1a<\/p>\n<ol>\n<li>\u6d41\u7a0b\u5b9e\u4f8b ID<\/li>\n<li>\u6d41\u7a0b\u7ed3\u675f\u65f6\u95f4\u4e0d\u4e3a null<\/li>\n<\/ol>\n<p>\u4ece\u8fd9\u91cc\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff0c\u8fd9\u4e2a finish \u65b9\u6cd5\u7684\u6267\u884c\u903b\u8f91\u8ddf\u6211\u4eec\u524d\u9762\u8bb2\u7684\u662f\u4e00\u6837\u7684\u3002<\/p>\n<h2>3. \u5386\u53f2\u6d3b\u52a8\u67e5\u8be2<\/h2>\n<p>\u5386\u53f2\u4efb\u52a1\u5c31\u662f\u5404\u79cd Task\uff0c\u5386\u53f2\u6d3b\u52a8\u5219\u5305\u62ec\u8ddf\u591a\u5185\u5bb9\uff0c\u50cf\u5f00\u59cb\/\u7ed3\u675f\u8282\u70b9\uff0c\u8fde\u7ebf\u7b49\u7b49\u8fd9\u4e9b\u4fe1\u606f\u90fd\u7b97\u662f\u6d3b\u52a8\uff0c\u8fd9\u4e2a\u5728\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\u677e\u54e5\u5df2\u7ecf\u548c\u5927\u5bb6\u4ecb\u7ecd\u8fc7\u4e86\u3002<\/p>\n<p>\u67e5\u8be2\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test08() {\n    List&lt;HistoricActivityInstance&gt; list = historyService.createHistoricActivityInstanceQuery().list();\n    for (HistoricActivityInstance hai : list) {\n        logger.info(&quot;name:{},startTime:{},assignee:{},type:{}&quot;,hai.getActivityName(),hai.getStartTime(),hai.getAssignee(),hai.getActivityType());\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u67e5\u8be2\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_ACTINST RES order by RES.ID_ asc<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c<code>ACT_HI_ACTINST<\/code> \u8868\u4e2d\u4fdd\u5b58\u4e86\u5386\u53f2\u6d3b\u52a8\u4fe1\u606f\u3002<\/p>\n<h2>4. \u5386\u53f2\u53d8\u91cf\u67e5\u8be2<\/h2>\n<p>\u67e5\u8be2\u6d41\u7a0b\u6267\u884c\u7684\u5386\u53f2\u53d8\u91cf\uff0c\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test09() {\n    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();\n    List&lt;HistoricVariableInstance&gt; list = historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list();\n    for (HistoricVariableInstance hvi : list) {\n        logger.info(&quot;name:{},type:{},value:{}&quot;, hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u67e5\u8be2\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\u6d41\u7a0b\u7684\u5386\u53f2\u53d8\u91cf\u4fe1\u606f\u4fdd\u5b58\u5728 <code>ACT_HI_VARINST<\/code> \u8868\u4e2d\u3002<\/p>\n<h2>5. \u5386\u53f2\u65e5\u5fd7\u67e5\u8be2<\/h2>\n<p>\u6709\u7684\u5c0f\u4f19\u4f34\u770b\u5230\u65e5\u5fd7\u8fd9\u4e24\u4e2a\u5b57\u53ef\u80fd\u4f1a\u89c9\u5f97\u5947\u602a\uff0c\u54a6\uff1f\u6d41\u7a0b\u6267\u884c\u8fd8\u6709\u65e5\u5fd7\u5417\uff1f\u6ca1\u542c\u8bf4\u8fc7\u5440\uff01<\/p>\n<p>\u5176\u5b9e\u5386\u53f2\u65e5\u5fd7\u67e5\u8be2\u5c31\u662f\u524d\u9762\u90a3\u51e0\u79cd\u7684\u4e00\u4e2a\u96c6\u5927\u6210\u8005\uff0c\u7528\u6cd5\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test10() {\n    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();\n    ProcessInstanceHistoryLog historyLog = historyService.createProcessInstanceHistoryLogQuery(pi.getId())\n            \/\/\u5305\u62ec\u5386\u53f2\u6d3b\u52a8\n            .includeActivities()\n            \/\/\u5305\u62ec\u5386\u53f2\u4efb\u52a1\n            .includeTasks()\n            \/\/\u5305\u62ec\u5386\u53f2\u53d8\u91cf\n            .includeVariables()\n            .singleResult();\n    logger.info(&quot;id:{},startTime:{},endTime:{}&quot;, historyLog.getId(), historyLog.getStartTime(), historyLog.getEndTime());\n    List&lt;HistoricData&gt; historicData = historyLog.getHistoricData();\n    for (HistoricData data : historicData) {\n        if (data instanceof HistoricActivityInstance) {\n            HistoricActivityInstance hai = (HistoricActivityInstance) data;\n            logger.info(&quot;name:{},type:{}&quot;, hai.getActivityName(), hai.getActivityType());\n        }\n        if (data instanceof HistoricTaskInstance) {\n            HistoricTaskInstance hti = (HistoricTaskInstance) data;\n            logger.info(&quot;name:{},assignee:{}&quot;, hti.getName(), hti.getAssignee());\n        }\n        if (data instanceof HistoricVariableInstance) {\n            HistoricVariableInstance hvi = (HistoricVariableInstance) data;\n            logger.info(&quot;name:{},type:{},value:{}&quot;, hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());\n        }\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u91cc\u8fb9\uff0c\u9996\u5148\u662f\u67e5\u8be2\u57fa\u672c\u7684\u6d41\u7a0b\u65e5\u5fd7\u4fe1\u606f\uff0c\u8fd9\u4e2a\u672c\u8d28\u4e0a\u5c31\u662f\u67e5\u8be2\u5386\u53f2\u6d41\u7a0b\u5b9e\u4f8b\u4fe1\u606f\uff0c\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">select RES.*, DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ where PROC_INST_ID_ = ?<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\u6211\u5199\u4e86\u4e09\u4e2a include\uff0c\u6bcf\u4e00\u4e2a include \u90fd\u5bf9\u5e94\u4e00\u53e5 SQL\uff1a<\/p>\n<p>includeActivities \u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc<\/code><\/pre>\n<p>includeTasks \u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc<\/code><\/pre>\n<p>includeVariables \u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc<\/code><\/pre>\n<p>\u6700\u7ec8\u67e5\u8be2\u5b8c\u6210\u540e\uff0c\u8c03\u7528 <code>getHistoricData<\/code> \u65b9\u6cd5\u53ef\u4ee5\u67e5\u770b\u8fd9\u4e9b\u989d\u5916\u7684\u6570\u636e\uff0cList \u96c6\u5408\u4e2d\u5b58\u653e\u7684 HistoricData \u4e5f\u5206\u4e3a\u4e0d\u540c\u7684\u7c7b\u578b\uff1a<\/p>\n<ul>\n<li>includeActivities \u65b9\u6cd5\u5bf9\u5e94\u6700\u7ec8\u67e5\u8be2\u51fa\u6765\u7684\u7c7b\u578b\u662f HistoricActivityInstance\u3002<\/li>\n<li>includeTasks \u65b9\u6cd5\u5bf9\u5e94\u6700\u7ec8\u67e5\u8be2\u51fa\u6765\u7684\u7c7b\u578b\u662f HistoricTaskInstance\u3002<\/li>\n<li>includeVariables \u65b9\u6cd5\u5bf9\u5e94\u6700\u7ec8\u67e5\u8be2\u51fa\u6765\u7684\u7c7b\u578b\u662f HistoricVariableInstance\u3002<\/li>\n<\/ul>\n<p>\u5728\u904d\u5386\u7684\u65f6\u5019\u901a\u8fc7\u7c7b\u578b\u5224\u65ad\u53bb\u67e5\u770b\u5177\u4f53\u662f\u54ea\u4e00\u79cd\u53d8\u91cf\u7c7b\u578b\u3002<\/p>\n<p>\u7efc\u4e0a\uff0c\u8fd9\u4e2a\u5386\u53f2\u65e5\u5fd7\u67e5\u8be2\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u96c6\u5927\u6210\u8005\u3002<\/p>\n<h2>6. \u5386\u53f2\u6743\u9650\u67e5\u8be2<\/h2>\n<p>\u8fd9\u4e2a\u662f\u7528\u6765\u67e5\u8be2\u6d41\u7a0b\u6216\u8005\u4efb\u52a1\u7684\u5904\u7406\u4eba\uff0c\u4f8b\u5982\u67e5\u8be2\u6d41\u7a0b\u7684\u5904\u7406\u4eba\uff0c\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test11() {\n    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();\n    List&lt;HistoricIdentityLink&gt; links = historyService.getHistoricIdentityLinksForProcessInstance(pi.getId());\n    for (HistoricIdentityLink link : links) {\n        logger.info(&quot;userId:{}&quot;,link.getUserId());\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u662f\u67e5\u8be2\u6d41\u7a0b\u5bf9\u5e94\u7684\u5904\u7406\u4eba\uff0c\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">select * from ACT_HI_IDENTITYLINK where PROC_INST_ID_ = ?<\/code><\/pre>\n<p>\u5982\u679c\u60f3\u67e5\u8be2\u4efb\u52a1\u7684\u5904\u7406\u4eba\uff0c\u5bf9\u5e94\u7684\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test12() {\n    String taskName = &quot;\u63d0\u4ea4\u8bf7\u5047\u7533\u8bf7&quot;;\n    HistoricTaskInstance hti = historyService.createHistoricTaskInstanceQuery().taskName(taskName).singleResult();\n    List&lt;HistoricIdentityLink&gt; links = historyService.getHistoricIdentityLinksForTask(hti.getId());\n    for (HistoricIdentityLink link : links) {\n        logger.info(&quot;{} \u4efb\u52a1\u7684\u5904\u7406\u4eba\u662f {}&quot;,taskName,link.getUserId());\n    }\n}<\/code><\/pre>\n<p>\u8fd9\u4e2a\u67e5\u8be2\u5bf9\u5e94\u7684 SQL \u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"sql\">select * from ACT_HI_IDENTITYLINK where TASK_ID_ = ?<\/code><\/pre>\n<p>\u548c\u524d\u9762\u7684\u76f8\u6bd4\uff0c\u5176\u5b9e\u5c31\u591a\u4e86\u4e00\u4e2a\u67e5\u8be2\u6761\u4ef6 <code>TASK_ID_<\/code>\u3002<\/p>\n<h2>7. \u81ea\u5b9a\u4e49\u67e5\u8be2 SQL<\/h2>\n<p>\u548c\u524d\u9762\u8bb2\u7684\u5f88\u591a\u67e5\u8be2\u7c7b\u4f3c\uff0c\u5f53\u6211\u4eec\u5f04\u61c2\u4e86\u6bcf\u4e00\u4e2a\u5386\u53f2\u67e5\u8be2\u7684 API \u64cd\u4f5c\u7684\u662f\u54ea\u4e00\u4e2a\u6570\u636e\u8868\uff0c\u5c31\u4f1a\u53d1\u73b0\uff0c\u5386\u53f2\u6570\u636e\u7684\u67e5\u8be2\uff0c\u4e5f\u53ef\u4ee5\u81ea\u5b9a\u4e49 SQL\u3002<\/p>\n<p>\u4e3e\u4e2a\u4f8b\u5b50\u548c\u5c0f\u4f19\u4f34\u4eec\u770b\u4e0b\uff0c\u4f8b\u5982\u67e5\u8be2\u67d0\u4e00\u4e2a\u6d41\u7a0b\u5df2\u7ecf\u6267\u884c\u5b8c\u6bd5\u7684\u5386\u53f2\u4efb\u52a1\uff1a<\/p>\n<pre><code class=\"java\">@Test\nvoid test13() {\n    List&lt;HistoricProcessInstance&gt; instanceList = historyService.createHistoricProcessInstanceQuery().list();\n    for (HistoricProcessInstance hpi : instanceList) {\n        List&lt;HistoricTaskInstance&gt; list = historyService.createNativeHistoricTaskInstanceQuery()\n                .sql(&quot;SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = #{pid} and RES.END_TIME_ is not null order by RES.ID_ asc&quot;)\n                .parameter(&quot;pid&quot;,hpi.getId()).list();\n        for (HistoricTaskInstance hti : list) {\n            logger.info(&quot;name:{},assignee:{},createTime:{},endTime:{}&quot;, hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime());\n        }\n    }\n}<\/code><\/pre>\n<p>flowable \u5e95\u5c42\u662f MyBatis\uff0c\u6240\u6709 SQL \u4e2d\u53c2\u6570\u7684\u4f20\u9012\u5f62\u5f0f\u548c MyBatis \u4e00\u81f4\u3002<\/p>\n<h2>8. \u5386\u53f2\u6570\u636e\u8bb0\u5f55\u7ea7\u522b<\/h2>\n<p>Flowable \u9700\u8981\u8bb0\u5f55\u54ea\u4e9b\u5386\u53f2\u6570\u636e\uff0c\u6709\u4e00\u4e2a\u65e5\u5fd7\u7ea7\u522b\u7528\u6765\u63cf\u8ff0\u8fd9\u4e2a\u4e8b\u60c5\uff0c\u9ed8\u8ba4\u6709\u56db\u79cd\u7ea7\u522b\uff1a<\/p>\n<ul>\n<li>None: \u8fd9\u4e2a\u8868\u793a\u4e0d\u5b58\u50a8\u4efb\u4f55\u5386\u53f2\u4fe1\u606f\uff0c\u597d\u5904\u662f\u6d41\u7a0b\u6267\u884c\u7684\u65f6\u5019\u6548\u7387\u4f1a\u6bd4\u8f83\u5feb\uff0c\u574f\u5904\u662f\u6d41\u7a0b\u6267\u884c\u7ed3\u675f\u540e\uff0c\u770b\u4e0d\u5230\u66fe\u7ecf\u6267\u884c\u8fc7\u7684\u6d41\u7a0b\u4fe1\u606f\u4e86\u3002<\/li>\n<li>Activity: \u8fd9\u4e2a\u4f1a\u5b58\u50a8\u6240\u6709\u6d41\u7a0b\u5b9e\u4f8b\u548c\u6d3b\u52a8\u5b9e\u4f8b\uff0c\u5728\u6d41\u7a0b\u5b9e\u4f8b\u7ed3\u675f\u65f6\uff0c\u9876\u7ea7\u6d41\u7a0b\u5b9e\u4f8b\u53d8\u91cf\u7684\u6700\u65b0\u503c\u5c06\u590d\u5236\u5230\u5386\u53f2\u53d8\u91cf\u5b9e\u4f8b\u4e2d\uff0c\u4e0d\u4f1a\u5b58\u50a8\u8be6\u7ec6\u4fe1\u606f\u3002<\/li>\n<li>Audit: \u5728 Activity \u7684\u57fa\u7840\u4e0a\uff0c\u8fd8\u4f1a\u5b58\u50a8\u5386\u53f2\u8be6\u7ec6\u4fe1\u606f\uff0c\u5305\u62ec\u6743\u9650\u4fe1\u606f\u7b49\u3002\u9ed8\u8ba4\u7684\u65e5\u5fd7\u8bb0\u5f55\u7ea7\u522b\u5373\u6b21\u3002<\/li>\n<li>Full: \u8fd9\u4e2a\u662f\u5728 Audit \u7684\u57fa\u7840\u4e0a\uff0c\u8fd8\u4f1a\u5b58\u50a8\u53d8\u91cf\u7684\u53d8\u5316\u4fe1\u606f\uff0c\u8fd9\u4f1a\u8bb0\u5f55\u5927\u91cf\u7684\u6570\u636e\uff0c\u4e5f\u4f1a\u5bfc\u81f4\u6d41\u7a0b\u6267\u884c\u53d8\u6162\u3002<\/li>\n<\/ul>\n<p>\u4e00\u5171\u5c31\u8fd9\u56db\u79cd\u7ea7\u522b\uff0c\u5728 Spring Boot \u9879\u76ee\u4e2d\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\u914d\u7f6e\u8fd9\u4e2a\u65e5\u5fd7\u8bb0\u5f55\u7684\u7ea7\u522b\uff0c\u5176\u5b9e\u975e\u5e38\u65b9\u4fbf\uff0c\u76f4\u63a5\u5728 application.properties \u4e2d\u8fdb\u884c\u914d\u7f6e\u5373\u53ef\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"properties\">flowable.history-level=none<\/code><\/pre>\n<p>\u914d\u7f6e\u52a0\u4e86\u8fd9\u4e2a\u914d\u7f6e\uff0c\u6211\u4eec\u968f\u4fbf\u542f\u52a8\u4e00\u4e2a\u6d41\u7a0b\uff0c\u7136\u540e\u53bb\u67e5\u8be2 <code>ACT_HI_<\/code> \u7cfb\u5217\u7684\u8868\uff0c\u53d1\u73b0\u90fd\u662f\u7a7a\u7684\uff0c\u6ca1\u6709\u6570\u636e\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u5c06\u5386\u53f2\u65e5\u5fd7\u8bb0\u5f55\u7684\u7ea7\u522b\u6539\u4e3a activity\uff0c\u90a3\u4e48\u5c31\u4f1a\u8bb0\u5f55\u4e0b\u6765\u6d41\u7a0b\u4fe1\u606f\u4ee5\u53ca\u6d3b\u52a8\u4fe1\u606f\uff0c\u4f46\u662f\u50cf\u6267\u884c\u7684 Task \u8fd9\u4e9b\u4fe1\u606f\u90fd\u662f\u6ca1\u6709\u7684\uff08<code>ACT_HI_TASKINST<\/code>\uff09\uff0c\u5305\u62ec\u6d41\u7a0b\u53c2\u4e0e\u8005\u7684\u4fe1\u606f\uff08<code>ACT_HI_IDENTITYLINK<\/code>\uff09\u7b49\u90fd\u4e0d\u4f1a\u8bb0\u5f55\u4e0b\u6765\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u5c06\u5386\u53f2\u65e5\u5fd7\u8bb0\u5f55\u7684\u7ea7\u522b\u6539\u4e3a audit\uff0c\u5219\u4e0a\u9762\u63d0\u5230\u7684\u8fd9\u51e0\u79cd\u65e5\u5fd7\u5c31\u90fd\u4f1a\u8bb0\u5f55\u4e0b\u6765\u3002\u4f46\u662f <code>ACT_HI_DETAIL<\/code> \u8868\u8fd8\u662f\u7a7a\u7684\uff0c\u8be6\u7ec6\u4e00\u4e2a\u6d41\u7a0b\u53d8\u91cf\u7684\u53d8\u5316\u8fc7\u7a0b\u4e0d\u4f1a\u88ab\u8bb0\u5f55\u4e0b\u6765\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u5c06\u65e5\u5fd7\u8bb0\u5f55\u7ea7\u522b\u6539\u4e3a full\uff0c\u90a3\u4e48\u5c06\u4f1a\u8bb0\u5f55\u4e0b\u66f4\u591a\u7684\u4fe1\u606f\u3002<code>ACT_HI_DETAIL<\/code> \u8868\u4e2d\u4f1a\u8bb0\u5f55\u4e0b\u6d41\u7a0b\u53d8\u91cf\u7684\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<p>\u6574\u4e2a\u8fc7\u7a0b\u6211\u5c31\u4e0d\u7ed9\u5c0f\u4f19\u4f34\u4eec\u6f14\u793a\u4e86\u5927\u5bb6\u53ef\u4ee5\u81ea\u884c\u5c1d\u8bd5\u3002<\/p>\n<p>\u597d\u5566\uff0c\u5173\u4e8e\u5386\u53f2\u6570\u636e\u7684\u67e5\u8be2\uff0c\u677e\u54e5\u5148\u548c\u5c0f\u4f19\u4f34\u4eec\u804a\u8fd9\u4e48\u591a\uff5e\u4e0b\u7bc7\u6587\u7ae0\u6211\u4eec\u7ee7\u7eed\uff5e<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000042772980\">https:\/\/segmentfault.com\/a\/1190000042772980<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>@[toc]\u5728\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\u677e\u54e5\u548c\u5c0f\u4f19\u4f34\u4eec\u804a\u8fc7\uff0c\u6b63\u5728\u6267\u884c\u7684\u6d41\u7a0b\u4fe1\u606f\u662f\u4fdd\u5b58\u5728\u4ee5 ACT_RU_ \u4e3a\u524d\u7f00\u7684\u8868\u4e2d\uff0c\u6267\u884c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10006839","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006839","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10006839"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006839\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10006839"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10006839"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10006839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}