diff --git a/yanzhu-common/src/main/java/com/yanzhu/common/utils/StringUtils.java b/yanzhu-common/src/main/java/com/yanzhu/common/utils/StringUtils.java
index 2086a3b..60f698e 100644
--- a/yanzhu-common/src/main/java/com/yanzhu/common/utils/StringUtils.java
+++ b/yanzhu-common/src/main/java/com/yanzhu/common/utils/StringUtils.java
@@ -1,11 +1,10 @@
package com.yanzhu.common.utils;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.*;
+
+import io.netty.util.CharsetUtil;
import org.springframework.util.AntPathMatcher;
import com.yanzhu.common.constant.Constants;
import com.yanzhu.common.core.text.StrFormatter;
@@ -565,6 +564,105 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
return false;
}
+ /**
+ * 判断指定集合是否包含指定值,如果集合为空(null或者空),返回{@code false},否则找到元素返回{@code true}
+ *
+ * @param collection 集合
+ * @param value 需要查找的值
+ * @return 如果集合为空(null或者空),返回{@code false},否则找到元素返回{@code true}
+ * @throws ClassCastException 如果类型不一致会抛出转换异常
+ * @throws NullPointerException 当指定的元素 值为 null ,或集合类不支持null 时抛出该异常
+ * @see Collection#contains(Object)
+ * @since 4.1.10
+ */
+ public static boolean contains(Collection> collection, Object value) {
+ return isNotEmpty(collection) && collection.contains(value);
+ }
+
+ /**
+ * 将对象转为字符串
+ *
+ *
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 + * 2、对象数组会调用Arrays.toString方法 + *+ * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) { + return str(obj, CharsetUtil.UTF_8); + } + + /** + * 将对象转为字符串 + *
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 + * 2、对象数组会调用Arrays.toString方法 + *+ * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[]) { + return str((byte[]) obj, charset); + } else if (obj instanceof Byte[]) { + return str((Byte[]) obj, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } else if (isArray(obj)) { + return toString(obj); + } + + return obj.toString(); + } + + + /** + * 数组或集合转String + * + * @param obj 集合或数组对象 + * @return 数组字符串,与集合转字符串格式相同 + */ + public static String toString(Object obj) { + if (null == obj) { + return null; + } + if (obj instanceof long[]) { + return Arrays.toString((long[]) obj); + } else if (obj instanceof int[]) { + return Arrays.toString((int[]) obj); + } else if (obj instanceof short[]) { + return Arrays.toString((short[]) obj); + } else if (obj instanceof char[]) { + return Arrays.toString((char[]) obj); + } else if (obj instanceof byte[]) { + return Arrays.toString((byte[]) obj); + } else if (obj instanceof boolean[]) { + return Arrays.toString((boolean[]) obj); + } else if (obj instanceof float[]) { + return Arrays.toString((float[]) obj); + } else if (obj instanceof double[]) { + return Arrays.toString((double[]) obj); + } else if (isArray(obj)) { + // 对象数组 + try { + return Arrays.deepToString((Object[]) obj); + } catch (Exception ignore) { + //ignore + } + } + return obj.toString(); + } + /** * 判断url是否与规则配置: * ? 表示单个字符; diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/common/enums/FlowComment.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/common/enums/FlowComment.java index cd0dbcc..06aa8bf 100644 --- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/common/enums/FlowComment.java +++ b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/common/enums/FlowComment.java @@ -16,8 +16,8 @@ public enum FlowComment { REJECT("3", "驳回意见"), DELEGATE("4", "委派意见"), ASSIGN("5", "转办意见"), - STOP("6", "终止流程"); - + STOP("6", "终止流程"), + REVOKE("7", "撤回流程"); /** * 类型 */ diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowDefinitionController.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowDefinitionController.java index 2c974b0..70b11c8 100644 --- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowDefinitionController.java +++ b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowDefinitionController.java @@ -1,10 +1,12 @@ package com.yanzhu.flowable.controller; +import com.yanzhu.common.annotation.Log; import com.yanzhu.common.core.controller.BaseController; import com.yanzhu.common.core.domain.AjaxResult; import com.yanzhu.common.core.domain.entity.SysRole; import com.yanzhu.common.core.domain.entity.SysUser; import com.yanzhu.common.core.text.Convert; +import com.yanzhu.common.enums.BusinessType; import com.yanzhu.flowable.domain.FlowSaveXmlVo; import com.yanzhu.project.domain.ProProjectApply; import com.yanzhu.system.domain.flowable.FlowQueryVo; @@ -75,6 +77,7 @@ public class FlowDefinitionController extends BaseController { } @ApiOperation(value = "导入流程文件", notes = "上传bpmn20的xml文件") + @Log(title = "导入流程文件", businessType = BusinessType.INSERT) @PostMapping("/import") public AjaxResult importFile(@RequestParam(required = false) String name, @RequestParam(required = false) String category, @@ -136,6 +139,7 @@ public class FlowDefinitionController extends BaseController { } @ApiOperation(value = "保存流程设计器内的xml文件") + @Log(title = "保存流程设计", businessType = BusinessType.INSERT) @PostMapping("/save") public AjaxResult save(@RequestBody FlowSaveXmlVo vo) { InputStream in = null; @@ -159,6 +163,7 @@ public class FlowDefinitionController extends BaseController { @ApiOperation(value = "发起流程") + @Log(title = "发起流程申请", businessType = BusinessType.INSERT) @PostMapping("/start/{procDefId}") public AjaxResult start(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId, @ApiParam(value = "申请表单") @RequestBody ProProjectApply proProjectApply) { @@ -166,6 +171,7 @@ public class FlowDefinitionController extends BaseController { } @ApiOperation(value = "激活或挂起流程定义") + @Log(title = "激活/挂起流程", businessType = BusinessType.UPDATE) @PutMapping(value = "/updateState") public AjaxResult updateState(@ApiParam(value = "1:激活,2:挂起", required = true) @RequestParam Integer state, @ApiParam(value = "流程部署ID", required = true) @RequestParam String deployId) { @@ -174,6 +180,7 @@ public class FlowDefinitionController extends BaseController { } @ApiOperation(value = "删除流程") + @Log(title = "删除流程定义", businessType = BusinessType.UPDATE) @DeleteMapping(value = "/{deployIds}") public AjaxResult delete(@PathVariable String[] deployIds) { for (String deployId : deployIds) { diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java index 86f7cc5..8c68a8d 100644 --- a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java +++ b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/controller/FlowTaskController.java @@ -1,6 +1,8 @@ package com.yanzhu.flowable.controller; +import com.yanzhu.common.annotation.Log; import com.yanzhu.common.core.domain.AjaxResult; +import com.yanzhu.common.enums.BusinessType; import com.yanzhu.flowable.domain.FlowTaskDto; import com.yanzhu.system.domain.flowable.FlowQueryVo; import com.yanzhu.system.domain.flowable.FlowTaskVo; @@ -41,12 +43,14 @@ public class FlowTaskController { } @ApiOperation(value = "取消申请", response = FlowTaskDto.class) + @Log(title = "终止申请", businessType = BusinessType.UPDATE) @PostMapping(value = "/stopProcess") public AjaxResult stopProcess(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.stopProcess(flowTaskVo); } @ApiOperation(value = "撤回流程", response = FlowTaskDto.class) + @Log(title = "撤回流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/revokeProcess") public AjaxResult revokeProcess(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.revokeProcess(flowTaskVo); @@ -85,12 +89,14 @@ public class FlowTaskController { } @ApiOperation(value = "审批任务") + @Log(title = "审批流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/complete") public AjaxResult complete(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.complete(flowTaskVo); } @ApiOperation(value = "驳回任务") + @Log(title = "驳回流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/reject") public AjaxResult taskReject(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskReject(flowTaskVo); @@ -98,6 +104,7 @@ public class FlowTaskController { } @ApiOperation(value = "退回任务") + @Log(title = "退回流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/return") public AjaxResult taskReturn(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskReturn(flowTaskVo); @@ -111,6 +118,7 @@ public class FlowTaskController { } @ApiOperation(value = "删除任务") + @Log(title = "删除流程", businessType = BusinessType.DELETE) @DeleteMapping(value = "/delete") public AjaxResult delete(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.deleteTask(flowTaskVo); @@ -118,6 +126,7 @@ public class FlowTaskController { } @ApiOperation(value = "认领/签收任务") + @Log(title = "认领/签收流程", businessType = BusinessType.INSERT) @PostMapping(value = "/claim") public AjaxResult claim(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.claim(flowTaskVo); @@ -125,6 +134,7 @@ public class FlowTaskController { } @ApiOperation(value = "取消认领/签收任务") + @Log(title = "取消认领/签收流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/unClaim") public AjaxResult unClaim(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.unClaim(flowTaskVo); @@ -132,6 +142,7 @@ public class FlowTaskController { } @ApiOperation(value = "委派任务") + @Log(title = "委派流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/delegateTask") public AjaxResult delegate(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.delegateTask(flowTaskVo); @@ -139,6 +150,7 @@ public class FlowTaskController { } @ApiOperation(value = "任务归还") + @Log(title = "归还流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/resolveTask") public AjaxResult resolveTask(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.resolveTask(flowTaskVo); @@ -146,6 +158,7 @@ public class FlowTaskController { } @ApiOperation(value = "转办任务") + @Log(title = "转办流程", businessType = BusinessType.UPDATE) @PostMapping(value = "/assignTask") public AjaxResult assign(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.assignTask(flowTaskVo); diff --git a/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java new file mode 100644 index 0000000..b302b44 --- /dev/null +++ b/yanzhu-flowable/src/main/java/com/yanzhu/flowable/flow/ModelUtils.java @@ -0,0 +1,372 @@ +package com.yanzhu.flowable.flow; + +import com.yanzhu.common.utils.StringUtils; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.*; +import org.flowable.common.engine.impl.util.io.StringStreamSource; + +import java.util.*; + +/** + * @author KonBAI + * @createTime 2022/3/26 19:04 + */ +public class ModelUtils { + + private static final BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter(); + + /** + * xml转bpmnModel对象 + * + * @param xml xml + * @return bpmnModel对象 + */ + public static BpmnModel getBpmnModel(String xml) { + return bpmnXMLConverter.convertToBpmnModel(new StringStreamSource(xml), false, false); + } + + /** + * bpmnModel转xml字符串 + * + * @deprecated 存在会丢失 bpmn 连线问题 + * @param bpmnModel bpmnModel对象 + * @return xml字符串 + */ + @Deprecated + public static String getBpmnXmlStr(BpmnModel bpmnModel) { + return StringUtils.utf8Str(getBpmnXml(bpmnModel)); + } + + /** + * bpmnModel转xml对象 + * + * @deprecated 存在丢失 bpmn 连线问题 + * @param bpmnModel bpmnModel对象 + * @return xml + */ + @Deprecated + public static byte[] getBpmnXml(BpmnModel bpmnModel) { + return bpmnXMLConverter.convertToXML(bpmnModel); + } + + /** + * 根据节点,获取入口连线 + * + * @param source 起始节点 + * @return 入口连线列表 + */ + public static List