From 97e28f289b9d760cc823399b7edd48dbfd4023c6 Mon Sep 17 00:00:00 2001 From: xiefangzhen Date: Fri, 3 Jan 2025 10:40:19 +0800 Subject: [PATCH 001/112] fix filter logic --- .DS_Store | Bin 8196 -> 8196 bytes .../web/core/filter/ApiRequestFilter.java | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index 8406d508bca176e90b7f717667ad1c8f1a08dc3d..a0cc682e9fc0e78be316502f41253d0a2607da9a 100644 GIT binary patch delta 40 wcmZp1XmOa}&nUhzU^hRb_+}n~M8?g_1ryjNHdt+Dm-xoA*h($ delta 78 zcmZp1XmOa}&nU4mU^hRb#AY6WL`H31hDwG~h7^WGhI|HHhE#?MAS;)lfFXw=)iWnQ hIVmSUiGhJZfPsP8d2^g#KHFw?iEk{M4~wuf0{{e!6MO&w diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java index 8e78a3b727..3b84933e37 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java @@ -20,7 +20,8 @@ public abstract class ApiRequestFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) { // 只过滤 API 请求的地址 - return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAdminApi().getPrefix(), + String contextPath = request.getContextPath(); + return !StrUtil.startWithAny(request.getRequestURI().substring(contextPath.length()), webProperties.getAdminApi().getPrefix(), webProperties.getAppApi().getPrefix()); } From 4c8b83d46f378386e3cb3a0b3148a2a19e64cca1 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Fri, 3 Jan 2025 16:18:46 +0800 Subject: [PATCH 002/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E5=BB=B6=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/BpmBoundaryEventType.java | 3 +- .../enums/definition/BpmDelayTimerType.java | 30 ++++++++++++++ .../definition/BpmSimpleModelNodeType.java | 1 + .../vo/model/simple/BpmSimpleModelNodeVO.java | 17 ++++++++ .../core/listener/BpmTaskEventListener.java | 19 +++++---- .../flowable/core/util/SimpleModelUtils.java | 40 +++++++++++++++++++ .../bpm/service/task/BpmTaskService.java | 7 ++++ .../bpm/service/task/BpmTaskServiceImpl.java | 19 +++++++++ 8 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java index 537e03e03c..e6283849c1 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java @@ -13,7 +13,8 @@ import lombok.Getter; @AllArgsConstructor public enum BpmBoundaryEventType { - USER_TASK_TIMEOUT(1,"用户任务超时"); + USER_TASK_TIMEOUT(1,"用户任务超时"), + DELAY_TIMER_TIMEOUT(2,"触发器超时"); private final Integer type; private final String name; diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java new file mode 100644 index 0000000000..97388a813f --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.bpm.enums.definition; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * BPM 延时器类型枚举 + * + * @author Lesan + */ +@Getter +@AllArgsConstructor +public enum BpmDelayTimerType implements IntArrayValuable { + + FIXED_TIME_DURATION(1, "固定时长"), + FIXED_DATE_TIME(2, "固定日期时间"); + + private final Integer type; + private final String name; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmDelayTimerType::getType).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index 4a2e1d50f8..88c03fbe58 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -25,6 +25,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { START_USER_NODE(10, "发起人", "userTask"), // 发起人节点。前端的开始节点,Id 固定 APPROVE_NODE(11, "审批人", "userTask"), COPY_NODE(12, "抄送人", "serviceTask"), + DELAY_TIMER_NODE(13, "延迟器", "receiveTask"), // 50 ~ 条件分支 CONDITION_NODE(50, "条件", "sequenceFlow"), // 用于构建流转条件的表达式 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index fca7cd6d6c..ce116ae56c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -208,5 +208,22 @@ public class BpmSimpleModelNodeVO { private String rightSide; } + @Schema(description = "延迟器设置", example = "{}") + private DelaySetting delaySetting; + + @Schema(description = "延迟器") + @Data + @Valid + public static class DelaySetting { + + @Schema(description = "延迟时间类型", example = "1") + @NotNull(message = "延迟时间类型不能为空") + private Integer delayType; + + @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") + @NotEmpty(message = "延迟时间表达式不能为空") + private String delayTime; + } + // TODO @芋艿:条件;建议可以固化的一些选项;然后有个表达式兜底;要支持 } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java index fc113936fa..0add5f07ce 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -98,15 +98,20 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { String boundaryEventType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, BpmnModelConstants.BOUNDARY_EVENT_TYPE); BpmBoundaryEventType bpmTimerBoundaryEventType = BpmBoundaryEventType.typeOf(NumberUtils.parseInt(boundaryEventType)); - if (ObjectUtil.notEqual(bpmTimerBoundaryEventType, BpmBoundaryEventType.USER_TASK_TIMEOUT)) { - return; - } // 2. 处理超时 - String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, - BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); - String taskKey = boundaryEvent.getAttachedToRefId(); - taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); + // 2.1 用户任务超时处理 + if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.USER_TASK_TIMEOUT)) { + String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, + BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); + String taskKey = boundaryEvent.getAttachedToRefId(); + taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); + } + // 2.2 触发器超时处理 + if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT)) { + String taskKey = boundaryEvent.getAttachedToRefId(); + taskService.processDelayTimerTimeout(event.getProcessInstanceId(), taskKey); + } } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index ab64323757..eeab5cf0b8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -37,6 +37,7 @@ public class SimpleModelUtils { static { List converts = asList(new StartNodeConvert(), new EndNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), + new DelayTimerNodeConvert(), new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert()); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); } @@ -605,6 +606,45 @@ public class SimpleModelUtils { } + public static class DelayTimerNodeConvert implements NodeConvert { + + @Override + public List convertList(BpmSimpleModelNodeVO node) { + List flowElements = new ArrayList<>(2); + // 1. 构建接收任务,通过接收任务可卡住节点 + ReceiveTask receiveTask = new ReceiveTask(); + receiveTask.setId(node.getId()); + receiveTask.setName(node.getName()); + flowElements.add(receiveTask); + + // 2. 添加接收任务的 Timer Boundary Event + if (node.getDelaySetting() != null) { + // 2.1 定时器边界事件 + BoundaryEvent boundaryEvent = new BoundaryEvent(); + boundaryEvent.setId("Event-" + IdUtil.fastUUID()); + boundaryEvent.setCancelActivity(false); + boundaryEvent.setAttachedToRef(receiveTask); + // 2.2 定义超时时间 + TimerEventDefinition eventDefinition = new TimerEventDefinition(); + if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_DATE_TIME.getType())){ + eventDefinition.setTimeDuration(node.getDelaySetting().getDelayTime()); + } + if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())){ + eventDefinition.setTimeDate(node.getDelaySetting().getDelayTime()); + } + boundaryEvent.addEventDefinition(eventDefinition); + addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT.getType()); + flowElements.add(boundaryEvent); + } + return flowElements; + } + + @Override + public BpmSimpleModelNodeType getType() { + return BpmSimpleModelNodeType.DELAY_TIMER_NODE; + } + } + private static String buildGatewayJoinId(String id) { return id + "_join"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index 06b081953d..8fee0da5d8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -275,4 +275,11 @@ public interface BpmTaskService { */ void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType); + /** + * 处理 延时器 超时事件 + * + * @param processInstanceId 流程示例编号 + * @param taskDefineKey 任务 Key + */ + void processDelayTimerTimeout(String processInstanceId, String taskDefineKey); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 513ea53f2e..e885689e1d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -42,6 +42,7 @@ import org.flowable.engine.ManagementService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.DelegationState; import org.flowable.task.api.Task; @@ -1238,6 +1239,24 @@ public class BpmTaskServiceImpl implements BpmTaskService { })); } + @Override + public void processDelayTimerTimeout(String processInstanceId, String taskDefineKey) { + Execution execution = runtimeService.createExecutionQuery() + .processInstanceId(processInstanceId) + .activityId(taskDefineKey) + .singleResult(); + if (execution == null) { + log.error("[processDelayTimerTimeout][processInstanceId({})activityId({}) 没有找到执行活动]", + processInstanceId, taskDefineKey); + return; + } + // 若存在直接触发接收任务,执行后续节点 + // TODO @芋艿 这里需要帮助看一下,我不懂为啥开启了租户后就一直报错:不存在租户编号 + FlowableUtils.execute(execution.getTenantId(), () -> { + runtimeService.trigger(execution.getId()); + }); + } + /** * 获得自身的代理对象,解决 AOP 生效问题 * From e380bc34f36273a3eaba0b99d769f9eda3da8e24 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 3 Jan 2025 19:52:51 +0800 Subject: [PATCH 003/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=B7=A5=E4=BD=9C=E6=B5=81=EF=BC=9A=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=99=A8=20trigger=20=E6=97=B6=EF=BC=8C=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=20id=20=E4=B8=A2=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../candidate/BpmTaskCandidateInvoker.java | 57 ++++++++++--------- .../flowable/core/util/SimpleModelUtils.java | 3 +- .../bpm/service/task/BpmTaskServiceImpl.java | 9 ++- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java index 30e675bf05..952f0f1bea 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/BpmTaskCandidateInvoker.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskApproveTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -91,35 +92,39 @@ public class BpmTaskCandidateInvoker { */ @DataPermission(enable = false) // 忽略数据权限,避免因为过滤,导致找不到候选人 public Set calculateUsersByTask(DelegateExecution execution) { - // 审批类型非人工审核时,不进行计算候选人。原因是:后续会自动通过、不通过 - FlowElement flowElement = execution.getCurrentFlowElement(); - Integer approveType = BpmnModelUtils.parseApproveType(flowElement); - if (ObjectUtils.equalsAny(approveType, - BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType(), - BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { - return new HashSet<>(); - } + // 注意:解决极端情况下,Flowable 异步调用,导致租户 id 丢失的情况 + // 例如说,SIMPLE 延迟器在 trigger 的时候!!! + return FlowableUtils.execute(execution.getTenantId(), () -> { + // 审批类型非人工审核时,不进行计算候选人。原因是:后续会自动通过、不通过 + FlowElement flowElement = execution.getCurrentFlowElement(); + Integer approveType = BpmnModelUtils.parseApproveType(flowElement); + if (ObjectUtils.equalsAny(approveType, + BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType(), + BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) { + return new HashSet<>(); + } - // 1.1 计算任务的候选人 - Integer strategy = BpmnModelUtils.parseCandidateStrategy(flowElement); - String param = BpmnModelUtils.parseCandidateParam(flowElement); - Set userIds = getCandidateStrategy(strategy).calculateUsersByTask(execution, param); - // 1.2 移除被禁用的用户 - removeDisableUsers(userIds); + // 1.1 计算任务的候选人 + Integer strategy = BpmnModelUtils.parseCandidateStrategy(flowElement); + String param = BpmnModelUtils.parseCandidateParam(flowElement); + Set userIds = getCandidateStrategy(strategy).calculateUsersByTask(execution, param); + // 1.2 移除被禁用的用户 + removeDisableUsers(userIds); - // 2. 候选人为空时,根据“审批人为空”的配置补充 - if (CollUtil.isEmpty(userIds)) { - userIds = getCandidateStrategy(BpmTaskCandidateStrategyEnum.ASSIGN_EMPTY.getStrategy()) - .calculateUsersByTask(execution, param); - // ASSIGN_EMPTY 策略,不需要移除被禁用的用户。原因是,再移除,可能会出现更没审批人了!!! - } + // 2. 候选人为空时,根据“审批人为空”的配置补充 + if (CollUtil.isEmpty(userIds)) { + userIds = getCandidateStrategy(BpmTaskCandidateStrategyEnum.ASSIGN_EMPTY.getStrategy()) + .calculateUsersByTask(execution, param); + // ASSIGN_EMPTY 策略,不需要移除被禁用的用户。原因是,再移除,可能会出现更没审批人了!!! + } - // 3. 移除发起人的用户 - ProcessInstance processInstance = SpringUtil.getBean(BpmProcessInstanceService.class) - .getProcessInstance(execution.getProcessInstanceId()); - Assert.notNull(processInstance, "流程实例({}) 不存在", execution.getProcessInstanceId()); - removeStartUserIfSkip(userIds, flowElement, Long.valueOf(processInstance.getStartUserId())); - return userIds; + // 3. 移除发起人的用户 + ProcessInstance processInstance = SpringUtil.getBean(BpmProcessInstanceService.class) + .getProcessInstance(execution.getProcessInstanceId()); + Assert.notNull(processInstance, "流程实例({}) 不存在", execution.getProcessInstanceId()); + removeStartUserIfSkip(userIds, flowElement, Long.valueOf(processInstance.getStartUserId())); + return userIds; + }); } public Set calculateUsersByActivity(BpmnModel bpmnModel, String activityId, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index eeab5cf0b8..f4fd8c6d9e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -628,8 +628,7 @@ public class SimpleModelUtils { TimerEventDefinition eventDefinition = new TimerEventDefinition(); if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_DATE_TIME.getType())){ eventDefinition.setTimeDuration(node.getDelaySetting().getDelayTime()); - } - if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())){ + } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())){ eventDefinition.setTimeDate(node.getDelaySetting().getDelayTime()); } boundaryEvent.addEventDefinition(eventDefinition); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index e885689e1d..4d536d1f4b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1246,15 +1246,14 @@ public class BpmTaskServiceImpl implements BpmTaskService { .activityId(taskDefineKey) .singleResult(); if (execution == null) { - log.error("[processDelayTimerTimeout][processInstanceId({})activityId({}) 没有找到执行活动]", + log.error("[processDelayTimerTimeout][processInstanceId({}) activityId({}) 没有找到执行活动]", processInstanceId, taskDefineKey); return; } + // 若存在直接触发接收任务,执行后续节点 - // TODO @芋艿 这里需要帮助看一下,我不懂为啥开启了租户后就一直报错:不存在租户编号 - FlowableUtils.execute(execution.getTenantId(), () -> { - runtimeService.trigger(execution.getId()); - }); + FlowableUtils.execute(execution.getTenantId(), + () -> runtimeService.trigger(execution.getId())); } /** From 9512dcf812f22a582ff731572e5173d50d90631b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 3 Jan 2025 19:53:06 +0800 Subject: [PATCH 004/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=B7=A5=E4=BD=9C=E6=B5=81=EF=BC=9A=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=99=A8=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 2 +- .../flowable/core/listener/BpmTaskEventListener.java | 7 +++---- .../framework/flowable/core/util/FlowableUtils.java | 12 ++++++++++++ .../module/bpm/service/task/BpmTaskService.java | 1 + 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index ce116ae56c..6a4ec2c263 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -218,6 +218,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "延迟时间类型", example = "1") @NotNull(message = "延迟时间类型不能为空") + @InEnum(BpmDelayTimerType.class) private Integer delayType; @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") @@ -225,5 +226,4 @@ public class BpmSimpleModelNodeVO { private String delayTime; } - // TODO @芋艿:条件;建议可以固化的一些选项;然后有个表达式兜底;要支持 } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java index 0add5f07ce..134871b01a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -100,15 +100,14 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { BpmBoundaryEventType bpmTimerBoundaryEventType = BpmBoundaryEventType.typeOf(NumberUtils.parseInt(boundaryEventType)); // 2. 处理超时 - // 2.1 用户任务超时处理 if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.USER_TASK_TIMEOUT)) { + // 2.1 用户任务超时处理 String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); - } - // 2.2 触发器超时处理 - if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT)) { + // 2.2 触发器超时处理 + } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT)) { String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processDelayTimerTimeout(event.getProcessInstanceId(), taskKey); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 3eead33293..9742c08ed3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -5,6 +5,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; +import lombok.SneakyThrows; import org.flowable.common.engine.api.delegate.Expression; import org.flowable.common.engine.api.variable.VariableContainer; import org.flowable.common.engine.impl.el.ExpressionManager; @@ -67,6 +68,17 @@ public class FlowableUtils { } } + @SneakyThrows + public static V execute(String tenantIdStr, Callable callable) { + if (ObjectUtil.isEmpty(tenantIdStr) + || Objects.equals(tenantIdStr, ProcessEngineConfiguration.NO_TENANT_ID)) { + return callable.call(); + } else { + Long tenantId = Long.valueOf(tenantIdStr); + return TenantUtils.execute(tenantId, callable); + } + } + // ========== Execution 相关的工具方法 ========== /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index 8fee0da5d8..46ba1ef3bc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -282,4 +282,5 @@ public interface BpmTaskService { * @param taskDefineKey 任务 Key */ void processDelayTimerTimeout(String processInstanceId, String taskDefineKey); + } From 686a64ccda7d5079b5a6ff95ad019dcb12d52437 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 3 Jan 2025 19:53:11 +0800 Subject: [PATCH 005/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=B7=A5=E4=BD=9C=E6=B5=81=EF=BC=9A=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=99=A8=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/enums/definition/BpmBoundaryEventType.java | 4 ++-- .../yudao/module/bpm/enums/definition/BpmDelayTimerType.java | 5 +++-- .../module/bpm/enums/definition/BpmSimpleModelNodeType.java | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java index e6283849c1..1d3dd5e294 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java @@ -13,8 +13,8 @@ import lombok.Getter; @AllArgsConstructor public enum BpmBoundaryEventType { - USER_TASK_TIMEOUT(1,"用户任务超时"), - DELAY_TIMER_TIMEOUT(2,"触发器超时"); + USER_TASK_TIMEOUT(1, "用户任务超时"), + DELAY_TIMER_TIMEOUT(2, "触发器超时"); private final Integer type; private final String name; diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java index 97388a813f..1e0fc162d6 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java @@ -16,7 +16,7 @@ import java.util.Arrays; public enum BpmDelayTimerType implements IntArrayValuable { FIXED_TIME_DURATION(1, "固定时长"), - FIXED_DATE_TIME(2, "固定日期时间"); + FIXED_DATE_TIME(2, "固定日期"); private final Integer type; private final String name; @@ -27,4 +27,5 @@ public enum BpmDelayTimerType implements IntArrayValuable { public int[] array() { return ARRAYS; } -} + +} \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index 88c03fbe58..ac001cf3e0 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -25,7 +25,8 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { START_USER_NODE(10, "发起人", "userTask"), // 发起人节点。前端的开始节点,Id 固定 APPROVE_NODE(11, "审批人", "userTask"), COPY_NODE(12, "抄送人", "serviceTask"), - DELAY_TIMER_NODE(13, "延迟器", "receiveTask"), + + DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), // 50 ~ 条件分支 CONDITION_NODE(50, "条件", "sequenceFlow"), // 用于构建流转条件的表达式 From 182511b65b8bbf7b5e373018ec84ffbf65563b08 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Jan 2025 08:39:39 +0800 Subject: [PATCH 006/112] =?UTF-8?q?!162=20=E7=A7=BB=E9=99=A4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=B4=A6=E5=8F=B7=E6=AD=A3=E5=88=99=E6=A3=80=E9=AA=8C?= =?UTF-8?q?=E4=B8=AD=E9=95=BF=E5=BA=A6=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/admin/user/vo/user/UserSaveReqVO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index f196e651d8..bdcbe0a4da 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -23,7 +23,7 @@ public class UserSaveReqVO { @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao") @NotBlank(message = "用户账号不能为空") - @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Pattern(regexp = "^[a-zA-Z0-9]$", message = "用户账号由 数字、字母 组成") @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") @DiffLogField(name = "用户账号") private String username; From 8d22ed8bea2b1bdab0d90113bcaab0f3437a0734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=AE=87=E5=BA=86?= Date: Sat, 4 Jan 2025 03:39:33 +0000 Subject: [PATCH 007/112] =?UTF-8?q?!1156=20feat:=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E9=87=8D=E7=BD=AE=E5=90=8E=E5=8F=B0=E5=AF=86?= =?UTF-8?q?=E7=A0=81=20*=20feat:=20=E6=94=AF=E6=8C=81=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=90=8E=E5=8F=B0=E5=AF=86=E7=A0=81=20*=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E7=9A=84=E9=AA=8C=E8=AF=81=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 1 + .../module/system/enums/sms/SmsSceneEnum.java | 4 +- .../controller/admin/auth/AuthController.java | 30 +++++-- .../admin/auth/vo/AuthLoginReqVO.java | 14 +--- .../admin/auth/vo/AuthRegisterReqVO.java | 10 +-- .../admin/auth/vo/AuthResetPasswordReqVO.java | 32 ++++++++ .../admin/auth/vo/AuthSmsSendReqVO.java | 2 +- .../auth/vo/CaptchaVerificationReqVO.java | 22 ++++++ .../system/service/auth/AdminAuthService.java | 9 ++- .../service/auth/AdminAuthServiceImpl.java | 78 ++++++++++++++----- .../auth/AdminAuthServiceImplTest.java | 3 +- 11 files changed, 154 insertions(+), 51 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index c714d86a35..a3cc1cefa0 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -43,6 +43,7 @@ public interface ErrorCodeConstants { ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过租户最大租户配额({})!"); ErrorCode USER_IMPORT_INIT_PASSWORD = new ErrorCode(1_002_003_009, "初始密码不能为空"); + ErrorCode USER_MOBILE_NOT_EXISTS = new ErrorCode(1_002_003_010, "该手机号尚未注册"); // ========== 部门模块 1-002-004-000 ========== ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java index 225685d1ba..32b9e6d492 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java @@ -21,7 +21,9 @@ public enum SmsSceneEnum implements IntArrayValuable { MEMBER_UPDATE_PASSWORD(3, "user-update-password", "会员用户 - 修改密码"), MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"), - ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"); + ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"), + ADMIN_MEMBER_REGISTER(22, "admin-sms-register", "后台用户 - 手机号注册"), + ADMIN_MEMBER_RESET_PASSWORD(23, "admin-reset-password", "后台用户 - 忘记密码"); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 281b766c0a..1e7a99a322 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -7,7 +7,14 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthPermissionInfoRespVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthResetPasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; @@ -23,14 +30,19 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import java.util.Collections; import java.util.List; import java.util.Set; @@ -139,6 +151,14 @@ public class AuthController { return success(true); } + @PostMapping("/reset-password") + @PermitAll + @Operation(summary = "重置密码") + public CommonResult resetPassword(@RequestBody @Valid AuthResetPasswordReqVO reqVO) { + authService.resetPassword(reqVO); + return success(true); + } + // ========== 社交登录相关 ========== @GetMapping("/social-auth-redirect") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java index 7da0f4d321..a29660ec4e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -19,7 +19,7 @@ import jakarta.validation.constraints.Pattern; @NoArgsConstructor @AllArgsConstructor @Builder -public class AuthLoginReqVO { +public class AuthLoginReqVO extends CaptchaVerificationReqVO { @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudaoyuanma") @NotEmpty(message = "登录账号不能为空") @@ -32,13 +32,6 @@ public class AuthLoginReqVO { @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; - // ========== 图片验证码相关 ========== - - @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, - example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") - @NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class) - private String captchaVerification; - // ========== 绑定社交登录时,需要传递如下参数 ========== @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @@ -51,11 +44,6 @@ public class AuthLoginReqVO { @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") private String socialState; - /** - * 开启验证码的 Group - */ - public interface CodeEnableGroup {} - @AssertTrue(message = "授权码不能为空") public boolean isSocialCodeValid() { return socialType == null || StrUtil.isNotEmpty(socialCode); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java index e15d46f112..97edc75a23 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthRegisterReqVO.java @@ -9,7 +9,7 @@ import jakarta.validation.constraints.*; @Schema(description = "管理后台 - Register Request VO") @Data -public class AuthRegisterReqVO { +public class AuthRegisterReqVO extends CaptchaVerificationReqVO { @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao") @NotBlank(message = "用户账号不能为空") @@ -26,12 +26,4 @@ public class AuthRegisterReqVO { @NotEmpty(message = "密码不能为空") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; - - // ========== 图片验证码相关 ========== - - @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, - example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") - @NotEmpty(message = "验证码不能为空", groups = AuthLoginReqVO.CodeEnableGroup.class) - private String captchaVerification; - } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java new file mode 100644 index 0000000000..16337cc8c0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.controller.admin.auth.vo; + +import cn.iocoder.yudao.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +@Schema(description = "管理后台 - 短信重置账号密码 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthResetPasswordReqVO { + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1234") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13312341234") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "手机短信验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "手机手机短信验证码不能为空") + private String code; +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java index b2c4455a0b..4efd98ff18 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java @@ -17,7 +17,7 @@ import jakarta.validation.constraints.NotNull; @NoArgsConstructor @AllArgsConstructor @Builder -public class AuthSmsSendReqVO { +public class AuthSmsSendReqVO extends CaptchaVerificationReqVO { @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudaoyuanma") @NotEmpty(message = "手机号不能为空") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java new file mode 100644 index 0000000000..b080cb5af1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Schema(description = "管理后台 - 验证码 Request VO") +@Data +public class CaptchaVerificationReqVO { + + // ========== 图片验证码相关 ========== + @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, + example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") + @NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class) + private String captchaVerification; + + /** + * 开启验证码的 Group + */ + public interface CodeEnableGroup { + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java index ee3ce101f9..3901e08905 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java @@ -52,7 +52,7 @@ public interface AdminAuthService { * @param reqVO 登录信息 * @return 登录结果 */ - AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) ; + AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO); /** * 社交快捷登录,使用 code 授权码 @@ -78,4 +78,11 @@ public interface AdminAuthService { */ AuthLoginRespVO register(AuthRegisterReqVO createReqVO); + /** + * 重置密码 + * + * @param reqVO 验证码信息 + */ + void resetPassword(AuthResetPasswordReqVO reqVO); + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 013c4ea725..9716acd2d1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -8,9 +8,17 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; +import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthResetPasswordReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.CaptchaVerificationReqVO; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -22,6 +30,7 @@ import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.member.MemberService; import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; import cn.iocoder.yudao.module.system.service.social.SocialUserService; +import cn.iocoder.yudao.module.system.service.tenant.TenantService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; import com.xingyuv.captcha.model.common.ResponseModel; @@ -32,12 +41,20 @@ import jakarta.validation.Validator; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_CAPTCHA_CODE_ERROR; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_USER_DISABLED; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_MOBILE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_REGISTER_CAPTCHA_CODE_ERROR; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_MOBILE_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** * Auth Service 实现类 @@ -64,6 +81,8 @@ public class AdminAuthServiceImpl implements AdminAuthService { private CaptchaService captchaService; @Resource private SmsCodeApi smsCodeApi; + @Resource + private TenantService tenantService; /** * 验证码的开关,默认为 true @@ -111,6 +130,13 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public void sendSmsCode(AuthSmsSendReqVO reqVO) { + // 如果是重置密码场景,需要校验图形验证码是否正确 + if (Objects.equals(SmsSceneEnum.ADMIN_MEMBER_RESET_PASSWORD.getScene(), reqVO.getScene())) { + ResponseModel response = doValidateCaptcha(reqVO); + if (!response.isSuccess()) { + throw exception(AUTH_REGISTER_CAPTCHA_CODE_ERROR, response.getRepMsg()); + } + } // 登录场景,验证是否存在 if (userService.getUserByMobile(reqVO.getMobile()) == null) { throw exception(AUTH_MOBILE_NOT_EXISTS); @@ -174,16 +200,8 @@ public class AdminAuthServiceImpl implements AdminAuthService { @VisibleForTesting void validateCaptcha(AuthLoginReqVO reqVO) { - // 如果验证码关闭,则不进行校验 - if (!captchaEnable) { - return; - } + ResponseModel response = doValidateCaptcha(reqVO); // 校验验证码 - ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); - CaptchaVO captchaVO = new CaptchaVO(); - captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); - ResponseModel response = captchaService.verification(captchaVO); - // 验证不通过 if (!response.isSuccess()) { // 创建登录失败日志(验证码不正确) createLoginLog(null, reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_CODE_ERROR); @@ -191,6 +209,17 @@ public class AdminAuthServiceImpl implements AdminAuthService { } } + private ResponseModel doValidateCaptcha(CaptchaVerificationReqVO reqVO) { + // 如果验证码关闭,则不进行校验 + if (!captchaEnable) { + return ResponseModel.success(); + } + ValidationUtils.validate(validator, reqVO, CaptchaVerificationReqVO.CodeEnableGroup.class); + CaptchaVO captchaVO = new CaptchaVO(); + captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); + return captchaService.verification(captchaVO); + } + private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { // 插入登陆日志 createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); @@ -261,19 +290,28 @@ public class AdminAuthServiceImpl implements AdminAuthService { @VisibleForTesting void validateCaptcha(AuthRegisterReqVO reqVO) { - // 如果验证码关闭,则不进行校验 - if (!captchaEnable) { - return; - } - // 校验验证码 - ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); - CaptchaVO captchaVO = new CaptchaVO(); - captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); - ResponseModel response = captchaService.verification(captchaVO); + ResponseModel response = doValidateCaptcha(reqVO); // 验证不通过 if (!response.isSuccess()) { throw exception(AUTH_REGISTER_CAPTCHA_CODE_ERROR, response.getRepMsg()); } } + @Override + @Transactional(rollbackFor = Exception.class) + public void resetPassword(AuthResetPasswordReqVO reqVO) { + AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getMobile()); + if (userByMobile == null) { + throw exception(USER_MOBILE_NOT_EXISTS); + } + + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO() + .setCode(reqVO.getCode()) + .setMobile(reqVO.getMobile()) + .setScene(SmsSceneEnum.ADMIN_MEMBER_RESET_PASSWORD.getScene()) + .setUsedIp(getClientIP()) + ); + + userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword()); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java index 0ad8fc342b..2f5f717e24 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java @@ -296,7 +296,8 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { @Test public void testValidateCaptcha_constraintViolationException() { // 准备参数 - AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class).setCaptchaVerification(null); + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); + reqVO.setCaptchaVerification(null); // mock 验证码打开 ReflectUtil.setFieldValue(authService, "captchaEnable", true); From f8fc3101c653aba46964b9bee1a3ebe462497ed1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Jan 2025 11:41:31 +0800 Subject: [PATCH 008/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=87=8D=E7=BD=AE=E5=90=8E=E5=8F=B0=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/auth/AdminAuthServiceImpl.java | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 9716acd2d1..e81c75724c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -11,14 +11,7 @@ import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthResetPasswordReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.CaptchaVerificationReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -30,7 +23,6 @@ import cn.iocoder.yudao.module.system.service.logger.LoginLogService; import cn.iocoder.yudao.module.system.service.member.MemberService; import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; import cn.iocoder.yudao.module.system.service.social.SocialUserService; -import cn.iocoder.yudao.module.system.service.tenant.TenantService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; import com.xingyuv.captcha.model.common.ResponseModel; @@ -47,14 +39,7 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_BAD_CREDENTIALS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_CAPTCHA_CODE_ERROR; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_LOGIN_USER_DISABLED; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_MOBILE_NOT_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_REGISTER_CAPTCHA_CODE_ERROR; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_MOBILE_NOT_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * Auth Service 实现类 @@ -81,8 +66,6 @@ public class AdminAuthServiceImpl implements AdminAuthService { private CaptchaService captchaService; @Resource private SmsCodeApi smsCodeApi; - @Resource - private TenantService tenantService; /** * 验证码的开关,默认为 true @@ -137,6 +120,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { throw exception(AUTH_REGISTER_CAPTCHA_CODE_ERROR, response.getRepMsg()); } } + // 登录场景,验证是否存在 if (userService.getUserByMobile(reqVO.getMobile()) == null) { throw exception(AUTH_MOBILE_NOT_EXISTS); From 6a7e7e3e442fa7ead4324659a79adc3c4d9e886e Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 4 Jan 2025 15:13:54 +0800 Subject: [PATCH 009/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=20=E5=BB=B6=E8=BF=9F=E5=99=A8=20trigger=20?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=A7=9F=E6=88=B7=20id=20=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/service/task/BpmTaskServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 4d536d1f4b..355e96979c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1192,9 +1192,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { } } } - - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); - messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); + // 注意:需要基于 instance 设置租户编号,避免 Flowable 内部异步时,丢失租户编号 + FlowableUtils.execute(processInstance.getTenantId(),()-> { + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); + messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); + }); } }); From 92d6b8ad8821972fd9aa8497b39d313721fd440f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Jan 2025 16:00:42 +0800 Subject: [PATCH 010/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91AI=EF=BC=9Aspring-ai-tika-document-reader=20?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E4=BA=86=20cloud=20=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=90=AF=E5=8A=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml b/yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml index 9ac6a0be9c..a270f76558 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml @@ -57,6 +57,17 @@ ${spring-ai.groupId} spring-ai-tika-document-reader ${spring-ai.version} + + + + spring-cloud-function-context + org.springframework.cloud + + + spring-cloud-function-core + org.springframework.cloud + + ${spring-ai.groupId} From 256b40b3882a029a75fe217344f91612cda6f188 Mon Sep 17 00:00:00 2001 From: xiefangzhen Date: Sun, 5 Jan 2025 09:17:43 +0800 Subject: [PATCH 011/112] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BD=9C=E8=80=85?= =?UTF-8?q?=E6=84=8F=E8=A7=81=EF=BC=8C=E8=BF=9B=E8=A1=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/web/core/filter/ApiRequestFilter.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java index 3b84933e37..42cb6a6658 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java @@ -20,9 +20,8 @@ public abstract class ApiRequestFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) { // 只过滤 API 请求的地址 - String contextPath = request.getContextPath(); - return !StrUtil.startWithAny(request.getRequestURI().substring(contextPath.length()), webProperties.getAdminApi().getPrefix(), - webProperties.getAppApi().getPrefix()); + String apiUri = request.getRequestURI().substring(request.getContextPath().length()); + return !StrUtil.startWithAny(apiUri, webProperties.getAdminApi().getPrefix(), webProperties.getAppApi().getPrefix()); } } From 39ac9053fdd1993c6e604ea3b1671faf793d87ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=81=E8=99=8E?= Date: Sun, 5 Jan 2025 16:19:40 +0800 Subject: [PATCH 012/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E9=80=80=E6=AC=BE=E5=9B=9E=E6=94=B6=E4=BC=98?= =?UTF-8?q?=E6=83=A0=E5=88=B8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/promotion/service/coupon/CouponServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java index 7a0ae512f6..060306f118 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java @@ -178,6 +178,9 @@ public class CouponServiceImpl implements CouponService { */ @Transactional(rollbackFor = Exception.class) public void invalidateCoupon(Long couponId, Long userId) { + if (couponId == null || couponId <= 0) { + return; + } // 1.1 校验优惠券 CouponDO coupon = couponMapper.selectByIdAndUserId(couponId, userId); if (coupon == null) { From 92a4831644b784b29b91f5c182e48d83f0a21d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=81=E8=99=8E?= Date: Sun, 5 Jan 2025 18:30:44 +0800 Subject: [PATCH 013/112] =?UTF-8?q?=E6=AD=A3=E5=88=99=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E8=A1=A5=E4=B8=8A=E6=AC=A1=E6=95=B0=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/admin/user/vo/user/UserSaveReqVO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index bdcbe0a4da..482d140533 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -23,7 +23,7 @@ public class UserSaveReqVO { @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao") @NotBlank(message = "用户账号不能为空") - @Pattern(regexp = "^[a-zA-Z0-9]$", message = "用户账号由 数字、字母 组成") + @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "用户账号由 数字、字母 组成") @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") @DiffLogField(name = "用户账号") private String username; From 8b91b471d58985aa1925efd9ad7c2fb1b62896ef Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 6 Jan 2025 08:42:03 +0800 Subject: [PATCH 014/112] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E5=99=A8=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/enums/definition/BpmBoundaryEventType.java | 2 +- .../yudao/module/bpm/enums/definition/BpmDelayTimerType.java | 2 +- .../framework/flowable/core/listener/BpmTaskEventListener.java | 2 +- .../iocoder/yudao/module/bpm/service/task/BpmTaskService.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java index 1d3dd5e294..242bfcbf8d 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java @@ -14,7 +14,7 @@ import lombok.Getter; public enum BpmBoundaryEventType { USER_TASK_TIMEOUT(1, "用户任务超时"), - DELAY_TIMER_TIMEOUT(2, "触发器超时"); + DELAY_TIMER_TIMEOUT(2, "延迟器超时"); private final Integer type; private final String name; diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java index 1e0fc162d6..db7829958b 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java @@ -7,7 +7,7 @@ import lombok.Getter; import java.util.Arrays; /** - * BPM 延时器类型枚举 + * BPM 延迟器类型枚举 * * @author Lesan */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java index 134871b01a..9968c1c4bf 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -106,7 +106,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); - // 2.2 触发器超时处理 + // 2.2 延迟器超时处理 } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT)) { String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processDelayTimerTimeout(event.getProcessInstanceId(), taskKey); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index 46ba1ef3bc..dd83d287e6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -276,7 +276,7 @@ public interface BpmTaskService { void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType); /** - * 处理 延时器 超时事件 + * 处理 延迟器 超时事件 * * @param processInstanceId 流程示例编号 * @param taskDefineKey 任务 Key From a13b58200948bc269c1746073f79e7473cfbafe1 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 6 Jan 2025 11:24:37 +0800 Subject: [PATCH 015/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E8=B7=AF=E7=94=B1=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/BpmSimpleModelNodeType.java | 4 +- .../vo/model/simple/BpmSimpleModelNodeVO.java | 27 ++++++ .../flowable/core/util/SimpleModelUtils.java | 94 ++++++++++++++----- 3 files changed, 101 insertions(+), 24 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index ac001cf3e0..e95c59dcdc 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -33,6 +33,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { CONDITION_BRANCH_NODE(51, "条件分支", "exclusiveGateway"), PARALLEL_BRANCH_NODE(52, "并行分支", "parallelGateway"), INCLUSIVE_BRANCH_NODE(53, "包容分支", "inclusiveGateway"), + ROUTE_BRANCH_NODE(54, "路由分支", "exclusiveGateway") ; public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); @@ -49,7 +50,8 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { public static boolean isBranchNode(Integer type) { return Objects.equals(CONDITION_BRANCH_NODE.getType(), type) || Objects.equals(PARALLEL_BRANCH_NODE.getType(), type) - || Objects.equals(INCLUSIVE_BRANCH_NODE.getType(), type); + || Objects.equals(INCLUSIVE_BRANCH_NODE.getType(), type) + || Objects.equals(ROUTE_BRANCH_NODE.getType(), type); } public static BpmSimpleModelNodeType valueOf(Integer type) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 6a4ec2c263..03732e8b6b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -226,4 +226,31 @@ public class BpmSimpleModelNodeVO { private String delayTime; } + @Schema(description = "路由分支组", example = "[]") + private List routeGroup; + + @Schema(description = "默认分支id", example = "Flow_xxx") + private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE + + @Schema(description = "路由分支") + @Data + @Valid + public static class RouteCondition { + + @Schema(description = "节点Id", example = "Activity_xxx") + @NotEmpty(message = "节点Id不能为空") + private String nodeId; + + @Schema(description = "条件类型", example = "1") + @InEnum(BpmSimpleModeConditionType.class) + @NotNull(message = "条件类型不能为空") + private Integer conditionType; + + @Schema(description = "条件表达式", example = "${day>3}") + private String conditionExpression; + + @Schema(description = "条件组", example = "{}") + private ConditionGroups conditionGroups; + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f4fd8c6d9e..c916d326f3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -38,7 +38,8 @@ public class SimpleModelUtils { List converts = asList(new StartNodeConvert(), new EndNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new DelayTimerNodeConvert(), - new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert()); + new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), + new RouteBranchNodeConvert()); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); } @@ -180,10 +181,12 @@ public class SimpleModelUtils { BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); BpmSimpleModelNodeVO childNode = node.getChildNode(); List conditionNodes = node.getConditionNodes(); - Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空"); + // TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗? +// Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空"); // 分支终点节点 ID String branchEndNodeId = null; - if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE) { // 条件分支 + if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE + || nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { // 条件分支或路由分支 // 分两种情况 1. 分支节点有孩子节点为孩子节点 Id 2. 分支节点孩子为无效节点时 (分支嵌套且为分支最后一个节点) 为分支终点节点 ID branchEndNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; } else if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE @@ -194,31 +197,45 @@ public class SimpleModelUtils { Assert.notEmpty(branchEndNodeId, "分支终点节点 Id 不能为空"); // 3. 遍历分支节点 - // 下面的注释,以如下情况举例子。分支 1:A->B->C->D->E,分支 2:A->D->E。其中,A 为分支节点, D 为 A 孩子节点 - for (BpmSimpleModelNodeVO item : conditionNodes) { - Assert.isTrue(Objects.equals(item.getType(), BpmSimpleModelNodeType.CONDITION_NODE.getType()), - "条件节点类型({})不符合", item.getType()); - BpmSimpleModelNodeVO conditionChildNode = item.getChildNode(); - // 3.1 分支有后续节点。即分支 1: A->B->C->D 的情况 - if (isValidNode(conditionChildNode)) { - // 3.1.1 建立与后续的节点的连线。例如说,建立 A->B 的连线 - SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), conditionChildNode.getId(), item); - process.addFlowElement(sequenceFlow); - // 3.1.2 递归调用后续节点连线。例如说,建立 B->C->D 的连线 - traverseNodeToBuildSequenceFlow(process, conditionChildNode, branchEndNodeId); - } else { - // 3.2 分支没有后续节点。例如说,建立 A->D 的连线 - SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), branchEndNodeId, item); - process.addFlowElement(sequenceFlow); + if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { + // 路由分支遍历 + for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroup()) { + SequenceFlow sFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); + process.addFlowElement(sFlow); + } + } else { + // 下面的注释,以如下情况举例子。分支 1:A->B->C->D->E,分支 2:A->D->E。其中,A 为分支节点, D 为 A 孩子节点 + for (BpmSimpleModelNodeVO item : conditionNodes) { + Assert.isTrue(Objects.equals(item.getType(), BpmSimpleModelNodeType.CONDITION_NODE.getType()), + "条件节点类型({})不符合", item.getType()); + BpmSimpleModelNodeVO conditionChildNode = item.getChildNode(); + // 3.1 分支有后续节点。即分支 1: A->B->C->D 的情况 + if (isValidNode(conditionChildNode)) { + // 3.1.1 建立与后续的节点的连线。例如说,建立 A->B 的连线 + SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), conditionChildNode.getId(), item); + process.addFlowElement(sequenceFlow); + // 3.1.2 递归调用后续节点连线。例如说,建立 B->C->D 的连线 + traverseNodeToBuildSequenceFlow(process, conditionChildNode, branchEndNodeId); + } else { + // 3.2 分支没有后续节点。例如说,建立 A->D 的连线 + SequenceFlow sequenceFlow = ConditionNodeConvert.buildSequenceFlow(node.getId(), branchEndNodeId, item); + process.addFlowElement(sequenceFlow); + } } } - // 4. 如果是并行分支、包容分支,由于是程序创建的聚合网关,需要手工创建聚合网关和下一个节点的连线 + // 4. 各分支节点所需特殊处理 if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE ) { + // 如果是并行分支、包容分支,由于是程序创建的聚合网关,需要手工创建聚合网关和下一个节点的连线 String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); process.addFlowElement(sequenceFlow); + } else if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { + // 如果是路由分支,需要连接后续节点为默认路由 + SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(), + null, null); + process.addFlowElement(sequenceFlow); } // 5. 递归调用后续节点 继续递归。例如说,建立 D->E 的连线 @@ -576,12 +593,20 @@ public class SimpleModelUtils { * @param node 条件节点 */ public static String buildConditionExpression(BpmSimpleModelNodeVO node) { - BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(node.getConditionType()); + return buildConditionExpression(node.getConditionType(), node.getConditionExpression(), + node.getConditionGroups()); + } + public static String buildConditionExpression(BpmSimpleModelNodeVO.RouteCondition route) { + return buildConditionExpression(route.getConditionType(), route.getConditionExpression(), + route.getConditionGroups()); + } + public static String buildConditionExpression(Integer conditionType, String conditionExpression, + ConditionGroups conditionGroups) { + BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(conditionType); if (conditionTypeEnum == BpmSimpleModeConditionType.EXPRESSION) { - return node.getConditionExpression(); + return conditionExpression; } if (conditionTypeEnum == BpmSimpleModeConditionType.RULE) { - ConditionGroups conditionGroups = node.getConditionGroups(); if (conditionGroups == null || CollUtil.isEmpty(conditionGroups.getConditions())) { return null; } @@ -644,6 +669,29 @@ public class SimpleModelUtils { } } + public static class RouteBranchNodeConvert implements NodeConvert { + + @Override + public ExclusiveGateway convert(BpmSimpleModelNodeVO node) { + ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); + exclusiveGateway.setId(node.getId()); + + // 设置默认的序列流(条件) + exclusiveGateway.setDefaultFlow(node.getDefaultFlowId()); + return exclusiveGateway; + } + + @Override + public BpmSimpleModelNodeType getType() { + return BpmSimpleModelNodeType.ROUTE_BRANCH_NODE; + } + + public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouteCondition route) { + String conditionExpression = ConditionNodeConvert.buildConditionExpression(route); + return buildBpmnSequenceFlow(nodeId, route.getNodeId(), null, null, conditionExpression); + } + } + private static String buildGatewayJoinId(String id) { return id + "_join"; } From 46c125b0305aeb27aec326e664f7d67ffc2fc9fe Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 6 Jan 2025 17:24:59 +0800 Subject: [PATCH 016/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmListenerMapType.java | 31 ++++++++ .../vo/model/simple/BpmSimpleModelNodeVO.java | 36 +++++++++ .../flowable/core/util/SimpleModelUtils.java | 18 +++++ .../task/listener/BpmUserTaskListener.java | 76 +++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java new file mode 100644 index 0000000000..4afd9ea3c3 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.bpm.enums.definition; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * BPM 任务监听器键值对类型 + * + * @author Lesan + */ +@Getter +@AllArgsConstructor +public enum BpmListenerMapType implements IntArrayValuable { + + FIXED_VALUE(1, "固定值"), + FROM_FORM(2, "表单"); + + private final Integer type; + private final String name; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmListenerMapType::getType).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } + +} \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 6a4ec2c263..45c5db3a00 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -96,6 +96,42 @@ public class BpmSimpleModelNodeVO { */ private AssignEmptyHandler assignEmptyHandler; + /** + * 创建任务监听器 + */ + private ListenerHandler createTaskListener; + + @Schema(description = "任务监听器") + @Data + public static class ListenerHandler { + + @Schema(description = "是否开启任务监听器", example = "false") + private Boolean enable; + + @Schema(description = "请求路径", example = "http://xxxxx") + private String path; + + @Schema(description = "请求头", example = "[]") + private List header; + + @Schema(description = "请求体", example = "[]") + private List body; + + @Schema(description = "任务监听器键值对") + @Data + public static class ListenerMap { + + @Schema(description = "键", example = "xxx") + private String key; + + @Schema(description = "值类型", example = "1") + private Integer type; + + @Schema(description = "值", example = "xxx") + private String value; + } + } + @Schema(description = "审批节点拒绝处理策略") @Data public static class RejectHandler { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f4fd8c6d9e..2f1d966f6b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; +import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; @@ -15,11 +16,14 @@ import org.flowable.bpmn.BpmnAutoLayout; import org.flowable.bpmn.constants.BpmnXMLConstants; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; +import org.flowable.engine.delegate.TaskListener; import java.util.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; +import static cn.iocoder.yudao.module.bpm.service.task.listener.BpmUserTaskListener.DELEGATE_EXPRESSION; +import static cn.iocoder.yudao.module.bpm.service.task.listener.BpmUserTaskListener.EXTENSION_SUFFIX; import static java.util.Arrays.asList; /** @@ -420,6 +424,20 @@ public class SimpleModelUtils { if (node.getTimeoutHandler() != null && node.getTimeoutHandler().getEnable()) { userTask.setDueDate(node.getTimeoutHandler().getTimeDuration()); } + // 设置监听器 + List flowableListeners = new ArrayList<>(3); + if (node.getCreateTaskListener().getEnable()) { + FlowableListener flowableListener = new FlowableListener(); + flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); + flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + flowableListener.setImplementation(DELEGATE_EXPRESSION); + addExtensionElement(userTask, "create" + EXTENSION_SUFFIX, + JSONUtil.toJsonStr(node.getCreateTaskListener())); + flowableListeners.add(flowableListener); + } + if (!flowableListeners.isEmpty()) { + userTask.setTaskListeners(flowableListeners); + } return userTask; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java new file mode 100644 index 0000000000..18360241ef --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.bpm.service.task.listener; + +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerMapType; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; +import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseExtensionElement; + +/** + * BPM 用户任务通用监听器 + * + * @author Lesan + */ +@Component +@Slf4j +public class BpmUserTaskListener implements TaskListener { + + public static final String DELEGATE_EXPRESSION = "${bpmUserTaskListener}"; + + public static final String EXTENSION_SUFFIX = "TaskListenerMetaInfo"; + + @Resource + private BpmModelService modelService; + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Override + public void notify(DelegateTask delegateTask) { + // 1. 获取所需基础信息 + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); + BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); + FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); + BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean( + parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX), + BpmSimpleModelNodeVO.ListenerHandler.class); + Map processVariables = processInstance.getProcessVariables(); + // 2. 获取请求头和请求体 + HashMap headers = new HashMap<>(); + HashMap body = new HashMap<>(); + listenerHandler.getHeader().forEach(item -> { + if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { + headers.put(item.getKey(), item.getValue()); + } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { + headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString()); + } + }); + listenerHandler.getBody().forEach(item -> { + if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { + body.put(item.getKey(), item.getValue()); + } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { + body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "")); + } + }); + // 3. 异步发起请求 + HttpRequest.post(listenerHandler.getPath()) + .addHeaders(headers).form(body).executeAsync(); + // 4. 是否需要后续操作? + } + +} \ No newline at end of file From 1d597403c914944672676959a4a74df98486fa76 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 7 Jan 2025 11:05:38 +0800 Subject: [PATCH 017/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E4=BA=BA=E5=A4=B1=E8=B4=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=20log=20error=20=E6=97=A5=E5=BF=97,=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=B8=8D=E6=8F=90=E7=A4=BA=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../brokerage/BrokerageUserServiceImpl.java | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java index 490f2cec8c..921915ea96 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java @@ -29,6 +29,7 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; import com.baomidou.mybatisplus.core.metadata.IPage; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -45,6 +46,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; * * @author owen */ +@Slf4j @Service @Validated public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -174,34 +176,39 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @Override public boolean bindBrokerageUser(Long userId, Long bindUserId) { - // 1. 获得分销用户 - boolean isNewBrokerageUser = false; - BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); - if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 - isNewBrokerageUser = true; - brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setBrokeragePrice(0).setFrozenPrice(0); - } + try { + // 1. 获得分销用户 + boolean isNewBrokerageUser = false; + BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); + if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 + isNewBrokerageUser = true; + brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setBrokeragePrice(0).setFrozenPrice(0); + } - // 2.1 校验是否能绑定用户 - boolean validated = isUserCanBind(brokerageUser); - if (!validated) { + // 2.1 校验是否能绑定用户 + boolean validated = isUserCanBind(brokerageUser); + if (!validated) { + return false; + } + // 2.3 校验能否绑定 + validateCanBindUser(brokerageUser, bindUserId); + // 2.3 绑定用户 + if (isNewBrokerageUser) { + Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); + if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 + brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); + } else { + brokerageUser.setBrokerageEnabled(false).setBrokerageTime(LocalDateTime.now()); + } + brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); + } else { + brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); + } + return true; + } catch (Exception e) { + log.error("[bindBrokerageUser][userId({}) 绑定推广员失败 bindUserId({})]", userId, bindUserId, e); return false; } - // 2.3 校验能否绑定 - validateCanBindUser(brokerageUser, bindUserId); - // 2.3 绑定用户 - if (isNewBrokerageUser) { - Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); - if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 - brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); - } else { - brokerageUser.setBrokerageEnabled(false).setBrokerageTime(LocalDateTime.now()); - } - brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); - } else { - brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); - } - return true; } @Override From b5f6545d5a1909e8bb750c36939ded2f9a8d2320 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 7 Jan 2025 12:52:50 +0800 Subject: [PATCH 018/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20userTask=20=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/enums/definition/BpmListenerMapType.java | 1 + .../vo/model/simple/BpmSimpleModelNodeVO.java | 9 +++++++++ .../flowable/core/util/SimpleModelUtils.java | 5 ++++- .../task/listener/BpmUserTaskListener.java | 15 +++++++++++---- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java index 4afd9ea3c3..e07675d578 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java @@ -6,6 +6,7 @@ import lombok.Getter; import java.util.Arrays; +// TODO @芋艿:枚举值的类名,在考虑下 /** * BPM 任务监听器键值对类型 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 45c5db3a00..46c755e14d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -96,15 +96,19 @@ public class BpmSimpleModelNodeVO { */ private AssignEmptyHandler assignEmptyHandler; + // TODO @lesan:建议改成 taskCreateListener; /** * 创建任务监听器 */ private ListenerHandler createTaskListener; @Schema(description = "任务监听器") + @Valid @Data public static class ListenerHandler { + // TODO @lesan:参数校验,需要加下 + @Schema(description = "是否开启任务监听器", example = "false") private Boolean enable; @@ -117,6 +121,8 @@ public class BpmSimpleModelNodeVO { @Schema(description = "请求体", example = "[]") private List body; + // TODO @芋艿:这里后续要不要复用; + @Schema(description = "任务监听器键值对") @Data public static class ListenerMap { @@ -125,11 +131,14 @@ public class BpmSimpleModelNodeVO { private String key; @Schema(description = "值类型", example = "1") + @InEnum(BpmListenerMapType.class) private Integer type; @Schema(description = "值", example = "xxx") private String value; + } + } @Schema(description = "审批节点拒绝处理策略") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 2f1d966f6b..f4464ef2b4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -431,11 +431,14 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); + // TODO @lesan:可以加个 addExtensionElementJson() 方法; + // TODO @lesan:是不是不用带 "create" + EXTENSION_SUFFIX 这种,直接给个 "config" 就完事了! addExtensionElement(userTask, "create" + EXTENSION_SUFFIX, + // TODO @lesan:默认使用项目里的 JsonUtils 方法 JSONUtil.toJsonStr(node.getCreateTaskListener())); flowableListeners.add(flowableListener); } - if (!flowableListeners.isEmpty()) { + if (CollUtil.isNotEmpty(flowableListeners)) { userTask.setTaskListeners(flowableListeners); } return userTask; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 18360241ef..d77b820aad 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -46,20 +46,24 @@ public class BpmUserTaskListener implements TaskListener { HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); + // TODO @lesan:可以写到 FlowableUtils 里,简化解析逻辑! BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean( parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX), BpmSimpleModelNodeVO.ListenerHandler.class); - Map processVariables = processInstance.getProcessVariables(); + // 2. 获取请求头和请求体 - HashMap headers = new HashMap<>(); - HashMap body = new HashMap<>(); + Map processVariables = processInstance.getProcessVariables(); + Map headers = new HashMap<>(); + Map body = new HashMap<>(); listenerHandler.getHeader().forEach(item -> { + // TODO @lesan:可以写个统一的方法,解析参数。然后非空,put 到 headers 或者 body 里! if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { headers.put(item.getKey(), item.getValue()); } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString()); } }); + // TODO @lesan:header 里面,需要添加下 tenant-id! listenerHandler.getBody().forEach(item -> { if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { body.put(item.getKey(), item.getValue()); @@ -67,10 +71,13 @@ public class BpmUserTaskListener implements TaskListener { body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "")); } }); + // 3. 异步发起请求 + // TODO @lesan:最好打印下日志! HttpRequest.post(listenerHandler.getPath()) .addHeaders(headers).form(body).executeAsync(); - // 4. 是否需要后续操作? + + // 4. 是否需要后续操作?TODO 芋艿:待定! } } \ No newline at end of file From 955ad86db45eabb9260a6aad68a81b66e3097d03 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 7 Jan 2025 16:31:44 +0800 Subject: [PATCH 019/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 14 +++- .../flowable/core/util/BpmnModelUtils.java | 40 +++++++++ .../flowable/core/util/SimpleModelUtils.java | 31 +++++-- .../task/listener/BpmUserTaskListener.java | 82 +++++++++++-------- 4 files changed, 121 insertions(+), 46 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 382cd7c318..b6bfc803b3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -96,20 +96,26 @@ public class BpmSimpleModelNodeVO { */ private AssignEmptyHandler assignEmptyHandler; - // TODO @lesan:建议改成 taskCreateListener; /** * 创建任务监听器 */ - private ListenerHandler createTaskListener; + private ListenerHandler taskCreateListener; + /** + * 指派任务监听器 + */ + private ListenerHandler taskAssignListener; + /** + * 完成任务监听器 + */ + private ListenerHandler taskCompleteListener; @Schema(description = "任务监听器") @Valid @Data public static class ListenerHandler { - // TODO @lesan:参数校验,需要加下 - @Schema(description = "是否开启任务监听器", example = "false") + @NotNull(message = "是否开启任务监听器不能为空") private Boolean enable; @Schema(description = "请求路径", example = "http://xxxxx") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index 01200298f9..f2f3017ec9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; @@ -56,6 +57,18 @@ public class BpmnModelUtils { element.addExtensionElement(extensionElement); } + public static void addExtensionElementJson(FlowElement element, String name, Object value) { + if (value == null) { + return; + } + ExtensionElement extensionElement = new ExtensionElement(); + extensionElement.setNamespace(FLOWABLE_EXTENSIONS_NAMESPACE); + extensionElement.setNamespacePrefix(FLOWABLE_EXTENSIONS_PREFIX); + extensionElement.setElementText(JsonUtils.toJsonString(value)); + extensionElement.setName(name); + element.addExtensionElement(extensionElement); + } + public static void addExtensionElement(FlowElement element, String name, Integer value) { if (value == null) { return; @@ -93,6 +106,33 @@ public class BpmnModelUtils { return element != null ? element.getElementText() : null; } + public static T parseExtensionElementJson(FlowElement flowElement, String elementName, Class clazz) { + if (flowElement == null) { + return null; + } + ExtensionElement element = CollUtil.getFirst(flowElement.getExtensionElements().get(elementName)); + return element != null ? JsonUtils.parseObject(element.getElementText(), clazz) : null; + } + + /** + * 给节点添加Simple设计器配置Json + * + * @param userTask 节点 + * @param node 节点对象 + */ + public static void addSimpleConfigInfo(FlowElement userTask, Object node) { + addExtensionElementJson(userTask, "config", node); + } + + /** + * 解析Simple设计器配置Json + * + * @param userTask 节点 + */ + public static BpmSimpleModelNodeVO parseSimpleConfigInfo(FlowElement userTask) { + return parseExtensionElementJson(userTask, "config", BpmSimpleModelNodeVO.class); + } + /** * 给节点添加候选人元素 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 6922b0a453..1c7ccc300c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; -import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; @@ -23,7 +22,6 @@ import java.util.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; import static cn.iocoder.yudao.module.bpm.service.task.listener.BpmUserTaskListener.DELEGATE_EXPRESSION; -import static cn.iocoder.yudao.module.bpm.service.task.listener.BpmUserTaskListener.EXTENSION_SUFFIX; import static java.util.Arrays.asList; /** @@ -442,23 +440,38 @@ public class SimpleModelUtils { userTask.setDueDate(node.getTimeoutHandler().getTimeDuration()); } // 设置监听器 + addUserTaskListener(node, userTask); + // 设置Simple设计器节点配置 + addSimpleConfigInfo(userTask, node); + return userTask; + } + + private void addUserTaskListener(BpmSimpleModelNodeVO node, UserTask userTask) { List flowableListeners = new ArrayList<>(3); - if (node.getCreateTaskListener().getEnable()) { + if (node.getTaskCreateListener().getEnable()) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - // TODO @lesan:可以加个 addExtensionElementJson() 方法; - // TODO @lesan:是不是不用带 "create" + EXTENSION_SUFFIX 这种,直接给个 "config" 就完事了! - addExtensionElement(userTask, "create" + EXTENSION_SUFFIX, - // TODO @lesan:默认使用项目里的 JsonUtils 方法 - JSONUtil.toJsonStr(node.getCreateTaskListener())); + flowableListeners.add(flowableListener); + } + if (node.getTaskAssignListener().getEnable()) { + FlowableListener flowableListener = new FlowableListener(); + flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); + flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + flowableListener.setImplementation(DELEGATE_EXPRESSION); + flowableListeners.add(flowableListener); + } + if (node.getTaskCompleteListener().getEnable()) { + FlowableListener flowableListener = new FlowableListener(); + flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); + flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListeners.add(flowableListener); } if (CollUtil.isNotEmpty(flowableListeners)) { userTask.setTaskListeners(flowableListeners); } - return userTask; } private void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index d77b820aad..14dda44055 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; -import cn.hutool.http.HttpRequest; -import cn.hutool.json.JSONUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerMapType; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -14,12 +14,18 @@ import org.flowable.bpmn.model.FlowElement; import org.flowable.engine.delegate.TaskListener; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; -import java.util.HashMap; +import java.util.List; import java.util.Map; -import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseExtensionElement; +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSimpleConfigInfo; /** * BPM 用户任务通用监听器 @@ -32,52 +38,62 @@ public class BpmUserTaskListener implements TaskListener { public static final String DELEGATE_EXPRESSION = "${bpmUserTaskListener}"; - public static final String EXTENSION_SUFFIX = "TaskListenerMetaInfo"; - @Resource private BpmModelService modelService; @Resource private BpmProcessInstanceService processInstanceService; + @Resource + private RestTemplate restTemplate; + @Override public void notify(DelegateTask delegateTask) { // 1. 获取所需基础信息 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); - FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); - // TODO @lesan:可以写到 FlowableUtils 里,简化解析逻辑! - BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean( - parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX), - BpmSimpleModelNodeVO.ListenerHandler.class); + FlowElement userTask = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); + BpmSimpleModelNodeVO node = parseSimpleConfigInfo(userTask); + BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(), node); // 2. 获取请求头和请求体 Map processVariables = processInstance.getProcessVariables(); - Map headers = new HashMap<>(); - Map body = new HashMap<>(); - listenerHandler.getHeader().forEach(item -> { - // TODO @lesan:可以写个统一的方法,解析参数。然后非空,put 到 headers 或者 body 里! - if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { - headers.put(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { - headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString()); - } - }); - // TODO @lesan:header 里面,需要添加下 tenant-id! - listenerHandler.getBody().forEach(item -> { - if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { - body.put(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { - body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "")); - } - }); + MultiValueMap headers = new LinkedMultiValueMap<>(); + MultiValueMap body = new LinkedMultiValueMap<>(); + parseListenerMap(listenerHandler.getHeader(), processVariables, headers); + headers.add("tenant-id", delegateTask.getTenantId()); + parseListenerMap(listenerHandler.getBody(), processVariables, body); // 3. 异步发起请求 - // TODO @lesan:最好打印下日志! - HttpRequest.post(listenerHandler.getPath()) - .addHeaders(headers).form(body).executeAsync(); - + HttpEntity> requestEntity = new HttpEntity<>(body, headers); + ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, + requestEntity, String.class); + log.info("[BpmUserTaskListener][的响应结果({})]", responseEntity); // 4. 是否需要后续操作?TODO 芋艿:待定! } + private void parseListenerMap(List list, + Map processVariables, + MultiValueMap to) { + if (CollUtil.isEmpty(list)) { + return; + } + list.forEach(item -> { + if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { + to.add(item.getKey(), item.getValue()); + } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { + to.add(item.getKey(), processVariables.get(item.getValue()).toString()); + } + }); + } + + private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, BpmSimpleModelNodeVO node) { + return switch (eventName) { + case TaskListener.EVENTNAME_CREATE -> node.getTaskCreateListener(); + case TaskListener.EVENTNAME_ASSIGNMENT -> node.getTaskAssignListener(); + case TaskListener.EVENTNAME_COMPLETE -> node.getTaskCompleteListener(); + default -> null; + }; + } + } \ No newline at end of file From adff185716a67ee12d38573cb13c381d41cd009b Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 7 Jan 2025 17:00:01 +0800 Subject: [PATCH 020/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E5=88=86=E9=94=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=B4=AF=E8=AE=A1=E5=B7=B2=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BD=BF=E7=94=A8=20WITHDRAW=5FSUCCESS=20?= =?UTF-8?q?=E4=BD=93=E7=8E=B0=E6=88=90=E5=8A=9F=E7=8A=B6=E6=80=81=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/brokerage/BrokerageUserController.java | 8 ++++---- .../app/brokerage/AppBrokerageUserController.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java index 9aad2e897b..3380362ff0 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java @@ -13,17 +13,17 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService; import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService; -import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO; import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO; +import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import java.util.Map; import java.util.Set; @@ -110,7 +110,7 @@ public class BrokerageUserController { // 合计分佣的提现 // TODO @疯狂:如果未来支持了打款这个动作,可能 status 会不对; Map withdrawMap = brokerageWithdrawService.getWithdrawSummaryMapByUserId( - userIds, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS); + userIds, BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS); // 拼接返回 return success(BrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, brokerageOrderSummaryMap, withdrawMap)); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java index 1af8f7252d..ed889ef162 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java @@ -84,7 +84,7 @@ public class AppBrokerageUserController { BrokerageRecordBizTypeEnum.ORDER, BrokerageRecordStatusEnum.SETTLEMENT, beginTime, endTime); // 统计用户提现的佣金 Integer withdrawPrice = brokerageWithdrawService.getWithdrawSummaryListByUserId(Collections.singleton(userId), - BrokerageWithdrawStatusEnum.AUDIT_SUCCESS).stream() + BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS).stream() .findFirst().map(BrokerageWithdrawSummaryRespBO::getPrice).orElse(0); // 统计分销用户数量(一级) Long firstBrokerageUserCount = brokerageUserService.getBrokerageUserCountByBindUserId(userId, 1); From da9f6ab76ef6e8579772653f639c023834279706 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 7 Jan 2025 19:02:20 +0800 Subject: [PATCH 021/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E7=9B=91=E5=90=AC=E5=99=A8-=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E9=BB=98=E8=AE=A4=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/listener/BpmUserTaskListener.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 14dda44055..1d543d25d7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerMapType; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -61,8 +60,14 @@ public class BpmUserTaskListener implements TaskListener { MultiValueMap headers = new LinkedMultiValueMap<>(); MultiValueMap body = new LinkedMultiValueMap<>(); parseListenerMap(listenerHandler.getHeader(), processVariables, headers); - headers.add("tenant-id", delegateTask.getTenantId()); parseListenerMap(listenerHandler.getBody(), processVariables, body); + // 2.1 请求头默认参数 + headers.add("tenant-id", delegateTask.getTenantId()); + // 2.2 请求体默认参数 + body.add("processInstanceId", delegateTask.getProcessInstanceId()); + body.add("assignee", delegateTask.getAssignee()); + body.add("taskDefinitionKey", delegateTask.getTaskDefinitionKey()); + body.add("taskId", delegateTask.getId()); // 3. 异步发起请求 HttpEntity> requestEntity = new HttpEntity<>(body, headers); From ae3c63eb29977d069dd986a16842411b977eb0a9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 7 Jan 2025 22:27:06 +0800 Subject: [PATCH 022/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20=E8=B7=AF=E7=94=B1=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 10 ++++++++-- .../flowable/core/util/SimpleModelUtils.java | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 382cd7c318..57ce1e9b58 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -39,6 +39,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "条件节点") private List conditionNodes; // 补充说明:有且仅有条件、并行、包容等分支会使用 + // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? @Schema(description = "条件类型", example = "1") @InEnum(BpmSimpleModeConditionType.class) private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE @@ -251,6 +252,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "运算符右边的值", example = "1") @NotEmpty(message = "运算符右边的值不能为空") private String rightSide; + } @Schema(description = "延迟器设置", example = "{}") @@ -269,8 +271,10 @@ public class BpmSimpleModelNodeVO { @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") @NotEmpty(message = "延迟时间表达式不能为空") private String delayTime; + } + // TODO @lesan:routeGroups @Schema(description = "路由分支组", example = "[]") private List routeGroup; @@ -282,10 +286,11 @@ public class BpmSimpleModelNodeVO { @Valid public static class RouteCondition { - @Schema(description = "节点Id", example = "Activity_xxx") - @NotEmpty(message = "节点Id不能为空") + @Schema(description = "节点 Id", example = "Activity_xxx") + @NotEmpty(message = "节点 Id 不能为空") private String nodeId; + // TODO @lesan:type、expression、groups;(可以晚点改,在和 conditionType、conditionExpression、defaultFlow、conditionGroups 讨论!) @Schema(description = "条件类型", example = "1") @InEnum(BpmSimpleModeConditionType.class) @NotNull(message = "条件类型不能为空") @@ -296,6 +301,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "条件组", example = "{}") private ConditionGroups conditionGroups; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 6922b0a453..57d32c441e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -42,8 +42,7 @@ public class SimpleModelUtils { List converts = asList(new StartNodeConvert(), new EndNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new DelayTimerNodeConvert(), - new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), - new RouteBranchNodeConvert()); + new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert()); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); } @@ -185,7 +184,7 @@ public class SimpleModelUtils { BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); BpmSimpleModelNodeVO childNode = node.getChildNode(); List conditionNodes = node.getConditionNodes(); - // TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗? + // TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗?@jason:一起帮忙瞅瞅! // Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空"); // 分支终点节点 ID String branchEndNodeId = null; @@ -204,8 +203,8 @@ public class SimpleModelUtils { if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { // 路由分支遍历 for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroup()) { - SequenceFlow sFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); - process.addFlowElement(sFlow); + SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); + process.addFlowElement(sequenceFlow); } } else { // 下面的注释,以如下情况举例子。分支 1:A->B->C->D->E,分支 2:A->D->E。其中,A 为分支节点, D 为 A 孩子节点 @@ -228,15 +227,14 @@ public class SimpleModelUtils { } } - // 4. 各分支节点所需特殊处理 + // 4.1 如果是并行分支、包容分支,由于是程序创建的聚合网关,需要手工创建聚合网关和下一个节点的连线 if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE - || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE ) { - // 如果是并行分支、包容分支,由于是程序创建的聚合网关,需要手工创建聚合网关和下一个节点的连线 + || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) { String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); process.addFlowElement(sequenceFlow); + // 4.2 如果是路由分支,需要连接后续节点为默认路由 } else if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { - // 如果是路由分支,需要连接后续节点为默认路由 SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(), null, null); process.addFlowElement(sequenceFlow); @@ -617,10 +615,12 @@ public class SimpleModelUtils { return buildConditionExpression(node.getConditionType(), node.getConditionExpression(), node.getConditionGroups()); } + public static String buildConditionExpression(BpmSimpleModelNodeVO.RouteCondition route) { return buildConditionExpression(route.getConditionType(), route.getConditionExpression(), route.getConditionGroups()); } + public static String buildConditionExpression(Integer conditionType, String conditionExpression, ConditionGroups conditionGroups) { BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(conditionType); @@ -711,6 +711,7 @@ public class SimpleModelUtils { String conditionExpression = ConditionNodeConvert.buildConditionExpression(route); return buildBpmnSequenceFlow(nodeId, route.getNodeId(), null, null, conditionExpression); } + } private static String buildGatewayJoinId(String id) { From d33afd7a9a843a353eb29f5c59a1a6ecae91172e Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 8 Jan 2025 08:52:24 +0800 Subject: [PATCH 023/112] =?UTF-8?q?fix:=20routeGroups=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java | 3 +-- .../bpm/framework/flowable/core/util/SimpleModelUtils.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index f4778cdff8..d5e119931d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -280,9 +280,8 @@ public class BpmSimpleModelNodeVO { } - // TODO @lesan:routeGroups @Schema(description = "路由分支组", example = "[]") - private List routeGroup; + private List routeGroups; @Schema(description = "默认分支id", example = "Flow_xxx") private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f33e73199c..dbd087cfc6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -200,7 +200,7 @@ public class SimpleModelUtils { // 3. 遍历分支节点 if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { // 路由分支遍历 - for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroup()) { + for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroups()) { SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); process.addFlowElement(sequenceFlow); } From 4acb01c3b061156d0ad5889f27fa1009619387ef Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Jan 2025 09:40:38 +0800 Subject: [PATCH 024/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20userTask=20=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/SimpleModelUtils.java | 12 ++++++++---- .../service/task/listener/BpmUserTaskListener.java | 14 +++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f33e73199c..952cd6c26a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -439,28 +439,32 @@ public class SimpleModelUtils { } // 设置监听器 addUserTaskListener(node, userTask); - // 设置Simple设计器节点配置 + // 设置 Simple 设计器节点配置 + // TODO @lesan:只设置到 flowableListener 里面,整个 node 太大了!因为很多都保存过啦。 addSimpleConfigInfo(userTask, node); return userTask; } private void addUserTaskListener(BpmSimpleModelNodeVO node, UserTask userTask) { List flowableListeners = new ArrayList<>(3); - if (node.getTaskCreateListener().getEnable()) { + if (node.getTaskCreateListener() != null + && Boolean.TRUE.equals(node.getTaskCreateListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListeners.add(flowableListener); } - if (node.getTaskAssignListener().getEnable()) { + if (node.getTaskAssignListener() != null + && Boolean.TRUE.equals(node.getTaskAssignListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListeners.add(flowableListener); } - if (node.getTaskCompleteListener().getEnable()) { + if (node.getTaskCompleteListener() != null + && Boolean.TRUE.equals(node.getTaskCompleteListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 1d543d25d7..1680b26691 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerMapType; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -24,6 +25,7 @@ import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSimpleConfigInfo; /** @@ -62,18 +64,23 @@ public class BpmUserTaskListener implements TaskListener { parseListenerMap(listenerHandler.getHeader(), processVariables, headers); parseListenerMap(listenerHandler.getBody(), processVariables, body); // 2.1 请求头默认参数 - headers.add("tenant-id", delegateTask.getTenantId()); + if (StrUtil.isNotEmpty(delegateTask.getTenantId())) { + headers.add(HEADER_TENANT_ID, delegateTask.getTenantId()); + } // 2.2 请求体默认参数 + // TODO @芋艿:哪些默认参数,后续再调研下; body.add("processInstanceId", delegateTask.getProcessInstanceId()); body.add("assignee", delegateTask.getAssignee()); body.add("taskDefinitionKey", delegateTask.getTaskDefinitionKey()); body.add("taskId", delegateTask.getId()); // 3. 异步发起请求 + // TODO @芋艿:确认要同步,还是异步 HttpEntity> requestEntity = new HttpEntity<>(body, headers); ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, requestEntity, String.class); - log.info("[BpmUserTaskListener][的响应结果({})]", responseEntity); + // TODO @lesan:日志打印,可以更全哈,例如说,请求参数、对应的 task id,哪个 listener + log.info("[notify][的响应结果({})]", responseEntity); // 4. 是否需要后续操作?TODO 芋艿:待定! } @@ -92,12 +99,13 @@ public class BpmUserTaskListener implements TaskListener { }); } + // TODO @lesan:改成 jdk8 写法哈。主要考虑好兼容! private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, BpmSimpleModelNodeVO node) { return switch (eventName) { case TaskListener.EVENTNAME_CREATE -> node.getTaskCreateListener(); case TaskListener.EVENTNAME_ASSIGNMENT -> node.getTaskAssignListener(); case TaskListener.EVENTNAME_COMPLETE -> node.getTaskCompleteListener(); - default -> null; + default -> null; // TODO @lesan:这个抛出异常,可控一点 }; } From 4b09bff64b3aad5ddd945df8b6dc3c1cf1fd9010 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Jan 2025 09:55:50 +0800 Subject: [PATCH 025/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20=E8=B7=AF=E7=94=B1=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmListenerMapType.java | 2 +- .../vo/model/simple/BpmSimpleModelNodeVO.java | 70 ++++++++++--------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java index e07675d578..0396fbcce9 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java @@ -6,7 +6,7 @@ import lombok.Getter; import java.util.Arrays; -// TODO @芋艿:枚举值的类名,在考虑下 +// TODO @lesan:BpmListenerParamTypeEnum /** * BPM 任务监听器键值对类型 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index f4778cdff8..b5057713ef 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -36,24 +36,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "子节点") private BpmSimpleModelNodeVO childNode; // 补充说明:在该模型下,子节点有且仅有一个,不会有多个 - @Schema(description = "条件节点") - private List conditionNodes; // 补充说明:有且仅有条件、并行、包容等分支会使用 - - // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? - @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionType.class) - private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "条件表达式", example = "${day>3}") - private String conditionExpression; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "是否默认条件", example = "true") - private Boolean defaultFlow; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - /** - * 条件组 - */ - private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - @Schema(description = "候选人策略", example = "30") @InEnum(BpmTaskCandidateStrategyEnum.class) private Integer candidateStrategy; // 用于审批,抄送节点 @@ -110,6 +92,37 @@ public class BpmSimpleModelNodeVO { */ private ListenerHandler taskCompleteListener; + @Schema(description = "延迟器设置", example = "{}") + private DelaySetting delaySetting; + + @Schema(description = "条件节点") + private List conditionNodes; // 补充说明:有且仅有条件、并行、包容分支会使用 + + // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? + @Schema(description = "条件类型", example = "1") + @InEnum(BpmSimpleModeConditionType.class) + private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + @Schema(description = "条件表达式", example = "${day>3}") + private String conditionExpression; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + @Schema(description = "是否默认条件", example = "true") + private Boolean defaultFlow; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + /** + * 条件组 + */ + private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + // TODO @lesan:route 改成 router 会不会好点。因为触发器、延迟器,都带了类似 r + + // TODO @lesan:routeGroups + @Schema(description = "路由分支组", example = "[]") + private List routeGroup; + + // TODO @lesan:貌似没用??? + @Schema(description = "默认分支 ID", example = "Flow_xxx") + private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE + @Schema(description = "任务监听器") @Valid @Data @@ -130,17 +143,18 @@ public class BpmSimpleModelNodeVO { // TODO @芋艿:这里后续要不要复用; + // TODO @lesan:ListenerParam 更合适哈。首先它是参数配置,然后形式是键值对 @Schema(description = "任务监听器键值对") @Data public static class ListenerMap { - @Schema(description = "键", example = "xxx") - private String key; - @Schema(description = "值类型", example = "1") @InEnum(BpmListenerMapType.class) private Integer type; + @Schema(description = "键", example = "xxx") + private String key; + @Schema(description = "值", example = "xxx") private String value; @@ -261,9 +275,6 @@ public class BpmSimpleModelNodeVO { } - @Schema(description = "延迟器设置", example = "{}") - private DelaySetting delaySetting; - @Schema(description = "延迟器") @Data @Valid @@ -280,23 +291,16 @@ public class BpmSimpleModelNodeVO { } - // TODO @lesan:routeGroups - @Schema(description = "路由分支组", example = "[]") - private List routeGroup; - - @Schema(description = "默认分支id", example = "Flow_xxx") - private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE - @Schema(description = "路由分支") @Data @Valid public static class RouteCondition { - @Schema(description = "节点 Id", example = "Activity_xxx") + @Schema(description = "节点 Id", example = "Activity_xxx") // 跳转到该节点 @NotEmpty(message = "节点 Id 不能为空") private String nodeId; - // TODO @lesan:type、expression、groups;(可以晚点改,在和 conditionType、conditionExpression、defaultFlow、conditionGroups 讨论!) + // TODO @lesan:type、expression、groups; @Schema(description = "条件类型", example = "1") @InEnum(BpmSimpleModeConditionType.class) @NotNull(message = "条件类型不能为空") From 60d1f1199d7a8eb6955255c2e8299bc6a9ae2ecd Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 8 Jan 2025 10:50:36 +0800 Subject: [PATCH 026/112] =?UTF-8?q?chore:=20=E9=83=A8=E5=88=86=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9B=B4=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...apType.java => BpmListenerParamTypeEnum.java} | 5 ++--- .../vo/model/simple/BpmSimpleModelNodeVO.java | 16 +++++----------- .../flowable/core/util/SimpleModelUtils.java | 2 +- .../task/listener/BpmUserTaskListener.java | 8 ++++---- 4 files changed, 12 insertions(+), 19 deletions(-) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmListenerMapType.java => BpmListenerParamTypeEnum.java} (78%) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java similarity index 78% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java index 0396fbcce9..53b08c9e29 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java @@ -6,7 +6,6 @@ import lombok.Getter; import java.util.Arrays; -// TODO @lesan:BpmListenerParamTypeEnum /** * BPM 任务监听器键值对类型 * @@ -14,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmListenerMapType implements IntArrayValuable { +public enum BpmListenerParamTypeEnum implements IntArrayValuable { FIXED_VALUE(1, "固定值"), FROM_FORM(2, "表单"); @@ -22,7 +21,7 @@ public enum BpmListenerMapType implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmListenerMapType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmListenerParamTypeEnum::getType).toArray(); @Override public int[] array() { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index b5057713ef..b11787b2e4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -113,13 +113,9 @@ public class BpmSimpleModelNodeVO { */ private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - // TODO @lesan:route 改成 router 会不会好点。因为触发器、延迟器,都带了类似 r - - // TODO @lesan:routeGroups @Schema(description = "路由分支组", example = "[]") - private List routeGroup; + private List routerGroups; - // TODO @lesan:貌似没用??? @Schema(description = "默认分支 ID", example = "Flow_xxx") private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE @@ -136,20 +132,19 @@ public class BpmSimpleModelNodeVO { private String path; @Schema(description = "请求头", example = "[]") - private List header; + private List header; @Schema(description = "请求体", example = "[]") - private List body; + private List body; // TODO @芋艿:这里后续要不要复用; - // TODO @lesan:ListenerParam 更合适哈。首先它是参数配置,然后形式是键值对 @Schema(description = "任务监听器键值对") @Data - public static class ListenerMap { + public static class ListenerParam { @Schema(description = "值类型", example = "1") - @InEnum(BpmListenerMapType.class) + @InEnum(BpmListenerParamTypeEnum.class) private Integer type; @Schema(description = "键", example = "xxx") @@ -300,7 +295,6 @@ public class BpmSimpleModelNodeVO { @NotEmpty(message = "节点 Id 不能为空") private String nodeId; - // TODO @lesan:type、expression、groups; @Schema(description = "条件类型", example = "1") @InEnum(BpmSimpleModeConditionType.class) @NotNull(message = "条件类型不能为空") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 343ba01bf8..fddfc37147 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -200,7 +200,7 @@ public class SimpleModelUtils { // 3. 遍历分支节点 if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { // 路由分支遍历 - for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouteGroups()) { + for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouterGroups()) { SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); process.addFlowElement(sequenceFlow); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 1680b26691..ac61b33ae8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerMapType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; @@ -84,16 +84,16 @@ public class BpmUserTaskListener implements TaskListener { // 4. 是否需要后续操作?TODO 芋艿:待定! } - private void parseListenerMap(List list, + private void parseListenerMap(List list, Map processVariables, MultiValueMap to) { if (CollUtil.isEmpty(list)) { return; } list.forEach(item -> { - if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { + if (item.getType().equals(BpmListenerParamTypeEnum.FIXED_VALUE.getType())) { to.add(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { + } else if (item.getType().equals(BpmListenerParamTypeEnum.FROM_FORM.getType())) { to.add(item.getKey(), processVariables.get(item.getValue()).toString()); } }); From 1fb8c9238a7e2d773855c10ed12a2e34ae6ca799 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 8 Jan 2025 14:22:52 +0800 Subject: [PATCH 027/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-=E7=9B=91=E5=90=AC=E5=99=A8=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/BpmnModelUtils.java | 19 --------- .../flowable/core/util/SimpleModelUtils.java | 16 ++++++-- .../task/listener/BpmUserTaskListener.java | 39 ++++++++++++------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index f2f3017ec9..fc4e68e21a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -114,25 +114,6 @@ public class BpmnModelUtils { return element != null ? JsonUtils.parseObject(element.getElementText(), clazz) : null; } - /** - * 给节点添加Simple设计器配置Json - * - * @param userTask 节点 - * @param node 节点对象 - */ - public static void addSimpleConfigInfo(FlowElement userTask, Object node) { - addExtensionElementJson(userTask, "config", node); - } - - /** - * 解析Simple设计器配置Json - * - * @param userTask 节点 - */ - public static BpmSimpleModelNodeVO parseSimpleConfigInfo(FlowElement userTask) { - return parseExtensionElementJson(userTask, "config", BpmSimpleModelNodeVO.class); - } - /** * 给节点添加候选人元素 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index fddfc37147..deee7a0f46 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; import cn.iocoder.yudao.module.bpm.enums.definition.*; @@ -439,9 +440,6 @@ public class SimpleModelUtils { } // 设置监听器 addUserTaskListener(node, userTask); - // 设置 Simple 设计器节点配置 - // TODO @lesan:只设置到 flowableListener 里面,整个 node 太大了!因为很多都保存过啦。 - addSimpleConfigInfo(userTask, node); return userTask; } @@ -453,6 +451,10 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); + FieldExtension fieldExtension = new FieldExtension(); + fieldExtension.setFieldName("listenerConfig"); + fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCreateListener())); + flowableListener.getFieldExtensions().add(fieldExtension); flowableListeners.add(flowableListener); } if (node.getTaskAssignListener() != null @@ -461,6 +463,10 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); + FieldExtension fieldExtension = new FieldExtension(); + fieldExtension.setFieldName("listenerConfig"); + fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskAssignListener())); + flowableListener.getFieldExtensions().add(fieldExtension); flowableListeners.add(flowableListener); } if (node.getTaskCompleteListener() != null @@ -469,6 +475,10 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); + FieldExtension fieldExtension = new FieldExtension(); + fieldExtension.setFieldName("listenerConfig"); + fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCompleteListener())); + flowableListener.getFieldExtensions().add(fieldExtension); flowableListeners.add(flowableListener); } if (CollUtil.isNotEmpty(flowableListeners)) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index ac61b33ae8..4fce01df3a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -10,7 +12,9 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.FieldExtension; +import org.flowable.bpmn.model.FlowableListener; +import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.TaskListener; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.service.delegate.DelegateTask; @@ -26,7 +30,6 @@ import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; -import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSimpleConfigInfo; /** * BPM 用户任务通用监听器 @@ -53,9 +56,9 @@ public class BpmUserTaskListener implements TaskListener { // 1. 获取所需基础信息 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); - FlowElement userTask = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); - BpmSimpleModelNodeVO node = parseSimpleConfigInfo(userTask); - BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(), node); + UserTask userTask = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); + BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(), + userTask.getTaskListeners()); // 2. 获取请求头和请求体 Map processVariables = processInstance.getProcessVariables(); @@ -79,8 +82,12 @@ public class BpmUserTaskListener implements TaskListener { HttpEntity> requestEntity = new HttpEntity<>(body, headers); ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, requestEntity, String.class); - // TODO @lesan:日志打印,可以更全哈,例如说,请求参数、对应的 task id,哪个 listener - log.info("[notify][的响应结果({})]", responseEntity); + log.info("[notify][监听器:{},事件类型:{},请求头:{},请求体:{},响应结果:{}]", + DELEGATE_EXPRESSION, + delegateTask.getEventName(), + headers, + body, + responseEntity); // 4. 是否需要后续操作?TODO 芋艿:待定! } @@ -99,14 +106,16 @@ public class BpmUserTaskListener implements TaskListener { }); } - // TODO @lesan:改成 jdk8 写法哈。主要考虑好兼容! - private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, BpmSimpleModelNodeVO node) { - return switch (eventName) { - case TaskListener.EVENTNAME_CREATE -> node.getTaskCreateListener(); - case TaskListener.EVENTNAME_ASSIGNMENT -> node.getTaskAssignListener(); - case TaskListener.EVENTNAME_COMPLETE -> node.getTaskCompleteListener(); - default -> null; // TODO @lesan:这个抛出异常,可控一点 - }; + private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, List node) { + FlowableListener flowableListener = node.stream() + .filter(item -> item.getEvent().equals(eventName)) + .findFirst().orElse(null); + Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener); + FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream() + .filter(item -> item.getFieldName().equals("listenerConfig")) + .findFirst().orElse(null); + Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension); + return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class); } } \ No newline at end of file From fd4b6ef9e468c15a313e858c507f9d5844fb0162 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 8 Jan 2025 16:55:23 +0800 Subject: [PATCH 028/112] =?UTF-8?q?feat:=20Simple=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8-userTask-=E6=B7=BB=E5=8A=A0=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=AD=BE=E5=90=8D=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 3 +++ .../admin/task/vo/task/BpmTaskRespVO.java | 3 +++ .../core/enums/BpmnModelConstants.java | 5 +++++ .../flowable/core/util/BpmnModelUtils.java | 21 +++++++++++++++++++ .../flowable/core/util/SimpleModelUtils.java | 2 ++ .../bpm/service/task/BpmTaskServiceImpl.java | 7 ++++++- 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index b11787b2e4..1fd048e9b6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -60,6 +60,9 @@ public class BpmSimpleModelNodeVO { @Schema(description = "操作按钮设置", example = "[]") private List buttonsSetting; // 用于审批节点 + @Schema(description = "是否需要签名", example = "false") + private Boolean signEnable; + /** * 审批节点拒绝处理 */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index 5b34d36db9..95917f6292 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -78,6 +78,9 @@ public class BpmTaskRespVO { @Schema(description = "操作按钮设置值") private Map buttonsSetting; + @Schema(description = "是否需要签名") + private Boolean signEnable; + @Data @Schema(description = "流程实例") public static class ProcessInstance { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java index 60a864848a..6bb418f0fa 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java @@ -110,4 +110,9 @@ public interface BpmnModelConstants { */ String START_USER_NODE_ID = "StartUserNode"; + /** + * 是否需要签名 + */ + String SIGN_ENABLE = "signEnable"; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index fc4e68e21a..de31536681 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; @@ -367,6 +368,26 @@ public class BpmnModelUtils { return Optional.ofNullable(extensionElement).map(ExtensionElement::getElementText).orElse(null); } + public static void addSignEnable(Boolean signEnable, FlowElement userTask) { + if (ObjUtil.isNotNull(signEnable)) { + addExtensionElement(userTask, SIGN_ENABLE, signEnable.toString()); + } else { + addExtensionElement(userTask, SIGN_ENABLE, "false"); + } + } + + public static Boolean parseSignEnable(BpmnModel bpmnModel, String flowElementId) { + FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); + if (flowElement == null) { + return false; + } + List extensionElements = flowElement.getExtensionElements().get(SIGN_ENABLE); + if (CollUtil.isEmpty(extensionElements)) { + return false; + } + return Convert.toBool(extensionElements.get(0).getElementText(), false); + } + // ========== BPM 简单查找相关的方法 ========== /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index deee7a0f46..e392d8b6f7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -440,6 +440,8 @@ public class SimpleModelUtils { } // 设置监听器 addUserTaskListener(node, userTask); + // 添加是否需要签名 + addSignEnable(node.getSignEnable(), userTask); return userTask; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 355e96979c..4240d402cf 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -64,6 +64,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSignEnable; /** * 流程任务实例 Service 实现类 @@ -161,13 +162,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(todoTask.getProcessDefinitionId()); Map buttonsSetting = BpmnModelUtils.parseButtonsSetting( bpmnModel, todoTask.getTaskDefinitionKey()); + Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); // 4. 任务表单 BpmFormDO taskForm = null; if (StrUtil.isNotBlank(todoTask.getFormKey())){ taskForm = formService.getForm(NumberUtils.parseLong(todoTask.getFormKey())); } - return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm); + + BpmTaskRespVO bpmTaskRespVO = BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm); + bpmTaskRespVO.setSignEnable(signEnable); + return bpmTaskRespVO; } @Override From 62aabc633c857a21cd2ef0449e11829fbdc2d1a7 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Jan 2025 22:11:52 +0800 Subject: [PATCH 029/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20=E7=AD=BE=E5=90=8D=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 2 ++ .../flowable/core/util/BpmnModelUtils.java | 26 ++----------------- .../flowable/core/util/SimpleModelUtils.java | 1 + .../bpm/service/task/BpmTaskServiceImpl.java | 5 ++-- .../task/listener/BpmUserTaskListener.java | 4 ++- 5 files changed, 10 insertions(+), 28 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 1fd048e9b6..2b87bffccb 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -119,6 +119,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支组", example = "[]") private List routerGroups; + // TODO @lesan:这个目前前端是随机生成的。可以后端来随机么? @Schema(description = "默认分支 ID", example = "Flow_xxx") private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE @@ -289,6 +290,7 @@ public class BpmSimpleModelNodeVO { } + // TODO @lesan:还有相关的也要改下哈。route 到 router @Schema(description = "路由分支") @Data @Valid diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index de31536681..0ffb9dcb38 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -3,11 +3,8 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; @@ -58,18 +55,6 @@ public class BpmnModelUtils { element.addExtensionElement(extensionElement); } - public static void addExtensionElementJson(FlowElement element, String name, Object value) { - if (value == null) { - return; - } - ExtensionElement extensionElement = new ExtensionElement(); - extensionElement.setNamespace(FLOWABLE_EXTENSIONS_NAMESPACE); - extensionElement.setNamespacePrefix(FLOWABLE_EXTENSIONS_PREFIX); - extensionElement.setElementText(JsonUtils.toJsonString(value)); - extensionElement.setName(name); - element.addExtensionElement(extensionElement); - } - public static void addExtensionElement(FlowElement element, String name, Integer value) { if (value == null) { return; @@ -107,14 +92,6 @@ public class BpmnModelUtils { return element != null ? element.getElementText() : null; } - public static T parseExtensionElementJson(FlowElement flowElement, String elementName, Class clazz) { - if (flowElement == null) { - return null; - } - ExtensionElement element = CollUtil.getFirst(flowElement.getExtensionElements().get(elementName)); - return element != null ? JsonUtils.parseObject(element.getElementText(), clazz) : null; - } - /** * 给节点添加候选人元素 * @@ -369,6 +346,7 @@ public class BpmnModelUtils { } public static void addSignEnable(Boolean signEnable, FlowElement userTask) { + // TODO @lesan:是不是改成表达式会好点 addExtensionElement(userTask, SIGN_ENABLE, ObjUtil.isNotNull(signEnable) ? ) if (ObjUtil.isNotNull(signEnable)) { addExtensionElement(userTask, SIGN_ENABLE, signEnable.toString()); } else { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index e392d8b6f7..e5a9a06070 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -465,6 +465,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); + // TODO @lesan:可以在 BpmnModelUtils 搞个方法,类似 public static Integer parseCandidateStrategy。这样,就收敛啦! FieldExtension fieldExtension = new FieldExtension(); fieldExtension.setFieldName("listenerConfig"); fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskAssignListener())); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 4240d402cf..d7df16e857 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -170,9 +170,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { taskForm = formService.getForm(NumberUtils.parseLong(todoTask.getFormKey())); } - BpmTaskRespVO bpmTaskRespVO = BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm); - bpmTaskRespVO.setSignEnable(signEnable); - return bpmTaskRespVO; + return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) + .setSignEnable(signEnable); } @Override diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 4fce01df3a..2eb9240564 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -71,7 +71,7 @@ public class BpmUserTaskListener implements TaskListener { headers.add(HEADER_TENANT_ID, delegateTask.getTenantId()); } // 2.2 请求体默认参数 - // TODO @芋艿:哪些默认参数,后续再调研下; + // TODO @芋艿:哪些默认参数,后续再调研下;感觉可以搞个 task 字段,把整个 delegateTask 放进去; body.add("processInstanceId", delegateTask.getProcessInstanceId()); body.add("assignee", delegateTask.getAssignee()); body.add("taskDefinitionKey", delegateTask.getTaskDefinitionKey()); @@ -80,6 +80,7 @@ public class BpmUserTaskListener implements TaskListener { // 3. 异步发起请求 // TODO @芋艿:确认要同步,还是异步 HttpEntity> requestEntity = new HttpEntity<>(body, headers); + // TODO @lesan:可能需要 try catch 哇? RestClientException ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, requestEntity, String.class); log.info("[notify][监听器:{},事件类型:{},请求头:{},请求体:{},响应结果:{}]", @@ -111,6 +112,7 @@ public class BpmUserTaskListener implements TaskListener { .filter(item -> item.getEvent().equals(eventName)) .findFirst().orElse(null); Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener); + // TODO @lesan:BpmnModelUtils 提供一个 BpmSimpleModelNodeVO.ListenerHandler 解析方法,尽量收敛掉。 FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream() .filter(item -> item.getFieldName().equals("listenerConfig")) .findFirst().orElse(null); From fcbf1d0765968b7d40b0642ff1fb496bf6d86153 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:04:39 +0800 Subject: [PATCH 030/112] =?UTF-8?q?fix:=20defaultFlowId=E7=94=B1=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java | 1 - .../bpm/framework/flowable/core/util/SimpleModelUtils.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 2b87bffccb..d4547da671 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -119,7 +119,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支组", example = "[]") private List routerGroups; - // TODO @lesan:这个目前前端是随机生成的。可以后端来随机么? @Schema(description = "默认分支 ID", example = "Flow_xxx") private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index e5a9a06070..6e150b6fa2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -728,6 +728,7 @@ public class SimpleModelUtils { exclusiveGateway.setId(node.getId()); // 设置默认的序列流(条件) + node.setDefaultFlowId("Flow_" + IdUtil.fastUUID()); exclusiveGateway.setDefaultFlow(node.getDefaultFlowId()); return exclusiveGateway; } From 37cb20d964d3d733e072d219635be1e8303bbb1f Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:17:49 +0800 Subject: [PATCH 031/112] =?UTF-8?q?fix:=20=E6=A3=80=E6=9F=A5=E6=89=80?= =?UTF-8?q?=E6=9C=89route->router?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/BpmSimpleModelNodeType.java | 4 ++-- .../vo/model/simple/BpmSimpleModelNodeVO.java | 6 ++--- .../flowable/core/util/SimpleModelUtils.java | 24 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index e95c59dcdc..4dbae58cbe 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -33,7 +33,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { CONDITION_BRANCH_NODE(51, "条件分支", "exclusiveGateway"), PARALLEL_BRANCH_NODE(52, "并行分支", "parallelGateway"), INCLUSIVE_BRANCH_NODE(53, "包容分支", "inclusiveGateway"), - ROUTE_BRANCH_NODE(54, "路由分支", "exclusiveGateway") + ROUTER_BRANCH_NODE(54, "路由分支", "exclusiveGateway") ; public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); @@ -51,7 +51,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { return Objects.equals(CONDITION_BRANCH_NODE.getType(), type) || Objects.equals(PARALLEL_BRANCH_NODE.getType(), type) || Objects.equals(INCLUSIVE_BRANCH_NODE.getType(), type) - || Objects.equals(ROUTE_BRANCH_NODE.getType(), type); + || Objects.equals(ROUTER_BRANCH_NODE.getType(), type); } public static BpmSimpleModelNodeType valueOf(Integer type) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index d4547da671..b3f03cd3ff 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -117,10 +117,10 @@ public class BpmSimpleModelNodeVO { private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE @Schema(description = "路由分支组", example = "[]") - private List routerGroups; + private List routerGroups; @Schema(description = "默认分支 ID", example = "Flow_xxx") - private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE + private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE @Schema(description = "任务监听器") @Valid @@ -293,7 +293,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支") @Data @Valid - public static class RouteCondition { + public static class RouterCondition { @Schema(description = "节点 Id", example = "Activity_xxx") // 跳转到该节点 @NotEmpty(message = "节点 Id 不能为空") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 6e150b6fa2..9fc202548b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -188,7 +188,7 @@ public class SimpleModelUtils { // 分支终点节点 ID String branchEndNodeId = null; if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE - || nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { // 条件分支或路由分支 + || nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { // 条件分支或路由分支 // 分两种情况 1. 分支节点有孩子节点为孩子节点 Id 2. 分支节点孩子为无效节点时 (分支嵌套且为分支最后一个节点) 为分支终点节点 ID branchEndNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; } else if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE @@ -199,10 +199,10 @@ public class SimpleModelUtils { Assert.notEmpty(branchEndNodeId, "分支终点节点 Id 不能为空"); // 3. 遍历分支节点 - if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { // 路由分支遍历 - for (BpmSimpleModelNodeVO.RouteCondition route : node.getRouterGroups()) { - SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), route); + for (BpmSimpleModelNodeVO.RouterCondition router : node.getRouterGroups()) { + SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), router); process.addFlowElement(sequenceFlow); } } else { @@ -233,7 +233,7 @@ public class SimpleModelUtils { SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); process.addFlowElement(sequenceFlow); // 4.2 如果是路由分支,需要连接后续节点为默认路由 - } else if (nodeType == BpmSimpleModelNodeType.ROUTE_BRANCH_NODE) { + } else if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(), null, null); process.addFlowElement(sequenceFlow); @@ -646,9 +646,9 @@ public class SimpleModelUtils { node.getConditionGroups()); } - public static String buildConditionExpression(BpmSimpleModelNodeVO.RouteCondition route) { - return buildConditionExpression(route.getConditionType(), route.getConditionExpression(), - route.getConditionGroups()); + public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterCondition router) { + return buildConditionExpression(router.getConditionType(), router.getConditionExpression(), + router.getConditionGroups()); } public static String buildConditionExpression(Integer conditionType, String conditionExpression, @@ -735,12 +735,12 @@ public class SimpleModelUtils { @Override public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.ROUTE_BRANCH_NODE; + return BpmSimpleModelNodeType.ROUTER_BRANCH_NODE; } - public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouteCondition route) { - String conditionExpression = ConditionNodeConvert.buildConditionExpression(route); - return buildBpmnSequenceFlow(nodeId, route.getNodeId(), null, null, conditionExpression); + public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterCondition router) { + String conditionExpression = ConditionNodeConvert.buildConditionExpression(router); + return buildBpmnSequenceFlow(nodeId, router.getNodeId(), null, null, conditionExpression); } } From 343991445fc537b7e043a2dd681eaf1cabadc189 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:21:23 +0800 Subject: [PATCH 032/112] =?UTF-8?q?fix:=20addSignEnable=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/framework/flowable/core/util/BpmnModelUtils.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index 0ffb9dcb38..9d558cedd9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -346,12 +346,7 @@ public class BpmnModelUtils { } public static void addSignEnable(Boolean signEnable, FlowElement userTask) { - // TODO @lesan:是不是改成表达式会好点 addExtensionElement(userTask, SIGN_ENABLE, ObjUtil.isNotNull(signEnable) ? ) - if (ObjUtil.isNotNull(signEnable)) { - addExtensionElement(userTask, SIGN_ENABLE, signEnable.toString()); - } else { - addExtensionElement(userTask, SIGN_ENABLE, "false"); - } + addExtensionElement(userTask, SIGN_ENABLE, ObjUtil.isNotNull(signEnable) ? signEnable.toString() : "false"); } public static Boolean parseSignEnable(BpmnModel bpmnModel, String flowElementId) { From a85d51cc8c407316c382f21a093b3969109d48fd Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:26:07 +0800 Subject: [PATCH 033/112] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0addListenerFie?= =?UTF-8?q?ldExtension=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/BpmnModelUtils.java | 8 ++++++++ .../flowable/core/util/SimpleModelUtils.java | 17 +++-------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index 9d558cedd9..eb94833a45 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; @@ -361,6 +362,13 @@ public class BpmnModelUtils { return Convert.toBool(extensionElements.get(0).getElementText(), false); } + public static void addListenerFieldExtension(FlowableListener flowableListener, Object obj) { + FieldExtension fieldExtension = new FieldExtension(); + fieldExtension.setFieldName("listenerConfig"); + fieldExtension.setStringValue(JsonUtils.toJsonString(obj)); + flowableListener.getFieldExtensions().add(fieldExtension); + } + // ========== BPM 简单查找相关的方法 ========== /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 9fc202548b..174198ccd5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; import cn.iocoder.yudao.module.bpm.enums.definition.*; @@ -453,10 +452,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - FieldExtension fieldExtension = new FieldExtension(); - fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCreateListener())); - flowableListener.getFieldExtensions().add(fieldExtension); + addListenerFieldExtension(flowableListener, node.getTaskCreateListener()); flowableListeners.add(flowableListener); } if (node.getTaskAssignListener() != null @@ -465,11 +461,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - // TODO @lesan:可以在 BpmnModelUtils 搞个方法,类似 public static Integer parseCandidateStrategy。这样,就收敛啦! - FieldExtension fieldExtension = new FieldExtension(); - fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskAssignListener())); - flowableListener.getFieldExtensions().add(fieldExtension); + addListenerFieldExtension(flowableListener, node.getTaskAssignListener()); flowableListeners.add(flowableListener); } if (node.getTaskCompleteListener() != null @@ -478,10 +470,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - FieldExtension fieldExtension = new FieldExtension(); - fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCompleteListener())); - flowableListener.getFieldExtensions().add(fieldExtension); + addListenerFieldExtension(flowableListener, node.getTaskCompleteListener()); flowableListeners.add(flowableListener); } if (CollUtil.isNotEmpty(flowableListeners)) { From 533e5c3bf59bc25fc8fffb1b96f362e0f1280549 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:33:16 +0800 Subject: [PATCH 034/112] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96ListenerH?= =?UTF-8?q?andler=E5=86=99=E5=85=A5=E5=8F=8A=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/BpmnModelUtils.java | 13 +++++++++++-- .../flowable/core/util/SimpleModelUtils.java | 6 +++--- .../service/task/listener/BpmUserTaskListener.java | 10 ++-------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index eb94833a45..042447d08d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -362,13 +363,21 @@ public class BpmnModelUtils { return Convert.toBool(extensionElements.get(0).getElementText(), false); } - public static void addListenerFieldExtension(FlowableListener flowableListener, Object obj) { + public static void addListenerConfig(FlowableListener flowableListener, BpmSimpleModelNodeVO.ListenerHandler handler) { FieldExtension fieldExtension = new FieldExtension(); fieldExtension.setFieldName("listenerConfig"); - fieldExtension.setStringValue(JsonUtils.toJsonString(obj)); + fieldExtension.setStringValue(JsonUtils.toJsonString(handler)); flowableListener.getFieldExtensions().add(fieldExtension); } + public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FlowableListener flowableListener) { + FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream() + .filter(item -> item.getFieldName().equals("listenerConfig")) + .findFirst().orElse(null); + Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension); + return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class); + } + // ========== BPM 简单查找相关的方法 ========== /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 174198ccd5..51452b3b7d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -452,7 +452,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - addListenerFieldExtension(flowableListener, node.getTaskCreateListener()); + addListenerConfig(flowableListener, node.getTaskCreateListener()); flowableListeners.add(flowableListener); } if (node.getTaskAssignListener() != null @@ -461,7 +461,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - addListenerFieldExtension(flowableListener, node.getTaskAssignListener()); + addListenerConfig(flowableListener, node.getTaskAssignListener()); flowableListeners.add(flowableListener); } if (node.getTaskCompleteListener() != null @@ -470,7 +470,7 @@ public class SimpleModelUtils { flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); - addListenerFieldExtension(flowableListener, node.getTaskCompleteListener()); + addListenerConfig(flowableListener, node.getTaskCompleteListener()); flowableListeners.add(flowableListener); } if (CollUtil.isNotEmpty(flowableListeners)) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 2eb9240564..fd6a24defd 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -12,7 +11,6 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FieldExtension; import org.flowable.bpmn.model.FlowableListener; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.TaskListener; @@ -30,6 +28,7 @@ import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseListenerConfig; /** * BPM 用户任务通用监听器 @@ -112,12 +111,7 @@ public class BpmUserTaskListener implements TaskListener { .filter(item -> item.getEvent().equals(eventName)) .findFirst().orElse(null); Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener); - // TODO @lesan:BpmnModelUtils 提供一个 BpmSimpleModelNodeVO.ListenerHandler 解析方法,尽量收敛掉。 - FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream() - .filter(item -> item.getFieldName().equals("listenerConfig")) - .findFirst().orElse(null); - Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension); - return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class); + return parseListenerConfig(flowableListener); } } \ No newline at end of file From f1296c59ebb9bcb21ae6e2c511d2b7b7ffdeeebc Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:36:44 +0800 Subject: [PATCH 035/112] =?UTF-8?q?fix:=20restTemplate=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0try-catch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/listener/BpmUserTaskListener.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index fd6a24defd..057fa98571 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -22,6 +22,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.List; @@ -79,15 +80,23 @@ public class BpmUserTaskListener implements TaskListener { // 3. 异步发起请求 // TODO @芋艿:确认要同步,还是异步 HttpEntity> requestEntity = new HttpEntity<>(body, headers); - // TODO @lesan:可能需要 try catch 哇? RestClientException - ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, - requestEntity, String.class); - log.info("[notify][监听器:{},事件类型:{},请求头:{},请求体:{},响应结果:{}]", - DELEGATE_EXPRESSION, - delegateTask.getEventName(), - headers, - body, - responseEntity); + try { + ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, + requestEntity, String.class); + log.info("[notify][监听器:{},事件类型:{},请求头:{},请求体:{},响应结果:{}]", + DELEGATE_EXPRESSION, + delegateTask.getEventName(), + headers, + body, + responseEntity); + } catch (RestClientException e) { + log.error("[error][监听器:{},事件类型:{},请求头:{},请求体:{},请求出错:{}]", + DELEGATE_EXPRESSION, + delegateTask.getEventName(), + headers, + body, + e.getMessage()); + } // 4. 是否需要后续操作?TODO 芋艿:待定! } From 267435c90f9d67600b054189ed7815960d3fa2c1 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 09:37:48 +0800 Subject: [PATCH 036/112] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java | 1 - 1 file changed, 1 deletion(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index b3f03cd3ff..8d0965c9d5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -289,7 +289,6 @@ public class BpmSimpleModelNodeVO { } - // TODO @lesan:还有相关的也要改下哈。route 到 router @Schema(description = "路由分支") @Data @Valid From 71b86e620783f1b618bd82c00d594506e7e43d93 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 9 Jan 2025 13:49:11 +0800 Subject: [PATCH 037/112] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84UserTask?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/enums/ErrorCodeConstants.java | 1 + .../task/vo/instance/BpmApprovalDetailRespVO.java | 3 +++ .../admin/task/vo/task/BpmTaskApproveReqVO.java | 3 +++ .../bpm/convert/task/BpmProcessInstanceConvert.java | 3 ++- .../flowable/core/enums/BpmnVariableConstants.java | 2 ++ .../framework/flowable/core/util/FlowableUtils.java | 4 ++++ .../module/bpm/service/task/BpmTaskServiceImpl.java | 11 ++++++++++- 7 files changed, 25 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 6c7a7ce92e..67df493971 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -54,6 +54,7 @@ public interface ErrorCodeConstants { ErrorCode TASK_TRANSFER_FAIL_USER_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当前审批人为同一人"); ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在"); ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); + ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "签名不能为空!"); // ========== 动态表单模块 1-009-010-000 ========== ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java index 148175d938..c1e24038ce 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java @@ -101,6 +101,9 @@ public class BpmApprovalDetailRespVO { @Schema(description = "审批意见", example = "同意") private String reason; + @Schema(description = "签名", example = "http://xxx") + private String sign; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 5bec026608..9fa4bcb1fd 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -18,6 +18,9 @@ public class BpmTaskApproveReqVO { @NotEmpty(message = "审批意见不能为空") private String reason; + @Schema(description = "签名", example = "http://xxx") + private String sign; + @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.REQUIRED) private Map variables; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index 450699c2f7..b409f0639c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -186,7 +186,8 @@ public interface BpmProcessInstanceConvert { return null; } return BeanUtils.toBean(task, BpmApprovalDetailRespVO.ActivityNodeTask.class) - .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); + .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)) + .setSign(FlowableUtils.getTaskSign(task)); } default Set parseUserIds(HistoricProcessInstance processInstance, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 08fb5c48ee..8b797521a7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -59,4 +59,6 @@ public class BpmnVariableConstants { */ public static final String TASK_VARIABLE_REASON = "TASK_REASON"; + public static final String TASK_VARIABLE_SIGN = "TASK_SIGN"; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 9742c08ed3..619e8ed58c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -213,6 +213,10 @@ public class FlowableUtils { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON); } + public static String getTaskSign(TaskInfo task) { + return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_SIGN); + } + /** * 获得任务的表单 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index d7df16e857..0322537cb0 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -482,6 +482,12 @@ public class BpmTaskServiceImpl implements BpmTaskService { if (instance == null) { throw exception(PROCESS_INSTANCE_NOT_EXISTS); } + // 1.3 校验签名 + BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); + Boolean signEnable = parseSignEnable(bpmnModel, task.getTaskDefinitionKey()); + if (signEnable && StrUtil.isEmpty(reqVO.getSign())) { + throw exception(TASK_SIGNATURE_NOT_EXISTS); + } // 情况一:被委派的任务,不调用 complete 去完成任务 if (DelegationState.PENDING.equals(task.getDelegationState())) { @@ -496,8 +502,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { } // 情况三:审批普通的任务。大多数情况下,都是这样 - // 2.1 更新 task 状态、原因 + // 2.1 更新 task 状态、原因、签字 updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.APPROVE.getStatus(), reqVO.getReason()); + if (signEnable) { + taskService.setVariableLocal(task.getId(), BpmnVariableConstants.TASK_VARIABLE_SIGN, reqVO.getSign()); + } // 2.2 添加评论 taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType(), BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason())); From b2d81e076395290924018af7ce82e241ecf42cb9 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Fri, 10 Jan 2025 12:47:31 +0800 Subject: [PATCH 038/112] =?UTF-8?q?fix:=20=E9=80=9A=E8=BF=87FixedValue?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E6=96=B9=E5=BC=8F=E8=8E=B7=E5=8F=96=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=99=A8=E6=89=A9=E5=B1=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/BpmnModelUtils.java | 11 +++--- .../task/listener/BpmUserTaskListener.java | 39 +++++++------------ 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index 042447d08d..46097c28a0 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -23,6 +23,7 @@ import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.impl.util.io.BytesStreamSource; +import org.flowable.engine.impl.el.FixedValue; import java.util.*; @@ -370,12 +371,10 @@ public class BpmnModelUtils { flowableListener.getFieldExtensions().add(fieldExtension); } - public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FlowableListener flowableListener) { - FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream() - .filter(item -> item.getFieldName().equals("listenerConfig")) - .findFirst().orElse(null); - Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension); - return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class); + public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FixedValue fixedValue) { + String expressionText = fixedValue.getExpressionText(); + Assert.notNull(expressionText, "监听器扩展字段({})不能为空", expressionText); + return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class); } // ========== BPM 简单查找相关的方法 ========== diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 057fa98571..ffe91f277f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,21 +1,18 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowableListener; -import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.TaskListener; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.impl.el.FixedValue; import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.context.annotation.Scope; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -38,34 +35,32 @@ import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModel */ @Component @Slf4j +@Scope("prototype") public class BpmUserTaskListener implements TaskListener { public static final String DELEGATE_EXPRESSION = "${bpmUserTaskListener}"; - @Resource - private BpmModelService modelService; - @Resource private BpmProcessInstanceService processInstanceService; @Resource private RestTemplate restTemplate; + @Setter + private FixedValue listenerConfig; + @Override public void notify(DelegateTask delegateTask) { // 1. 获取所需基础信息 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); - BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); - UserTask userTask = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); - BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(), - userTask.getTaskListeners()); + BpmSimpleModelNodeVO.ListenerHandler listenerHandler = parseListenerConfig(listenerConfig); // 2. 获取请求头和请求体 Map processVariables = processInstance.getProcessVariables(); MultiValueMap headers = new LinkedMultiValueMap<>(); MultiValueMap body = new LinkedMultiValueMap<>(); - parseListenerMap(listenerHandler.getHeader(), processVariables, headers); - parseListenerMap(listenerHandler.getBody(), processVariables, body); + parseListenerParam(listenerHandler.getHeader(), processVariables, headers); + parseListenerParam(listenerHandler.getBody(), processVariables, body); // 2.1 请求头默认参数 if (StrUtil.isNotEmpty(delegateTask.getTenantId())) { headers.add(HEADER_TENANT_ID, delegateTask.getTenantId()); @@ -100,9 +95,9 @@ public class BpmUserTaskListener implements TaskListener { // 4. 是否需要后续操作?TODO 芋艿:待定! } - private void parseListenerMap(List list, - Map processVariables, - MultiValueMap to) { + private void parseListenerParam(List list, + Map processVariables, + MultiValueMap to) { if (CollUtil.isEmpty(list)) { return; } @@ -115,12 +110,4 @@ public class BpmUserTaskListener implements TaskListener { }); } - private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, List node) { - FlowableListener flowableListener = node.stream() - .filter(item -> item.getEvent().equals(eventName)) - .findFirst().orElse(null); - Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener); - return parseListenerConfig(flowableListener); - } - } \ No newline at end of file From b1c115d221b23308a1bce1f25d32a540b88e5371 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Fri, 10 Jan 2025 15:50:15 +0800 Subject: [PATCH 039/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E5=88=86=E9=94=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=B4=AF=E8=AE=A1=E5=B7=B2=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/brokerage/BrokerageUserController.java | 3 ++- .../app/brokerage/AppBrokerageUserController.java | 3 ++- .../mysql/brokerage/BrokerageWithdrawMapper.java | 5 +++-- .../brokerage/BrokerageWithdrawService.java | 4 ++-- .../brokerage/BrokerageWithdrawServiceImpl.java | 14 ++++++++------ 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java index 3380362ff0..c037c9fa00 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java @@ -30,6 +30,7 @@ import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static java.util.Arrays.asList; @Tag(name = "管理后台 - 分销用户") @RestController @@ -110,7 +111,7 @@ public class BrokerageUserController { // 合计分佣的提现 // TODO @疯狂:如果未来支持了打款这个动作,可能 status 会不对; Map withdrawMap = brokerageWithdrawService.getWithdrawSummaryMapByUserId( - userIds, BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS); + userIds, asList(BrokerageWithdrawStatusEnum.AUDIT_SUCCESS, BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS)); // 拼接返回 return success(BrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, brokerageOrderSummaryMap, withdrawMap)); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java index ed889ef162..9f9dcde371 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java @@ -35,6 +35,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static java.util.Arrays.asList; @Tag(name = "用户 APP - 分销用户") @RestController @@ -84,7 +85,7 @@ public class AppBrokerageUserController { BrokerageRecordBizTypeEnum.ORDER, BrokerageRecordStatusEnum.SETTLEMENT, beginTime, endTime); // 统计用户提现的佣金 Integer withdrawPrice = brokerageWithdrawService.getWithdrawSummaryListByUserId(Collections.singleton(userId), - BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS).stream() + asList(BrokerageWithdrawStatusEnum.AUDIT_SUCCESS, BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS)).stream() .findFirst().map(BrokerageWithdrawSummaryRespBO::getPrice).orElse(0); // 统计分销用户数量(一级) Long firstBrokerageUserCount = brokerageUserService.getBrokerageUserCountByBindUserId(userId, 1); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java index dc2b009160..1942cc42bb 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java @@ -41,13 +41,14 @@ public interface BrokerageWithdrawMapper extends BaseMapperX selectCountAndSumPriceByUserIdAndStatus(Collection userIds, Integer status) { + default List selectCountAndSumPriceByUserIdAndStatus(Collection userIds, + Collection status) { List> list = selectMaps(new MPJLambdaWrapper() .select(BrokerageWithdrawDO::getUserId) .selectCount(BrokerageWithdrawDO::getId, BrokerageWithdrawSummaryRespBO::getCount) .selectSum(BrokerageWithdrawDO::getPrice) .in(BrokerageWithdrawDO::getUserId, userIds) - .eq(BrokerageWithdrawDO::getStatus, status) + .in(BrokerageWithdrawDO::getStatus, status) .groupBy(BrokerageWithdrawDO::getUserId)); return BeanUtil.copyToList(list, BrokerageWithdrawSummaryRespBO.class); // selectJoinList有BUG,会与租户插件冲突:解析SQL时,发生异常 https://gitee.com/best_handsome/mybatis-plus-join/issues/I84GYW diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java index 386b4c6107..400d68f76f 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java @@ -74,7 +74,7 @@ public interface BrokerageWithdrawService { * @return 用户提现汇总 List */ List getWithdrawSummaryListByUserId(Collection userIds, - BrokerageWithdrawStatusEnum status); + Collection status); /** * 按照 userId,汇总每个用户的提现 @@ -84,7 +84,7 @@ public interface BrokerageWithdrawService { * @return 用户提现汇总 Map */ default Map getWithdrawSummaryMapByUserId(Set userIds, - BrokerageWithdrawStatusEnum status) { + Collection status) { return convertMap(getWithdrawSummaryListByUserId(userIds, status), BrokerageWithdrawSummaryRespBO::getUserId); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java index 6e63ae71f3..b095494e55 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java @@ -42,6 +42,7 @@ import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; @@ -98,7 +99,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { // 3.1 审批通过的后续处理 if (BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.equals(status)) { auditBrokerageWithdrawSuccess(withdraw); - // 3.2 审批不通过的后续处理 + // 3.2 审批不通过的后续处理 } else if (BrokerageWithdrawStatusEnum.AUDIT_FAIL.equals(status)) { brokerageRecordService.addBrokerage(withdraw.getUserId(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT, String.valueOf(withdraw.getId()), withdraw.getPrice(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT.getTitle()); @@ -114,11 +115,11 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { .setUserId(withdraw.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) .setBizType(PayWalletBizTypeEnum.BROKERAGE_WITHDRAW.getType()).setBizId(withdraw.getId().toString()) .setPrice(withdraw.getPrice())); - // 1.2 微信 API + // 1.2 微信 API } else if (BrokerageWithdrawTypeEnum.WECHAT_API.getType().equals(withdraw.getType())) { // TODO @luchi:这里,要加个转账单号的记录;另外,调用 API 转账,是立马成功,还是有延迟的哈? Long payTransferId = createPayTransfer(withdraw); - // 1.3 剩余类型,都是手动打款,所以不处理 + // 1.3 剩余类型,都是手动打款,所以不处理 } else { // TODO 可优化:未来可以考虑,接入支付宝、银联等 API 转账,实现自动打款 log.info("[auditBrokerageWithdrawSuccess][withdraw({}) 类型({}) 手动打款,无需处理]", withdraw.getId(), withdraw.getType()); @@ -239,11 +240,12 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { @Override public List getWithdrawSummaryListByUserId(Collection userIds, - BrokerageWithdrawStatusEnum status) { - if (CollUtil.isEmpty(userIds)) { + Collection status) { + if (CollUtil.isEmpty(userIds) || CollUtil.isEmpty(status)) { return Collections.emptyList(); } - return brokerageWithdrawMapper.selectCountAndSumPriceByUserIdAndStatus(userIds, status.getStatus()); + return brokerageWithdrawMapper.selectCountAndSumPriceByUserIdAndStatus(userIds, + convertSet(status, BrokerageWithdrawStatusEnum::getStatus)); } } From 2451942cf2fbd9d009347b393f0f662466ecd453 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Fri, 10 Jan 2025 16:24:36 +0800 Subject: [PATCH 040/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E5=88=86=E9=94=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BB=91=E5=AE=9A=E7=A7=BB=E9=99=A4=20try=20?= =?UTF-8?q?catch=EF=BC=8C=E9=94=99=E8=AF=AF=E6=B6=88=E6=81=AF=E7=94=B1?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=BF=9B=E8=A1=8C=E7=89=B9=E6=AE=8A=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../brokerage/BrokerageUserServiceImpl.java | 57 ++++++++----------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java index 921915ea96..490f2cec8c 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java @@ -29,7 +29,6 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; import com.baomidou.mybatisplus.core.metadata.IPage; import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -46,7 +45,6 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; * * @author owen */ -@Slf4j @Service @Validated public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -176,39 +174,34 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @Override public boolean bindBrokerageUser(Long userId, Long bindUserId) { - try { - // 1. 获得分销用户 - boolean isNewBrokerageUser = false; - BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); - if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 - isNewBrokerageUser = true; - brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setBrokeragePrice(0).setFrozenPrice(0); - } + // 1. 获得分销用户 + boolean isNewBrokerageUser = false; + BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); + if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 + isNewBrokerageUser = true; + brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setBrokeragePrice(0).setFrozenPrice(0); + } - // 2.1 校验是否能绑定用户 - boolean validated = isUserCanBind(brokerageUser); - if (!validated) { - return false; - } - // 2.3 校验能否绑定 - validateCanBindUser(brokerageUser, bindUserId); - // 2.3 绑定用户 - if (isNewBrokerageUser) { - Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); - if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 - brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); - } else { - brokerageUser.setBrokerageEnabled(false).setBrokerageTime(LocalDateTime.now()); - } - brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); - } else { - brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); - } - return true; - } catch (Exception e) { - log.error("[bindBrokerageUser][userId({}) 绑定推广员失败 bindUserId({})]", userId, bindUserId, e); + // 2.1 校验是否能绑定用户 + boolean validated = isUserCanBind(brokerageUser); + if (!validated) { return false; } + // 2.3 校验能否绑定 + validateCanBindUser(brokerageUser, bindUserId); + // 2.3 绑定用户 + if (isNewBrokerageUser) { + Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); + if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 + brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); + } else { + brokerageUser.setBrokerageEnabled(false).setBrokerageTime(LocalDateTime.now()); + } + brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); + } else { + brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); + } + return true; } @Override From 31c2e81dd286b9088c5feb4b3ac4abd88ac6519c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 16 Jan 2025 13:12:23 +0800 Subject: [PATCH 041/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E5=AE=A1=E6=89=B9=E7=AD=BE?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java | 2 +- .../admin/task/vo/instance/BpmApprovalDetailRespVO.java | 3 ++- .../bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java | 3 ++- .../framework/flowable/core/enums/BpmnVariableConstants.java | 1 + .../bpm/framework/flowable/core/util/BpmnModelUtils.java | 3 ++- .../module/bpm/framework/flowable/core/util/FlowableUtils.java | 1 + 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 8d0965c9d5..1ba4f39b53 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -119,7 +119,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支组", example = "[]") private List routerGroups; - @Schema(description = "默认分支 ID", example = "Flow_xxx") + @Schema(description = "默认分支 ID", example = "Flow_xxx", hidden = true) // 由后端生成,所以 hidden = true private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE @Schema(description = "任务监听器") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java index c1e24038ce..16a6c0e9e4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java @@ -101,7 +101,8 @@ public class BpmApprovalDetailRespVO { @Schema(description = "审批意见", example = "同意") private String reason; - @Schema(description = "签名", example = "http://xxx") + // TODO @lesan:改成 signPicUrl 会好点 + @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") private String sign; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 9fa4bcb1fd..3988754a29 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -18,7 +18,8 @@ public class BpmTaskApproveReqVO { @NotEmpty(message = "审批意见不能为空") private String reason; - @Schema(description = "签名", example = "http://xxx") + // TODO @lesan:改成 signPicUrl 会好点 + @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") private String sign; @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 8b797521a7..a108789db5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -59,6 +59,7 @@ public class BpmnVariableConstants { */ public static final String TASK_VARIABLE_REASON = "TASK_REASON"; + // TODO @lesan:TASK_SIGN_PIC_URL 。。。虽然长一点,嘿嘿 public static final String TASK_VARIABLE_SIGN = "TASK_SIGN"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index 46097c28a0..df2aed30f9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -349,7 +349,8 @@ public class BpmnModelUtils { } public static void addSignEnable(Boolean signEnable, FlowElement userTask) { - addExtensionElement(userTask, SIGN_ENABLE, ObjUtil.isNotNull(signEnable) ? signEnable.toString() : "false"); + addExtensionElement(userTask, SIGN_ENABLE, + ObjUtil.isNotNull(signEnable) ? signEnable.toString() : Boolean.FALSE.toString()); } public static Boolean parseSignEnable(BpmnModel bpmnModel, String flowElementId) { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 619e8ed58c..fde29a122f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -213,6 +213,7 @@ public class FlowableUtils { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON); } + // TODO @lesan:这个方法名,也改咧 public static String getTaskSign(TaskInfo task) { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_SIGN); } From aba9626384521c88029f89f53fd6ff6487e67217 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 16 Jan 2025 13:56:37 +0800 Subject: [PATCH 042/112] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/task/vo/instance/BpmApprovalDetailRespVO.java | 3 +-- .../controller/admin/task/vo/task/BpmTaskApproveReqVO.java | 3 +-- .../module/bpm/convert/task/BpmProcessInstanceConvert.java | 2 +- .../framework/flowable/core/enums/BpmnVariableConstants.java | 3 +-- .../bpm/framework/flowable/core/util/FlowableUtils.java | 5 ++--- .../yudao/module/bpm/service/task/BpmTaskServiceImpl.java | 4 ++-- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java index 16a6c0e9e4..888f59ada2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmApprovalDetailRespVO.java @@ -101,9 +101,8 @@ public class BpmApprovalDetailRespVO { @Schema(description = "审批意见", example = "同意") private String reason; - // TODO @lesan:改成 signPicUrl 会好点 @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") - private String sign; + private String signPicUrl; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 3988754a29..12449736ce 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -18,9 +18,8 @@ public class BpmTaskApproveReqVO { @NotEmpty(message = "审批意见不能为空") private String reason; - // TODO @lesan:改成 signPicUrl 会好点 @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") - private String sign; + private String signPicUrl; @Schema(description = "变量实例(动态表单)", requiredMode = Schema.RequiredMode.REQUIRED) private Map variables; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index b409f0639c..8118bdd0ca 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -187,7 +187,7 @@ public interface BpmProcessInstanceConvert { } return BeanUtils.toBean(task, BpmApprovalDetailRespVO.ActivityNodeTask.class) .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)) - .setSign(FlowableUtils.getTaskSign(task)); + .setSignPicUrl(FlowableUtils.getTaskSignPicUrl(task)); } default Set parseUserIds(HistoricProcessInstance processInstance, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index a108789db5..12d975cd73 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -59,7 +59,6 @@ public class BpmnVariableConstants { */ public static final String TASK_VARIABLE_REASON = "TASK_REASON"; - // TODO @lesan:TASK_SIGN_PIC_URL 。。。虽然长一点,嘿嘿 - public static final String TASK_VARIABLE_SIGN = "TASK_SIGN"; + public static final String TASK_SIGN_PIC_URL = "TASK_SIGN_PIC_URL"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index fde29a122f..deaa15869d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -213,9 +213,8 @@ public class FlowableUtils { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON); } - // TODO @lesan:这个方法名,也改咧 - public static String getTaskSign(TaskInfo task) { - return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_SIGN); + public static String getTaskSignPicUrl(TaskInfo task) { + return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_SIGN_PIC_URL); } /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 0322537cb0..cd38b8f1a4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -485,7 +485,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 1.3 校验签名 BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); Boolean signEnable = parseSignEnable(bpmnModel, task.getTaskDefinitionKey()); - if (signEnable && StrUtil.isEmpty(reqVO.getSign())) { + if (signEnable && StrUtil.isEmpty(reqVO.getSignPicUrl())) { throw exception(TASK_SIGNATURE_NOT_EXISTS); } @@ -505,7 +505,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 2.1 更新 task 状态、原因、签字 updateTaskStatusAndReason(task.getId(), BpmTaskStatusEnum.APPROVE.getStatus(), reqVO.getReason()); if (signEnable) { - taskService.setVariableLocal(task.getId(), BpmnVariableConstants.TASK_VARIABLE_SIGN, reqVO.getSign()); + taskService.setVariableLocal(task.getId(), BpmnVariableConstants.TASK_SIGN_PIC_URL, reqVO.getSignPicUrl()); } // 2.2 添加评论 taskService.addComment(task.getId(), task.getProcessInstanceId(), BpmCommentTypeEnum.APPROVE.getType(), From 610f39de05caea8f7fcb9094de9053540cb09321 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Thu, 16 Jan 2025 21:02:49 +0800 Subject: [PATCH 043/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=20=E8=A7=A3=E5=86=B3=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E5=88=86=E6=94=AF=E6=8B=92=E7=BB=9D=E4=BB=BB=E5=8A=A1=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B5=81=E7=A8=8B=E6=9C=AA=E7=BB=93=E6=9D=9F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/BpmProcessInstanceEventListener.java | 8 ++++++++ .../task/BpmProcessInstanceServiceImpl.java | 2 +- .../module/bpm/service/task/BpmTaskService.java | 3 ++- .../bpm/service/task/BpmTaskServiceImpl.java | 15 +++++++++++---- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java index a0ec3e40ab..6619979bd8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java @@ -6,6 +6,7 @@ import jakarta.annotation.Resource; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; +import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -22,6 +23,7 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent public static final Set PROCESS_INSTANCE_EVENTS = ImmutableSet.builder() .add(FlowableEngineEventType.PROCESS_COMPLETED) + .add(FlowableEngineEventType.PROCESS_CANCELLED) .build(); @Resource @@ -37,4 +39,10 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent processInstanceService.processProcessInstanceCompleted((ProcessInstance)event.getEntity()); } + @Override + // 特殊情况:当跳转到 EndEvent 流程实例未结束, 会执行 deleteProcessInstance 方法。 + protected void processCancelled(FlowableCancelledEvent event) { + ProcessInstance processInstance = processInstanceService.getProcessInstance(event.getProcessInstanceId()); + processInstanceService.processProcessInstanceCompleted(processInstance); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 3fb17f0a79..890d3ea93d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -668,7 +668,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService runtimeService.setVariable(id, BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, reason); // 2. 结束流程 - taskService.moveTaskToEnd(id); + taskService.moveTaskToEnd(id, reason); } @Override diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java index dd83d287e6..bff859b063 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java @@ -195,8 +195,9 @@ public interface BpmTaskService { * 将指定流程实例的、进行中的流程任务,移动到结束节点 * * @param processInstanceId 流程编号 + * @param reason 原因 */ - void moveTaskToEnd(String processInstanceId); + void moveTaskToEnd(String processInstanceId, String reason); /** * 将任务退回到指定的 targetDefinitionKey 位置 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index d7df16e857..300c3ee700 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -166,7 +166,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 4. 任务表单 BpmFormDO taskForm = null; - if (StrUtil.isNotBlank(todoTask.getFormKey())){ + if (StrUtil.isNotBlank(todoTask.getFormKey())) { taskForm = formService.getForm(NumberUtils.parseLong(todoTask.getFormKey())); } @@ -652,7 +652,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } // 3.2 情况二:直接结束,审批不通过 processInstanceService.updateProcessInstanceReject(instance, reqVO.getReason()); // 标记不通过 - moveTaskToEnd(task.getProcessInstanceId()); // 结束流程 + moveTaskToEnd(task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason())); // 结束流程 } /** @@ -823,7 +823,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } @Override - public void moveTaskToEnd(String processInstanceId) { + public void moveTaskToEnd(String processInstanceId, String reason) { List taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null); if (CollUtil.isEmpty(taskList)) { return; @@ -849,6 +849,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { .processInstanceId(processInstanceId) .moveActivityIdsToSingleActivityId(activityIds, endEvent.getId()) .changeState(); + + // 3. 如果跳转到 EndEvent 流程还未结束, 执行 deleteProcessInstance 方法。 + List executionList = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list(); + if (CollUtil.isNotEmpty(executionList)) { + log.warn("执行跳转到 EndEvent 后, 流程实例未结束。执行 [deleteProcessInstance] 方法"); + runtimeService.deleteProcessInstance(processInstanceId, reason); + } } @Override @@ -1197,7 +1204,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { } } // 注意:需要基于 instance 设置租户编号,避免 Flowable 内部异步时,丢失租户编号 - FlowableUtils.execute(processInstance.getTenantId(),()-> { + FlowableUtils.execute(processInstance.getTenantId(), () -> { AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); }); From 93eb75552af787a33d1a3730b89a26cbdde56474 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Fri, 17 Jan 2025 09:57:06 +0800 Subject: [PATCH 044/112] =?UTF-8?q?feat:=20bpmn=E8=B7=B3=E8=BF=87=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/flowable/core/enums/BpmnVariableConstants.java | 2 ++ .../module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 1 + 2 files changed, 3 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index a108789db5..b942d586a2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -62,4 +62,6 @@ public class BpmnVariableConstants { // TODO @lesan:TASK_SIGN_PIC_URL 。。。虽然长一点,嘿嘿 public static final String TASK_VARIABLE_SIGN = "TASK_SIGN"; + public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 890d3ea93d..83248aa236 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -595,6 +595,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置流程变量,发起人 ID variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 BpmProcessInstanceStatusEnum.RUNNING.getStatus()); + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 true,不影响没配置skipExpression的节点 if (CollUtil.isNotEmpty(startUserSelectAssignees)) { variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); } From 62b271fbf8baefce4bbdc63c3fd802a02414d335 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Fri, 17 Jan 2025 14:01:02 +0800 Subject: [PATCH 045/112] =?UTF-8?q?feat:=20=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=95=B0=E6=8D=AE=E6=B8=85=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/BpmModelController.java | 9 ++++++ .../service/definition/BpmModelService.java | 8 +++++ .../definition/BpmModelServiceImpl.java | 32 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java index c63b0f5a22..8d23d4c93e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java @@ -161,6 +161,15 @@ public class BpmModelController { return success(true); } + @DeleteMapping("/clean") + @Operation(summary = "清理模型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:model:delete')") + public CommonResult cleanModel(@RequestParam("id") String id) { + modelService.cleanModel(getLoginUserId(), id); + return success(true); + } + // ========== 仿钉钉/飞书的精简模型 ========= @GetMapping("/simple/get") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java index 98a856bf42..3ccba5e613 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java @@ -88,6 +88,14 @@ public interface BpmModelService { */ void deleteModel(Long userId, String id); + /** + * 清理模型 + * + * @param userId 用户编号 + * @param id 编号 + */ + void cleanModel(Long userId, String id); + /** * 修改模型的状态,实际更新的部署的流程定义的状态 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 8ffbe688c5..85f849c5a7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; @@ -25,10 +26,14 @@ import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.StartEvent; import org.flowable.bpmn.model.UserTask; import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ModelQuery; import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -63,6 +68,11 @@ public class BpmModelServiceImpl implements BpmModelService { @Resource private BpmTaskCandidateInvoker taskCandidateInvoker; + @Resource + private HistoryService historyService; + @Resource + private RuntimeService runtimeService; + @Override public List getModelList(String name) { ModelQuery modelQuery = repositoryService.createModelQuery(); @@ -246,6 +256,28 @@ public class BpmModelServiceImpl implements BpmModelService { updateProcessDefinitionSuspended(model.getDeploymentId()); } + @Override + public void cleanModel(Long userId, String id) { + // 1. 校验流程模型存在 + Model model = validateModelManager(id, userId); + + // 2. 清理所有流程数据 + // TODO @芋艿:这里没有找到批量操作的方法,会不会有性能问题~ + // 2.1 先取消所有正在运行的流程 + List processInstances = runtimeService.createProcessInstanceQuery() + .processDefinitionKey(model.getKey()).list(); + processInstances.forEach(processInstance -> { + runtimeService.deleteProcessInstance(processInstance.getId(), + BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); + }); + // 2.2 再从历史中删除所有相关的流程数据 + List historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(model.getKey()).list(); + historicProcessInstances.forEach(historicProcessInstance -> { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + }); + } + @Override public void updateModelState(Long userId, String id, Integer state) { // 1.1 校验流程模型存在 From 9c4648e54545d8f82ffb20734a4ace9eb33f0936 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 19:07:58 +0800 Subject: [PATCH 046/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E5=AE=A1=E6=89=B9=E7=AD=BE?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/enums/BpmnVariableConstants.java | 4 +++- .../core/listener/BpmProcessInstanceEventListener.java | 4 ++-- .../bpm/framework/flowable/core/util/FlowableUtils.java | 6 ++++++ .../module/bpm/service/task/BpmTaskServiceImpl.java | 9 +++++---- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 12d975cd73..7963c73ded 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -58,7 +58,9 @@ public class BpmnVariableConstants { * @see org.flowable.task.api.Task#getTaskLocalVariables() */ public static final String TASK_VARIABLE_REASON = "TASK_REASON"; - + /** + * 任务变量 - 签名图片 URL + */ public static final String TASK_SIGN_PIC_URL = "TASK_SIGN_PIC_URL"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java index 6619979bd8..5251aea64f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java @@ -39,10 +39,10 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent processInstanceService.processProcessInstanceCompleted((ProcessInstance)event.getEntity()); } - @Override - // 特殊情况:当跳转到 EndEvent 流程实例未结束, 会执行 deleteProcessInstance 方法。 + @Override // 特殊情况:当跳转到 EndEvent 流程实例未结束, 会执行 deleteProcessInstance 方法 protected void processCancelled(FlowableCancelledEvent event) { ProcessInstance processInstance = processInstanceService.getProcessInstance(event.getProcessInstanceId()); processInstanceService.processProcessInstanceCompleted(processInstance); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index deaa15869d..9b10e4a78b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -213,6 +213,12 @@ public class FlowableUtils { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_VARIABLE_REASON); } + /** + * 获得任务的签名图片 URL + * + * @param task 任务 + * @return 签名图片 URL + */ public static String getTaskSignPicUrl(TaskInfo task) { return (String) task.getTaskLocalVariables().get(BpmnVariableConstants.TASK_SIGN_PIC_URL); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index f8fba212f3..11f9457958 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -859,10 +859,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { .moveActivityIdsToSingleActivityId(activityIds, endEvent.getId()) .changeState(); - // 3. 如果跳转到 EndEvent 流程还未结束, 执行 deleteProcessInstance 方法。 - List executionList = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list(); - if (CollUtil.isNotEmpty(executionList)) { - log.warn("执行跳转到 EndEvent 后, 流程实例未结束。执行 [deleteProcessInstance] 方法"); + // 3. 特殊:如果跳转到 EndEvent 流程还未结束, 执行 deleteProcessInstance 方法 + // TODO 芋艿:目前发现并行分支情况下,会存在这个情况,后续看看有没更好的方案; + List executions = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list(); + if (CollUtil.isNotEmpty(executions)) { + log.warn("[moveTaskToEnd][执行跳转到 EndEvent 后, 流程实例未结束,强制执行 deleteProcessInstance 方法]"); runtimeService.deleteProcessInstance(processInstanceId, reason); } } From bcc535e034c6af635097fde1a8a349ed3abe067e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 19:20:22 +0800 Subject: [PATCH 047/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E8=B7=B3=E8=BF=87=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/enums/BpmnVariableConstants.java | 9 +++++++-- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 9f19f662f4..0f3e4c2079 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -43,6 +43,13 @@ public class BpmnVariableConstants { * @see ProcessInstance#getProcessVariables() */ public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s"; + /** + * 流程实例的变量 - 是否跳过表达式 + * + * @see ProcessInstance#getProcessVariables() + * @see Flowable/Activiti之SkipExpression 完成自动审批 + */ + public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; /** * 任务的变量 - 状态 @@ -63,6 +70,4 @@ public class BpmnVariableConstants { */ public static final String TASK_SIGN_PIC_URL = "TASK_SIGN_PIC_URL"; - public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; - } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 83248aa236..ed4e0f4c25 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -595,7 +595,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置流程变量,发起人 ID variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 BpmProcessInstanceStatusEnum.RUNNING.getStatus()); - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 true,不影响没配置skipExpression的节点 + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 true,不影响没配置 skipExpression 的节点 if (CollUtil.isNotEmpty(startUserSelectAssignees)) { variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); } From 70538320c84df0a20b4da63b03a3f821180d80b3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 19:29:07 +0800 Subject: [PATCH 048/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=B8=85=E7=90=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/controller/admin/definition/BpmModelController.java | 2 +- .../yudao/module/bpm/service/definition/BpmModelService.java | 2 +- .../module/bpm/service/definition/BpmModelServiceImpl.java | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java index 8d23d4c93e..6483ee0e39 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java @@ -164,7 +164,7 @@ public class BpmModelController { @DeleteMapping("/clean") @Operation(summary = "清理模型") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('bpm:model:delete')") + @PreAuthorize("@ss.hasPermission('bpm:model:clean')") public CommonResult cleanModel(@RequestParam("id") String id) { modelService.cleanModel(getLoginUserId(), id); return success(true); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java index 3ccba5e613..5601bcda31 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java @@ -89,7 +89,7 @@ public interface BpmModelService { void deleteModel(Long userId, String id); /** - * 清理模型 + * 清理模型,包括流程实例 * * @param userId 用户编号 * @param id 编号 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 85f849c5a7..a8cc55ed91 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -262,7 +262,8 @@ public class BpmModelServiceImpl implements BpmModelService { Model model = validateModelManager(id, userId); // 2. 清理所有流程数据 - // TODO @芋艿:这里没有找到批量操作的方法,会不会有性能问题~ + // TODO @芋艿:这里没有找到批量操作的方法,会不会有性能问题~; + // TODO @lesan:建议按照顺序?1)List processInstances 循环处理;然后删除删除一个示实例,接着删除它的 history; // 2.1 先取消所有正在运行的流程 List processInstances = runtimeService.createProcessInstanceQuery() .processDefinitionKey(model.getKey()).list(); @@ -276,6 +277,8 @@ public class BpmModelServiceImpl implements BpmModelService { historicProcessInstances.forEach(historicProcessInstance -> { historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); }); + // TODO @lesan:流程任务,是不是也要清理哈? + // TODO @lesan:抄送是不是也要清理; } @Override From a985ba923efffe750f757c46ee8e93ea7dbe309f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 19:56:09 +0800 Subject: [PATCH 049/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=85=A8=E5=B1=80=EF=BC=9A=E6=B8=85=E7=90=86?= =?UTF-8?q?=E6=8E=89=E5=A4=9A=E4=BD=99=E9=87=8D=E5=A4=8D=E7=9A=84=20"/*.ht?= =?UTF-8?q?ml"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/config/YudaoWebSecurityConfigurerAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index c91bc31906..68ae1b30c5 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -128,7 +128,7 @@ public class YudaoWebSecurityConfigurerAdapter { // ①:全局共享规则 .authorizeHttpRequests(c -> c // 1.1 静态资源,可匿名访问 - .requestMatchers(HttpMethod.GET, "/*.html", "/*.html", "/*.css", "/*.js").permitAll() + .requestMatchers(HttpMethod.GET, "/*.html", "/*.css", "/*.js").permitAll() // 1.2 设置 @PermitAll 无需认证 .requestMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll() .requestMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll() From 25c86c05b3ae595b13210cd1566554573b863540 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 19:57:33 +0800 Subject: [PATCH 050/112] =?UTF-8?q?=E3=80=90=E6=8B=BC=E5=86=99=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=80=91=E5=85=A8=E5=B1=80=EF=BC=9A=E9=81=87=E5=88=B0?= =?UTF-8?q?=E6=94=B9=E6=88=90=E8=8A=8B=E9=81=93=EF=BC=8C=E6=8B=BC=E5=86=99?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/core/client/impl/weixin/AbstractWxPayClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java index 7f4cc584aa..374afccad6 100644 --- a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java +++ b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java @@ -48,7 +48,7 @@ import static cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClient /** * 微信支付抽象类,实现微信统一的接口、以及部分实现(退款) * - * @author 遇到源码 + * @author 芋道源码 */ @Slf4j public abstract class AbstractWxPayClient extends AbstractPayClient { From 2725376b91b10d24ba87df461039bc3a70c61a44 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jan 2025 20:04:09 +0800 Subject: [PATCH 051/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E5=88=86=E9=94=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=B4=AF=E8=AE=A1=E5=B7=B2=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BD=BF=E7=94=A8=20WITHDRAW=5FSUCCESS=20?= =?UTF-8?q?=E4=BD=93=E7=8E=B0=E6=88=90=E5=8A=9F=E7=8A=B6=E6=80=81=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/brokerage/BrokerageWithdrawServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java index b095494e55..390a1fcde7 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java @@ -240,12 +240,12 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { @Override public List getWithdrawSummaryListByUserId(Collection userIds, - Collection status) { - if (CollUtil.isEmpty(userIds) || CollUtil.isEmpty(status)) { + Collection statuses) { + if (CollUtil.isEmpty(userIds) || CollUtil.isEmpty(statuses)) { return Collections.emptyList(); } return brokerageWithdrawMapper.selectCountAndSumPriceByUserIdAndStatus(userIds, - convertSet(status, BrokerageWithdrawStatusEnum::getStatus)); + convertSet(statuses, BrokerageWithdrawStatusEnum::getStatus)); } } From 6c3afa7c969d6a190272d0cbec329c56f3507049 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Sun, 19 Jan 2025 08:39:32 +0800 Subject: [PATCH 052/112] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B8=85?= =?UTF-8?q?=E7=90=86=E6=8A=84=E9=80=81=E5=92=8C=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceCopyMapper.java | 3 +++ .../definition/BpmModelServiceImpl.java | 20 +++++++++++++++---- .../task/BpmProcessInstanceCopyService.java | 6 ++++++ .../BpmProcessInstanceCopyServiceImpl.java | 5 +++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java index 8f23024e84..11bd10aefd 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java @@ -25,4 +25,7 @@ public interface BpmProcessInstanceCopyMapper extends BaseMapperX getModelList(String name) { @@ -262,23 +269,28 @@ public class BpmModelServiceImpl implements BpmModelService { Model model = validateModelManager(id, userId); // 2. 清理所有流程数据 - // TODO @芋艿:这里没有找到批量操作的方法,会不会有性能问题~; - // TODO @lesan:建议按照顺序?1)List processInstances 循环处理;然后删除删除一个示实例,接着删除它的 history; // 2.1 先取消所有正在运行的流程 List processInstances = runtimeService.createProcessInstanceQuery() .processDefinitionKey(model.getKey()).list(); processInstances.forEach(processInstance -> { runtimeService.deleteProcessInstance(processInstance.getId(), BpmReasonEnum.CANCEL_BY_SYSTEM.getReason()); + historyService.deleteHistoricProcessInstance(processInstance.getId()); + processInstanceCopyService.deleteProcessInstanceCopy(processInstance.getId()); }); // 2.2 再从历史中删除所有相关的流程数据 List historicProcessInstances = historyService.createHistoricProcessInstanceQuery() .processDefinitionKey(model.getKey()).list(); historicProcessInstances.forEach(historicProcessInstance -> { historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + processInstanceCopyService.deleteProcessInstanceCopy(historicProcessInstance.getId()); + }); + // 2.3 清理所有 Task + List tasks = taskService.createTaskQuery() + .processDefinitionKey(model.getKey()).list(); + tasks.forEach(task -> { + taskService.deleteTask(task.getId()); }); - // TODO @lesan:流程任务,是不是也要清理哈? - // TODO @lesan:抄送是不是也要清理; } @Override diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java index 3cbac06168..b226029d94 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java @@ -50,4 +50,10 @@ public interface BpmProcessInstanceCopyService { PageResult getProcessInstanceCopyPage(Long userId, BpmProcessInstanceCopyPageReqVO pageReqVO); + /** + * 删除抄送流程 + * + * @param processInstanceId 流程实例id + */ + void deleteProcessInstanceCopy(String processInstanceId); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java index c2d52de05c..1f90888c48 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java @@ -87,4 +87,9 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy return processInstanceCopyMapper.selectPage(userId, pageReqVO); } + @Override + public void deleteProcessInstanceCopy(String processInstanceId) { + processInstanceCopyMapper.deleteByProcessInstanceId(processInstanceId); + } + } From d758da489c8caefc210c210a9ecfcbb6a359ea8f Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Sun, 19 Jan 2025 10:14:56 +0800 Subject: [PATCH 053/112] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E6=84=8F?= =?UTF-8?q?=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/enums/ErrorCodeConstants.java | 1 + .../vo/model/simple/BpmSimpleModelNodeVO.java | 3 +++ .../admin/task/vo/task/BpmTaskApproveReqVO.java | 1 - .../admin/task/vo/task/BpmTaskRejectReqVO.java | 1 - .../admin/task/vo/task/BpmTaskRespVO.java | 3 +++ .../flowable/core/enums/BpmnModelConstants.java | 5 +++++ .../flowable/core/util/BpmnModelUtils.java | 17 +++++++++++++++++ .../flowable/core/util/SimpleModelUtils.java | 2 ++ .../bpm/service/task/BpmTaskServiceImpl.java | 10 +++++++++- 9 files changed, 40 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 67df493971..bd2b3a60fb 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -55,6 +55,7 @@ public interface ErrorCodeConstants { ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在"); ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "签名不能为空!"); + ErrorCode TASK_REASON_REQUIRE = new ErrorCode(1_009_005_016, "审批意见不能为空!"); // ========== 动态表单模块 1-009-010-000 ========== ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 1ba4f39b53..c134086c66 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -63,6 +63,9 @@ public class BpmSimpleModelNodeVO { @Schema(description = "是否需要签名", example = "false") private Boolean signEnable; + @Schema(description = "审批意见", example = "false") + private Boolean reasonRequire; + /** * 审批节点拒绝处理 */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 12449736ce..23e5851bc8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -15,7 +15,6 @@ public class BpmTaskApproveReqVO { private String id; @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!") - @NotEmpty(message = "审批意见不能为空") private String reason; @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java index acb4ee91d3..d4dca29aa3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRejectReqVO.java @@ -14,7 +14,6 @@ public class BpmTaskRejectReqVO { private String id; @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!") - @NotEmpty(message = "审批意见不能为空") private String reason; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index 95917f6292..f68ac10728 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -81,6 +81,9 @@ public class BpmTaskRespVO { @Schema(description = "是否需要签名") private Boolean signEnable; + @Schema(description = "审批意见") + private Boolean reasonRequire; + @Data @Schema(description = "流程实例") public static class ProcessInstance { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java index 6bb418f0fa..fb394cc3d6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java @@ -115,4 +115,9 @@ public interface BpmnModelConstants { */ String SIGN_ENABLE = "signEnable"; + /** + * 审批意见是否必填 + */ + String REASON_REQUIRE = "reasonRequire"; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index df2aed30f9..ef7c09b4d4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -365,6 +365,23 @@ public class BpmnModelUtils { return Convert.toBool(extensionElements.get(0).getElementText(), false); } + public static void addReasonRequire(Boolean reasonRequire, FlowElement userTask) { + addExtensionElement(userTask, REASON_REQUIRE, + ObjUtil.isNotNull(reasonRequire) ? reasonRequire.toString() : Boolean.FALSE.toString()); + } + + public static Boolean parseReasonRequire(BpmnModel bpmnModel, String flowElementId) { + FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); + if (flowElement == null) { + return false; + } + List extensionElements = flowElement.getExtensionElements().get(REASON_REQUIRE); + if (CollUtil.isEmpty(extensionElements)) { + return false; + } + return Convert.toBool(extensionElements.get(0).getElementText(), false); + } + public static void addListenerConfig(FlowableListener flowableListener, BpmSimpleModelNodeVO.ListenerHandler handler) { FieldExtension fieldExtension = new FieldExtension(); fieldExtension.setFieldName("listenerConfig"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 51452b3b7d..713c391e3f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -441,6 +441,8 @@ public class SimpleModelUtils { addUserTaskListener(node, userTask); // 添加是否需要签名 addSignEnable(node.getSignEnable(), userTask); + // 审批意见 + addReasonRequire(node.getReasonRequire(), userTask); return userTask; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 11f9457958..03a65f2a58 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -64,6 +64,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseReasonRequire; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSignEnable; /** @@ -163,6 +164,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { Map buttonsSetting = BpmnModelUtils.parseButtonsSetting( bpmnModel, todoTask.getTaskDefinitionKey()); Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); + Boolean reasonRequire = parseReasonRequire(bpmnModel, todoTask.getTaskDefinitionKey()); // 4. 任务表单 BpmFormDO taskForm = null; @@ -171,7 +173,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { } return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) - .setSignEnable(signEnable); + .setSignEnable(signEnable) + .setReasonRequire(reasonRequire); } @Override @@ -488,6 +491,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { if (signEnable && StrUtil.isEmpty(reqVO.getSignPicUrl())) { throw exception(TASK_SIGNATURE_NOT_EXISTS); } + // 1.4 校验审批意见 + Boolean reasonRequire = parseReasonRequire(bpmnModel, task.getTaskDefinitionKey()); + if (reasonRequire && StrUtil.isEmpty(reqVO.getReason())) { + throw exception(TASK_REASON_REQUIRE); + } // 情况一:被委派的任务,不调用 complete 去完成任务 if (DelegationState.PENDING.equals(task.getDelegationState())) { From 68b7a9a9544c172139dfb85598e28f69781d7de4 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Sun, 19 Jan 2025 16:42:21 +0800 Subject: [PATCH 054/112] =?UTF-8?q?feat:=20=E6=8F=90=E4=BA=A4=E4=BA=BA?= =?UTF-8?q?=E6=9D=83=E9=99=90-=E5=85=81=E8=AE=B8=E6=92=A4=E9=94=80?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=B8=AD=E7=9A=84=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java | 1 + .../admin/definition/vo/model/BpmModelMetaInfoVO.java | 3 +++ .../dataobject/definition/BpmProcessDefinitionInfoDO.java | 6 ++++++ .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 7 +++++++ 4 files changed, 17 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java index 67df493971..7ebf7eca8e 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java @@ -38,6 +38,7 @@ public interface ErrorCodeConstants { ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "任务({})的候选人未配置"); ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "任务({})的候选人({})不存在"); ErrorCode PROCESS_INSTANCE_START_USER_CAN_START = new ErrorCode(1_009_004_005, "发起流程失败,你没有权限发起该流程"); + ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW = new ErrorCode(1_009_004_005, "流程取消失败,该流程不允许取消"); // ========== 流程任务 1-009-005-000 ========== ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index f0676b2512..432f5353e2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -62,4 +62,7 @@ public class BpmModelMetaInfoVO { @Schema(description = "排序", example = "1") private Long sort; // 创建时,后端自动生成 + @Schema(description = "允许撤销审批中的申请") + private Boolean allowCancelRunningProcess; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 7248b31cdb..d0def6866c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -150,4 +150,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @TableField(typeHandler = StringListTypeHandler.class) // 为了可以使用 find_in_set 进行过滤 private List managerUserIds; + /** + * 允许撤销审批中的申请 + * TODO @芋艿 需要同步修改数据库字段 + */ + private Boolean allowCancelRunningProcess; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index ed4e0f4c25..5f6e85a206 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -642,6 +642,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } + // 1.3 校验允许撤销审批中的申请 + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(instance.getProcessDefinitionId()); + Assert.notNull(processDefinitionInfo, "流程定义({})不存在", processDefinitionInfo); + if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未配置 AllowCancelRunningProcess , 默认为可取消 + && !processDefinitionInfo.getAllowCancelRunningProcess()) { + throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW); + } // 2. 取消流程 updateProcessInstanceCancel(cancelReqVO.getId(), From fcf0b562fdd242fe9aab97f546753e7ea763458f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 19 Jan 2025 18:22:34 +0800 Subject: [PATCH 055/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E5=8F=91=E8=B5=B7=E4=BA=BA?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=85=81=E8=AE=B8=E6=92=A4=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/BpmModelMetaInfoVO.java | 2 +- .../dal/dataobject/definition/BpmProcessDefinitionInfoDO.java | 3 +-- .../module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index 432f5353e2..eadfc24394 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -62,7 +62,7 @@ public class BpmModelMetaInfoVO { @Schema(description = "排序", example = "1") private Long sort; // 创建时,后端自动生成 - @Schema(description = "允许撤销审批中的申请") + @Schema(description = "允许撤销审批中的申请", example = "true") private Boolean allowCancelRunningProcess; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index d0def6866c..132d79b143 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -151,8 +151,7 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { private List managerUserIds; /** - * 允许撤销审批中的申请 - * TODO @芋艿 需要同步修改数据库字段 + * 是否允许撤销审批中的申请 */ private Boolean allowCancelRunningProcess; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 5f6e85a206..6d9168e145 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -646,7 +646,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(instance.getProcessDefinitionId()); Assert.notNull(processDefinitionInfo, "流程定义({})不存在", processDefinitionInfo); if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未配置 AllowCancelRunningProcess , 默认为可取消 - && !processDefinitionInfo.getAllowCancelRunningProcess()) { + && Boolean.FALSE.equals(processDefinitionInfo.getAllowCancelRunningProcess())) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW); } From 081e716e723b88fe060aa84a7c087e467a033c1b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 19 Jan 2025 18:27:50 +0800 Subject: [PATCH 056/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=98=AF=E5=90=A6=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E5=AE=A1=E6=89=B9=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/simple/BpmSimpleModelNodeVO.java | 2 +- .../controller/admin/task/vo/task/BpmTaskApproveReqVO.java | 2 +- .../bpm/controller/admin/task/vo/task/BpmTaskRespVO.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index c134086c66..40a615a47c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -63,7 +63,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "是否需要签名", example = "false") private Boolean signEnable; - @Schema(description = "审批意见", example = "false") + @Schema(description = "是否填写审批意见", example = "false") private Boolean reasonRequire; /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 23e5851bc8..40df86efc8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -14,7 +14,7 @@ public class BpmTaskApproveReqVO { @NotEmpty(message = "任务编号不能为空") private String id; - @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!") + @Schema(description = "审批意见", example = "不错不错!") private String reason; @Schema(description = "签名", example = "https://www.iocoder.cn/sign.png") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index f68ac10728..684a8bd5e7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -78,10 +78,10 @@ public class BpmTaskRespVO { @Schema(description = "操作按钮设置值") private Map buttonsSetting; - @Schema(description = "是否需要签名") + @Schema(description = "是否需要签名", example = "false") private Boolean signEnable; - @Schema(description = "审批意见") + @Schema(description = "是否填写审批意见", example = "false") private Boolean reasonRequire; @Data From 96875b1e022f03e9857f4027fd49c0785a45bfca Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 19 Jan 2025 18:33:02 +0800 Subject: [PATCH 057/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E4=BF=AE=E6=94=B9=E3=80=91=20=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E8=AE=BE=E7=BD=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 44 ++++++++++--------- .../flowable/core/util/SimpleModelUtils.java | 16 +++---- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 1ba4f39b53..bbe341a182 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -101,20 +101,10 @@ public class BpmSimpleModelNodeVO { @Schema(description = "条件节点") private List conditionNodes; // 补充说明:有且仅有条件、并行、包容分支会使用 - // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? - @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionType.class) - private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "条件表达式", example = "${day>3}") - private String conditionExpression; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "是否默认条件", example = "true") - private Boolean defaultFlow; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE /** - * 条件组 + * 条件节点设置 */ - private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + private ConditionSetting conditionSetting; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE @Schema(description = "路由分支组", example = "[]") private List routerGroups; @@ -155,9 +145,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "值", example = "xxx") private String value; - } - } @Schema(description = "审批节点拒绝处理策略") @@ -192,7 +180,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "最大提醒次数", example = "1") private Integer maxRemindCount; - } @Schema(description = "空处理策略") @@ -207,7 +194,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "指定人员审批的用户编号数组", example = "1") private List userIds; - } @Schema(description = "操作按钮设置") @@ -226,6 +212,28 @@ public class BpmSimpleModelNodeVO { private Boolean enable; } + @Schema(description = "条件设置") + @Data + @Valid + // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + public static class ConditionSetting { + + @Schema(description = "条件类型", example = "1") + @InEnum(BpmSimpleModeConditionType.class) + private Integer conditionType; + + @Schema(description = "条件表达式", example = "${day>3}") + private String conditionExpression; + + @Schema(description = "是否默认条件", example = "true") + private Boolean defaultFlow; + + /** + * 条件组 + */ + private ConditionGroups conditionGroups; + } + @Schema(description = "条件组") @Data @Valid @@ -270,7 +278,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "运算符右边的值", example = "1") @NotEmpty(message = "运算符右边的值不能为空") private String rightSide; - } @Schema(description = "延迟器") @@ -286,7 +293,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") @NotEmpty(message = "延迟时间表达式不能为空") private String delayTime; - } @Schema(description = "路由分支") @@ -308,7 +314,5 @@ public class BpmSimpleModelNodeVO { @Schema(description = "条件组", example = "{}") private ConditionGroups conditionGroups; - } - } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 51452b3b7d..fc230ccdfc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -544,7 +544,7 @@ public class SimpleModelUtils { // 设置默认的序列流(条件) BpmSimpleModelNodeVO defaultSeqFlow = CollUtil.findOne(node.getConditionNodes(), - item -> BooleanUtil.isTrue(item.getDefaultFlow())); + item -> BooleanUtil.isTrue(item.getConditionSetting().getDefaultFlow())); Assert.notNull(defaultSeqFlow, "条件分支节点({})的默认序列流不能为空", node.getId()); exclusiveGateway.setDefaultFlow(defaultSeqFlow.getId()); return exclusiveGateway; @@ -587,7 +587,7 @@ public class SimpleModelUtils { inclusiveGateway.setId(node.getId()); // 设置默认的序列流(条件) BpmSimpleModelNodeVO defaultSeqFlow = CollUtil.findOne(node.getConditionNodes(), - item -> BooleanUtil.isTrue(item.getDefaultFlow())); + item -> BooleanUtil.isTrue(item.getConditionSetting().getDefaultFlow())); Assert.notNull(defaultSeqFlow, "包容分支节点({})的默认序列流不能为空", node.getId()); inclusiveGateway.setDefaultFlow(defaultSeqFlow.getId()); // TODO @jason:setName @@ -631,8 +631,8 @@ public class SimpleModelUtils { * @param node 条件节点 */ public static String buildConditionExpression(BpmSimpleModelNodeVO node) { - return buildConditionExpression(node.getConditionType(), node.getConditionExpression(), - node.getConditionGroups()); + return buildConditionExpression(node.getConditionSetting().getConditionType(), node.getConditionSetting().getConditionExpression(), + node.getConditionSetting().getConditionGroups()); } public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterCondition router) { @@ -771,11 +771,11 @@ public class SimpleModelUtils { if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE) { // 查找满足条件的 BpmSimpleModelNodeVO 节点 BpmSimpleModelNodeVO matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), - conditionNode -> !BooleanUtil.isTrue(conditionNode.getDefaultFlow()) + conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) && evalConditionExpress(variables, conditionNode)); if (matchConditionNode == null) { matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), - conditionNode -> BooleanUtil.isTrue(conditionNode.getDefaultFlow())); + conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); } Assert.notNull(matchConditionNode, "找不到条件节点({})", currentNode); // 遍历满足条件的 BpmSimpleModelNodeVO 节点 @@ -786,11 +786,11 @@ public class SimpleModelUtils { if (nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) { // 查找满足条件的 BpmSimpleModelNodeVO 节点 Collection matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), - conditionNode -> !BooleanUtil.isTrue(conditionNode.getDefaultFlow()) + conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) && evalConditionExpress(variables, conditionNode)); if (CollUtil.isEmpty(matchConditionNodes)) { matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), - conditionNode -> BooleanUtil.isTrue(conditionNode.getDefaultFlow())); + conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); } Assert.isTrue(!matchConditionNodes.isEmpty(), "找不到条件节点({})", currentNode); // 遍历满足条件的 BpmSimpleModelNodeVO 节点 From e55be75357f9b7278269793749536a21d87f0145 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 20 Jan 2025 08:39:37 +0800 Subject: [PATCH 058/112] =?UTF-8?q?fix:=20=E9=87=8D=E5=91=BD=E5=90=8DRoute?= =?UTF-8?q?rCondition->RouterSetting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/simple/BpmSimpleModelNodeVO.java | 4 ++-- .../bpm/framework/flowable/core/util/SimpleModelUtils.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 239a4fd036..ad9603dff5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -110,7 +110,7 @@ public class BpmSimpleModelNodeVO { private ConditionSetting conditionSetting; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE @Schema(description = "路由分支组", example = "[]") - private List routerGroups; + private List routerGroups; @Schema(description = "默认分支 ID", example = "Flow_xxx", hidden = true) // 由后端生成,所以 hidden = true private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE @@ -301,7 +301,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支") @Data @Valid - public static class RouterCondition { + public static class RouterSetting { @Schema(description = "节点 Id", example = "Activity_xxx") // 跳转到该节点 @NotEmpty(message = "节点 Id 不能为空") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 568c92c50f..74bcbc1632 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -200,7 +200,7 @@ public class SimpleModelUtils { // 3. 遍历分支节点 if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { // 路由分支遍历 - for (BpmSimpleModelNodeVO.RouterCondition router : node.getRouterGroups()) { + for (BpmSimpleModelNodeVO.RouterSetting router : node.getRouterGroups()) { SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), router); process.addFlowElement(sequenceFlow); } @@ -637,7 +637,7 @@ public class SimpleModelUtils { node.getConditionSetting().getConditionGroups()); } - public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterCondition router) { + public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterSetting router) { return buildConditionExpression(router.getConditionType(), router.getConditionExpression(), router.getConditionGroups()); } @@ -729,7 +729,7 @@ public class SimpleModelUtils { return BpmSimpleModelNodeType.ROUTER_BRANCH_NODE; } - public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterCondition router) { + public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterSetting router) { String conditionExpression = ConditionNodeConvert.buildConditionExpression(router); return buildBpmnSequenceFlow(nodeId, router.getNodeId(), null, null, conditionExpression); } From c4fcd0564c1308192a39b7df10bed444e64c141e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Jan 2025 09:18:59 +0800 Subject: [PATCH 059/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E5=B0=86=20routerDefaultFlowId?= =?UTF-8?q?=20=E9=87=8D=E5=91=BD=E5=90=8D=EF=BC=8C=E6=9B=B4=E5=A5=BD?= =?UTF-8?q?=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/simple/BpmSimpleModelNodeVO.java | 4 ++-- .../bpm/framework/flowable/core/util/SimpleModelUtils.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index ad9603dff5..79bc5e0afc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -112,8 +112,8 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支组", example = "[]") private List routerGroups; - @Schema(description = "默认分支 ID", example = "Flow_xxx", hidden = true) // 由后端生成,所以 hidden = true - private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE + @Schema(description = "路由分支默认分支 ID", example = "Flow_xxx", hidden = true) // 由后端生成,所以 hidden = true + private String routerDefaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE @Schema(description = "任务监听器") @Valid diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 74bcbc1632..9269ef1f28 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -233,7 +233,7 @@ public class SimpleModelUtils { process.addFlowElement(sequenceFlow); // 4.2 如果是路由分支,需要连接后续节点为默认路由 } else if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { - SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getDefaultFlowId(), + SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getRouterDefaultFlowId(), null, null); process.addFlowElement(sequenceFlow); } @@ -719,8 +719,8 @@ public class SimpleModelUtils { exclusiveGateway.setId(node.getId()); // 设置默认的序列流(条件) - node.setDefaultFlowId("Flow_" + IdUtil.fastUUID()); - exclusiveGateway.setDefaultFlow(node.getDefaultFlowId()); + node.setRouterDefaultFlowId("Flow_" + IdUtil.fastUUID()); + exclusiveGateway.setDefaultFlow(node.getRouterDefaultFlowId()); return exclusiveGateway; } From daa718a444c7d2768df64681b7f12145a24d95a3 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 20 Jan 2025 11:03:39 +0800 Subject: [PATCH 060/112] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=B5=81=E7=A8=8B=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/BpmModelMetaInfoVO.java | 27 ++++++++++ .../BpmProcessDefinitionInfoDO.java | 7 +++ .../bpm/dal/redis/BpmProcessIdRedisDAO.java | 54 +++++++++++++++++++ .../task/BpmProcessInstanceServiceImpl.java | 19 +++++-- 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index eadfc24394..4825e5f5a9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -65,4 +66,30 @@ public class BpmModelMetaInfoVO { @Schema(description = "允许撤销审批中的申请", example = "true") private Boolean allowCancelRunningProcess; + @Schema(description = "流程 Id 规则", example = "{}") + private ProcessIdRule processIdRule; + + @Schema(description = "流程 Id 规则") + @Data + @Valid + public static class ProcessIdRule { + + @Schema(description = "是否启用", example = "false") + @NotNull(message = "是否启用不能为空") + private Boolean enable; + + @Schema(description = "前缀", example = "xx") + private String prefix; + + @Schema(description = "前缀", example = "20250120") + private String infix; + + @Schema(description = "前缀", example = "xx") + private String postfix; + + @Schema(description = "序列长度", example = "5") + @NotNull(message = "序列长度不能为空") + private Integer length; + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 132d79b143..5369127c16 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; import cn.iocoder.yudao.framework.mybatis.core.type.StringListTypeHandler; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -155,4 +156,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { */ private Boolean allowCancelRunningProcess; + /** + * 流程 Id 规则 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private BpmModelMetaInfoVO.ProcessIdRule processIdRule; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java new file mode 100644 index 0000000000..48666f4373 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.bpm.dal.redis; + +import cn.hutool.core.date.DateUtil; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; +import jakarta.annotation.Resource; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import java.time.Duration; +import java.time.LocalDateTime; + +/** + * BPM 流程 Id 编码的 Redis DAO + * + * @author Lesan + */ +@Repository +public class BpmProcessIdRedisDAO { + + public static final String BPM_PROCESS_ID_PREFIX = "BPMPID"; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + /** + * 生成序号,使用定义的 processIdRule 规则生成 + * + * @param processIdRule 规则 + * @return 序号 + */ + public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { + String infix = ""; + switch (processIdRule.getInfix()) { + case "DAY": + infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDD"); + break; + case "HOUR": + infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHH"); + break; + case "MINUTE": + infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHHmm"); + break; + case "SECOND": + infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHHmmss"); + break; + } + String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); + String key = BPM_PROCESS_ID_PREFIX + noPrefix; + Long no = stringRedisTemplate.opsForValue().increment(key); + stringRedisTemplate.expire(key, Duration.ofDays(1L)); + return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 6d9168e145..a0a581eecd 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -12,12 +12,14 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNodeTask; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; +import cn.iocoder.yudao.module.bpm.dal.redis.BpmProcessIdRedisDAO; import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType; @@ -50,6 +52,7 @@ import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.runtime.ProcessInstanceBuilder; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -109,6 +112,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Resource private BpmTaskCandidateInvoker taskCandidateInvoker; + @Resource + private BpmProcessIdRedisDAO processIdRedisDAO; + // ========== Query 查询相关方法 ========== @Override @@ -599,12 +605,19 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService if (CollUtil.isNotEmpty(startUserSelectAssignees)) { variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); } - ProcessInstance instance = runtimeService.createProcessInstanceBuilder() + + // 3. 流程 Id + ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) - .variables(variables) - .start(); + .variables(variables); + BpmModelMetaInfoVO.ProcessIdRule processIdRule = processDefinitionInfo.getProcessIdRule(); + if (processIdRule != null && processIdRule.getEnable()) { + String id = processIdRedisDAO.generate(processIdRule); + processInstanceBuilder.predefineProcessInstanceId(id); + } + ProcessInstance instance = processInstanceBuilder.start(); return instance.getId(); } From f486790defc75e8afd7b9e852d4e7fb210b3217f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Jan 2025 12:41:33 +0800 Subject: [PATCH 061/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=B5=81=E7=A8=8B=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/BpmModelMetaInfoVO.java | 13 +++++++------ .../definition/BpmProcessDefinitionInfoDO.java | 2 +- .../module/bpm/dal/redis/BpmProcessIdRedisDAO.java | 4 ++++ .../service/task/BpmProcessInstanceServiceImpl.java | 9 +++++---- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index 4825e5f5a9..dfd62cfc2e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -66,10 +66,10 @@ public class BpmModelMetaInfoVO { @Schema(description = "允许撤销审批中的申请", example = "true") private Boolean allowCancelRunningProcess; - @Schema(description = "流程 Id 规则", example = "{}") + @Schema(description = "流程 ID 规则", example = "{}") private ProcessIdRule processIdRule; - @Schema(description = "流程 Id 规则") + @Schema(description = "流程 ID 规则") @Data @Valid public static class ProcessIdRule { @@ -78,18 +78,19 @@ public class BpmModelMetaInfoVO { @NotNull(message = "是否启用不能为空") private Boolean enable; - @Schema(description = "前缀", example = "xx") + @Schema(description = "前缀", example = "XX") private String prefix; - @Schema(description = "前缀", example = "20250120") - private String infix; + @Schema(description = "中缀", example = "20250120") + private String infix; // 精确到日、精确到时、精确到分、精确到秒 - @Schema(description = "前缀", example = "xx") + @Schema(description = "后缀", example = "YY") private String postfix; @Schema(description = "序列长度", example = "5") @NotNull(message = "序列长度不能为空") private Integer length; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 5369127c16..3edbb9fd51 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -157,7 +157,7 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { private Boolean allowCancelRunningProcess; /** - * 流程 Id 规则 + * 流程 ID 规则 */ @TableField(typeHandler = JacksonTypeHandler.class) private BpmModelMetaInfoVO.ProcessIdRule processIdRule; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java index 48666f4373..2e66ab09f8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -17,6 +17,7 @@ import java.time.LocalDateTime; @Repository public class BpmProcessIdRedisDAO { + // TODO @lesan:要枚举到 rediskeyconstants 哈 public static final String BPM_PROCESS_ID_PREFIX = "BPMPID"; @Resource @@ -29,6 +30,7 @@ public class BpmProcessIdRedisDAO { * @return 序号 */ public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { + // 生成日期前缀 String infix = ""; switch (processIdRule.getInfix()) { case "DAY": @@ -44,6 +46,8 @@ public class BpmProcessIdRedisDAO { infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHHmmss"); break; } + + // 生成序号 String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); String key = BPM_PROCESS_ID_PREFIX + noPrefix; Long no = stringRedisTemplate.opsForValue().increment(key); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index a0a581eecd..d60c3c904e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -606,17 +606,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); } - // 3. 流程 Id + // 3. 创建流程 ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables); + // 3.1 创建流程 ID BpmModelMetaInfoVO.ProcessIdRule processIdRule = processDefinitionInfo.getProcessIdRule(); - if (processIdRule != null && processIdRule.getEnable()) { - String id = processIdRedisDAO.generate(processIdRule); - processInstanceBuilder.predefineProcessInstanceId(id); + if (processIdRule != null && Boolean.TRUE.equals(processIdRule.getEnable())) { + processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule)); } + // 3.2 发起流程实例 ProcessInstance instance = processInstanceBuilder.start(); return instance.getId(); } From 4a1fe1f3074df04f474c6dca8144fb086f3ccf06 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Mon, 20 Jan 2025 13:35:45 +0800 Subject: [PATCH 062/112] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=B5=81=E7=A8=8B=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/dal/redis/BpmProcessIdRedisDAO.java | 5 +---- .../module/bpm/dal/redis/RedisKeyConstants.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java index 2e66ab09f8..53a76322fe 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -17,9 +17,6 @@ import java.time.LocalDateTime; @Repository public class BpmProcessIdRedisDAO { - // TODO @lesan:要枚举到 rediskeyconstants 哈 - public static final String BPM_PROCESS_ID_PREFIX = "BPMPID"; - @Resource private StringRedisTemplate stringRedisTemplate; @@ -49,7 +46,7 @@ public class BpmProcessIdRedisDAO { // 生成序号 String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); - String key = BPM_PROCESS_ID_PREFIX + noPrefix; + String key = RedisKeyConstants.BPM_PROCESS_ID + noPrefix; Long no = stringRedisTemplate.opsForValue().increment(key); stringRedisTemplate.expire(key, Duration.ofDays(1L)); return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000000..ceb0fccdd4 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.bpm.dal.redis; + +/** + * BPM Redis Key 枚举类 + * + * @author 芋道源码 + */ +public interface RedisKeyConstants { + + /** + * 流程 ID 的缓存 + */ + String BPM_PROCESS_ID = "bpm:process_id:seq_no:"; + +} From d8bc3a46e58c70fc24a5c457dd0d65a1c6548377 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 21 Jan 2025 08:24:42 +0800 Subject: [PATCH 063/112] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E8=87=AA=E5=8A=A8=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmAutoApproveType.java | 32 ++++++++++++ .../vo/model/BpmModelMetaInfoVO.java | 5 ++ .../BpmProcessDefinitionInfoDO.java | 5 ++ .../bpm/service/task/BpmTaskServiceImpl.java | 51 +++++++++++++++++-- 4 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java new file mode 100644 index 0000000000..7e6444fb2a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.bpm.enums.definition; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * BPM 自动去重的类型的枚举 + * + * @author Lesan + */ +@Getter +@AllArgsConstructor +public enum BpmAutoApproveType implements IntArrayValuable { + + NONE(1, "不自动通过"), + APPROVE_ALL(2, "仅审批一次,后续重复的审批节点均自动通过"), + APPROVE_SEQUENT(3, "仅针对连续审批的节点自动通过"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmAutoApproveType::getType).toArray(); + + private final Integer type; + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + +} \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index dfd62cfc2e..ee14536d58 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveType; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; @@ -69,6 +70,10 @@ public class BpmModelMetaInfoVO { @Schema(description = "流程 ID 规则", example = "{}") private ProcessIdRule processIdRule; + @Schema(description = "自动去重类型", example = "1") + @InEnum(BpmAutoApproveType.class) + private Integer autoApprovalType; + @Schema(description = "流程 ID 规则") @Data @Valid diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 3edbb9fd51..6416e30cd1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -162,4 +162,9 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @TableField(typeHandler = JacksonTypeHandler.class) private BpmModelMetaInfoVO.ProcessIdRule processIdRule; + /** + * 自动去重类型 + */ + private Integer autoApprovalType; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 03a65f2a58..f9f0340917 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.enums.definition.*; import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum; @@ -33,10 +34,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.EndEvent; -import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.UserTask; +import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; import org.flowable.engine.ManagementService; import org.flowable.engine.RuntimeService; @@ -1174,6 +1172,51 @@ public class BpmTaskServiceImpl implements BpmTaskService { log.error("[processTaskAssigned][taskId({}) 没有找到流程实例]", task.getId()); return; } + // 自动去重 TODO @芋艿 驳回的情况得考虑一下 + BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.getProcessDefinitionInfo(task.getProcessDefinitionId()); + if (processDefinitionInfo == null) { + log.error("[processTaskAssigned][taskId({}) 没有找到流程定义]", task.getId()); + return; + } + if (processDefinitionInfo.getAutoApprovalType() != null) { + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .taskAssignee(task.getAssignee()) + .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, + BpmTaskStatusEnum.APPROVE.getStatus()) + .finished(); + if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType())){ + long count = query.count(); + if (count > 0) { + // 自动通过 + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) + .setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason())); + return; + } + } + if (BpmAutoApproveType.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { + BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); + if (bpmnModel == null) { + log.error("[processTaskAssigned][taskId({}) 没有找到流程模型]", task.getId()); + return; + } + FlowNode taskElement = (FlowNode) BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); + List incomingFlows = taskElement.getIncomingFlows(); + List sourceTaskIds = new ArrayList<>(); + if (incomingFlows != null && !incomingFlows.isEmpty()) { + incomingFlows.forEach(flow -> { + sourceTaskIds.add(flow.getSourceRef()); + }); + } + long count = query.taskDefinitionKeys(sourceTaskIds).count(); + if (count > 0) { + // 自动通过 + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) + .setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason())); + return; + } + } + } // 审批人与提交人为同一人时,根据 BpmUserTaskAssignStartUserHandlerTypeEnum 策略进行处理 if (StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) { // 判断是否为退回或者驳回:如果是退回或者驳回不走这个策略 From 0642c5ebe4fcf90063a50d5a0b3ad47db8083c4b Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 21 Jan 2025 08:39:32 +0800 Subject: [PATCH 064/112] =?UTF-8?q?fix:=20=E9=80=9A=E8=BF=87=E7=90=86?= =?UTF-8?q?=E7=94=B1=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/service/task/BpmTaskServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index f9f0340917..38d99b71d8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1190,7 +1190,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { if (count > 0) { // 自动通过 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason())); + .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); return; } } @@ -1212,7 +1212,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { if (count > 0) { // 自动通过 getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason())); + .setReason(BpmAutoApproveType.APPROVE_SEQUENT.getName())); return; } } From ca1d9e6896ef18ea6351df5707b017997031d4b1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 21 Jan 2025 09:37:38 +0800 Subject: [PATCH 065/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E8=87=AA=E5=8A=A8=E5=8E=BB=E9=87=8D=EF=BC=88?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmAutoApproveType.java | 1 + .../BpmProcessDefinitionInfoDO.java | 2 ++ .../bpm/dal/redis/RedisKeyConstants.java | 2 +- .../bpm/service/task/BpmTaskServiceImpl.java | 35 +++++++++---------- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java index 7e6444fb2a..add4529ad3 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java @@ -15,6 +15,7 @@ import java.util.Arrays; @AllArgsConstructor public enum BpmAutoApproveType implements IntArrayValuable { + // TODO @lesan:0、1、/2 会不会好理解一点哈。 NONE(1, "不自动通过"), APPROVE_ALL(2, "仅审批一次,后续重复的审批节点均自动通过"), APPROVE_SEQUENT(3, "仅针对连续审批的节点自动通过"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 6416e30cd1..4effd29989 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -164,6 +164,8 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { /** * 自动去重类型 + * + * 枚举 {@link cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveType} */ private Integer autoApprovalType; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java index ceb0fccdd4..304cda3d8c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java @@ -10,6 +10,6 @@ public interface RedisKeyConstants { /** * 流程 ID 的缓存 */ - String BPM_PROCESS_ID = "bpm:process_id:seq_no:"; + String BPM_PROCESS_ID = "bpm:process_id:"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 38d99b71d8..ce1e029e3a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1172,51 +1172,50 @@ public class BpmTaskServiceImpl implements BpmTaskService { log.error("[processTaskAssigned][taskId({}) 没有找到流程实例]", task.getId()); return; } - // 自动去重 TODO @芋艿 驳回的情况得考虑一下 + + // 自动去重,通过自动审批的方式 TODO @芋艿 驳回的情况得考虑一下;@lesan:驳回后,又自动审批么? BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.getProcessDefinitionInfo(task.getProcessDefinitionId()); if (processDefinitionInfo == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到流程定义]", task.getId()); + log.error("[processTaskAssigned][taskId({}) 没有找到流程定义({})]", task.getId(), task.getProcessDefinitionId()); return; } if (processDefinitionInfo.getAutoApprovalType() != null) { - HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + HistoricTaskInstanceQuery sameAssigneeQuery = historyService.createHistoricTaskInstanceQuery() .processInstanceId(task.getProcessInstanceId()) - .taskAssignee(task.getAssignee()) - .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, - BpmTaskStatusEnum.APPROVE.getStatus()) + .taskAssignee(task.getAssignee()) // 相同审批人 + .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) .finished(); - if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType())){ - long count = query.count(); - if (count > 0) { - // 自动通过 - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); - return; - } + if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) + && sameAssigneeQuery.count() > 0) { + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) + .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); + return; } if (BpmAutoApproveType.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); if (bpmnModel == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到流程模型]", task.getId()); + log.error("[processTaskAssigned][taskId({}) 没有找到流程模型({})]", task.getId(), task.getProcessDefinitionId()); return; } + // TODO @lesan:这里的逻辑,要不在 BpmnModelUtils 抽个方法???尽量收敛 FlowNode taskElement = (FlowNode) BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); List incomingFlows = taskElement.getIncomingFlows(); List sourceTaskIds = new ArrayList<>(); + // TODO @lesan:这种 CollUtil.isnotempty 简化 if (incomingFlows != null && !incomingFlows.isEmpty()) { + // TODO @lesan:这种,idea 一般会告警,可以处理掉哈。一切警告,皆是错误 incomingFlows.forEach(flow -> { sourceTaskIds.add(flow.getSourceRef()); }); } - long count = query.taskDefinitionKeys(sourceTaskIds).count(); - if (count > 0) { - // 自动通过 + if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) .setReason(BpmAutoApproveType.APPROVE_SEQUENT.getName())); return; } } } + // 审批人与提交人为同一人时,根据 BpmUserTaskAssignStartUserHandlerTypeEnum 策略进行处理 if (StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) { // 判断是否为退回或者驳回:如果是退回或者驳回不走这个策略 From 6317a4f3610171c38bfc9251736450d37e3489f3 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Wed, 22 Jan 2025 09:52:06 +0800 Subject: [PATCH 066/112] =?UTF-8?q?fix:=20=E8=87=AA=E5=8A=A8=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=9E=9A=E4=B8=BE=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/enums/definition/BpmAutoApproveType.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java index add4529ad3..c224bf5f3c 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java @@ -15,10 +15,9 @@ import java.util.Arrays; @AllArgsConstructor public enum BpmAutoApproveType implements IntArrayValuable { - // TODO @lesan:0、1、/2 会不会好理解一点哈。 - NONE(1, "不自动通过"), - APPROVE_ALL(2, "仅审批一次,后续重复的审批节点均自动通过"), - APPROVE_SEQUENT(3, "仅针对连续审批的节点自动通过"); + NONE(0, "不自动通过"), + APPROVE_ALL(1, "仅审批一次,后续重复的审批节点均自动通过"), + APPROVE_SEQUENT(2, "仅针对连续审批的节点自动通过"); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmAutoApproveType::getType).toArray(); From e548d4454ebcd3e5c8ab80e25088a0121a4a0ec1 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Wed, 22 Jan 2025 10:08:58 +0800 Subject: [PATCH 067/112] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/BpmTaskServiceImpl.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index ce1e029e3a..1bcb7ad8b9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -62,8 +62,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; -import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseReasonRequire; -import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSignEnable; +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; /** * 流程任务实例 Service 实现类 @@ -1197,17 +1196,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { log.error("[processTaskAssigned][taskId({}) 没有找到流程模型({})]", task.getId(), task.getProcessDefinitionId()); return; } - // TODO @lesan:这里的逻辑,要不在 BpmnModelUtils 抽个方法???尽量收敛 - FlowNode taskElement = (FlowNode) BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); - List incomingFlows = taskElement.getIncomingFlows(); - List sourceTaskIds = new ArrayList<>(); - // TODO @lesan:这种 CollUtil.isnotempty 简化 - if (incomingFlows != null && !incomingFlows.isEmpty()) { - // TODO @lesan:这种,idea 一般会告警,可以处理掉哈。一切警告,皆是错误 - incomingFlows.forEach(flow -> { - sourceTaskIds.add(flow.getSourceRef()); - }); - } + List sourceTaskIds = getElementIncomingFlows(getFlowElementById(bpmnModel, task.getTaskDefinitionKey())) + .stream().map(SequenceFlow::getSourceRef).toList(); if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) .setReason(BpmAutoApproveType.APPROVE_SEQUENT.getName())); From 8a8dc67d72c95ad1bc0d411e319e48014fe3a5d7 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Wed, 22 Jan 2025 22:18:37 +0800 Subject: [PATCH 068/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=91=E6=96=B0=E5=A2=9ESimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E8=A7=A6=E5=8F=91=E5=99=A8=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va => BpmHttpRequestParamSettingType.java} | 6 +- .../definition/BpmSimpleModelNodeType.java | 1 + .../bpm/enums/definition/BpmTriggerType.java | 41 +++++++++ .../vo/model/simple/BpmSimpleModelNodeVO.java | 72 ++++++++++++--- .../core/enums/BpmnModelConstants.java | 10 ++ .../core/listener/BpmTriggerTaskDelegate.java | 54 +++++++++++ .../flowable/core/util/BpmnModelUtils.java | 18 +++- .../flowable/core/util/SimpleModelUtils.java | 92 ++++++++++++++----- .../task/listener/BpmUserTaskListener.java | 24 +---- .../task/trigger/BpmHttpRequestTrigger.java | 73 +++++++++++++++ .../bpm/service/task/trigger/BpmTrigger.java | 28 ++++++ 11 files changed, 354 insertions(+), 65 deletions(-) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmListenerParamTypeEnum.java => BpmHttpRequestParamSettingType.java} (69%) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java similarity index 69% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java index 53b08c9e29..81b0ac5939 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerParamTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java @@ -7,13 +7,13 @@ import lombok.Getter; import java.util.Arrays; /** - * BPM 任务监听器键值对类型 + * BPM HTTP 请求参数设置类型。用于 Simple 设计器任务监听器和触发器配置。 * * @author Lesan */ @Getter @AllArgsConstructor -public enum BpmListenerParamTypeEnum implements IntArrayValuable { +public enum BpmHttpRequestParamSettingType implements IntArrayValuable { FIXED_VALUE(1, "固定值"), FROM_FORM(2, "表单"); @@ -21,7 +21,7 @@ public enum BpmListenerParamTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmListenerParamTypeEnum::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmHttpRequestParamSettingType::getType).toArray(); @Override public int[] array() { diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index 4dbae58cbe..65ee645637 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -27,6 +27,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { COPY_NODE(12, "抄送人", "serviceTask"), DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), + TRIGGER_NODE(15, "触发器", "serviceTask"), // 50 ~ 条件分支 CONDITION_NODE(50, "条件", "sequenceFlow"), // 用于构建流转条件的表达式 diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java new file mode 100644 index 0000000000..b1dbadbfda --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.bpm.enums.definition; + +import cn.hutool.core.util.ArrayUtil; +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * BPM Simple 触发器类型枚举 + * + * @author jason + */ +@Getter +@AllArgsConstructor +public enum BpmTriggerType implements IntArrayValuable { + + HTTP_REQUEST(1, "发起 HTTP 请求"); + + /** + * 触发器执行动作类型 + */ + private final Integer type; + + /** + * 触发器执行动作描述 + */ + private final String desc; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmTriggerType::getType).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } + + public static BpmTriggerType typeOf(Integer type) { + return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 79bc5e0afc..06109e5aba 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -9,6 +9,7 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.hibernate.validator.constraints.URL; import java.util.List; import java.util.Map; @@ -115,6 +116,11 @@ public class BpmSimpleModelNodeVO { @Schema(description = "路由分支默认分支 ID", example = "Flow_xxx", hidden = true) // 由后端生成,所以 hidden = true private String routerDefaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTER_BRANCH_NODE + /** + * 触发器节点设置 + */ + private TriggerSetting triggerSetting; + @Schema(description = "任务监听器") @Valid @Data @@ -128,27 +134,28 @@ public class BpmSimpleModelNodeVO { private String path; @Schema(description = "请求头", example = "[]") - private List header; + private List header; @Schema(description = "请求体", example = "[]") - private List body; + private List body; + } - // TODO @芋艿:这里后续要不要复用; + @Schema(description = "HTTP 请求参数设置") + @Data + public static class HttpRequestParamSetting { - @Schema(description = "任务监听器键值对") - @Data - public static class ListenerParam { + @Schema(description = "值类型", example = "1") + @InEnum(BpmHttpRequestParamSettingType.class) + @NotNull(message = "值类型不能为空") + private Integer type; - @Schema(description = "值类型", example = "1") - @InEnum(BpmListenerParamTypeEnum.class) - private Integer type; + @Schema(description = "键", example = "xxx") + @NotEmpty(message = "键不能为空") + private String key; - @Schema(description = "键", example = "xxx") - private String key; - - @Schema(description = "值", example = "xxx") - private String value; - } + @Schema(description = "值", example = "xxx") + @NotEmpty(message = "值不能为空") + private String value; } @Schema(description = "审批节点拒绝处理策略") @@ -318,4 +325,39 @@ public class BpmSimpleModelNodeVO { @Schema(description = "条件组", example = "{}") private ConditionGroups conditionGroups; } + + @Schema(description = "触发器节点配置") + @Data + @Valid + public static class TriggerSetting { + + @Schema(description = "触发器类型", example = "1") + @InEnum(BpmTriggerType.class) + @NotNull(message = "触发器类型不能为空") + private Integer type; + + /** + * http 请求触发器设置 + */ + @Valid + private HttpRequestTriggerSetting httpRequestSetting; + + @Schema(description = "http 请求触发器设置", example = "{}") + @Data + public static class HttpRequestTriggerSetting { + + @Schema(description = "请求路径", example = "http://127.0.0.1") + @NotEmpty(message = "请求 URL 不能为空") + @URL(message = "请求 URL 格式不正确") + private String url; + + @Schema(description = "请求头参数设置", example = "[]") + @Valid + private List header; + + @Schema(description = "请求头参数设置", example = "[]") + @Valid + private List body; + } + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java index fb394cc3d6..3d644fc246 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java @@ -100,6 +100,16 @@ public interface BpmnModelConstants { */ String BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE = "enable"; + /** + * BPMN ExtensionElement 的扩展属性,用于标记触发器的类型 + */ + String TRIGGER_TYPE = "triggerType"; + + /** + * BPMN ExtensionElement 的扩展属性,用于标记触发器参数 + */ + String TRIGGER_PARAM = "triggerParam"; + /** * BPMN Start Event Node Id */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java new file mode 100644 index 0000000000..60818800f7 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; + +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; +import cn.iocoder.yudao.module.bpm.service.task.trigger.BpmTrigger; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.EnumMap; +import java.util.List; + +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate.BEAN_NAME; + + +/** + * 处理触发器任务 {@link JavaDelegate} 的实现类 + *

+ * 目前只有 Simple 设计器【触发器节点】使用 + * + * @author jason + */ +@Component(BEAN_NAME) +@Slf4j +public class BpmTriggerTaskDelegate implements JavaDelegate { + + public static final String BEAN_NAME = "bpmTriggerTaskDelegate"; + + @Resource + private List triggers; + + private final EnumMap triggerMap = new EnumMap<>(BpmTriggerType.class); + + @PostConstruct + private void init() { + triggers.forEach(trigger -> triggerMap.put(trigger.getType(), trigger)); + } + + @Override + public void execute(DelegateExecution execution) { + FlowElement flowElement = execution.getCurrentFlowElement(); + BpmTriggerType bpmTriggerType = BpmnModelUtils.parserTriggerType(flowElement); + BpmTrigger bpmTrigger = triggerMap.get(bpmTriggerType); + if (bpmTrigger == null) { + log.error("[execute], FlowElement[{}], {} 找不到匹配的 BpmTrigger", execution.getCurrentActivityId(), flowElement); + return; + } + bpmTrigger.execute(execution.getProcessInstanceId(), BpmnModelUtils.parserTriggerParam(flowElement)); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index ef7c09b4d4..ba678c49fe 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -4,17 +4,16 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.*; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskApproveTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignEmptyHandlerTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType; +import cn.iocoder.yudao.module.bpm.enums.definition.*; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -395,6 +394,15 @@ public class BpmnModelUtils { return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class); } + public static BpmTriggerType parserTriggerType(FlowElement flowElement) { + Integer triggerType = NumberUtils.parseInt(parseExtensionElement(flowElement, TRIGGER_TYPE)); + return BpmTriggerType.typeOf(triggerType); + } + + public static String parserTriggerParam(FlowElement flowElement) { + return parseExtensionElement(flowElement, TRIGGER_PARAM); + } + // ========== BPM 简单查找相关的方法 ========== /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 9269ef1f28..a37e10e680 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -5,17 +5,20 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; import cn.iocoder.yudao.module.bpm.enums.definition.*; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmTriggerTaskDelegate; import org.flowable.bpmn.BpmnAutoLayout; import org.flowable.bpmn.constants.BpmnXMLConstants; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.engine.delegate.TaskListener; +import org.springframework.util.MultiValueMap; import java.util.*; @@ -39,7 +42,7 @@ public class SimpleModelUtils { static { List converts = asList(new StartNodeConvert(), new EndNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), - new DelayTimerNodeConvert(), + new DelayTimerNodeConvert(), new TriggerNodeConvert(), new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert()); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); } @@ -93,7 +96,7 @@ public class SimpleModelUtils { /** * 遍历节点,构建 FlowNode 元素 * - * @param node SIMPLE 节点 + * @param node SIMPLE 节点 * @param process BPMN 流程 */ private static void traverseNodeToBuildFlowNode(BpmSimpleModelNodeVO node, Process process) { @@ -124,8 +127,8 @@ public class SimpleModelUtils { /** * 遍历节点,构建 SequenceFlow 元素 * - * @param process Bpmn 流程 - * @param node 当前节点 + * @param process Bpmn 流程 + * @param node 当前节点 * @param targetNodeId 目标节点 ID */ private static void traverseNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { @@ -152,8 +155,8 @@ public class SimpleModelUtils { /** * 遍历普通(非条件)节点,构建 SequenceFlow 元素 * - * @param process Bpmn 流程 - * @param node 当前节点 + * @param process Bpmn 流程 + * @param node 当前节点 * @param targetNodeId 目标节点 ID */ private static void traverseNormalNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { @@ -161,7 +164,7 @@ public class SimpleModelUtils { boolean isChildNodeValid = isValidNode(childNode); // 情况一:有“子”节点,则建立连线 // 情况二:没有“子节点”,则直接跟 targetNodeId 建立连线。例如说,结束节点、条件分支(分支节点的孩子节点或聚合节点)的最后一个节点 - String finalTargetNodeId = isChildNodeValid? childNode.getId() : targetNodeId; + String finalTargetNodeId = isChildNodeValid ? childNode.getId() : targetNodeId; SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), finalTargetNodeId); process.addFlowElement(sequenceFlow); @@ -174,8 +177,8 @@ public class SimpleModelUtils { /** * 遍历条件节点,构建 SequenceFlow 元素 * - * @param process Bpmn 流程 - * @param node 当前节点 + * @param process Bpmn 流程 + * @param node 当前节点 * @param targetNodeId 目标节点 ID */ private static void traverseBranchNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { @@ -231,7 +234,7 @@ public class SimpleModelUtils { String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); process.addFlowElement(sequenceFlow); - // 4.2 如果是路由分支,需要连接后续节点为默认路由 + // 4.2 如果是路由分支,需要连接后续节点为默认路由 } else if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getRouterDefaultFlowId(), null, null); @@ -449,7 +452,7 @@ public class SimpleModelUtils { private void addUserTaskListener(BpmSimpleModelNodeVO node, UserTask userTask) { List flowableListeners = new ArrayList<>(3); if (node.getTaskCreateListener() != null - && Boolean.TRUE.equals(node.getTaskCreateListener().getEnable())) { + && Boolean.TRUE.equals(node.getTaskCreateListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); @@ -458,7 +461,7 @@ public class SimpleModelUtils { flowableListeners.add(flowableListener); } if (node.getTaskAssignListener() != null - && Boolean.TRUE.equals(node.getTaskAssignListener().getEnable())) { + && Boolean.TRUE.equals(node.getTaskAssignListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); @@ -467,7 +470,7 @@ public class SimpleModelUtils { flowableListeners.add(flowableListener); } if (node.getTaskCompleteListener() != null - && Boolean.TRUE.equals(node.getTaskCompleteListener().getEnable())) { + && Boolean.TRUE.equals(node.getTaskCompleteListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); @@ -693,9 +696,9 @@ public class SimpleModelUtils { boundaryEvent.setAttachedToRef(receiveTask); // 2.2 定义超时时间 TimerEventDefinition eventDefinition = new TimerEventDefinition(); - if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_DATE_TIME.getType())){ + if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_DATE_TIME.getType())) { eventDefinition.setTimeDuration(node.getDelaySetting().getDelayTime()); - } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())){ + } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())) { eventDefinition.setTimeDate(node.getDelaySetting().getDelayTime()); } boundaryEvent.addEventDefinition(eventDefinition); @@ -711,6 +714,32 @@ public class SimpleModelUtils { } } + public static class TriggerNodeConvert implements NodeConvert { + + @Override + public ServiceTask convert(BpmSimpleModelNodeVO node) { + // 触发器使用 ServiceTask 来实现 + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setId(node.getId()); + serviceTask.setName(node.getName()); + serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + serviceTask.setImplementation("${" + BpmTriggerTaskDelegate.BEAN_NAME + "}"); + if (node.getTriggerSetting() != null) { + addExtensionElement(serviceTask, TRIGGER_TYPE, node.getTriggerSetting().getType()); + if (node.getTriggerSetting().getHttpRequestSetting() != null) { + addExtensionElement(serviceTask, TRIGGER_PARAM, + JsonUtils.toJsonString(node.getTriggerSetting().getHttpRequestSetting())); + } + } + return serviceTask; + } + + @Override + public BpmSimpleModelNodeType getType() { + return BpmSimpleModelNodeType.TRIGGER_NODE; + } + } + public static class RouteBranchNodeConvert implements NodeConvert { @Override @@ -751,7 +780,7 @@ public class SimpleModelUtils { } private static void simulateNextNode(BpmSimpleModelNodeVO currentNode, Map variables, - List resultNodes) { + List resultNodes) { // 如果不合法(包括为空),则直接结束 if (!isValidNode(currentNode)) { return; @@ -761,10 +790,10 @@ public class SimpleModelUtils { // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE if (nodeType == BpmSimpleModelNodeType.START_NODE - || nodeType == BpmSimpleModelNodeType.START_USER_NODE - || nodeType == BpmSimpleModelNodeType.APPROVE_NODE - || nodeType == BpmSimpleModelNodeType.COPY_NODE - || nodeType == BpmSimpleModelNodeType.END_NODE) { + || nodeType == BpmSimpleModelNodeType.START_USER_NODE + || nodeType == BpmSimpleModelNodeType.APPROVE_NODE + || nodeType == BpmSimpleModelNodeType.COPY_NODE + || nodeType == BpmSimpleModelNodeType.END_NODE) { // 添加元素 resultNodes.add(currentNode); } @@ -774,7 +803,7 @@ public class SimpleModelUtils { // 查找满足条件的 BpmSimpleModelNodeVO 节点 BpmSimpleModelNodeVO matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) - && evalConditionExpress(variables, conditionNode)); + && evalConditionExpress(variables, conditionNode)); if (matchConditionNode == null) { matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); @@ -815,4 +844,25 @@ public class SimpleModelUtils { return BpmnModelUtils.evalConditionExpress(variables, ConditionNodeConvert.buildConditionExpression(conditionNode)); } + /** + * 添加 HTTP 请求参数。请求头或者请求体 + * + * @param params HTTP 请求参数 + * @param paramSettings HTTP 请求参数设置 + * @param processVariables 流程变量 + */ + public static void addHttpRequestParam(MultiValueMap params, + List paramSettings, + Map processVariables) { + if (CollUtil.isEmpty(paramSettings)) { + return; + } + paramSettings.forEach(item -> { + if (item.getType().equals(BpmHttpRequestParamSettingType.FIXED_VALUE.getType())) { + params.add(item.getKey(), item.getValue()); + } else if (item.getType().equals(BpmHttpRequestParamSettingType.FROM_FORM.getType())) { + params.add(item.getKey(), processVariables.get(item.getValue()).toString()); + } + }); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index ffe91f277f..e89587d471 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,9 +1,8 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; import lombok.Setter; @@ -22,7 +21,6 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; @@ -59,8 +57,8 @@ public class BpmUserTaskListener implements TaskListener { Map processVariables = processInstance.getProcessVariables(); MultiValueMap headers = new LinkedMultiValueMap<>(); MultiValueMap body = new LinkedMultiValueMap<>(); - parseListenerParam(listenerHandler.getHeader(), processVariables, headers); - parseListenerParam(listenerHandler.getBody(), processVariables, body); + SimpleModelUtils.addHttpRequestParam(headers, listenerHandler.getHeader(), processVariables); + SimpleModelUtils.addHttpRequestParam(body, listenerHandler.getBody(), processVariables); // 2.1 请求头默认参数 if (StrUtil.isNotEmpty(delegateTask.getTenantId())) { headers.add(HEADER_TENANT_ID, delegateTask.getTenantId()); @@ -94,20 +92,4 @@ public class BpmUserTaskListener implements TaskListener { } // 4. 是否需要后续操作?TODO 芋艿:待定! } - - private void parseListenerParam(List list, - Map processVariables, - MultiValueMap to) { - if (CollUtil.isEmpty(list)) { - return; - } - list.forEach(item -> { - if (item.getType().equals(BpmListenerParamTypeEnum.FIXED_VALUE.getType())) { - to.add(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmListenerParamTypeEnum.FROM_FORM.getType())) { - to.add(item.getKey(), processVariables.get(item.getValue()).toString()); - } - }); - } - } \ No newline at end of file diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java new file mode 100644 index 0000000000..0614e6948c --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.bpm.service.task.trigger; + +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.util.Map; + +import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * BPM 发送 HTTP 请求触发器 + * + * @author jason + */ +@Component +@Slf4j +public class BpmHttpRequestTrigger implements BpmTrigger { + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Resource + private RestTemplate restTemplate; + + @Override + public BpmTriggerType getType() { + return BpmTriggerType.HTTP_REQUEST; + } + + @Override + public void execute(String processInstanceId, String param) { + // 1. 解析 http 请求配置 + HttpRequestTriggerSetting httpRequestSetting = JsonUtils.parseObject(param, HttpRequestTriggerSetting.class); + if (httpRequestSetting == null) { + log.error("[execute] HTTP 触发器请求配置为空"); + return; + } + // 2.1 设置请求头 + ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); + Map processVariables = processInstance.getProcessVariables(); + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add(HEADER_TENANT_ID, processInstance.getTenantId()); + SimpleModelUtils.addHttpRequestParam(headers, httpRequestSetting.getHeader(), processVariables); + // 2.2 设置请求体 + MultiValueMap body = new LinkedMultiValueMap<>(); + SimpleModelUtils.addHttpRequestParam(body, httpRequestSetting.getBody(), processVariables); + body.add("processInstanceId", processInstanceId); + + // 3. 发起请求 + HttpEntity> requestEntity = new HttpEntity<>(body, headers); + try { + ResponseEntity responseEntity = restTemplate.exchange(httpRequestSetting.getUrl(), HttpMethod.POST, + requestEntity, String.class); + log.info("[execute][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity); + } catch (RestClientException e) { + log.error("[execute][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); + } + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java new file mode 100644 index 0000000000..f0c474784f --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.bpm.service.task.trigger; + +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; + +/** + * BPM 触发器接口 + *

+ * 处理不同的动作 + * + * @author jason + */ +public interface BpmTrigger { + + /** + * 对应触发器类型 + * + * @return 触发器类型 + */ + BpmTriggerType getType(); + + /** + * 触发器执行 + * + * @param processInstanceId 流程实例编号 + * @param param 触发器参数 + */ + void execute(String processInstanceId, String param); +} From 61e32752310fbb813adaaa1edac3404618548813 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 23 Jan 2025 08:13:06 +0800 Subject: [PATCH 069/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E8=A7=A6=E5=8F=91=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eType.java => BpmAutoApproveTypeEnum.java} | 4 +- ...ype.java => BpmBoundaryEventTypeEnum.java} | 4 +- ...erType.java => BpmDelayTimerTypeEnum.java} | 4 +- ....java => BpmHttpRequestParamTypeEnum.java} | 4 +- ...e.java => BpmProcessListenerTypeEnum.java} | 2 +- ...a => BpmProcessListenerValueTypeEnum.java} | 2 +- ...va => BpmSimpleModeConditionTypeEnum.java} | 6 +- ...e.java => BpmSimpleModelNodeTypeEnum.java} | 6 +- ...iggerType.java => BpmTriggerTypeEnum.java} | 6 +- ... => BpmUserTaskRejectHandlerTypeEnum.java} | 6 +- .../vo/model/BpmModelMetaInfoVO.java | 4 +- .../vo/model/simple/BpmSimpleModelNodeVO.java | 26 ++-- .../BpmProcessDefinitionInfoDO.java | 3 +- .../definition/BpmProcessListenerDO.java | 3 +- .../core/enums/BpmnModelConstants.java | 1 - .../core/listener/BpmTaskEventListener.java | 8 +- .../core/listener/BpmTriggerTaskDelegate.java | 9 +- .../flowable/core/util/BpmnModelUtils.java | 10 +- .../flowable/core/util/SimpleModelUtils.java | 128 +++++++++--------- .../BpmProcessListenerServiceImpl.java | 10 +- .../task/BpmProcessInstanceServiceImpl.java | 32 ++--- .../bpm/service/task/BpmTaskServiceImpl.java | 17 +-- .../task/trigger/BpmHttpRequestTrigger.java | 20 +-- .../bpm/service/task/trigger/BpmTrigger.java | 5 +- 24 files changed, 165 insertions(+), 155 deletions(-) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmAutoApproveType.java => BpmAutoApproveTypeEnum.java} (85%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmBoundaryEventType.java => BpmBoundaryEventTypeEnum.java} (83%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmDelayTimerType.java => BpmDelayTimerTypeEnum.java} (83%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmHttpRequestParamSettingType.java => BpmHttpRequestParamTypeEnum.java} (82%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmProcessListenerType.java => BpmProcessListenerTypeEnum.java} (89%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmProcessListenerValueType.java => BpmProcessListenerValueTypeEnum.java} (90%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmSimpleModeConditionType.java => BpmSimpleModeConditionTypeEnum.java} (77%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmSimpleModelNodeType.java => BpmSimpleModelNodeTypeEnum.java} (91%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmTriggerType.java => BpmTriggerTypeEnum.java} (82%) rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/{BpmUserTaskRejectHandlerType.java => BpmUserTaskRejectHandlerTypeEnum.java} (77%) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java similarity index 85% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java index c224bf5f3c..f4f8ed99b9 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java @@ -13,13 +13,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmAutoApproveType implements IntArrayValuable { +public enum BpmAutoApproveTypeEnum implements IntArrayValuable { NONE(0, "不自动通过"), APPROVE_ALL(1, "仅审批一次,后续重复的审批节点均自动通过"), APPROVE_SEQUENT(2, "仅针对连续审批的节点自动通过"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmAutoApproveType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmAutoApproveTypeEnum::getType).toArray(); private final Integer type; private final String name; diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java index 242bfcbf8d..a63804de32 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmBoundaryEventTypeEnum.java @@ -11,7 +11,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum BpmBoundaryEventType { +public enum BpmBoundaryEventTypeEnum { USER_TASK_TIMEOUT(1, "用户任务超时"), DELAY_TIMER_TIMEOUT(2, "延迟器超时"); @@ -19,7 +19,7 @@ public enum BpmBoundaryEventType { private final Integer type; private final String name; - public static BpmBoundaryEventType typeOf(Integer type) { + public static BpmBoundaryEventTypeEnum typeOf(Integer type) { return ArrayUtil.firstMatch(eventType -> eventType.getType().equals(type), values()); } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java similarity index 83% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java index db7829958b..9e3583167f 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmDelayTimerType implements IntArrayValuable { +public enum BpmDelayTimerTypeEnum implements IntArrayValuable { FIXED_TIME_DURATION(1, "固定时长"), FIXED_DATE_TIME(2, "固定日期"); @@ -21,7 +21,7 @@ public enum BpmDelayTimerType implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmDelayTimerType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmDelayTimerTypeEnum::getType).toArray(); @Override public int[] array() { diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java similarity index 82% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java index 81b0ac5939..09987c1f92 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamSettingType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmHttpRequestParamSettingType implements IntArrayValuable { +public enum BpmHttpRequestParamTypeEnum implements IntArrayValuable { FIXED_VALUE(1, "固定值"), FROM_FORM(2, "表单"); @@ -21,7 +21,7 @@ public enum BpmHttpRequestParamSettingType implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmHttpRequestParamSettingType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmHttpRequestParamTypeEnum::getType).toArray(); @Override public int[] array() { diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java similarity index 89% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java index 3dde5dfb53..e4fed4215e 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerTypeEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum BpmProcessListenerType { +public enum BpmProcessListenerTypeEnum { EXECUTION("execution", "执行监听器"), TASK("task", "任务执行器"); diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java similarity index 90% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java index 63e23af236..4e57f10bf6 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmProcessListenerValueTypeEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum BpmProcessListenerValueType { +public enum BpmProcessListenerValueTypeEnum { CLASS("class", "Java 类"), DELEGATE_EXPRESSION("delegateExpression", "代理表达式"), diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java similarity index 77% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java index 234ec7e47b..5226b2278e 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionTypeEnum.java @@ -14,18 +14,18 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmSimpleModeConditionType implements IntArrayValuable { +public enum BpmSimpleModeConditionTypeEnum implements IntArrayValuable { EXPRESSION(1, "条件表达式"), RULE(2, "条件规则"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModeConditionType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModeConditionTypeEnum::getType).toArray(); private final Integer type; private final String name; - public static BpmSimpleModeConditionType valueOf(Integer type) { + public static BpmSimpleModeConditionTypeEnum valueOf(Integer type) { return ArrayUtil.firstMatch(nodeType -> nodeType.getType().equals(type), values()); } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java similarity index 91% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java index 65ee645637..0b572a975c 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java @@ -15,7 +15,7 @@ import java.util.Objects; */ @Getter @AllArgsConstructor -public enum BpmSimpleModelNodeType implements IntArrayValuable { +public enum BpmSimpleModelNodeTypeEnum implements IntArrayValuable { // 0 ~ 1 开始和结束 START_NODE(0, "开始", "startEvent"), @@ -37,7 +37,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { ROUTER_BRANCH_NODE(54, "路由分支", "exclusiveGateway") ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeTypeEnum::getType).toArray(); private final Integer type; private final String name; @@ -55,7 +55,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { || Objects.equals(ROUTER_BRANCH_NODE.getType(), type); } - public static BpmSimpleModelNodeType valueOf(Integer type) { + public static BpmSimpleModelNodeTypeEnum valueOf(Integer type) { return ArrayUtil.firstMatch(nodeType -> nodeType.getType().equals(type), values()); } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java similarity index 82% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java index b1dbadbfda..f8b3efb96e 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmTriggerType implements IntArrayValuable { +public enum BpmTriggerTypeEnum implements IntArrayValuable { HTTP_REQUEST(1, "发起 HTTP 请求"); @@ -28,14 +28,14 @@ public enum BpmTriggerType implements IntArrayValuable { */ private final String desc; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmTriggerType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmTriggerTypeEnum::getType).toArray(); @Override public int[] array() { return ARRAYS; } - public static BpmTriggerType typeOf(Integer type) { + public static BpmTriggerTypeEnum typeOf(Integer type) { return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); } } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java similarity index 77% rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java index f2d48f7d9a..6e81ccddee 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerTypeEnum.java @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmUserTaskRejectHandlerType implements IntArrayValuable { +public enum BpmUserTaskRejectHandlerTypeEnum implements IntArrayValuable { FINISH_PROCESS_INSTANCE(1, "终止流程"), RETURN_USER_TASK(2, "驳回到指定任务节点"); @@ -22,9 +22,9 @@ public enum BpmUserTaskRejectHandlerType implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskRejectHandlerType::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskRejectHandlerTypeEnum::getType).toArray(); - public static BpmUserTaskRejectHandlerType typeOf(Integer type) { + public static BpmUserTaskRejectHandlerTypeEnum typeOf(Integer type) { return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index ee14536d58..eb42c73e55 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; @@ -71,7 +71,7 @@ public class BpmModelMetaInfoVO { private ProcessIdRule processIdRule; @Schema(description = "自动去重类型", example = "1") - @InEnum(BpmAutoApproveType.class) + @InEnum(BpmAutoApproveTypeEnum.class) private Integer autoApprovalType; @Schema(description = "流程 ID 规则") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 06109e5aba..d3890adf1e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -25,7 +25,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "模型节点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "模型节点类型不能为空") - @InEnum(BpmSimpleModelNodeType.class) + @InEnum(BpmSimpleModelNodeTypeEnum.class) private Integer type; @Schema(description = "模型节点名称", example = "领导审批") @@ -134,18 +134,19 @@ public class BpmSimpleModelNodeVO { private String path; @Schema(description = "请求头", example = "[]") - private List header; + private List header; @Schema(description = "请求体", example = "[]") - private List body; + private List body; + } @Schema(description = "HTTP 请求参数设置") @Data - public static class HttpRequestParamSetting { + public static class HttpRequestParam { @Schema(description = "值类型", example = "1") - @InEnum(BpmHttpRequestParamSettingType.class) + @InEnum(BpmHttpRequestParamTypeEnum.class) @NotNull(message = "值类型不能为空") private Integer type; @@ -163,7 +164,7 @@ public class BpmSimpleModelNodeVO { public static class RejectHandler { @Schema(description = "拒绝处理类型", example = "1") - @InEnum(BpmUserTaskRejectHandlerType.class) + @InEnum(BpmUserTaskRejectHandlerTypeEnum.class) private Integer type; @Schema(description = "任务拒绝后驳回的节点 Id", example = "Activity_1") @@ -229,7 +230,7 @@ public class BpmSimpleModelNodeVO { public static class ConditionSetting { @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionType.class) + @InEnum(BpmSimpleModeConditionTypeEnum.class) private Integer conditionType; @Schema(description = "条件表达式", example = "${day>3}") @@ -297,7 +298,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "延迟时间类型", example = "1") @NotNull(message = "延迟时间类型不能为空") - @InEnum(BpmDelayTimerType.class) + @InEnum(BpmDelayTimerTypeEnum.class) private Integer delayType; @Schema(description = "延迟时间表达式", example = "PT1H,2025-01-01T00:00:00") @@ -315,7 +316,7 @@ public class BpmSimpleModelNodeVO { private String nodeId; @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionType.class) + @InEnum(BpmSimpleModeConditionTypeEnum.class) @NotNull(message = "条件类型不能为空") private Integer conditionType; @@ -332,7 +333,7 @@ public class BpmSimpleModelNodeVO { public static class TriggerSetting { @Schema(description = "触发器类型", example = "1") - @InEnum(BpmTriggerType.class) + @InEnum(BpmTriggerTypeEnum.class) @NotNull(message = "触发器类型不能为空") private Integer type; @@ -353,11 +354,12 @@ public class BpmSimpleModelNodeVO { @Schema(description = "请求头参数设置", example = "[]") @Valid - private List header; + private List header; @Schema(description = "请求头参数设置", example = "[]") @Valid - private List body; + private List body; } + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 4effd29989..359c7042f4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; import cn.iocoder.yudao.framework.mybatis.core.type.StringListTypeHandler; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -165,7 +166,7 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { /** * 自动去重类型 * - * 枚举 {@link cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveType} + * 枚举 {@link BpmAutoApproveTypeEnum} */ private Integer autoApprovalType; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java index 08ecebe112..4a04c4666a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessListenerDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -42,7 +43,7 @@ public class BpmProcessListenerDO extends BaseDO { /** * 监听类型 * - * 枚举 {@link cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerType} + * 枚举 {@link BpmProcessListenerTypeEnum} * * 1. execution:ExecutionListener 执行监听器 * 2. task:TaskListener 任务监听器 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java index 3d644fc246..9dce8a2eae 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java @@ -104,7 +104,6 @@ public interface BpmnModelConstants { * BPMN ExtensionElement 的扩展属性,用于标记触发器的类型 */ String TRIGGER_TYPE = "triggerType"; - /** * BPMN ExtensionElement 的扩展属性,用于标记触发器参数 */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java index 9968c1c4bf..ecef8fdb48 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; @@ -97,17 +97,17 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { BoundaryEvent boundaryEvent = (BoundaryEvent) element; String boundaryEventType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, BpmnModelConstants.BOUNDARY_EVENT_TYPE); - BpmBoundaryEventType bpmTimerBoundaryEventType = BpmBoundaryEventType.typeOf(NumberUtils.parseInt(boundaryEventType)); + BpmBoundaryEventTypeEnum bpmTimerBoundaryEventType = BpmBoundaryEventTypeEnum.typeOf(NumberUtils.parseInt(boundaryEventType)); // 2. 处理超时 - if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.USER_TASK_TIMEOUT)) { + if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT)) { // 2.1 用户任务超时处理 String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent, BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE); String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType)); // 2.2 延迟器超时处理 - } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT)) { + } else if (ObjectUtil.equal(bpmTimerBoundaryEventType, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT)) { String taskKey = boundaryEvent.getAttachedToRefId(); taskService.processDelayTimerTimeout(event.getProcessInstanceId(), taskKey); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java index 60818800f7..1ee347dfa1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.service.task.trigger.BpmTrigger; import jakarta.annotation.PostConstruct; @@ -33,7 +33,7 @@ public class BpmTriggerTaskDelegate implements JavaDelegate { @Resource private List triggers; - private final EnumMap triggerMap = new EnumMap<>(BpmTriggerType.class); + private final EnumMap triggerMap = new EnumMap<>(BpmTriggerTypeEnum.class); @PostConstruct private void init() { @@ -43,12 +43,13 @@ public class BpmTriggerTaskDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { FlowElement flowElement = execution.getCurrentFlowElement(); - BpmTriggerType bpmTriggerType = BpmnModelUtils.parserTriggerType(flowElement); + BpmTriggerTypeEnum bpmTriggerType = BpmnModelUtils.parserTriggerType(flowElement); BpmTrigger bpmTrigger = triggerMap.get(bpmTriggerType); if (bpmTrigger == null) { - log.error("[execute], FlowElement[{}], {} 找不到匹配的 BpmTrigger", execution.getCurrentActivityId(), flowElement); + log.error("[execute][FlowElement({}), {} 找不到匹配的触发器]", execution.getCurrentActivityId(), flowElement); return; } bpmTrigger.execute(execution.getProcessInstanceId(), BpmnModelUtils.parserTriggerParam(flowElement)); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index ba678c49fe..eae4eb988b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -171,9 +171,9 @@ public class BpmnModelUtils { * @param userTask 任务节点 * @return 任务拒绝处理类型 */ - public static BpmUserTaskRejectHandlerType parseRejectHandlerType(FlowElement userTask) { + public static BpmUserTaskRejectHandlerTypeEnum parseRejectHandlerType(FlowElement userTask) { Integer rejectHandlerType = NumberUtils.parseInt(parseExtensionElement(userTask, USER_TASK_REJECT_HANDLER_TYPE)); - return BpmUserTaskRejectHandlerType.typeOf(rejectHandlerType); + return BpmUserTaskRejectHandlerTypeEnum.typeOf(rejectHandlerType); } /** @@ -394,9 +394,9 @@ public class BpmnModelUtils { return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class); } - public static BpmTriggerType parserTriggerType(FlowElement flowElement) { + public static BpmTriggerTypeEnum parserTriggerType(FlowElement flowElement) { Integer triggerType = NumberUtils.parseInt(parseExtensionElement(flowElement, TRIGGER_TYPE)); - return BpmTriggerType.typeOf(triggerType); + return BpmTriggerTypeEnum.typeOf(triggerType); } public static String parserTriggerParam(FlowElement flowElement) { @@ -834,7 +834,7 @@ public class BpmnModelUtils { Object result = FlowableUtils.getExpressionValue(variables, express); return Boolean.TRUE.equals(result); } catch (FlowableException ex) { - log.error("[evalConditionExpress][条件表达式({}) 变量({}) 解析报错", express, variables, ex); + log.error("[evalConditionExpress][条件表达式({}) 变量({}) 解析报错]", express, variables, ex); return Boolean.FALSE; } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index a37e10e680..97c5f8a707 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -37,7 +37,7 @@ import static java.util.Arrays.asList; */ public class SimpleModelUtils { - private static final Map NODE_CONVERTS = MapUtil.newHashMap(); + private static final Map NODE_CONVERTS = MapUtil.newHashMap(); static { List converts = asList(new StartNodeConvert(), new EndNodeConvert(), @@ -89,8 +89,8 @@ public class SimpleModelUtils { private static BpmSimpleModelNodeVO buildStartNode() { return new BpmSimpleModelNodeVO().setId(START_EVENT_NODE_ID) - .setName(BpmSimpleModelNodeType.START_NODE.getName()) - .setType(BpmSimpleModelNodeType.START_NODE.getType()); + .setName(BpmSimpleModelNodeTypeEnum.START_NODE.getName()) + .setType(BpmSimpleModelNodeTypeEnum.START_NODE.getType()); } /** @@ -104,7 +104,7 @@ public class SimpleModelUtils { if (!isValidNode(node)) { return; } - BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); + BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); Assert.notNull(nodeType, "模型节点类型({})不支持", node.getType()); // 2. 处理当前节点 @@ -114,7 +114,7 @@ public class SimpleModelUtils { flowElements.forEach(process::addFlowElement); // 3.1 情况一:如果当前是分支节点,并且存在条件节点,则处理每个条件的子节点 - if (BpmSimpleModelNodeType.isBranchNode(node.getType()) + if (BpmSimpleModelNodeTypeEnum.isBranchNode(node.getType()) && CollUtil.isNotEmpty(node.getConditionNodes())) { // 注意:这里的 item.getChildNode() 处理的是每个条件的子节点,不是处理条件 node.getConditionNodes().forEach(item -> traverseNodeToBuildFlowNode(item.getChildNode(), process)); @@ -137,14 +137,14 @@ public class SimpleModelUtils { return; } // 1.2 END_NODE 直接返回 - BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); + BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); Assert.notNull(nodeType, "模型节点类型不支持"); - if (nodeType == BpmSimpleModelNodeType.END_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { return; } // 2.1 情况一:普通节点 - if (!BpmSimpleModelNodeType.isBranchNode(node.getType())) { + if (!BpmSimpleModelNodeTypeEnum.isBranchNode(node.getType())) { traverseNormalNodeToBuildSequenceFlow(process, node, targetNodeId); } else { // 2.2 情况二:分支节点 @@ -182,26 +182,26 @@ public class SimpleModelUtils { * @param targetNodeId 目标节点 ID */ private static void traverseBranchNodeToBuildSequenceFlow(Process process, BpmSimpleModelNodeVO node, String targetNodeId) { - BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(node.getType()); + BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(node.getType()); BpmSimpleModelNodeVO childNode = node.getChildNode(); List conditionNodes = node.getConditionNodes(); // TODO @芋艿 路由分支没有conditionNodes 这里注释会影响吗?@jason:一起帮忙瞅瞅! // Assert.notEmpty(conditionNodes, "分支节点的条件节点不能为空"); // 分支终点节点 ID String branchEndNodeId = null; - if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE - || nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { // 条件分支或路由分支 + if (nodeType == BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { // 条件分支或路由分支 // 分两种情况 1. 分支节点有孩子节点为孩子节点 Id 2. 分支节点孩子为无效节点时 (分支嵌套且为分支最后一个节点) 为分支终点节点 ID branchEndNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; - } else if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE - || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) { // 并行分支或包容分支 + } else if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { // 并行分支或包容分支 // 分支节点:分支终点节点 Id 为程序创建的网关集合节点。目前不会从前端传入。 branchEndNodeId = buildGatewayJoinId(node.getId()); } Assert.notEmpty(branchEndNodeId, "分支终点节点 Id 不能为空"); // 3. 遍历分支节点 - if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { // 路由分支遍历 for (BpmSimpleModelNodeVO.RouterSetting router : node.getRouterGroups()) { SequenceFlow sequenceFlow = RouteBranchNodeConvert.buildSequenceFlow(node.getId(), router); @@ -210,7 +210,7 @@ public class SimpleModelUtils { } else { // 下面的注释,以如下情况举例子。分支 1:A->B->C->D->E,分支 2:A->D->E。其中,A 为分支节点, D 为 A 孩子节点 for (BpmSimpleModelNodeVO item : conditionNodes) { - Assert.isTrue(Objects.equals(item.getType(), BpmSimpleModelNodeType.CONDITION_NODE.getType()), + Assert.isTrue(Objects.equals(item.getType(), BpmSimpleModelNodeTypeEnum.CONDITION_NODE.getType()), "条件节点类型({})不符合", item.getType()); BpmSimpleModelNodeVO conditionChildNode = item.getChildNode(); // 3.1 分支有后续节点。即分支 1: A->B->C->D 的情况 @@ -229,13 +229,13 @@ public class SimpleModelUtils { } // 4.1 如果是并行分支、包容分支,由于是程序创建的聚合网关,需要手工创建聚合网关和下一个节点的连线 - if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE - || nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { String nextNodeId = isValidNode(childNode) ? childNode.getId() : targetNodeId; SequenceFlow sequenceFlow = buildBpmnSequenceFlow(branchEndNodeId, nextNodeId); process.addFlowElement(sequenceFlow); // 4.2 如果是路由分支,需要连接后续节点为默认路由 - } else if (nodeType == BpmSimpleModelNodeType.ROUTER_BRANCH_NODE) { + } else if (nodeType == BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE) { SequenceFlow sequenceFlow = buildBpmnSequenceFlow(node.getId(), branchEndNodeId, node.getRouterDefaultFlowId(), null, null); process.addFlowElement(sequenceFlow); @@ -274,7 +274,7 @@ public class SimpleModelUtils { } public static boolean isSequentialApproveNode(BpmSimpleModelNodeVO node) { - return BpmSimpleModelNodeType.APPROVE_NODE.getType().equals(node.getType()) + return BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType().equals(node.getType()) && BpmUserTaskApproveMethodEnum.SEQUENTIAL.getMethod().equals(node.getApproveMethod()); } @@ -290,7 +290,7 @@ public class SimpleModelUtils { throw new UnsupportedOperationException("请实现该方法"); } - BpmSimpleModelNodeType getType(); + BpmSimpleModelNodeTypeEnum getType(); } @@ -305,8 +305,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.START_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.START_NODE; } } @@ -323,8 +323,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.END_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.END_NODE; } } @@ -352,8 +352,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.START_USER_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.START_USER_NODE; } } @@ -376,8 +376,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.APPROVE_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.APPROVE_NODE; } /** @@ -405,7 +405,7 @@ public class SimpleModelUtils { boundaryEvent.addEventDefinition(eventDefinition); // 2.1 添加定时器边界事件类型 - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventType.USER_TASK_TIMEOUT.getType()); + addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventTypeEnum.USER_TASK_TIMEOUT.getType()); // 2.2 添加超时执行动作元素 addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_TYPE, timeoutHandler.getType()); return boundaryEvent; @@ -533,8 +533,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.COPY_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.COPY_NODE; } } @@ -556,8 +556,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.CONDITION_BRANCH_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE; } } @@ -578,8 +578,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE; } } @@ -605,8 +605,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE; } } @@ -620,8 +620,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.CONDITION_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.CONDITION_NODE; } public static SequenceFlow buildSequenceFlow(String sourceId, String targetId, @@ -647,11 +647,11 @@ public class SimpleModelUtils { public static String buildConditionExpression(Integer conditionType, String conditionExpression, ConditionGroups conditionGroups) { - BpmSimpleModeConditionType conditionTypeEnum = BpmSimpleModeConditionType.valueOf(conditionType); - if (conditionTypeEnum == BpmSimpleModeConditionType.EXPRESSION) { + BpmSimpleModeConditionTypeEnum conditionTypeEnum = BpmSimpleModeConditionTypeEnum.valueOf(conditionType); + if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.EXPRESSION) { return conditionExpression; } - if (conditionTypeEnum == BpmSimpleModeConditionType.RULE) { + if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.RULE) { if (conditionGroups == null || CollUtil.isEmpty(conditionGroups.getConditions())) { return null; } @@ -696,21 +696,21 @@ public class SimpleModelUtils { boundaryEvent.setAttachedToRef(receiveTask); // 2.2 定义超时时间 TimerEventDefinition eventDefinition = new TimerEventDefinition(); - if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_DATE_TIME.getType())) { + if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) { eventDefinition.setTimeDuration(node.getDelaySetting().getDelayTime()); - } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerType.FIXED_TIME_DURATION.getType())) { + } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) { eventDefinition.setTimeDate(node.getDelaySetting().getDelayTime()); } boundaryEvent.addEventDefinition(eventDefinition); - addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventType.DELAY_TIMER_TIMEOUT.getType()); + addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType()); flowElements.add(boundaryEvent); } return flowElements; } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.DELAY_TIMER_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.DELAY_TIMER_NODE; } } @@ -727,6 +727,7 @@ public class SimpleModelUtils { if (node.getTriggerSetting() != null) { addExtensionElement(serviceTask, TRIGGER_TYPE, node.getTriggerSetting().getType()); if (node.getTriggerSetting().getHttpRequestSetting() != null) { + // TODO @jason:加个 addExtensionElementJson 方法,方便设置 JSON 类型的属性 addExtensionElement(serviceTask, TRIGGER_PARAM, JsonUtils.toJsonString(node.getTriggerSetting().getHttpRequestSetting())); } @@ -735,8 +736,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.TRIGGER_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.TRIGGER_NODE; } } @@ -754,8 +755,8 @@ public class SimpleModelUtils { } @Override - public BpmSimpleModelNodeType getType() { - return BpmSimpleModelNodeType.ROUTER_BRANCH_NODE; + public BpmSimpleModelNodeTypeEnum getType() { + return BpmSimpleModelNodeTypeEnum.ROUTER_BRANCH_NODE; } public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterSetting router) { @@ -785,21 +786,21 @@ public class SimpleModelUtils { if (!isValidNode(currentNode)) { return; } - BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(currentNode.getType()); + BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(currentNode.getType()); Assert.notNull(nodeType, "模型节点类型不支持"); // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE - if (nodeType == BpmSimpleModelNodeType.START_NODE - || nodeType == BpmSimpleModelNodeType.START_USER_NODE - || nodeType == BpmSimpleModelNodeType.APPROVE_NODE - || nodeType == BpmSimpleModelNodeType.COPY_NODE - || nodeType == BpmSimpleModelNodeType.END_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.START_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.START_USER_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.APPROVE_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE + || nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { // 添加元素 resultNodes.add(currentNode); } // 情况:CONDITION_BRANCH_NODE 排它,只有一个满足条件的。如果没有,就走默认的 - if (nodeType == BpmSimpleModelNodeType.CONDITION_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.CONDITION_BRANCH_NODE) { // 查找满足条件的 BpmSimpleModelNodeVO 节点 BpmSimpleModelNodeVO matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) @@ -814,7 +815,7 @@ public class SimpleModelUtils { } // 情况:INCLUSIVE_BRANCH_NODE 包容,多个满足条件的。如果没有,就走默认的 - if (nodeType == BpmSimpleModelNodeType.INCLUSIVE_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { // 查找满足条件的 BpmSimpleModelNodeVO 节点 Collection matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) @@ -830,7 +831,7 @@ public class SimpleModelUtils { } // 情况:PARALLEL_BRANCH_NODE 并行,都满足,都走 - if (nodeType == BpmSimpleModelNodeType.PARALLEL_BRANCH_NODE) { + if (nodeType == BpmSimpleModelNodeTypeEnum.PARALLEL_BRANCH_NODE) { // 遍历所有 BpmSimpleModelNodeVO 节点 currentNode.getConditionNodes().forEach(matchConditionNode -> simulateNextNode(matchConditionNode.getChildNode(), variables, resultNodes)); @@ -844,6 +845,7 @@ public class SimpleModelUtils { return BpmnModelUtils.evalConditionExpress(variables, ConditionNodeConvert.buildConditionExpression(conditionNode)); } + // TODO @芋艿:【高】要不要优化下,抽个 HttpUtils /** * 添加 HTTP 请求参数。请求头或者请求体 * @@ -852,15 +854,15 @@ public class SimpleModelUtils { * @param processVariables 流程变量 */ public static void addHttpRequestParam(MultiValueMap params, - List paramSettings, + List paramSettings, Map processVariables) { if (CollUtil.isEmpty(paramSettings)) { return; } paramSettings.forEach(item -> { - if (item.getType().equals(BpmHttpRequestParamSettingType.FIXED_VALUE.getType())) { + if (item.getType().equals(BpmHttpRequestParamTypeEnum.FIXED_VALUE.getType())) { params.add(item.getKey(), item.getValue()); - } else if (item.getType().equals(BpmHttpRequestParamSettingType.FROM_FORM.getType())) { + } else if (item.getType().equals(BpmHttpRequestParamTypeEnum.FROM_FORM.getType())) { params.add(item.getKey(), processVariables.get(item.getValue()).toString()); } }); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java index 078c92287a..1eb3f820da 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java @@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmPr import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerSaveReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessListenerMapper; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerType; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerValueType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerTypeEnum; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerValueTypeEnum; import jakarta.annotation.Resource; import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.delegate.TaskListener; @@ -52,14 +52,14 @@ public class BpmProcessListenerServiceImpl implements BpmProcessListenerService private void validateCreateProcessListenerValue(BpmProcessListenerSaveReqVO createReqVO) { // class 类型 - if (createReqVO.getValueType().equals(BpmProcessListenerValueType.CLASS.getType())) { + if (createReqVO.getValueType().equals(BpmProcessListenerValueTypeEnum.CLASS.getType())) { try { Class clazz = Class.forName(createReqVO.getValue()); - if (createReqVO.getType().equals(BpmProcessListenerType.EXECUTION.getType()) + if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.EXECUTION.getType()) && !JavaDelegate.class.isAssignableFrom(clazz)) { throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), JavaDelegate.class.getName()); - } else if (createReqVO.getType().equals(BpmProcessListenerType.TASK.getType()) + } else if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.TASK.getType()) && !TaskListener.class.isAssignableFrom(clazz)) { throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), TaskListener.class.getName()); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index d60c3c904e..291cd152e1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -22,7 +22,7 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitio import cn.iocoder.yudao.module.bpm.dal.redis.BpmProcessIdRedisDAO; import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeTypeEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; @@ -294,7 +294,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) ? - BpmSimpleModelNodeType.START_USER_NODE.getType() : BpmSimpleModelNodeType.APPROVE_NODE.getType()) + BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) .setStatus(FlowableUtils.getTaskStatus(task)) .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) @@ -316,8 +316,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID) .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus()); ActivityNode startNode = new ActivityNode().setId(startTask.getId()) - .setName(BpmSimpleModelNodeType.START_USER_NODE.getName()) - .setNodeType(BpmSimpleModelNodeType.START_USER_NODE.getType()) + .setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) + .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()) .setStatus(startTask.getStatus()).setTasks(ListUtil.of(startTask)) .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); approvalNodes.add(0, startNode); @@ -330,8 +330,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return; } ActivityNode endNode = new ActivityNode().setId(activity.getId()) - .setName(BpmSimpleModelNodeType.END_NODE.getName()) - .setNodeType(BpmSimpleModelNodeType.END_NODE.getType()).setStatus(processInstanceStatus) + .setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) + .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()).setStatus(processInstanceStatus) .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); String reason = FlowableUtils.getProcessInstanceReason(historicProcessInstance); if (StrUtil.isNotEmpty(reason)) { @@ -367,7 +367,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()).setName(firstActivity.getActivityName()) - .setNodeType(BpmSimpleModelNodeType.APPROVE_NODE.getType()).setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) + .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()).setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) .setTasks(new ArrayList<>()); @@ -437,8 +437,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 1. 开始节点/审批节点 if (ObjectUtils.equalsAny(node.getType(), - BpmSimpleModelNodeType.START_USER_NODE.getType(), - BpmSimpleModelNodeType.APPROVE_NODE.getType())) { + BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType(), + BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) { List candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); activityNode.setCandidateUserIds(candidateUserIds); @@ -446,13 +446,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } // 2. 结束节点 - if (BpmSimpleModelNodeType.END_NODE.getType().equals(node.getType())) { + if (BpmSimpleModelNodeTypeEnum.END_NODE.getType().equals(node.getType())) { return activityNode; } // 3. 抄送节点 if (CollUtil.isEmpty(runActivityIds) && // 流程发起时:需要展示抄送节点,用于选择抄送人 - BpmSimpleModelNodeType.COPY_NODE.getType().equals(node.getType())) { + BpmSimpleModelNodeTypeEnum.COPY_NODE.getType().equals(node.getType())) { return activityNode; } return null; @@ -468,23 +468,23 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 1. 开始节点 if (node instanceof StartEvent) { - return activityNode.setName(BpmSimpleModelNodeType.START_USER_NODE.getName()) - .setNodeType(BpmSimpleModelNodeType.START_USER_NODE.getType()); + return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) + .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()); } // 2. 审批节点 if (node instanceof UserTask) { List candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); - return activityNode.setName(node.getName()).setNodeType(BpmSimpleModelNodeType.APPROVE_NODE.getType()) + return activityNode.setName(node.getName()).setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(node)) .setCandidateUserIds(candidateUserIds); } // 3. 结束节点 if (node instanceof EndEvent) { - return activityNode.setName(BpmSimpleModelNodeType.END_NODE.getName()) - .setNodeType(BpmSimpleModelNodeType.END_NODE.getType()); + return activityNode.setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) + .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()); } return null; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 1bcb7ad8b9..76c7771035 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -656,8 +656,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId()); FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); // 3.1 情况一:驳回到指定的任务节点 - BpmUserTaskRejectHandlerType userTaskRejectHandlerType = BpmnModelUtils.parseRejectHandlerType(userTaskElement); - if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerType.RETURN_USER_TASK) { + BpmUserTaskRejectHandlerTypeEnum userTaskRejectHandlerType = BpmnModelUtils.parseRejectHandlerType(userTaskElement); + if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerTypeEnum.RETURN_USER_TASK) { String returnTaskId = BpmnModelUtils.parseReturnTaskId(userTaskElement); Assert.notNull(returnTaskId, "退回的节点不能为空"); returnTask(userId, new BpmTaskReturnReqVO().setId(task.getId()) @@ -1184,23 +1184,24 @@ public class BpmTaskServiceImpl implements BpmTaskService { .taskAssignee(task.getAssignee()) // 相同审批人 .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) .finished(); - if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) + if (BpmAutoApproveTypeEnum.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) && sameAssigneeQuery.count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); + .setReason(BpmAutoApproveTypeEnum.APPROVE_ALL.getName())); return; } - if (BpmAutoApproveType.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { + if (BpmAutoApproveTypeEnum.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); if (bpmnModel == null) { log.error("[processTaskAssigned][taskId({}) 没有找到流程模型({})]", task.getId(), task.getProcessDefinitionId()); return; } - List sourceTaskIds = getElementIncomingFlows(getFlowElementById(bpmnModel, task.getTaskDefinitionKey())) - .stream().map(SequenceFlow::getSourceRef).toList(); + List sourceTaskIds = convertList(BpmnModelUtils.getElementIncomingFlows( // 获取所有上一个节点 + BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey())), + SequenceFlow::getSourceRef); if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveType.APPROVE_SEQUENT.getName())); + .setReason(BpmAutoApproveTypeEnum.APPROVE_SEQUENT.getName())); return; } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 0614e6948c..9b42d0d4d9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; @@ -37,16 +37,16 @@ public class BpmHttpRequestTrigger implements BpmTrigger { private RestTemplate restTemplate; @Override - public BpmTriggerType getType() { - return BpmTriggerType.HTTP_REQUEST; + public BpmTriggerTypeEnum getType() { + return BpmTriggerTypeEnum.HTTP_REQUEST; } @Override public void execute(String processInstanceId, String param) { // 1. 解析 http 请求配置 - HttpRequestTriggerSetting httpRequestSetting = JsonUtils.parseObject(param, HttpRequestTriggerSetting.class); - if (httpRequestSetting == null) { - log.error("[execute] HTTP 触发器请求配置为空"); + HttpRequestTriggerSetting setting = JsonUtils.parseObject(param, HttpRequestTriggerSetting.class); + if (setting == null) { + log.error("[execute][流程({}) HTTP 触发器请求配置为空]", processInstanceId); return; } // 2.1 设置请求头 @@ -54,20 +54,22 @@ public class BpmHttpRequestTrigger implements BpmTrigger { Map processVariables = processInstance.getProcessVariables(); MultiValueMap headers = new LinkedMultiValueMap<>(); headers.add(HEADER_TENANT_ID, processInstance.getTenantId()); - SimpleModelUtils.addHttpRequestParam(headers, httpRequestSetting.getHeader(), processVariables); + SimpleModelUtils.addHttpRequestParam(headers, setting.getHeader(), processVariables); // 2.2 设置请求体 MultiValueMap body = new LinkedMultiValueMap<>(); - SimpleModelUtils.addHttpRequestParam(body, httpRequestSetting.getBody(), processVariables); + SimpleModelUtils.addHttpRequestParam(body, setting.getBody(), processVariables); body.add("processInstanceId", processInstanceId); + // TODO @芋艿:要不要抽象一个 Http 请求的工具类,方便复用呢? // 3. 发起请求 HttpEntity> requestEntity = new HttpEntity<>(body, headers); try { - ResponseEntity responseEntity = restTemplate.exchange(httpRequestSetting.getUrl(), HttpMethod.POST, + ResponseEntity responseEntity = restTemplate.exchange(setting.getUrl(), HttpMethod.POST, requestEntity, String.class); log.info("[execute][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity); } catch (RestClientException e) { log.error("[execute][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); } } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java index f0c474784f..8ebd9735e9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; -import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerType; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; /** * BPM 触发器接口 @@ -16,7 +16,7 @@ public interface BpmTrigger { * * @return 触发器类型 */ - BpmTriggerType getType(); + BpmTriggerTypeEnum getType(); /** * 触发器执行 @@ -25,4 +25,5 @@ public interface BpmTrigger { * @param param 触发器参数 */ void execute(String processInstanceId, String param); + } From d3352308d4b8854f1b1d5cebedb2ee89435c260f Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 23 Jan 2025 10:49:08 +0800 Subject: [PATCH 070/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E7=A7=AF=E5=88=86=E5=95=86=E5=9F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/PointActivityServiceImpl.java | 12 +++++------ .../dal/mysql/order/TradeOrderMapper.java | 21 +++++++++++++++---- .../service/order/TradeOrderQueryService.java | 8 ++++--- .../order/TradeOrderQueryServiceImpl.java | 5 +++-- .../TradePointActivityPriceCalculator.java | 8 +++---- .../TradeSeckillActivityPriceCalculator.java | 3 ++- 6 files changed, 37 insertions(+), 20 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java index 21e9ce233a..812683326d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java @@ -100,7 +100,7 @@ public class PointActivityServiceImpl implements PointActivityService { } pointActivityMapper.updateById(updateObj); // 2.2 更新商品 - updateSeckillProduct(updateObj, updateReqVO.getProducts()); + updatePointProduct(updateObj, updateReqVO.getProducts()); } @Override @@ -157,12 +157,12 @@ public class PointActivityServiceImpl implements PointActivityService { } /** - * 更新秒杀商品 + * 更新积分商品 * - * @param activity 秒杀活动 + * @param activity 积分活动 * @param products 该活动的最新商品配置 */ - private void updateSeckillProduct(PointActivityDO activity, List products) { + private void updatePointProduct(PointActivityDO activity, List products) { // 第一步,对比新老数据,获得添加、修改、删除的列表 List newList = buildPointProductDO(activity, products); List oldList = pointProductMapper.selectListByActivityId(activity.getId()); @@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService { } /** - * 校验秒杀商品是否都存在 + * 校验积分商品是否都存在 * * @param spuId 商品 SPU 编号 - * @param products 秒杀商品 + * @param products 积分商品 */ private void validateProductExists(Long spuId, List products) { // 1. 校验商品 spu 是否存在 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java index 21fc038ba4..9ea87e80b7 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; @@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX { .eq(TradeOrderDO::getCommentStatus, commentStatus)); } - default List selectListByUserIdAndSeckillActivityId(Long userId, Long seckillActivityId) { - return selectList(new LambdaUpdateWrapper<>(TradeOrderDO.class) - .eq(TradeOrderDO::getUserId, userId) - .eq(TradeOrderDO::getSeckillActivityId, seckillActivityId)); + default List selectListByUserIdAndActivityId(Long userId, Long activityId, TradeOrderTypeEnum type) { + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + queryWrapperX.eq(TradeOrderDO::getUserId, userId); + if (TradeOrderTypeEnum.isSeckill(type.getType())) { + queryWrapperX.eq(TradeOrderDO::getSeckillActivityId, activityId); + } + if (TradeOrderTypeEnum.isBargain(type.getType())) { + queryWrapperX.eq(TradeOrderDO::getBargainActivityId, activityId); + } + if (TradeOrderTypeEnum.isCombination(type.getType())) { + queryWrapperX.eq(TradeOrderDO::getCombinationActivityId, activityId); + } + if (TradeOrderTypeEnum.isPoint(type.getType())) { + queryWrapperX.eq(TradeOrderDO::getPointActivityId, activityId); + } + return selectList(queryWrapperX); } default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) { diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java index 5e436d959a..d2509643d5 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummary import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; import java.util.Collection; @@ -110,13 +111,14 @@ public interface TradeOrderQueryService { List getExpressTrackList(Long id); /** - * 【会员】在指定秒杀活动下,用户购买的商品数量 + * 【会员】在指定活动下,用户购买的商品数量 * * @param userId 用户编号 * @param activityId 活动编号 - * @return 秒杀商品数量 + * @param type 订单类型 + * @return 活动商品数量 */ - int getSeckillProductCount(Long userId, Long activityId); + int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type); // =================== Order Item =================== diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java index 7f4b0e034d..4522f956af 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory; import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; @@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { } @Override - public int getSeckillProductCount(Long userId, Long activityId) { + public int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type) { // 获得订单列表 - List orders = tradeOrderMapper.selectListByUserIdAndSeckillActivityId(userId, activityId); + List orders = tradeOrderMapper.selectListByUserIdAndActivityId(userId, activityId, type); orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉【已取消】的订单 if (CollUtil.isEmpty(orders)) { return 0; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java index 4670cf9dec..4bc2b766e9 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java @@ -56,7 +56,7 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品"); // 2. 校验是否可以参与积分商城活动 TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0); - PointValidateJoinRespDTO activity = validateJoinSeckill( + PointValidateJoinRespDTO activity = validateJoinPointActivity( param.getUserId(), param.getPointActivityId(), orderItem.getSkuId(), orderItem.getCount()); @@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { TradePriceCalculatorHelper.recountAllPrice(result); } - private PointValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) { + private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) { // 1. 校验是否可以参与积分商城活动 PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count); // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用 - int activityProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId); - if (activityProductCount + count > pointValidateJoinRespDTO.getCount()) { + int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT); + if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) { throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT); } return pointValidateJoinRespDTO; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java index 90ae4fb25b..1007beb459 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi; import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO; import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; @@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator // 1. 校验是否可以参与秒杀 SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count); // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用 - int seckillProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId); + int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL); if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) { throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT); } From 30a24601cd885b954fac322a559ba5bc8ca75f4f Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 23 Jan 2025 11:55:30 +0800 Subject: [PATCH 071/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E4=B8=8D=E5=A4=9F=E8=BF=98=E8=83=BD=E5=85=91?= =?UTF-8?q?=E6=8D=A2=E5=95=86=E5=93=81=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/trade/enums/ErrorCodeConstants.java | 1 + .../order/handler/TradePointOrderHandler.java | 12 ++++++++++++ .../TradePointActivityPriceCalculator.java | 14 +++++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java index 1055cfe8cb..1e65aec629 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java @@ -37,6 +37,7 @@ public interface ErrorCodeConstants { ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单"); ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态"); ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限"); + ErrorCode ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS = new ErrorCode(1_011_000_035, "交易订单创建失败,原因:用户积分不足"); // ========== After Sale 模块 1-011-000-100 ========== ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在"); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java index 9c60accef4..fbaaca17c0 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.order.handler; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -13,6 +15,9 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.Objects; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS; + /** * 积分商城活动订单的 {@link TradeOrderHandler} 实现类 * @@ -23,6 +28,8 @@ public class TradePointOrderHandler implements TradeOrderHandler { @Resource private PointActivityApi pointActivityApi; + @Resource + private MemberUserApi memberUserApi; @Override public void beforeOrderCreate(TradeOrderDO order, List orderItems) { @@ -31,6 +38,11 @@ public class TradePointOrderHandler implements TradeOrderHandler { } // 明确校验一下 Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品"); + // 校验用户剩余积分是否足够兑换商品 + MemberUserRespDTO user = memberUserApi.getUser(order.getUserId()); + if (user.getPoint() < order.getUsePoint()) { + throw exception(ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS); + } // 扣减积分商城活动的库存 pointActivityApi.updatePointStockDecr(order.getPointActivityId(), diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java index 4bc2b766e9..425d092981 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java @@ -60,21 +60,21 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { param.getUserId(), param.getPointActivityId(), orderItem.getSkuId(), orderItem.getCount()); - // 3.1 记录优惠明细 - int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换 + // 3.0 积分兑换前置校验 Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1"); - result.setUsePoint(activity.getPoint() * orderItem.getCount()); - orderItem.setUsePoint(activity.getPoint() * orderItem.getCount()); + // 3.1 记录优惠明细 + int usePoint = activity.getPoint() * orderItem.getCount(); + result.setUsePoint(usePoint); + orderItem.setUsePoint(usePoint); + int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换 if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额 discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount(); } - // 3.2 记录优惠明细 TradePriceCalculatorHelper.addPromotion(result, orderItem, param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(), StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)), discountPrice); - - // 3.3 更新 SKU 优惠金额 + // 3.2 更新 SKU 优惠金额 orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice); TradePriceCalculatorHelper.recountPayPrice(orderItem); TradePriceCalculatorHelper.recountAllPrice(result); From de297e3a78d5a331e5d51ae0f28f328d40796871 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Thu, 23 Jan 2025 12:06:12 +0800 Subject: [PATCH 072/112] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=A0=87=E9=A2=98=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/BpmModelMetaInfoVO.java | 17 +++++++++++++++++ .../definition/BpmProcessDefinitionInfoDO.java | 6 ++++++ .../core/enums/BpmnVariableConstants.java | 8 ++++++++ .../task/BpmProcessInstanceServiceImpl.java | 16 ++++++++++++++-- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index eb42c73e55..dd33fa0573 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -74,6 +74,9 @@ public class BpmModelMetaInfoVO { @InEnum(BpmAutoApproveTypeEnum.class) private Integer autoApprovalType; + @Schema(description = "标题设置", example = "{}") + private CustomTitleSetting customTitleSetting; + @Schema(description = "流程 ID 规则") @Data @Valid @@ -98,4 +101,18 @@ public class BpmModelMetaInfoVO { } + @Schema(description = "标题设置") + @Data + @Valid + public static class CustomTitleSetting { + + @Schema(description = "是否自定义", example = "false") + @NotNull(message = "是否自定义不能为空") + private Boolean enable; + + @Schema(description = "标题", example = "流程标题") + private String title; + + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 359c7042f4..223f3be689 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -170,4 +170,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { */ private Integer autoApprovalType; + /** + * 标题设置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 0f3e4c2079..10e0e3ab8e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -50,6 +50,14 @@ public class BpmnVariableConstants { * @see Flowable/Activiti之SkipExpression 完成自动审批 */ public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + /** + * 流程实例的变量 - 流程开始时间 + */ + public static final String PROCESS_START_TIME = "PROCESS_START_TIME"; + /** + * 流程实例的变量 - 流程定义名称 + */ + public static final String PROCESS_DEFINITION_NAME = "PROCESS_DEFINITION_NAME"; /** * 任务的变量 - 状态 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 291cd152e1..954b3771d2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -610,14 +611,25 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) - .name(definition.getName().trim()) .variables(variables); // 3.1 创建流程 ID BpmModelMetaInfoVO.ProcessIdRule processIdRule = processDefinitionInfo.getProcessIdRule(); if (processIdRule != null && Boolean.TRUE.equals(processIdRule.getEnable())) { processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule)); } - // 3.2 发起流程实例 + // 3.2 流程名称 + BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting = processDefinitionInfo.getCustomTitleSetting(); + if (customTitleSetting != null && Boolean.TRUE.equals(customTitleSetting.getEnable())) { + AdminUserRespDTO user = adminUserApi.getUser(userId); + Map cloneVariables = ObjectUtil.clone(variables); + cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); + cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); + cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim()); + processInstanceBuilder.name(StrUtil.format(customTitleSetting.getTitle(), cloneVariables)); + } else { + processInstanceBuilder.name(definition.getName().trim()); + } + // 3.3 发起流程实例 ProcessInstance instance = processInstanceBuilder.start(); return instance.getId(); } From e89e3c946d86118566fd494b320c759bac6f489e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 23 Jan 2025 12:08:05 +0800 Subject: [PATCH 073/112] =?UTF-8?q?=E3=80=90=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91=E5=95=86=E5=9F=8E=EF=BC=9A=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=88=90=E5=9B=A2=E5=90=8E=E6=89=80=E6=9C=89=E6=88=90=E5=91=98?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=99=9A=E6=8B=9F=E6=88=90=E5=9B=A2=E6=A0=87?= =?UTF-8?q?=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/combination/CombinationRecordServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 7a9ec0a7de..58a8907536 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -375,7 +375,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { CombinationRecordDO updateRecord = new CombinationRecordDO().setId(item.getId()) .setStatus(status.getStatus()).setEndTime(now); if (CombinationRecordStatusEnum.isSuccess(status.getStatus())) { // 虚拟成团完事更改状态成功后还需要把参与人数修改为成团需要人数 - updateRecord.setUserCount(records.size()); + updateRecord.setUserCount(records.size()).setVirtualGroup(Boolean.TRUE); // 标记为虚拟成团 } updateRecords.add(updateRecord); }); From a0ff1244e5b739c54de6a5c58d0e40109d6901a1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 23 Jan 2025 19:19:30 +0800 Subject: [PATCH 074/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/BpmModelMetaInfoVO.java | 1 + .../framework/flowable/core/enums/BpmnVariableConstants.java | 3 +++ .../module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 1 + 3 files changed, 5 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index dd33fa0573..6eff000b78 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -101,6 +101,7 @@ public class BpmModelMetaInfoVO { } + // TODO @lesan:TitleSetting 会不会更好。因为 Custom 和 Setting 有点重叠 @Schema(description = "标题设置") @Data @Valid diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java index 10e0e3ab8e..8172cf59a5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java @@ -50,8 +50,11 @@ public class BpmnVariableConstants { * @see Flowable/Activiti之SkipExpression 完成自动审批 */ public static final String PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; + /** * 流程实例的变量 - 流程开始时间 + * + * 【非存储变量】用于部分需要 format 的场景,例如说:流程实例的自定义标题 */ public static final String PROCESS_START_TIME = "PROCESS_START_TIME"; /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 954b3771d2..35bb75a19c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -621,6 +621,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting = processDefinitionInfo.getCustomTitleSetting(); if (customTitleSetting != null && Boolean.TRUE.equals(customTitleSetting.getEnable())) { AdminUserRespDTO user = adminUserApi.getUser(userId); + // TODO @lesan:new HashMap 会更好哈。clone 感觉反射,不一定合适。 Map cloneVariables = ObjectUtil.clone(variables); cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); From dcf55c35338aa961fb06a7fa9eee638599a68bc7 Mon Sep 17 00:00:00 2001 From: Dincat <1139302731@qq.com> Date: Thu, 23 Jan 2025 12:05:09 +0000 Subject: [PATCH 075/112] =?UTF-8?q?!1196=20=E4=BF=AE=E5=A4=8D=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=9B=B4=E6=96=B0=E6=97=B6=EF=BC=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E5=B0=86=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=89=8D=E7=9A=84=E6=95=B0=E6=8D=AE=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98=20*=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=A7=92=E8=89=B2=E6=9B=B4=E6=96=B0=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=9A=84=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=B0=86=E6=9B=B4=E6=96=B0=E5=89=8D=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/service/permission/RoleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index 53d6b7e72e..c18ef31c53 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -86,6 +86,7 @@ public class RoleServiceImpl implements RoleService { roleMapper.updateById(updateObj); // 3. 记录操作日志上下文 + LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(role, RoleSaveReqVO.class)); LogRecordContext.putVariable("role", role); } @@ -118,7 +119,6 @@ public class RoleServiceImpl implements RoleService { permissionService.processRoleDeleted(id); // 3. 记录操作日志上下文 - LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(role, RoleSaveReqVO.class)); LogRecordContext.putVariable("role", role); } From 846d0605d84ed42c2b50829c5c3b32a131162f6d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 23 Jan 2025 20:08:31 +0800 Subject: [PATCH 076/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91IoT=EF=BC=9A=E6=B8=85=E7=90=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E7=9A=84=E5=AE=9E=E4=BE=8B=E4=BB=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java | 8 +------- .../bpm/service/definition/BpmModelServiceImpl.java | 5 ++--- .../bpm/service/task/BpmProcessInstanceCopyService.java | 3 ++- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java index 11bd10aefd..fbb6ddeab9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java @@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - @Mapper public interface BpmProcessInstanceCopyMapper extends BaseMapperX { @@ -20,12 +18,8 @@ public interface BpmProcessInstanceCopyMapper extends BaseMapperX selectListByProcessInstanceIdAndActivityId(String processInstanceId, String activityId) { - return selectList(BpmProcessInstanceCopyDO::getProcessInstanceId, processInstanceId, - BpmProcessInstanceCopyDO::getActivityId, activityId); - } - default void deleteByProcessInstanceId(String processInstanceId) { delete(BpmProcessInstanceCopyDO::getProcessInstanceId, processInstanceId); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 6b57c4512c..603ddd7ca4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -288,9 +288,8 @@ public class BpmModelServiceImpl implements BpmModelService { // 2.3 清理所有 Task List tasks = taskService.createTaskQuery() .processDefinitionKey(model.getKey()).list(); - tasks.forEach(task -> { - taskService.deleteTask(task.getId()); - }); + // TODO @lesan:貌似传递一个 reason 会好点! + tasks.forEach(task -> taskService.deleteTask(task.getId())); } @Override diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java index b226029d94..6c784e49af 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java @@ -53,7 +53,8 @@ public interface BpmProcessInstanceCopyService { /** * 删除抄送流程 * - * @param processInstanceId 流程实例id + * @param processInstanceId 流程实例 ID */ void deleteProcessInstanceCopy(String processInstanceId); + } From bd7f9761d8fd987c8c543cf71e73fa1150e562d3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 23 Jan 2025 20:16:19 +0800 Subject: [PATCH 077/112] https://gitee.com/zhijiantianya/yudao-cloud/pulls/165/files --- .../framework/apilog/core/filter/ApiAccessLogFilter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java index d798b7044e..8539fccd78 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -146,9 +146,11 @@ public class ApiAccessLogFilter extends ApiRequestFilter { if (handlerMethod != null) { Tag tagAnnotation = handlerMethod.getBeanType().getAnnotation(Tag.class); Operation operationAnnotation = handlerMethod.getMethodAnnotation(Operation.class); - String operateModule = accessLogAnnotation != null ? accessLogAnnotation.operateModule() : + String operateModule = accessLogAnnotation != null && StrUtil.isNotBlank(accessLogAnnotation.operateModule()) ? + accessLogAnnotation.operateModule() : tagAnnotation != null ? StrUtil.nullToDefault(tagAnnotation.name(), tagAnnotation.description()) : null; - String operateName = accessLogAnnotation != null ? accessLogAnnotation.operateName() : + String operateName = accessLogAnnotation != null && StrUtil.isNotBlank(accessLogAnnotation.operateName()) ? + accessLogAnnotation.operateName() : operationAnnotation != null ? operationAnnotation.summary() : null; OperateTypeEnum operateType = accessLogAnnotation != null && accessLogAnnotation.operateType().length > 0 ? accessLogAnnotation.operateType()[0] : parseOperateLogType(request); From 408f88da54bb5b2b89a730e93fc2e6c48cdfa6bd Mon Sep 17 00:00:00 2001 From: mcwindy Date: Fri, 24 Jan 2025 02:05:46 +0800 Subject: [PATCH 078/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=20=E7=AE=80=E5=8C=96=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E8=84=B1=E6=95=8F=E5=A4=84=E7=90=86=E5=99=A8=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractSliderDesensitizationHandler.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java index 018fc87893..7b56329180 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java @@ -26,19 +26,14 @@ public abstract class AbstractSliderDesensitizationHandler int suffixKeep = getSuffixKeep(annotation); String replacer = getReplacer(annotation); int length = origin.length(); - - // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换 - if (prefixKeep >= length || suffixKeep >= length) { - return buildReplacerByLength(replacer, length); - } - - // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换 - if ((prefixKeep + suffixKeep) >= length) { - return buildReplacerByLength(replacer, length); - } - - // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串 int interval = length - prefixKeep - suffixKeep; + + // 情况一:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换 + if (interval <= 0) { + return buildReplacerByLength(replacer, length); + } + + // 情况二:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串 return origin.substring(0, prefixKeep) + buildReplacerByLength(replacer, interval) + origin.substring(prefixKeep + interval); @@ -52,11 +47,7 @@ public abstract class AbstractSliderDesensitizationHandler * @return 构建后的替换符 */ private String buildReplacerByLength(String replacer, int length) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < length; i++) { - builder.append(replacer); - } - return builder.toString(); + return replacer.repeat(length); } /** From bcfa08f8ef1042bb0a6db31166839b356440cbd9 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Fri, 24 Jan 2025 10:28:49 +0800 Subject: [PATCH 079/112] =?UTF-8?q?fix:=20=E7=B1=BB=E6=9B=B4=E5=90=8DCusto?= =?UTF-8?q?mTitleSetting->TitleSetting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/BpmModelMetaInfoVO.java | 5 ++--- .../dataobject/definition/BpmProcessDefinitionInfoDO.java | 2 +- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index 6eff000b78..a197fe22a5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -75,7 +75,7 @@ public class BpmModelMetaInfoVO { private Integer autoApprovalType; @Schema(description = "标题设置", example = "{}") - private CustomTitleSetting customTitleSetting; + private TitleSetting titleSetting; @Schema(description = "流程 ID 规则") @Data @@ -101,11 +101,10 @@ public class BpmModelMetaInfoVO { } - // TODO @lesan:TitleSetting 会不会更好。因为 Custom 和 Setting 有点重叠 @Schema(description = "标题设置") @Data @Valid - public static class CustomTitleSetting { + public static class TitleSetting { @Schema(description = "是否自定义", example = "false") @NotNull(message = "是否自定义不能为空") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 223f3be689..3048f06fd9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -174,6 +174,6 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { * 标题设置 */ @TableField(typeHandler = JacksonTypeHandler.class) - private BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting; + private BpmModelMetaInfoVO.TitleSetting titleSetting; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 35bb75a19c..9e879a07ad 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -618,15 +618,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule)); } // 3.2 流程名称 - BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting = processDefinitionInfo.getCustomTitleSetting(); - if (customTitleSetting != null && Boolean.TRUE.equals(customTitleSetting.getEnable())) { + BpmModelMetaInfoVO.TitleSetting titleSetting = processDefinitionInfo.getTitleSetting(); + if (titleSetting != null && Boolean.TRUE.equals(titleSetting.getEnable())) { AdminUserRespDTO user = adminUserApi.getUser(userId); // TODO @lesan:new HashMap 会更好哈。clone 感觉反射,不一定合适。 Map cloneVariables = ObjectUtil.clone(variables); cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim()); - processInstanceBuilder.name(StrUtil.format(customTitleSetting.getTitle(), cloneVariables)); + processInstanceBuilder.name(StrUtil.format(titleSetting.getTitle(), cloneVariables)); } else { processInstanceBuilder.name(definition.getName().trim()); } From 8f4543a270ffc80f5471221653378111efc04792 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Fri, 24 Jan 2025 10:30:28 +0800 Subject: [PATCH 080/112] =?UTF-8?q?fix:=20=E9=80=9A=E8=BF=87new=20HashMap?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2clone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 9e879a07ad..c23e1abb53 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -621,8 +621,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService BpmModelMetaInfoVO.TitleSetting titleSetting = processDefinitionInfo.getTitleSetting(); if (titleSetting != null && Boolean.TRUE.equals(titleSetting.getEnable())) { AdminUserRespDTO user = adminUserApi.getUser(userId); - // TODO @lesan:new HashMap 会更好哈。clone 感觉反射,不一定合适。 - Map cloneVariables = ObjectUtil.clone(variables); + Map cloneVariables = new HashMap<>(variables); cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim()); From b5ba500b60ff32bbfe6f1f7ab32bf45721605d27 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Fri, 24 Jan 2025 13:11:41 +0800 Subject: [PATCH 081/112] =?UTF-8?q?feat:=20BPM-=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/BpmFormFieldVO.java | 14 ++++++ .../vo/model/BpmModelMetaInfoVO.java | 18 +++++++ .../task/BpmProcessInstanceController.java | 8 ++- .../admin/task/BpmTaskController.java | 16 ++++-- .../vo/instance/BpmProcessInstanceRespVO.java | 3 ++ .../admin/task/vo/task/BpmTaskRespVO.java | 4 ++ .../task/BpmProcessInstanceConvert.java | 7 ++- .../bpm/convert/task/BpmTaskConvert.java | 14 +++++- .../BpmProcessDefinitionInfoDO.java | 6 +++ .../flowable/core/util/FlowableUtils.java | 50 +++++++++++++++++-- .../task/BpmProcessInstanceServiceImpl.java | 4 +- 11 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java new file mode 100644 index 0000000000..25bea152c8 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; + +import lombok.Data; + +@Data +public class BpmFormFieldVO { + + private String type; + + private String field; + + private String title; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index a197fe22a5..7bdc963c8a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; @@ -77,6 +78,9 @@ public class BpmModelMetaInfoVO { @Schema(description = "标题设置", example = "{}") private TitleSetting titleSetting; + @Schema(description = "摘要设置", example = "{}") + private SummarySetting summarySetting; + @Schema(description = "流程 ID 规则") @Data @Valid @@ -115,4 +119,18 @@ public class BpmModelMetaInfoVO { } + @Schema(description = "摘要设置") + @Data + @Valid + public static class SummarySetting { + + @Schema(description = "是否自定义", example = "false") + @NotNull(message = "是否自定义不能为空") + private Boolean enable; + + @Schema(description = "摘要字段数组", example = "[]") + private List summary; + + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index bc8ab4d69c..3a847ce4e8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -74,8 +74,10 @@ public class BpmProcessInstanceController { convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); Map categoryMap = categoryService.getCategoryMap( convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory)); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, - processDefinitionMap, categoryMap, taskMap, null, null)); + processDefinitionMap, categoryMap, taskMap, null, null, processDefinitionInfoMap)); } @GetMapping("/manager-page") @@ -101,8 +103,10 @@ public class BpmProcessInstanceController { convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); Map deptMap = deptApi.getDeptMap( convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, - processDefinitionMap, categoryMap, taskMap, userMap, deptMap)); + processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); } @PostMapping("/create") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java index 3a017a627b..b796c5c17e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java @@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; @@ -50,6 +52,8 @@ public class BpmTaskController { private BpmProcessInstanceService processInstanceService; @Resource private BpmFormService formService; + @Resource + private BpmProcessDefinitionService processDefinitionService; @Resource private AdminUserApi adminUserApi; @@ -70,7 +74,9 @@ public class BpmTaskController { convertSet(pageResult.getList(), Task::getProcessInstanceId)); Map userMap = adminUserApi.getUserMap( convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap)); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), Task::getProcessDefinitionId)); + return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap)); } @GetMapping("done-page") @@ -87,7 +93,9 @@ public class BpmTaskController { convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); Map userMap = adminUserApi.getUserMap( convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null)); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); + return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap)); } @GetMapping("manager-page") @@ -108,7 +116,9 @@ public class BpmTaskController { Map userMap = adminUserApi.getUserMap(userIds); Map deptMap = deptApi.getDeptMap( convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap)); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); + return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, processDefinitionInfoMap)); } @GetMapping("/list-by-process-instance-id") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java index 2de0cbc956..7da75a9a7f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import io.swagger.v3.oas.annotations.media.Schema; @@ -59,6 +60,8 @@ public class BpmProcessInstanceRespVO { */ private List tasks; // 仅在流程实例分页才返回 + private List> summary; + @Schema(description = "流程任务") @Data public static class Task { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index 684a8bd5e7..9bee198fda 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; @@ -84,6 +85,9 @@ public class BpmTaskRespVO { @Schema(description = "是否填写审批意见", example = "false") private Boolean reasonRequire; + @Schema(description = "摘要", example = "[]") + private List> summary; + @Data @Schema(description = "流程实例") public static class ProcessInstance { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index 8118bdd0ca..acc337b01c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; @@ -58,7 +59,8 @@ public interface BpmProcessInstanceConvert { Map categoryMap, Map> taskMap, Map userMap, - Map deptMap) { + Map deptMap, + Map processDefinitionInfoMap) { PageResult vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class); for (int i = 0; i < pageResult.getList().size(); i++) { BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i); @@ -76,6 +78,9 @@ public interface BpmProcessInstanceConvert { MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName())); } } + // 摘要 + respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(respVO.getProcessDefinitionId()), + pageResult.getList().get(i).getProcessVariables())); } return vpPageResult; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java index 37c7218e05..ac6b91bbd7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; @@ -9,6 +10,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; @@ -41,7 +43,8 @@ public interface BpmTaskConvert { default PageResult buildTodoTaskPage(PageResult pageResult, Map processInstanceMap, - Map userMap) { + Map userMap, + Map processDefinitionInfoMap) { return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); if (processInstance == null) { @@ -50,13 +53,17 @@ public interface BpmTaskConvert { taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); + // 摘要 + taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + processInstance.getProcessVariables())); }); } default PageResult buildTaskPage(PageResult pageResult, Map processInstanceMap, Map userMap, - Map deptMap) { + Map deptMap, + Map processDefinitionInfoMap) { List taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); @@ -72,6 +79,9 @@ public interface BpmTaskConvert { AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); + // 摘要 + taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + processInstance.getProcessVariables())); } return taskVO; }); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 3048f06fd9..ccab7b0435 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -176,4 +176,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @TableField(typeHandler = JacksonTypeHandler.class) private BpmModelMetaInfoVO.TitleSetting titleSetting; + /** + * 摘要设置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private BpmModelMetaInfoVO.SummarySetting summarySetting; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 9b10e4a78b..489115aae1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -2,8 +2,13 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmFormFieldVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; import lombok.SneakyThrows; import org.flowable.common.engine.api.delegate.Expression; @@ -19,10 +24,7 @@ import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.TaskInfo; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.Callable; /** @@ -277,4 +279,44 @@ public class FlowableUtils { return getExpressionValue(variableContainer, expressionString); } + public static List> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, + Map processVariables) { + if (ObjectUtil.isNotNull(processDefinitionInfo) + && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { + List> summaryList = new ArrayList<>(); + Map formFieldsMap = new HashMap<>(); + processDefinitionInfo.getFormFields().forEach(formFieldStr -> { + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); + if (formField != null) { + formFieldsMap.put(formField.getField(), formField); + } + }); + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { + for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { + BpmFormFieldVO formField = formFieldsMap.get(item); + if (formField != null) { + summaryList.add(new KeyValue<>(formField.getTitle(), + processVariables.getOrDefault(item, "").toString())); + } + } + } else { + // 默认展示前三个 + int j = 0; + for (Map.Entry entry : formFieldsMap.entrySet()) { + BpmFormFieldVO formField = entry.getValue(); + if (j > 2) { + break; + } + summaryList.add(new KeyValue<>(formField.getTitle(), + processVariables.getOrDefault(formField.getField(), "").toString())); + j++; + } + } + Collections.reverse(summaryList); + return summaryList; + } + return null; + } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index c23e1abb53..ca13a0af46 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -128,7 +128,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public List getProcessInstances(Set ids) { - return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); + return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list(); } @Override @@ -138,7 +138,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public List getHistoricProcessInstances(Set ids) { - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); + return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list(); } @Override From 39e68af120f783601eea5527ad3975ae5ac799b8 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Fri, 24 Jan 2025 13:22:57 +0800 Subject: [PATCH 082/112] =?UTF-8?q?fix:=20=E5=8F=96=E6=B6=88=E6=91=98?= =?UTF-8?q?=E8=A6=81=E6=95=B0=E7=BB=84=E5=80=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/framework/flowable/core/util/FlowableUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 489115aae1..19be21e2ca 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -313,7 +313,6 @@ public class FlowableUtils { j++; } } - Collections.reverse(summaryList); return summaryList; } return null; From d83b7cd5b9d5d3e5817f51d22777fada6b1f6b4b Mon Sep 17 00:00:00 2001 From: puhui999 Date: Fri, 24 Jan 2025 17:31:41 +0800 Subject: [PATCH 083/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91InEnum=20=E4=B8=8D=E5=BF=85=E9=A1=BB=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=20int=20=E7=B1=BB=E5=9E=8B=EF=BC=8C=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=B3=9B=E5=9E=8B=E6=8C=87=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/core/ArrayValuable.java | 15 ++++++++++++++ .../common/core/IntArrayValuable.java | 15 -------------- .../common/enums/CommonStatusEnum.java | 8 ++++---- .../common/enums/DateIntervalEnum.java | 8 ++++---- .../framework/common/enums/TerminalEnum.java | 8 ++++---- .../framework/common/enums/UserTypeEnum.java | 8 ++++---- .../framework/common/validation/InEnum.java | 8 ++++---- .../validation/InEnumCollectionValidator.java | 20 ++++++++++--------- .../common/validation/InEnumValidator.java | 17 ++++++++-------- .../framework/ip/core/enums/AreaTypeEnum.java | 8 ++++---- .../AiKnowledgeDocumentStatusEnum.java | 8 ++++---- .../enums/music/AiMusicGenerateModeEnum.java | 8 ++++---- .../ai/enums/music/AiMusicStatusEnum.java | 8 ++++---- .../ai/enums/write/AiWriteTypeEnum.java | 8 ++++---- .../definition/BpmModelFormTypeEnum.java | 8 ++++---- .../enums/definition/BpmModelTypeEnum.java | 8 ++++---- .../BpmSimpleModeConditionType.java | 8 ++++---- .../definition/BpmSimpleModelNodeType.java | 8 ++++---- .../BpmUserTaskApproveMethodEnum.java | 8 ++++---- .../BpmUserTaskApproveTypeEnum.java | 8 ++++---- ...BpmUserTaskAssignEmptyHandlerTypeEnum.java | 8 ++++---- ...serTaskAssignStartUserHandlerTypeEnum.java | 8 ++++---- .../BpmUserTaskRejectHandlerType.java | 8 ++++---- .../BpmUserTaskTimeoutHandlerTypeEnum.java | 8 ++++---- .../task/BpmProcessInstanceStatusEnum.java | 8 ++++---- .../enums/BpmTaskCandidateStrategyEnum.java | 8 ++++---- .../business/CrmBusinessEndStatusEnum.java | 8 ++++---- .../crm/enums/common/CrmAuditStatusEnum.java | 8 ++++---- .../crm/enums/common/CrmBizTypeEnum.java | 8 ++++---- .../crm/enums/common/CrmSceneTypeEnum.java | 8 ++++---- .../enums/customer/CrmCustomerLevelEnum.java | 8 ++++---- .../CrmCustomerLimitConfigTypeEnum.java | 8 ++++---- .../permission/CrmPermissionLevelEnum.java | 8 ++++---- .../enums/product/CrmProductStatusEnum.java | 8 ++++---- .../CrmReceivableReturnTypeEnum.java | 8 ++++---- .../module/erp/enums/ErpAuditStatus.java | 8 ++++---- .../erp/enums/common/ErpBizTypeEnum.java | 8 ++++---- .../stock/ErpStockRecordBizTypeEnum.java | 8 ++++---- .../iot/enums/device/IotDeviceStatusEnum.java | 8 ++++---- .../iot/enums/product/IotDataFormatEnum.java | 8 ++++---- .../iot/enums/product/IotNetTypeEnum.java | 8 ++++---- .../product/IotProductDeviceTypeEnum.java | 8 ++++---- .../product/IotProductFunctionTypeEnum.java | 8 ++++---- .../enums/product/IotProductStatusEnum.java | 8 ++++---- .../enums/product/IotProtocolTypeEnum.java | 8 ++++---- .../enums/product/IotValidateTypeEnum.java | 8 ++++---- .../ProductCommentAuditStatusEnum.java | 8 ++++---- .../comment/ProductCommentScoresEnum.java | 8 ++++---- .../enums/spu/ProductSpuStatusEnum.java | 8 ++++---- .../enums/banner/BannerPositionEnum.java | 8 ++++---- .../bargain/BargainRecordStatusEnum.java | 8 ++++---- .../CombinationRecordStatusEnum.java | 8 ++++---- .../common/PromotionActivityStatusEnum.java | 8 ++++---- .../common/PromotionConditionTypeEnum.java | 8 ++++---- .../common/PromotionDiscountTypeEnum.java | 8 ++++---- .../common/PromotionProductScopeEnum.java | 8 ++++---- .../enums/common/PromotionTypeEnum.java | 8 ++++---- .../enums/coupon/CouponStatusEnum.java | 8 ++++---- .../enums/coupon/CouponTakeTypeEnum.java | 8 ++++---- .../CouponTemplateValidityTypeEnum.java | 8 ++++---- .../promotion/enums/diy/DiyPageEnum.java | 8 ++++---- .../kefu/KeFuMessageContentTypeEnum.java | 8 ++++---- .../statistics/enums/TimeRangeTypeEnum.java | 8 ++++---- .../enums/aftersale/AfterSaleStatusEnum.java | 8 ++++---- .../enums/aftersale/AfterSaleTypeEnum.java | 8 ++++---- .../enums/aftersale/AfterSaleWayEnum.java | 8 ++++---- .../brokerage/BrokerageBindModeEnum.java | 8 ++++---- .../BrokerageEnabledConditionEnum.java | 8 ++++---- .../brokerage/BrokerageRecordBizTypeEnum.java | 8 ++++---- .../brokerage/BrokerageRecordStatusEnum.java | 8 ++++---- .../BrokerageWithdrawStatusEnum.java | 8 ++++---- .../brokerage/BrokerageWithdrawTypeEnum.java | 8 ++++---- .../DeliveryExpressChargeModeEnum.java | 8 ++++---- .../enums/delivery/DeliveryTypeEnum.java | 8 ++++---- .../enums/order/TradeOrderCancelTypeEnum.java | 8 ++++---- .../TradeOrderItemAfterSaleStatusEnum.java | 8 ++++---- .../order/TradeOrderRefundStatusEnum.java | 8 ++++---- .../enums/order/TradeOrderStatusEnum.java | 8 ++++---- .../trade/enums/order/TradeOrderTypeEnum.java | 8 ++++---- .../enums/point/MemberPointBizTypeEnum.java | 8 ++++---- .../pay/enums/order/PayOrderStatusEnum.java | 8 ++++---- .../enums/transfer/PayTransferTypeEnum.java | 8 ++++---- .../enums/wallet/PayWalletBizTypeEnum.java | 8 ++++---- .../enums/transfer/PayTransferTypeEnum.java | 8 ++++---- .../enums/permission/DataScopeEnum.java | 8 ++++---- .../module/system/enums/sms/SmsSceneEnum.java | 8 ++++---- .../system/enums/social/SocialTypeEnum.java | 8 ++++---- 87 files changed, 366 insertions(+), 365 deletions(-) create mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/ArrayValuable.java delete mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/IntArrayValuable.java diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/ArrayValuable.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/ArrayValuable.java new file mode 100644 index 0000000000..b83451fd07 --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/ArrayValuable.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.framework.common.core; + +/** + * 可生成 T 数组的接口 + * + * @author HUIHUI + */ +public interface ArrayValuable { + + /** + * @return 数组 + */ + T[] array(); + +} \ No newline at end of file diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/IntArrayValuable.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/IntArrayValuable.java deleted file mode 100644 index 8914231d84..0000000000 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/IntArrayValuable.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.framework.common.core; - -/** - * 可生成 Int 数组的接口 - * - * @author 芋道源码 - */ -public interface IntArrayValuable { - - /** - * @return int 数组 - */ - int[] array(); - -} diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/CommonStatusEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/CommonStatusEnum.java index facf32679c..f2a63dcdb6 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/CommonStatusEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/CommonStatusEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.common.enums; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,12 +14,12 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CommonStatusEnum implements IntArrayValuable { +public enum CommonStatusEnum implements ArrayValuable { ENABLE(0, "开启"), DISABLE(1, "关闭"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CommonStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -31,7 +31,7 @@ public enum CommonStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/DateIntervalEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/DateIntervalEnum.java index 498b671242..8d6a791784 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/DateIntervalEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/DateIntervalEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.common.enums; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum DateIntervalEnum implements IntArrayValuable { +public enum DateIntervalEnum implements ArrayValuable { DAY(1, "天"), WEEK(2, "周"), @@ -23,7 +23,7 @@ public enum DateIntervalEnum implements IntArrayValuable { YEAR(5, "年") ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DateIntervalEnum::getInterval).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(DateIntervalEnum::getInterval).toArray(Integer[]::new); /** * 类型 @@ -35,7 +35,7 @@ public enum DateIntervalEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/TerminalEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/TerminalEnum.java index f256712b35..33482d46f8 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/TerminalEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/TerminalEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.framework.common.enums; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TerminalEnum implements IntArrayValuable { +public enum TerminalEnum implements ArrayValuable { UNKNOWN(0, "未知"), // 目的:在无法解析到 terminal 时,使用它 WECHAT_MINI_PROGRAM(10, "微信小程序"), @@ -22,7 +22,7 @@ public enum TerminalEnum implements IntArrayValuable { APP(31, "手机 App"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TerminalEnum::getTerminal).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TerminalEnum::getTerminal).toArray(Integer[]::new); /** * 终端 @@ -34,7 +34,7 @@ public enum TerminalEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java index c950c529db..e00ec0bef2 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/UserTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.common.enums; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,12 +12,12 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum UserTypeEnum implements IntArrayValuable { +public enum UserTypeEnum implements ArrayValuable { MEMBER(1, "会员"), // 面向 c 端,普通用户 ADMIN(2, "管理员"); // 面向 b 端,管理后台 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(UserTypeEnum::getValue).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new); /** * 类型 @@ -33,7 +33,7 @@ public enum UserTypeEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java index f8a7fba534..407d01b0a1 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.framework.common.validation; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; - +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import jakarta.validation.Constraint; import jakarta.validation.Payload; + import java.lang.annotation.*; @Target({ @@ -22,9 +22,9 @@ import java.lang.annotation.*; public @interface InEnum { /** - * @return 实现 EnumValuable 接口的 + * @return 实现 ArrayValuable 接口的类 */ - Class value(); + Class> value(); String message() default "必须在指定范围 {value}"; diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java index 8751905884..b21a929486 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java @@ -1,37 +1,39 @@ package cn.iocoder.yudao.framework.common.validation; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; - +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; + import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -public class InEnumCollectionValidator implements ConstraintValidator> { +public class InEnumCollectionValidator implements ConstraintValidator> { - private List values; + private List values; @Override public void initialize(InEnum annotation) { - IntArrayValuable[] values = annotation.value().getEnumConstants(); + ArrayValuable[] values = annotation.value().getEnumConstants(); if (values.length == 0) { this.values = Collections.emptyList(); } else { - this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + this.values = Arrays.asList(values[0].array()); } } @Override - public boolean isValid(Collection list, ConstraintValidatorContext context) { + public boolean isValid(Collection list, ConstraintValidatorContext context) { + if (list == null) { + return true; + } // 校验通过 if (CollUtil.containsAll(values, list)) { return true; } - // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + // 校验不通过,自定义提示语句 context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() .replaceAll("\\{value}", CollUtil.join(list, ","))).addConstraintViolation(); // 重新添加错误提示语句 diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java index c8c4058129..e80eac4bdb 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java @@ -1,30 +1,29 @@ package cn.iocoder.yudao.framework.common.validation; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; - +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; + import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -public class InEnumValidator implements ConstraintValidator { +public class InEnumValidator implements ConstraintValidator { - private List values; + private List values; @Override public void initialize(InEnum annotation) { - IntArrayValuable[] values = annotation.value().getEnumConstants(); + ArrayValuable[] values = annotation.value().getEnumConstants(); if (values.length == 0) { this.values = Collections.emptyList(); } else { - this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + this.values = Arrays.asList(values[0].array()); } } @Override - public boolean isValid(Integer value, ConstraintValidatorContext context) { + public boolean isValid(Object value, ConstraintValidatorContext context) { // 为空时,默认不校验,即认为通过 if (value == null) { return true; @@ -33,7 +32,7 @@ public class InEnumValidator implements ConstraintValidator { if (values.contains(value)) { return true; } - // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + // 校验不通过,自定义提示语句 context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句 diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/enums/AreaTypeEnum.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/enums/AreaTypeEnum.java index 916d885053..1698ad2e08 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/enums/AreaTypeEnum.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/enums/AreaTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.framework.ip.core.enums; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum AreaTypeEnum implements IntArrayValuable { +public enum AreaTypeEnum implements ArrayValuable { COUNTRY(1, "国家"), PROVINCE(2, "省份"), @@ -21,7 +21,7 @@ public enum AreaTypeEnum implements IntArrayValuable { DISTRICT(4, "地区"), // 县、镇、区等 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AreaTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AreaTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -33,7 +33,7 @@ public enum AreaTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/knowledge/AiKnowledgeDocumentStatusEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/knowledge/AiKnowledgeDocumentStatusEnum.java index a37fa86435..6ded3f6de8 100644 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/knowledge/AiKnowledgeDocumentStatusEnum.java +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/knowledge/AiKnowledgeDocumentStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.ai.enums.knowledge; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum AiKnowledgeDocumentStatusEnum implements IntArrayValuable { +public enum AiKnowledgeDocumentStatusEnum implements ArrayValuable { IN_PROGRESS(10, "索引中"), SUCCESS(20, "可用"), @@ -29,10 +29,10 @@ public enum AiKnowledgeDocumentStatusEnum implements IntArrayValuable { */ private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiKnowledgeDocumentStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AiKnowledgeDocumentStatusEnum::getStatus).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicGenerateModeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicGenerateModeEnum.java index 651731b60f..82052943bc 100644 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicGenerateModeEnum.java +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicGenerateModeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.ai.enums.music; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum AiMusicGenerateModeEnum implements IntArrayValuable { +public enum AiMusicGenerateModeEnum implements ArrayValuable { DESCRIPTION(1, "描述模式"), LYRIC(2, "歌词模式"); @@ -27,10 +27,10 @@ public enum AiMusicGenerateModeEnum implements IntArrayValuable { */ private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiMusicGenerateModeEnum::getMode).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AiMusicGenerateModeEnum::getMode).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicStatusEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicStatusEnum.java index f1298cf564..9340a59762 100644 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicStatusEnum.java +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/music/AiMusicStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.ai.enums.music; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum AiMusicStatusEnum implements IntArrayValuable { +public enum AiMusicStatusEnum implements ArrayValuable { IN_PROGRESS(10, "进行中"), SUCCESS(20, "已完成"), @@ -29,10 +29,10 @@ public enum AiMusicStatusEnum implements IntArrayValuable { */ private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiMusicStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AiMusicStatusEnum::getStatus).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java index 49d825be85..6d91433b7b 100644 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.ai.enums.write; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum AiWriteTypeEnum implements IntArrayValuable { +public enum AiWriteTypeEnum implements ArrayValuable { WRITING(1, "撰写", "请撰写一篇关于 [{}] 的文章。文章的内容格式:{},语气:{},语言:{},长度:{}。请确保涵盖主要内容,不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。"), REPLY(2, "回复", "请针对如下内容:[{}] 做个回复。回复内容参考:[{}], 回复格式:{},语气:{},语言:{},长度:{}。不需要除了正文内容外的其他回复,如标题、开头、额外的解释或道歉。"); @@ -32,10 +32,10 @@ public enum AiWriteTypeEnum implements IntArrayValuable { */ private final String prompt; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AiWriteTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java index 3bca6c82b8..40e96af060 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelFormTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,19 +13,19 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmModelFormTypeEnum implements IntArrayValuable { +public enum BpmModelFormTypeEnum implements ArrayValuable { NORMAL(10, "流程表单"), // 对应 BpmFormDO CUSTOM(20, "业务表单") // 业务自己定义的表单,自己进行数据的存储 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmModelFormTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmModelFormTypeEnum::getType).toArray(Integer[]::new); private final Integer type; private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelTypeEnum.java index 9863a44e87..6b2b85766c 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmModelTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,18 +13,18 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmModelTypeEnum implements IntArrayValuable { +public enum BpmModelTypeEnum implements ArrayValuable { BPMN(10, "BPMN 设计器"), // https://bpmn.io/toolkit/bpmn-js/ SIMPLE(20, "SIMPLE 设计器"); // 参考钉钉、飞书工作流的设计器 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmModelTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmModelTypeEnum::getType).toArray(Integer[]::new); private final Integer type; private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java index 234ec7e47b..1a3fedce82 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModeConditionType.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.enums.definition; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,12 +14,12 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmSimpleModeConditionType implements IntArrayValuable { +public enum BpmSimpleModeConditionType implements ArrayValuable { EXPRESSION(1, "条件表达式"), RULE(2, "条件规则"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModeConditionType::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmSimpleModeConditionType::getType).toArray(Integer[]::new); private final Integer type; @@ -30,7 +30,7 @@ public enum BpmSimpleModeConditionType implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index 36ad0e5ee1..7e933f2423 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.enums.definition; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,7 +15,7 @@ import java.util.Objects; */ @Getter @AllArgsConstructor -public enum BpmSimpleModelNodeType implements IntArrayValuable { +public enum BpmSimpleModelNodeType implements ArrayValuable { // 0 ~ 1 开始和结束 START_NODE(0, "startEvent", "开始节点"), @@ -35,7 +35,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { // TODO @芋艿。 感觉还是分开好理解一点,也好处理一点。前端结构中把聚合节点显示并传过来。 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmSimpleModelNodeType::getType).toArray(Integer[]::new); public static final String BPMN_USER_TASK_TYPE = "userTask"; @@ -69,7 +69,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java index 9d4dd63af6..0c79ac50c4 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.enums.definition; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable { +public enum BpmUserTaskApproveMethodEnum implements ArrayValuable { RANDOM(1, "随机挑选一人审批"), RATIO(2, "多人会签(按通过比例)"), // 会签(按通过比例) @@ -31,14 +31,14 @@ public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable { */ private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveMethodEnum::getMethod).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskApproveMethodEnum::getMethod).toArray(Integer[]::new); public static BpmUserTaskApproveMethodEnum valueOf(Integer method) { return ArrayUtil.firstMatch(item -> item.getMethod().equals(method), values()); } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java index fa6dba665a..353124a08f 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,18 +13,18 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmUserTaskApproveTypeEnum implements IntArrayValuable { +public enum BpmUserTaskApproveTypeEnum implements ArrayValuable { USER(1), // 人工审批 AUTO_APPROVE(2), // 自动通过 AUTO_REJECT(3); // 自动拒绝 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskApproveTypeEnum::getType).toArray(Integer[]::new); private final Integer type; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java index 7a7242a494..f6cee3b599 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignEmptyHandlerTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum BpmUserTaskAssignEmptyHandlerTypeEnum implements IntArrayValuable { +public enum BpmUserTaskAssignEmptyHandlerTypeEnum implements ArrayValuable { APPROVE(1), // 自动通过 REJECT(2), // 自动拒绝 @@ -21,12 +21,12 @@ public enum BpmUserTaskAssignEmptyHandlerTypeEnum implements IntArrayValuable { ASSIGN_ADMIN(4), // 转交给流程管理员 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskAssignEmptyHandlerTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskAssignEmptyHandlerTypeEnum::getType).toArray(Integer[]::new); private final Integer type; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java index 5012815027..6d0633afaf 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,18 +13,18 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum BpmUserTaskAssignStartUserHandlerTypeEnum implements IntArrayValuable { +public enum BpmUserTaskAssignStartUserHandlerTypeEnum implements ArrayValuable { START_USER_AUDIT(1), // 由发起人对自己审批 SKIP(2), // 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过 TRANSFER_DEPT_LEADER(3); // 转交给部门负责人审批【参考飞书】:若部门负责人为空,则自动通过 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskAssignStartUserHandlerTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskAssignStartUserHandlerTypeEnum::getType).toArray(Integer[]::new); private final Integer type; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java index f2d48f7d9a..adf2fd08d4 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskRejectHandlerType.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.enums.definition; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmUserTaskRejectHandlerType implements IntArrayValuable { +public enum BpmUserTaskRejectHandlerType implements ArrayValuable { FINISH_PROCESS_INSTANCE(1, "终止流程"), RETURN_USER_TASK(2, "驳回到指定任务节点"); @@ -22,14 +22,14 @@ public enum BpmUserTaskRejectHandlerType implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskRejectHandlerType::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskRejectHandlerType::getType).toArray(Integer[]::new); public static BpmUserTaskRejectHandlerType typeOf(Integer type) { return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java index 0d56c9b379..ef9825c48e 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmUserTaskTimeoutHandlerTypeEnum implements IntArrayValuable { +public enum BpmUserTaskTimeoutHandlerTypeEnum implements ArrayValuable { REMINDER(1,"自动提醒"), APPROVE(2, "自动同意"), @@ -22,10 +22,10 @@ public enum BpmUserTaskTimeoutHandlerTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskTimeoutHandlerTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmUserTaskTimeoutHandlerTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java index c635e92baa..e6b23777e7 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.task; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmProcessInstanceStatusEnum implements IntArrayValuable { +public enum BpmProcessInstanceStatusEnum implements ArrayValuable { NOT_START(-1, "未开始"), RUNNING(1, "审批中"), @@ -22,7 +22,7 @@ public enum BpmProcessInstanceStatusEnum implements IntArrayValuable { REJECT(3, "审批不通过"), CANCEL(4, "已取消"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmProcessInstanceStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmProcessInstanceStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -34,7 +34,7 @@ public enum BpmProcessInstanceStatusEnum implements IntArrayValuable { private final String desc; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java index 240aa18dc6..0f3390c65e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmTaskCandidateStrategyEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -16,7 +16,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmTaskCandidateStrategyEnum implements IntArrayValuable { +public enum BpmTaskCandidateStrategyEnum implements ArrayValuable { ROLE(10, "角色"), DEPT_MEMBER(20, "部门的成员"), // 包括负责人 @@ -33,7 +33,7 @@ public enum BpmTaskCandidateStrategyEnum implements IntArrayValuable { ASSIGN_EMPTY(1, "审批人为空"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmTaskCandidateStrategyEnum::getStrategy).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmTaskCandidateStrategyEnum::getStrategy).toArray(Integer[]::new); /** * 类型 @@ -49,7 +49,7 @@ public enum BpmTaskCandidateStrategyEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java index 4736c01b77..e199a882ad 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.enums.business; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum CrmBusinessEndStatusEnum implements IntArrayValuable { +public enum CrmBusinessEndStatusEnum implements ArrayValuable { WIN(1, "赢单"), LOSE(2, "输单"), INVALID(3, "无效"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBusinessEndStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmBusinessEndStatusEnum::getStatus).toArray(Integer[]::new); /** * 场景类型 @@ -31,7 +31,7 @@ public enum CrmBusinessEndStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java index 67709e95b6..3203481414 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum CrmAuditStatusEnum implements IntArrayValuable { +public enum CrmAuditStatusEnum implements ArrayValuable { DRAFT(0, "未提交"), PROCESS(10, "审批中"), @@ -24,10 +24,10 @@ public enum CrmAuditStatusEnum implements IntArrayValuable { private final Integer status; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmAuditStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmAuditStatusEnum::getStatus).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java index 8402ad2886..f2d3aaa994 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.crm.enums.common; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -15,7 +15,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum CrmBizTypeEnum implements IntArrayValuable { +public enum CrmBizTypeEnum implements ArrayValuable { CRM_CLUE(1, "线索"), CRM_CUSTOMER(2, "客户"), @@ -27,7 +27,7 @@ public enum CrmBizTypeEnum implements IntArrayValuable { CRM_RECEIVABLE_PLAN(8, "回款计划") ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmBizTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -45,7 +45,7 @@ public enum CrmBizTypeEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java index 945d7c6a3b..9a1a4209b7 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.enums.common; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,13 +14,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmSceneTypeEnum implements IntArrayValuable { +public enum CrmSceneTypeEnum implements ArrayValuable { OWNER(1, "我负责的"), INVOLVED(2, "我参与的"), SUBORDINATE(3, "下属负责的"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmSceneTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmSceneTypeEnum::getType).toArray(Integer[]::new); /** * 场景类型 @@ -44,7 +44,7 @@ public enum CrmSceneTypeEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java index aa06b05ebc..44402755e8 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.enums.customer; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmCustomerLevelEnum implements IntArrayValuable { +public enum CrmCustomerLevelEnum implements ArrayValuable { IMPORTANT(1, "A(重点客户)"), GENERAL(2, "B(普通客户)"), LOW_PRIORITY(3, "C(非优先客户)"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLevelEnum::getLevel).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmCustomerLevelEnum::getLevel).toArray(Integer[]::new); /** * 状态 @@ -31,7 +31,7 @@ public enum CrmCustomerLevelEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java index 2cf8d78113..7fd5eb3107 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.crm.enums.customer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,7 +15,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmCustomerLimitConfigTypeEnum implements IntArrayValuable { +public enum CrmCustomerLimitConfigTypeEnum implements ArrayValuable { /** * 拥有客户数限制 @@ -27,7 +27,7 @@ public enum CrmCustomerLimitConfigTypeEnum implements IntArrayValuable { CUSTOMER_LOCK_LIMIT(2, "锁定客户数限制"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLimitConfigTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmCustomerLimitConfigTypeEnum::getType).toArray(Integer[]::new); /** * 状态 @@ -45,7 +45,7 @@ public enum CrmCustomerLimitConfigTypeEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java index f36e8cfffb..85ab1bb951 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.crm.enums.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -17,13 +17,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmPermissionLevelEnum implements IntArrayValuable { +public enum CrmPermissionLevelEnum implements ArrayValuable { OWNER(1, "负责人"), READ(2, "只读"), WRITE(3, "读写"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmPermissionLevelEnum::getLevel).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmPermissionLevelEnum::getLevel).toArray(Integer[]::new); /** * 级别 @@ -35,7 +35,7 @@ public enum CrmPermissionLevelEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java index 9516c35c61..f940e8810b 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.enums.product; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,12 +15,12 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmProductStatusEnum implements IntArrayValuable { +public enum CrmProductStatusEnum implements ArrayValuable { DISABLE(0, "下架"), ENABLE(1, "上架"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmProductStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmProductStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -32,7 +32,7 @@ public enum CrmProductStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java index 3c01fe95c1..e10385ad97 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.enums.receivable; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum CrmReceivableReturnTypeEnum implements IntArrayValuable { +public enum CrmReceivableReturnTypeEnum implements ArrayValuable { CHECK(1, "支票"), CASH(2, "现金"), @@ -24,7 +24,7 @@ public enum CrmReceivableReturnTypeEnum implements IntArrayValuable { WECHAT_PAY(7, "微信支付"), OTHER(8, "其它"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmReceivableReturnTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmReceivableReturnTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -36,7 +36,7 @@ public enum CrmReceivableReturnTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpAuditStatus.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpAuditStatus.java index a10147a704..42c0174b51 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpAuditStatus.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpAuditStatus.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.erp.enums; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -15,12 +15,12 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum ErpAuditStatus implements IntArrayValuable { +public enum ErpAuditStatus implements ArrayValuable { PROCESS(10, "未审核"), // 审核中 APPROVE(20, "已审核"); // 审核通过 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpAuditStatus::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpAuditStatus::getStatus).toArray(Integer[]::new); /** * 状态 @@ -32,7 +32,7 @@ public enum ErpAuditStatus implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/common/ErpBizTypeEnum.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/common/ErpBizTypeEnum.java index a2770598e6..5b09756a2c 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/common/ErpBizTypeEnum.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/common/ErpBizTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.erp.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum ErpBizTypeEnum implements IntArrayValuable { +public enum ErpBizTypeEnum implements ArrayValuable { PURCHASE_ORDER(10, "采购订单"), PURCHASE_IN(11, "采购入库"), @@ -24,7 +24,7 @@ public enum ErpBizTypeEnum implements IntArrayValuable { SALE_RETURN(22, "销售退货"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpBizTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpBizTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -36,7 +36,7 @@ public enum ErpBizTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java index 559bf4ccf7..9ed19c5653 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.erp.enums.stock; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum ErpStockRecordBizTypeEnum implements IntArrayValuable { +public enum ErpStockRecordBizTypeEnum implements ArrayValuable { OTHER_IN(10, "其它入库"), OTHER_IN_CANCEL(11, "其它入库(作废)"), @@ -44,7 +44,7 @@ public enum ErpStockRecordBizTypeEnum implements IntArrayValuable { PURCHASE_RETURN_CANCEL(81, "采购退货出库(作废)"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErpStockRecordBizTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpStockRecordBizTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -56,7 +56,7 @@ public enum ErpStockRecordBizTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java index 5fd983dc01..0ec2ac776b 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.device; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import java.util.Arrays; @@ -11,14 +11,14 @@ import java.util.Arrays; * @author haohao */ @Getter -public enum IotDeviceStatusEnum implements IntArrayValuable { +public enum IotDeviceStatusEnum implements ArrayValuable { INACTIVE(0, "未激活"), ONLINE(1, "在线"), OFFLINE(2, "离线"), DISABLED(3, "已禁用"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotDeviceStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDeviceStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -48,7 +48,7 @@ public enum IotDeviceStatusEnum implements IntArrayValuable { } @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotDataFormatEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotDataFormatEnum.java index 8a1afa0709..0cfe1c9f48 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotDataFormatEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotDataFormatEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,12 +14,12 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotDataFormatEnum implements IntArrayValuable { +public enum IotDataFormatEnum implements ArrayValuable { JSON(0, "标准数据格式(JSON)"), CUSTOMIZE(1, "透传/自定义"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotDataFormatEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDataFormatEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -31,7 +31,7 @@ public enum IotDataFormatEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotNetTypeEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotNetTypeEnum.java index 718e86d131..561bc66f92 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotNetTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotNetTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,14 +13,14 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotNetTypeEnum implements IntArrayValuable { +public enum IotNetTypeEnum implements ArrayValuable { WIFI(0, "Wi-Fi"), CELLULAR(1, "Cellular"), ETHERNET(2, "Ethernet"), OTHER(3, "其他"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotNetTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotNetTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -32,7 +32,7 @@ public enum IotNetTypeEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductDeviceTypeEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductDeviceTypeEnum.java index 99b75f3fbd..3d8ca10b38 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductDeviceTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductDeviceTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotProductDeviceTypeEnum implements IntArrayValuable { +public enum IotProductDeviceTypeEnum implements ArrayValuable { DIRECT(0, "直连设备"), GATEWAY_CHILD(1, "网关子设备"), @@ -29,10 +29,10 @@ public enum IotProductDeviceTypeEnum implements IntArrayValuable { */ private final String description; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotProductDeviceTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotProductDeviceTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductFunctionTypeEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductFunctionTypeEnum.java index 7a924997a5..1e95c6b783 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductFunctionTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductFunctionTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotProductFunctionTypeEnum implements IntArrayValuable { +public enum IotProductFunctionTypeEnum implements ArrayValuable { PROPERTY(1, "属性"), SERVICE(2, "服务"), EVENT(3, "事件"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotProductFunctionTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotProductFunctionTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -31,7 +31,7 @@ public enum IotProductFunctionTypeEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductStatusEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductStatusEnum.java index e64a3d6789..32daf16719 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductStatusEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProductStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotProductStatusEnum implements IntArrayValuable { +public enum IotProductStatusEnum implements ArrayValuable { UNPUBLISHED(0, "开发中"), PUBLISHED(1, "已发布"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotProductStatusEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotProductStatusEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -30,7 +30,7 @@ public enum IotProductStatusEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProtocolTypeEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProtocolTypeEnum.java index c36a377237..9eb57044fb 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProtocolTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProtocolTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotProtocolTypeEnum implements IntArrayValuable { +public enum IotProtocolTypeEnum implements ArrayValuable { CUSTOM(0, "自定义"), MODBUS(1, "Modbus"), @@ -21,7 +21,7 @@ public enum IotProtocolTypeEnum implements IntArrayValuable { ZIGBEE(3, "ZigBee"), BLE(4, "BLE"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotProtocolTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotProtocolTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -33,7 +33,7 @@ public enum IotProtocolTypeEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotValidateTypeEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotValidateTypeEnum.java index 9a8092b7b6..11604b4dd8 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotValidateTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotValidateTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.iot.enums.product; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum IotValidateTypeEnum implements IntArrayValuable { +public enum IotValidateTypeEnum implements ArrayValuable { WEAK(0, "弱校验"), NONE(1, "免校验"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotValidateTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotValidateTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -30,7 +30,7 @@ public enum IotValidateTypeEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentAuditStatusEnum.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentAuditStatusEnum.java index 276839dafd..f46f1285cb 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentAuditStatusEnum.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentAuditStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.product.enums.comment; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum ProductCommentAuditStatusEnum implements IntArrayValuable { +public enum ProductCommentAuditStatusEnum implements ArrayValuable { NONE(1, "待审核"), APPROVE(2, "审批通过"), REJECT(2, "审批不通过"),; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentAuditStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ProductCommentAuditStatusEnum::getStatus).toArray(Integer[]::new); /** * 审批状态 @@ -31,7 +31,7 @@ public enum ProductCommentAuditStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentScoresEnum.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentScoresEnum.java index a114e1ab8b..58c6a45c5d 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentScoresEnum.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/comment/ProductCommentScoresEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.product.enums.comment; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum ProductCommentScoresEnum implements IntArrayValuable { +public enum ProductCommentScoresEnum implements ArrayValuable { ONE(1, "1星"), TWO(2, "2星"), @@ -21,7 +21,7 @@ public enum ProductCommentScoresEnum implements IntArrayValuable { FOUR(4, "4星"), FIVE(5, "5星"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentScoresEnum::getScores).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ProductCommentScoresEnum::getScores).toArray(Integer[]::new); /** * 星级 @@ -34,7 +34,7 @@ public enum ProductCommentScoresEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductSpuStatusEnum.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductSpuStatusEnum.java index 4ba6124e00..5735f49b16 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductSpuStatusEnum.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/spu/ProductSpuStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.product.enums.spu; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum ProductSpuStatusEnum implements IntArrayValuable { +public enum ProductSpuStatusEnum implements ArrayValuable { RECYCLE(-1, "回收站"), DISABLE(0, "下架"), ENABLE(1, "上架"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ProductSpuStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -31,7 +31,7 @@ public enum ProductSpuStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/banner/BannerPositionEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/banner/BannerPositionEnum.java index 8a8338c8a9..0d0db4e916 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/banner/BannerPositionEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/banner/BannerPositionEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.banner; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BannerPositionEnum implements IntArrayValuable { +public enum BannerPositionEnum implements ArrayValuable { HOME_POSITION(1, "首页"), SECKILL_POSITION(2, "秒杀活动页"), @@ -21,7 +21,7 @@ public enum BannerPositionEnum implements IntArrayValuable { DISCOUNT_POSITION(4, "限时折扣页"), REWARD_POSITION(5, "满减送页"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BannerPositionEnum::getPosition).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BannerPositionEnum::getPosition).toArray(Integer[]::new); /** * 值 @@ -33,7 +33,7 @@ public enum BannerPositionEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/bargain/BargainRecordStatusEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/bargain/BargainRecordStatusEnum.java index d5c22a7c57..85328d2311 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/bargain/BargainRecordStatusEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/bargain/BargainRecordStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.bargain; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,14 +13,14 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BargainRecordStatusEnum implements IntArrayValuable { +public enum BargainRecordStatusEnum implements ArrayValuable { IN_PROGRESS(1, "砍价中"), SUCCESS(2, "砍价成功"), FAILED(3, "砍价失败"), // 活动到期时,会自动将到期的砍价全部设置为过期 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BargainRecordStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BargainRecordStatusEnum::getStatus).toArray(Integer[]::new); /** * 值 @@ -32,7 +32,7 @@ public enum BargainRecordStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/combination/CombinationRecordStatusEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/combination/CombinationRecordStatusEnum.java index 627e139468..e11a2572a0 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/combination/CombinationRecordStatusEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/combination/CombinationRecordStatusEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.promotion.enums.combination; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,13 +14,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum CombinationRecordStatusEnum implements IntArrayValuable { +public enum CombinationRecordStatusEnum implements ArrayValuable { IN_PROGRESS(0, "进行中"), SUCCESS(1, "拼团成功"), FAILED(2, "拼团失败"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CombinationRecordStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CombinationRecordStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -32,7 +32,7 @@ public enum CombinationRecordStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionActivityStatusEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionActivityStatusEnum.java index e45e37bebe..1f2df82a47 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionActivityStatusEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionActivityStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,14 +14,14 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum PromotionActivityStatusEnum implements IntArrayValuable { +public enum PromotionActivityStatusEnum implements ArrayValuable { WAIT(10, "未开始"), RUN(20, "进行中"), END(30, "已结束"), CLOSE(40, "已关闭"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionActivityStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PromotionActivityStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -33,7 +33,7 @@ public enum PromotionActivityStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionConditionTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionConditionTypeEnum.java index 05e62e3990..9f23c1deee 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionConditionTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionConditionTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum PromotionConditionTypeEnum implements IntArrayValuable { +public enum PromotionConditionTypeEnum implements ArrayValuable { PRICE(10, "满 N 元"), COUNT(20, "满 N 件"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionConditionTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PromotionConditionTypeEnum::getType).toArray(Integer[]::new); /** * 类型值 @@ -30,7 +30,7 @@ public enum PromotionConditionTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionDiscountTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionDiscountTypeEnum.java index 7da6b4b08a..1209de3096 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionDiscountTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionDiscountTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum PromotionDiscountTypeEnum implements IntArrayValuable { +public enum PromotionDiscountTypeEnum implements ArrayValuable { PRICE(1, "满减"), // 具体金额 PERCENT(2, "折扣"), // 百分比 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionDiscountTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PromotionDiscountTypeEnum::getType).toArray(Integer[]::new); /** * 优惠类型 @@ -31,7 +31,7 @@ public enum PromotionDiscountTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionProductScopeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionProductScopeEnum.java index 4a95cb1fa8..716ac77fbb 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionProductScopeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionProductScopeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,13 +14,13 @@ import java.util.Objects; */ @Getter @AllArgsConstructor -public enum PromotionProductScopeEnum implements IntArrayValuable { +public enum PromotionProductScopeEnum implements ArrayValuable { ALL(1, "全部商品"), SPU(2, "指定商品"), CATEGORY(3, "指定品类"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionProductScopeEnum::getScope).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PromotionProductScopeEnum::getScope).toArray(Integer[]::new); /** * 范围值 @@ -32,7 +32,7 @@ public enum PromotionProductScopeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionTypeEnum.java index 4524c198d6..1501ed2315 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.common; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum PromotionTypeEnum implements IntArrayValuable { +public enum PromotionTypeEnum implements ArrayValuable { SECKILL_ACTIVITY(1, "秒杀活动"), BARGAIN_ACTIVITY(2, "砍价活动"), @@ -27,7 +27,7 @@ public enum PromotionTypeEnum implements IntArrayValuable { POINT(8, "积分") ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PromotionTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PromotionTypeEnum::getType).toArray(Integer[]::new); /** * 类型值 @@ -39,7 +39,7 @@ public enum PromotionTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java index bef4db225c..4121600cd5 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.coupon; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum CouponStatusEnum implements IntArrayValuable { +public enum CouponStatusEnum implements ArrayValuable { UNUSED(1, "未使用"), USED(2, "已使用"), EXPIRE(3, "已过期"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CouponStatusEnum::getStatus).toArray(Integer[]::new); /** * 值 @@ -31,7 +31,7 @@ public enum CouponStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTakeTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTakeTypeEnum.java index eff4137aca..ca3d370c26 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTakeTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTakeTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.coupon; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,14 +14,14 @@ import java.util.Objects; */ @AllArgsConstructor @Getter -public enum CouponTakeTypeEnum implements IntArrayValuable { +public enum CouponTakeTypeEnum implements ArrayValuable { USER(1, "直接领取"), // 用户可在首页、每日领劵直接领取 ADMIN(2, "指定发放"), // 后台指定会员赠送优惠劵 REGISTER(3, "新人券"), // 注册时自动领取 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponTakeTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CouponTakeTypeEnum::getType).toArray(Integer[]::new); /** * 值 @@ -33,7 +33,7 @@ public enum CouponTakeTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java index 391515de39..27c1bb9d97 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponTemplateValidityTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.coupon; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum CouponTemplateValidityTypeEnum implements IntArrayValuable { +public enum CouponTemplateValidityTypeEnum implements ArrayValuable { DATE(1, "固定日期"), TERM(2, "领取之后"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponTemplateValidityTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(CouponTemplateValidityTypeEnum::getType).toArray(Integer[]::new); /** * 值 @@ -31,7 +31,7 @@ public enum CouponTemplateValidityTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/diy/DiyPageEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/diy/DiyPageEnum.java index fa00adaad1..810585e7a8 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/diy/DiyPageEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/diy/DiyPageEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.diy; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum DiyPageEnum implements IntArrayValuable { +public enum DiyPageEnum implements ArrayValuable { INDEX(1, "首页"), MY(2, "我的"), ; - private static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DiyPageEnum::getPage).toArray(); + private static final Integer[] ARRAYS = Arrays.stream(values()).map(DiyPageEnum::getPage).toArray(Integer[]::new); /** * 页面编号 @@ -32,7 +32,7 @@ public enum DiyPageEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java index 4a058ab56f..94329d2cd1 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.promotion.enums.kefu; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum KeFuMessageContentTypeEnum implements IntArrayValuable { +public enum KeFuMessageContentTypeEnum implements ArrayValuable { TEXT(1, "文本消息"), IMAGE(2, "图片消息"), @@ -25,7 +25,7 @@ public enum KeFuMessageContentTypeEnum implements IntArrayValuable { PRODUCT(10, "商品消息"), ORDER(11, "订单消息"); - private static final int[] ARRAYS = Arrays.stream(values()).mapToInt(KeFuMessageContentTypeEnum::getType).toArray(); + private static final Integer[] ARRAYS = Arrays.stream(values()).map(KeFuMessageContentTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -38,7 +38,7 @@ public enum KeFuMessageContentTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-statistics-api/src/main/java/cn/iocoder/yudao/module/statistics/enums/TimeRangeTypeEnum.java b/yudao-module-mall/yudao-module-statistics-api/src/main/java/cn/iocoder/yudao/module/statistics/enums/TimeRangeTypeEnum.java index 5f3c8fe228..42b09fdcbc 100644 --- a/yudao-module-mall/yudao-module-statistics-api/src/main/java/cn/iocoder/yudao/module/statistics/enums/TimeRangeTypeEnum.java +++ b/yudao-module-mall/yudao-module-statistics-api/src/main/java/cn/iocoder/yudao/module/statistics/enums/TimeRangeTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.statistics.enums; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum TimeRangeTypeEnum implements IntArrayValuable { +public enum TimeRangeTypeEnum implements ArrayValuable { /** * 天 @@ -33,7 +33,7 @@ public enum TimeRangeTypeEnum implements IntArrayValuable { YEAR(365), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TimeRangeTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TimeRangeTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -41,7 +41,7 @@ public enum TimeRangeTypeEnum implements IntArrayValuable { private final Integer type; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleStatusEnum.java index 23c1b2efe0..b29df1c65e 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.aftersale; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -18,7 +18,7 @@ import static cn.hutool.core.util.ArrayUtil.firstMatch; */ @AllArgsConstructor @Getter -public enum AfterSaleStatusEnum implements IntArrayValuable { +public enum AfterSaleStatusEnum implements ArrayValuable { /** * 【申请售后】 @@ -54,7 +54,7 @@ public enum AfterSaleStatusEnum implements IntArrayValuable { SELLER_REFUSE(63,"卖家拒绝收货", "商家拒绝收货"), // 有赞的状态提示:商家拒绝收货,不同意退款 ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AfterSaleStatusEnum::getStatus).toArray(Integer[]::new); /** * 进行中的售后状态 @@ -84,7 +84,7 @@ public enum AfterSaleStatusEnum implements IntArrayValuable { private final String content; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleTypeEnum.java index dfb32f7bee..8e0ed752ce 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.aftersale; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum AfterSaleTypeEnum implements IntArrayValuable { +public enum AfterSaleTypeEnum implements ArrayValuable { IN_SALE(10, "售中退款"), // 交易完成前买家申请退款 AFTER_SALE(20, "售后退款"); // 交易完成后买家申请退款 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AfterSaleTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -30,7 +30,7 @@ public enum AfterSaleTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleWayEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleWayEnum.java index 1d608a1027..ca1a39bf70 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleWayEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleWayEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.aftersale; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum AfterSaleWayEnum implements IntArrayValuable { +public enum AfterSaleWayEnum implements ArrayValuable { REFUND(10, "仅退款"), RETURN_AND_REFUND(20, "退货退款"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleWayEnum::getWay).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(AfterSaleWayEnum::getWay).toArray(Integer[]::new); /** * 方式 @@ -30,7 +30,7 @@ public enum AfterSaleWayEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageBindModeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageBindModeEnum.java index 72ce100323..c8efa106c8 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageBindModeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageBindModeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageBindModeEnum implements IntArrayValuable { +public enum BrokerageBindModeEnum implements ArrayValuable { /** * 只要用户没有推广人,随时都可以绑定分销关系 @@ -29,7 +29,7 @@ public enum BrokerageBindModeEnum implements IntArrayValuable { OVERRIDE(3, "覆盖绑定"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageBindModeEnum::getMode).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageBindModeEnum::getMode).toArray(Integer[]::new); /** * 模式 @@ -41,7 +41,7 @@ public enum BrokerageBindModeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java index 990d10e160..cbb62d44b5 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageEnabledConditionEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageEnabledConditionEnum implements IntArrayValuable { +public enum BrokerageEnabledConditionEnum implements ArrayValuable { /** * 所有用户都可以分销 @@ -25,7 +25,7 @@ public enum BrokerageEnabledConditionEnum implements IntArrayValuable { ADMIN(2, "指定分销"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageEnabledConditionEnum::getCondition).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageEnabledConditionEnum::getCondition).toArray(Integer[]::new); /** * 模式 @@ -37,7 +37,7 @@ public enum BrokerageEnabledConditionEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java index 546069465a..cf7fbc290e 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordBizTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,14 +13,14 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageRecordBizTypeEnum implements IntArrayValuable { +public enum BrokerageRecordBizTypeEnum implements ArrayValuable { ORDER(1, "获得推广佣金", "获得推广佣金 {}", true), WITHDRAW(2, "提现申请", "提现申请扣除佣金 {}", false), WITHDRAW_REJECT(3, "提现申请驳回", "提现申请驳回,返还佣金 {}", true), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageRecordBizTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageRecordBizTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -40,7 +40,7 @@ public enum BrokerageRecordBizTypeEnum implements IntArrayValuable { private final boolean add; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java index 827390998e..9bfba4a72e 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageRecordStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,14 +13,14 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageRecordStatusEnum implements IntArrayValuable { +public enum BrokerageRecordStatusEnum implements ArrayValuable { WAIT_SETTLEMENT(0, "待结算"), SETTLEMENT(1, "已结算"), CANCEL(2, "已取消"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageRecordStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageRecordStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -32,7 +32,7 @@ public enum BrokerageRecordStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java index b68db4a718..fe574f73e5 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageWithdrawStatusEnum implements IntArrayValuable { +public enum BrokerageWithdrawStatusEnum implements ArrayValuable { AUDITING(0, "审核中"), AUDIT_SUCCESS(10, "审核通过"), @@ -23,7 +23,7 @@ public enum BrokerageWithdrawStatusEnum implements IntArrayValuable { WITHDRAW_FAIL(21, "提现失败"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageWithdrawStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageWithdrawStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态 @@ -35,7 +35,7 @@ public enum BrokerageWithdrawStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java index cf063516cb..b374566d39 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.brokerage; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum BrokerageWithdrawTypeEnum implements IntArrayValuable { +public enum BrokerageWithdrawTypeEnum implements ArrayValuable { WALLET(1, "钱包"), BANK(2, "银行卡"), @@ -22,7 +22,7 @@ public enum BrokerageWithdrawTypeEnum implements IntArrayValuable { WECHAT_API(5, "微信零钱"), // 自动打款,通过微信转账 API ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageWithdrawTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BrokerageWithdrawTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -34,7 +34,7 @@ public enum BrokerageWithdrawTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java index 7503dd322b..2794f06180 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryExpressChargeModeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.trade.enums.delivery; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,13 +14,13 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum DeliveryExpressChargeModeEnum implements IntArrayValuable { +public enum DeliveryExpressChargeModeEnum implements ArrayValuable { COUNT(1, "按件"), WEIGHT(2,"按重量"), VOLUME(3, "按体积"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryExpressChargeModeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(DeliveryExpressChargeModeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -32,7 +32,7 @@ public enum DeliveryExpressChargeModeEnum implements IntArrayValuable { private final String desc; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java index 27e11370cd..0aaf388bf9 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/delivery/DeliveryTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.delivery; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,12 +13,12 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum DeliveryTypeEnum implements IntArrayValuable { +public enum DeliveryTypeEnum implements ArrayValuable { EXPRESS(1, "快递发货"), PICK_UP(2, "用户自提"),; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(DeliveryTypeEnum::getType).toArray(Integer[]::new); /** * 配送方式 @@ -30,7 +30,7 @@ public enum DeliveryTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderCancelTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderCancelTypeEnum.java index cfd25468f5..b614f7865e 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderCancelTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderCancelTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.order; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,14 +13,14 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TradeOrderCancelTypeEnum implements IntArrayValuable { +public enum TradeOrderCancelTypeEnum implements ArrayValuable { PAY_TIMEOUT(10, "超时未支付"), AFTER_SALE_CLOSE(20, "退款关闭"), MEMBER_CANCEL(30, "买家取消"), COMBINATION_CLOSE(40, "拼团关闭"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderCancelTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TradeOrderCancelTypeEnum::getType).toArray(Integer[]::new); /** * 关闭类型 @@ -32,7 +32,7 @@ public enum TradeOrderCancelTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java index 50640717e2..f613981e63 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.trade.enums.order; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -14,13 +14,13 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TradeOrderItemAfterSaleStatusEnum implements IntArrayValuable { +public enum TradeOrderItemAfterSaleStatusEnum implements ArrayValuable { NONE(0, "未售后"), APPLY(10, "售后中"), SUCCESS(20, "售后成功"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderItemAfterSaleStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TradeOrderItemAfterSaleStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -32,7 +32,7 @@ public enum TradeOrderItemAfterSaleStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderRefundStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderRefundStatusEnum.java index d0e4190bba..20c93c3e38 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderRefundStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderRefundStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.trade.enums.order; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,13 +13,13 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TradeOrderRefundStatusEnum implements IntArrayValuable { +public enum TradeOrderRefundStatusEnum implements ArrayValuable { NONE(0, "未退款"), PART(10, "部分退款"), ALL(20, "全部退款"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderRefundStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TradeOrderRefundStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -31,7 +31,7 @@ public enum TradeOrderRefundStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java index 86d3d996f1..d1f90eb34b 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.trade.enums.order; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -15,7 +15,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TradeOrderStatusEnum implements IntArrayValuable { +public enum TradeOrderStatusEnum implements ArrayValuable { UNPAID(0, "待支付"), UNDELIVERED(10, "待发货"), @@ -23,7 +23,7 @@ public enum TradeOrderStatusEnum implements IntArrayValuable { COMPLETED(30, "已完成"), CANCELED(40, "已取消"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderStatusEnum::getStatus).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TradeOrderStatusEnum::getStatus).toArray(Integer[]::new); /** * 状态值 @@ -35,7 +35,7 @@ public enum TradeOrderStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderTypeEnum.java index 0fccebb471..94624560da 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.trade.enums.order; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @RequiredArgsConstructor @Getter -public enum TradeOrderTypeEnum implements IntArrayValuable { +public enum TradeOrderTypeEnum implements ArrayValuable { NORMAL(0, "普通订单"), SECKILL(1, "秒杀订单"), @@ -23,7 +23,7 @@ public enum TradeOrderTypeEnum implements IntArrayValuable { POINT(4, "积分商城"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(TradeOrderTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -35,7 +35,7 @@ public enum TradeOrderTypeEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java index ef491f42a7..794f230ddf 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.member.enums.point; import cn.hutool.core.util.EnumUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Objects; */ @AllArgsConstructor @Getter -public enum MemberPointBizTypeEnum implements IntArrayValuable { +public enum MemberPointBizTypeEnum implements ArrayValuable { SIGN(1, "签到", "签到获得 {} 积分", true), ADMIN(2, "管理员修改", "管理员修改 {} 积分", true), @@ -46,8 +46,8 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { private final boolean add; @Override - public int[] array() { - return new int[0]; + public Integer[] array() { + return new Integer[0]; } public static MemberPointBizTypeEnum getByType(Integer type) { diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java index 0d8bfe9e9e..d5c8b01aaa 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/order/PayOrderStatusEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.pay.enums.order; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Objects; */ @Getter @AllArgsConstructor -public enum PayOrderStatusEnum implements IntArrayValuable { +public enum PayOrderStatusEnum implements ArrayValuable { WAITING(0, "未支付"), SUCCESS(10, "支付成功"), @@ -26,8 +26,8 @@ public enum PayOrderStatusEnum implements IntArrayValuable { private final String name; @Override - public int[] array() { - return new int[0]; + public Integer[] array() { + return new Integer[0]; } /** diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/transfer/PayTransferTypeEnum.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/transfer/PayTransferTypeEnum.java index c881515897..66fa6f38f9 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/transfer/PayTransferTypeEnum.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/transfer/PayTransferTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.pay.enums.transfer; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum PayTransferTypeEnum implements IntArrayValuable { +public enum PayTransferTypeEnum implements ArrayValuable { ALIPAY_BALANCE(1, "支付宝余额"), WX_BALANCE(2, "微信余额"), @@ -30,10 +30,10 @@ public enum PayTransferTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PayTransferTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PayTransferTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java index 6682dc5d6b..30336da76e 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.pay.enums.wallet; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum PayWalletBizTypeEnum implements IntArrayValuable { +public enum PayWalletBizTypeEnum implements ArrayValuable { RECHARGE(1, "充值"), RECHARGE_REFUND(2, "充值退款"), @@ -31,10 +31,10 @@ public enum PayWalletBizTypeEnum implements IntArrayValuable { */ private final String description; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PayWalletBizTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PayWalletBizTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/transfer/PayTransferTypeEnum.java b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/transfer/PayTransferTypeEnum.java index a7580f0132..a2d9d44c6d 100644 --- a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/transfer/PayTransferTypeEnum.java +++ b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/enums/transfer/PayTransferTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.framework.pay.core.enums.transfer; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @AllArgsConstructor @Getter -public enum PayTransferTypeEnum implements IntArrayValuable { +public enum PayTransferTypeEnum implements ArrayValuable { ALIPAY_BALANCE(1, "支付宝余额"), WX_BALANCE(2, "微信余额"), @@ -30,10 +30,10 @@ public enum PayTransferTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(PayTransferTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(PayTransferTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/permission/DataScopeEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/permission/DataScopeEnum.java index 6b06b06d69..3440a17c31 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/permission/DataScopeEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/permission/DataScopeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.system.enums.permission; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,7 +15,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum DataScopeEnum implements IntArrayValuable { +public enum DataScopeEnum implements ArrayValuable { ALL(1), // 全部数据权限 @@ -30,10 +30,10 @@ public enum DataScopeEnum implements IntArrayValuable { */ private final Integer scope; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DataScopeEnum::getScope).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(DataScopeEnum::getScope).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java index 225685d1ba..0cfa8844bb 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.enums.sms; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum SmsSceneEnum implements IntArrayValuable { +public enum SmsSceneEnum implements ArrayValuable { MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"), MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"), @@ -23,7 +23,7 @@ public enum SmsSceneEnum implements IntArrayValuable { ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(SmsSceneEnum::getScene).toArray(Integer[]::new); /** * 验证场景的编号 @@ -39,7 +39,7 @@ public enum SmsSceneEnum implements IntArrayValuable { private final String description; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java index 602eb1e63a..e94b920b5a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/social/SocialTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.enums.social; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum SocialTypeEnum implements IntArrayValuable { +public enum SocialTypeEnum implements ArrayValuable { /** * Gitee @@ -55,7 +55,7 @@ public enum SocialTypeEnum implements IntArrayValuable { WECHAT_MINI_APP(34, "WECHAT_MINI_APP"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SocialTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(SocialTypeEnum::getType).toArray(Integer[]::new); /** * 类型 @@ -67,7 +67,7 @@ public enum SocialTypeEnum implements IntArrayValuable { private final String source; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } From 9d9351d066a856f11b9f580bc770b8fc5f95e618 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Jan 2025 19:59:18 +0800 Subject: [PATCH 084/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/{model => form}/BpmFormFieldVO.java | 16 ++- .../vo/instance/BpmProcessInstanceRespVO.java | 5 +- .../admin/task/vo/task/BpmTaskRespVO.java | 5 +- .../task/BpmProcessInstanceConvert.java | 1 - .../flowable/core/util/FlowableUtils.java | 103 +++++++++++------- 5 files changed, 82 insertions(+), 48 deletions(-) rename yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/{model => form}/BpmFormFieldVO.java (57%) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java similarity index 57% rename from yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java rename to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java index 25bea152c8..65fb305d3f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java @@ -1,14 +1,24 @@ -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import lombok.Data; +/** + * 流程表单字段 VO + */ @Data public class BpmFormFieldVO { + /** + * 字段类型 + */ private String type; - + /** + * 字段标识 + */ private String field; - + /** + * 字段标题 + */ private String title; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java index 7da75a9a7f..76dca606a2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java @@ -20,6 +20,9 @@ public class BpmProcessInstanceRespVO { @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String name; + @Schema(description = "流程摘要") + private List> summary; // 只有流程表单,才有摘要! + @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private String category; @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假") @@ -60,8 +63,6 @@ public class BpmProcessInstanceRespVO { */ private List tasks; // 仅在流程实例分页才返回 - private List> summary; - @Schema(description = "流程任务") @Data public static class Task { diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index 9bee198fda..f31c1bdcc9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -85,8 +85,9 @@ public class BpmTaskRespVO { @Schema(description = "是否填写审批意见", example = "false") private Boolean reasonRequire; - @Schema(description = "摘要", example = "[]") - private List> summary; + // TODO @lesan:要不放到 processInstance 里面?因为摘要是流程实例的,不是流程任务的 + @Schema(description = "流程摘要", example = "[]") + private List> summary; // 只有流程表单,才有摘要! @Data @Schema(description = "流程实例") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index acc337b01c..dfe23ce801 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 19be21e2ca..e80bba5029 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmFormFieldVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; @@ -193,6 +193,68 @@ public class FlowableUtils { BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES); } + // TODO @lesan:如果值是 null 的情况,可能要调研下飞书、钉钉,是不是不返回哈! + /** + * 获得流程实例的摘要 + * + * 仅有 {@link BpmModelFormTypeEnum#getType()} 表单,才有摘要。 + * 原因是,只有它才有表单项的配置,从而可以根据配置,展示摘要。 + * + * @param processDefinitionInfo 流程定义 + * @param processVariables 流程实例的 variables + * @return 摘要 + */ + public static List> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, + Map processVariables) { + // TODO @lesan:建议 if return,减少 { 层级 + if (ObjectUtil.isNotNull(processDefinitionInfo) + && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { + List> summaryList = new ArrayList<>(); + // TODO @lesan:可以使用 CollUtils.convertMap 简化工作量哈。 + Map formFieldsMap = new HashMap<>(); + processDefinitionInfo.getFormFields().forEach(formFieldStr -> { + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); + if (formField != null) { + formFieldsMap.put(formField.getField(), formField); + } + }); + + // TODO @lesan:这里也可以 if return,还是为了减少括号哈。这样,就可以写注释,情况一:;情况二: + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { + // TODO @lesan:这里,也可以通过 CollUtils.convertList 简化哈。 + for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { + BpmFormFieldVO formField = formFieldsMap.get(item); + if (formField != null) { + summaryList.add(new KeyValue<>(formField.getTitle(), + processVariables.getOrDefault(item, "").toString())); + } + } + } else { + // 默认展示前三个 + /* TODO @lesan:stream 简化 + * summaryList.addAll(formFieldsMap.entrySet().stream() + * .limit(3) + * .map(entry -> new KeyValue<>(entry.getValue().getTitle(), + * processVariables.getOrDefault(entry.getValue().getField(), "").toString())) + * .collect(Collectors.toList())); + */ + int j = 0; + for (Map.Entry entry : formFieldsMap.entrySet()) { + BpmFormFieldVO formField = entry.getValue(); + if (j > 2) { + break; + } + summaryList.add(new KeyValue<>(formField.getTitle(), + processVariables.getOrDefault(formField.getField(), "").toString())); + j++; + } + } + return summaryList; + } + return null; + } + // ========== Task 相关的工具方法 ========== /** @@ -279,43 +341,4 @@ public class FlowableUtils { return getExpressionValue(variableContainer, expressionString); } - public static List> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, - Map processVariables) { - if (ObjectUtil.isNotNull(processDefinitionInfo) - && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { - List> summaryList = new ArrayList<>(); - Map formFieldsMap = new HashMap<>(); - processDefinitionInfo.getFormFields().forEach(formFieldStr -> { - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); - if (formField != null) { - formFieldsMap.put(formField.getField(), formField); - } - }); - if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) - && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { - for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { - BpmFormFieldVO formField = formFieldsMap.get(item); - if (formField != null) { - summaryList.add(new KeyValue<>(formField.getTitle(), - processVariables.getOrDefault(item, "").toString())); - } - } - } else { - // 默认展示前三个 - int j = 0; - for (Map.Entry entry : formFieldsMap.entrySet()) { - BpmFormFieldVO formField = entry.getValue(); - if (j > 2) { - break; - } - summaryList.add(new KeyValue<>(formField.getTitle(), - processVariables.getOrDefault(formField.getField(), "").toString())); - j++; - } - } - return summaryList; - } - return null; - } - } From aab61f79631d1381cb2d4f40b68ea8282f077406 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Jan 2025 21:03:55 +0800 Subject: [PATCH 085/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=9B=B4=E5=A4=9A=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE-=E6=91=98=E8=A6=81=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/validation/InEnum.java | 4 ++-- .../validation/InEnumCollectionValidator.java | 4 ++-- .../common/validation/InEnumValidator.java | 4 ++-- .../AbstractSliderDesensitizationHandler.java | 3 ++- .../brokerage/BrokerageUserController.java | 4 ++-- .../controller/admin/auth/AuthController.java | 24 +++++-------------- .../admin/auth/vo/AuthResetPasswordReqVO.java | 3 ++- .../auth/vo/CaptchaVerificationReqVO.java | 3 ++- 8 files changed, 20 insertions(+), 29 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java index 407d01b0a1..d27a6431e8 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.framework.common.validation; import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import jakarta.validation.Constraint; -import jakarta.validation.Payload; +import javax.validation.Constraint; +import javax.validation.Payload; import java.lang.annotation.*; @Target({ diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java index b21a929486..b0551bd8f2 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.framework.common.validation; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.Collection; import java.util.Collections; diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java index e80eac4bdb..bd7e287846 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.framework.common.validation; import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java index 7b56329180..1e56d094b7 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.framework.desensitize.core.slider.handler; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; @@ -47,7 +48,7 @@ public abstract class AbstractSliderDesensitizationHandler * @return 构建后的替换符 */ private String buildReplacerByLength(String replacer, int length) { - return replacer.repeat(length); + return StrUtil.repeat(replacer, length); } /** diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java index c037c9fa00..9444d33d2a 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java @@ -18,12 +18,12 @@ import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRe import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.validation.Valid; import java.util.Map; import java.util.Set; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 1e7a99a322..488c3ca7c3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -7,14 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthPermissionInfoRespVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthResetPasswordReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; +import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; @@ -30,19 +23,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.annotation.security.PermitAll; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import java.util.Collections; import java.util.List; import java.util.Set; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java index 16337cc8c0..4338cf6c49 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java @@ -2,13 +2,14 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo; import cn.iocoder.yudao.framework.common.validation.Mobile; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.NotEmpty; + @Schema(description = "管理后台 - 短信重置账号密码 Request VO") @Data @NoArgsConstructor diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java index b080cb5af1..a50a028465 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/CaptchaVerificationReqVO.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.system.controller.admin.auth.vo; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; import lombok.Data; +import javax.validation.constraints.NotEmpty; + @Schema(description = "管理后台 - 验证码 Request VO") @Data public class CaptchaVerificationReqVO { From d63e3158762033f73efcbb4937f85e8303f9edbb Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Jan 2025 22:55:21 +0800 Subject: [PATCH 086/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91Bpm=EF=BC=9A=E8=B0=83=E6=95=B4=20IntArrayValu?= =?UTF-8?q?able=20=E5=88=B0=20ArrayValuable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/enums/definition/BpmAutoApproveTypeEnum.java | 8 ++++---- .../bpm/enums/definition/BpmDelayTimerTypeEnum.java | 8 ++++---- .../enums/definition/BpmHttpRequestParamTypeEnum.java | 8 ++++---- .../module/bpm/enums/definition/BpmTriggerTypeEnum.java | 9 +++++---- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java index f4f8ed99b9..f2f58c02e9 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,19 +13,19 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmAutoApproveTypeEnum implements IntArrayValuable { +public enum BpmAutoApproveTypeEnum implements ArrayValuable { NONE(0, "不自动通过"), APPROVE_ALL(1, "仅审批一次,后续重复的审批节点均自动通过"), APPROVE_SEQUENT(2, "仅针对连续审批的节点自动通过"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmAutoApproveTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmAutoApproveTypeEnum::getType).toArray(Integer[]::new); private final Integer type; private final String name; @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java index 9e3583167f..69f3c19bc8 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmDelayTimerTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmDelayTimerTypeEnum implements IntArrayValuable { +public enum BpmDelayTimerTypeEnum implements ArrayValuable { FIXED_TIME_DURATION(1, "固定时长"), FIXED_DATE_TIME(2, "固定日期"); @@ -21,10 +21,10 @@ public enum BpmDelayTimerTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmDelayTimerTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmDelayTimerTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java index 09987c1f92..e072ba51d4 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmHttpRequestParamTypeEnum.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.definition; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmHttpRequestParamTypeEnum implements IntArrayValuable { +public enum BpmHttpRequestParamTypeEnum implements ArrayValuable { FIXED_VALUE(1, "固定值"), FROM_FORM(2, "表单"); @@ -21,10 +21,10 @@ public enum BpmHttpRequestParamTypeEnum implements IntArrayValuable { private final Integer type; private final String name; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmHttpRequestParamTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmHttpRequestParamTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java index f8b3efb96e..66f34e6559 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.bpm.enums.definition; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,7 +14,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum BpmTriggerTypeEnum implements IntArrayValuable { +public enum BpmTriggerTypeEnum implements ArrayValuable { HTTP_REQUEST(1, "发起 HTTP 请求"); @@ -28,14 +28,15 @@ public enum BpmTriggerTypeEnum implements IntArrayValuable { */ private final String desc; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmTriggerTypeEnum::getType).toArray(); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmTriggerTypeEnum::getType).toArray(Integer[]::new); @Override - public int[] array() { + public Integer[] array() { return ARRAYS; } public static BpmTriggerTypeEnum typeOf(Integer type) { return ArrayUtil.firstMatch(item -> item.getType().equals(type), values()); } + } From 534c64709fc6c9d6053f1f898d62438877ab4bef Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Jan 2025 09:49:25 +0800 Subject: [PATCH 087/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E8=A7=A6=E5=8F=91=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/service/task/listener/BpmUserTaskListener.java | 1 + .../yudao/module/bpm/service/task/trigger/BpmTrigger.java | 1 + 2 files changed, 2 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index e89587d471..97c103c143 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -26,6 +26,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseListenerConfig; +// TODO @芋艿:可能会想换个包地址 /** * BPM 用户任务通用监听器 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java index 8ebd9735e9..dfbaa63ecb 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmTrigger.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; +// TODO @芋艿:可能会想换个包地址 /** * BPM 触发器接口 *

From 06634a426584d663a58c57b35c9aaffbd9757810 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Jan 2025 10:09:39 +0800 Subject: [PATCH 088/112] =?UTF-8?q?=E3=80=90=E5=8D=95=E6=B5=8B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91system=EF=BC=9AAdminAuthServiceImplTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/auth/AdminAuthServiceImpl.java | 2 ++ .../auth/AdminAuthServiceImplTest.java | 27 +++---------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index e81c75724c..4b09980235 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -30,6 +30,7 @@ import com.xingyuv.captcha.model.vo.CaptchaVO; import com.xingyuv.captcha.service.CaptchaService; import jakarta.annotation.Resource; import jakarta.validation.Validator; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -71,6 +72,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { * 验证码的开关,默认为 true */ @Value("${yudao.captcha.enable:true}") + @Setter // 为了单测:开启或者关闭验证码 private Boolean captchaEnable; @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java index 2f5f717e24..151150bc5a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java @@ -22,7 +22,6 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.xingyuv.captcha.model.common.ResponseModel; import com.xingyuv.captcha.service.CaptchaService; import jakarta.annotation.Resource; -import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.Validator; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +36,6 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; @@ -66,7 +64,7 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { @BeforeEach public void setUp() { - ReflectUtil.setFieldValue(authService, "captchaEnable", true); + authService.setCaptchaEnable(true); // 注入一个 Validator 对象 ReflectUtil.setFieldValue(authService, "validator", Validation.buildDefaultValidatorFactory().getValidator()); @@ -156,7 +154,7 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { .setSocialType(randomEle(SocialTypeEnum.values()).getType())); // mock 验证码正确 - ReflectUtil.setFieldValue(authService, "captchaEnable", false); + authService.setCaptchaEnable(false); // mock user 数据 AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(1L).setUsername("test_username") .setPassword("test_password").setStatus(CommonStatusEnum.ENABLE.getStatus())); @@ -269,8 +267,6 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { // 准备参数 AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); - // mock 验证码打开 - ReflectUtil.setFieldValue(authService, "captchaEnable", true); // mock 验证通过 when(captchaService.verification(argThat(captchaVO -> { assertEquals(reqVO.getCaptchaVerification(), captchaVO.getCaptchaVerification()); @@ -287,34 +283,17 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest { AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); // mock 验证码关闭 - ReflectUtil.setFieldValue(authService, "captchaEnable", false); + authService.setCaptchaEnable(false); // 调用,无需断言 authService.validateCaptcha(reqVO); } - @Test - public void testValidateCaptcha_constraintViolationException() { - // 准备参数 - AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); - reqVO.setCaptchaVerification(null); - - // mock 验证码打开 - ReflectUtil.setFieldValue(authService, "captchaEnable", true); - - // 调用,并断言异常 - assertThrows(ConstraintViolationException.class, () -> authService.validateCaptcha(reqVO), - "验证码不能为空"); - } - - @Test public void testCaptcha_fail() { // 准备参数 AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); - // mock 验证码打开 - ReflectUtil.setFieldValue(authService, "captchaEnable", true); // mock 验证通过 when(captchaService.verification(argThat(captchaVO -> { assertEquals(reqVO.getCaptchaVerification(), captchaVO.getCaptchaVerification()); From 38c24bddb692b526c5bc3add8320f7f7cf99dd69 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Jan 2025 10:13:41 +0800 Subject: [PATCH 089/112] =?UTF-8?q?=E3=80=90=E5=90=8C=E6=AD=A5=E3=80=91jdk?= =?UTF-8?q?21=20=E5=92=8C=20jdk8=20=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/definition/vo/model/BpmModelMetaInfoVO.java | 7 +++---- .../yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java | 2 +- .../flowable/core/listener/BpmTriggerTaskDelegate.java | 4 ++-- .../module/bpm/service/definition/BpmModelServiceImpl.java | 4 ++-- .../service/definition/BpmProcessListenerServiceImpl.java | 3 ++- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 4 ++-- .../bpm/service/task/listener/BpmUserTaskListener.java | 2 +- .../bpm/service/task/trigger/BpmHttpRequestTrigger.java | 2 +- .../module/system/service/auth/AdminAuthServiceImpl.java | 4 ++-- .../system/service/auth/AdminAuthServiceImplTest.java | 7 ++++--- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index 7bdc963c8a..cad08445c9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -1,17 +1,16 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; -import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Data; import org.hibernate.validator.constraints.URL; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java index 53a76322fe..be5dba693d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.bpm.dal.redis; import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; -import jakarta.annotation.Resource; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; +import javax.annotation.Resource; import java.time.Duration; import java.time.LocalDateTime; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java index 1ee347dfa1..fd74ef559a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTriggerTaskDelegate.java @@ -3,14 +3,14 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.listener; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.service.task.trigger.BpmTrigger; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.FlowElement; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import javax.annotation.Resource; import java.util.EnumMap; import java.util.List; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 603ddd7ca4..469fcc8902 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -20,8 +20,6 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.StartEvent; @@ -41,6 +39,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java index 1eb3f820da..44b9dce2d7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessListenerServiceImpl.java @@ -9,12 +9,13 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessListenerD import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessListenerMapper; import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerValueTypeEnum; -import jakarta.annotation.Resource; import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.delegate.TaskListener; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 517bdf79c0..9fe53d0399 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -41,8 +41,6 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.constants.BpmnXMLConstants; import org.flowable.bpmn.model.*; @@ -60,6 +58,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import javax.annotation.Resource; +import javax.validation.Valid; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 97c103c143..565808b238 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -4,7 +4,6 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.TaskListener; @@ -21,6 +20,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 9b42d0d4d9..e3c388f888 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.B import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.http.HttpEntity; @@ -17,6 +16,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 4b09980235..3fa0288c9b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -28,14 +28,14 @@ import com.google.common.annotations.VisibleForTesting; import com.xingyuv.captcha.model.common.ResponseModel; import com.xingyuv.captcha.model.vo.CaptchaVO; import com.xingyuv.captcha.service.CaptchaService; -import jakarta.annotation.Resource; -import jakarta.validation.Validator; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.validation.Validator; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java index 151150bc5a..e0865218d3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java @@ -21,14 +21,15 @@ import cn.iocoder.yudao.module.system.service.social.SocialUserService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.xingyuv.captcha.model.common.ResponseModel; import com.xingyuv.captcha.service.CaptchaService; -import jakarta.annotation.Resource; -import jakarta.validation.Validation; -import jakarta.validation.Validator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import javax.annotation.Resource; +import javax.validation.Validation; +import javax.validation.Validator; + import static cn.hutool.core.util.RandomUtil.randomEle; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; From f60a4dfa6b241c0526abaf1c38770666d4572425 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sat, 25 Jan 2025 10:24:34 +0800 Subject: [PATCH 090/112] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0Task=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E7=90=86=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java | 1 + .../module/bpm/service/definition/BpmModelServiceImpl.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java index 5ea8c41871..d41c0c3133 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java @@ -32,6 +32,7 @@ public enum BpmReasonEnum { ASSIGN_EMPTY_REJECT("审批人为空,自动不通过"), APPROVE_TYPE_AUTO_APPROVE("非人工审核,自动通过"), APPROVE_TYPE_AUTO_REJECT("非人工审核,自动不通过"), + CANCEL_BY_PROCESS_CLEAN("进程清理自动取消"), ; private final String reason; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 603ddd7ca4..23bff80df7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -288,8 +288,7 @@ public class BpmModelServiceImpl implements BpmModelService { // 2.3 清理所有 Task List tasks = taskService.createTaskQuery() .processDefinitionKey(model.getKey()).list(); - // TODO @lesan:貌似传递一个 reason 会好点! - tasks.forEach(task -> taskService.deleteTask(task.getId())); + tasks.forEach(task -> taskService.deleteTask(task.getId(),BpmReasonEnum.CANCEL_BY_PROCESS_CLEAN.getReason())); } @Override From 0ef8467546ed18c60d13833fc431dd55e3e7ceda Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sat, 25 Jan 2025 10:26:41 +0800 Subject: [PATCH 091/112] =?UTF-8?q?feat:=20=E6=91=98=E8=A6=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/task/vo/task/BpmTaskRespVO.java | 7 +- .../bpm/convert/task/BpmTaskConvert.java | 4 +- .../flowable/core/util/FlowableUtils.java | 85 ++++++++----------- 3 files changed, 41 insertions(+), 55 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index f31c1bdcc9..83812ee1ab 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -85,10 +85,6 @@ public class BpmTaskRespVO { @Schema(description = "是否填写审批意见", example = "false") private Boolean reasonRequire; - // TODO @lesan:要不放到 processInstance 里面?因为摘要是流程实例的,不是流程任务的 - @Schema(description = "流程摘要", example = "[]") - private List> summary; // 只有流程表单,才有摘要! - @Data @Schema(description = "流程实例") public static class ProcessInstance { @@ -105,6 +101,9 @@ public class BpmTaskRespVO { @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") private String processDefinitionId; + @Schema(description = "流程摘要", example = "[]") + private List> summary; // 只有流程表单,才有摘要! + /** * 发起人的用户信息 */ diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java index ac6b91bbd7..2fce9ef0dc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java @@ -54,7 +54,7 @@ public interface BpmTaskConvert { AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); // 摘要 - taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), processInstance.getProcessVariables())); }); } @@ -80,7 +80,7 @@ public interface BpmTaskConvert { taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); // 摘要 - taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), processInstance.getProcessVariables())); } return taskVO; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index e80bba5029..305380158c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -27,6 +27,8 @@ import org.flowable.task.api.TaskInfo; import java.util.*; import java.util.concurrent.Callable; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + /** * Flowable 相关的工具方法 * @@ -193,7 +195,6 @@ public class FlowableUtils { BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES); } - // TODO @lesan:如果值是 null 的情况,可能要调研下飞书、钉钉,是不是不返回哈! /** * 获得流程实例的摘要 * @@ -206,53 +207,39 @@ public class FlowableUtils { */ public static List> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables) { - // TODO @lesan:建议 if return,减少 { 层级 - if (ObjectUtil.isNotNull(processDefinitionInfo) - && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { - List> summaryList = new ArrayList<>(); - // TODO @lesan:可以使用 CollUtils.convertMap 简化工作量哈。 - Map formFieldsMap = new HashMap<>(); - processDefinitionInfo.getFormFields().forEach(formFieldStr -> { - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); - if (formField != null) { - formFieldsMap.put(formField.getField(), formField); - } - }); - - // TODO @lesan:这里也可以 if return,还是为了减少括号哈。这样,就可以写注释,情况一:;情况二: - if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) - && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { - // TODO @lesan:这里,也可以通过 CollUtils.convertList 简化哈。 - for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { - BpmFormFieldVO formField = formFieldsMap.get(item); - if (formField != null) { - summaryList.add(new KeyValue<>(formField.getTitle(), - processVariables.getOrDefault(item, "").toString())); - } - } - } else { - // 默认展示前三个 - /* TODO @lesan:stream 简化 - * summaryList.addAll(formFieldsMap.entrySet().stream() - * .limit(3) - * .map(entry -> new KeyValue<>(entry.getValue().getTitle(), - * processVariables.getOrDefault(entry.getValue().getField(), "").toString())) - * .collect(Collectors.toList())); - */ - int j = 0; - for (Map.Entry entry : formFieldsMap.entrySet()) { - BpmFormFieldVO formField = entry.getValue(); - if (j > 2) { - break; - } - summaryList.add(new KeyValue<>(formField.getTitle(), - processVariables.getOrDefault(formField.getField(), "").toString())); - j++; - } - } - return summaryList; + // 只有流程表单才会显示摘要! + if (ObjectUtil.isNull(processDefinitionInfo) + || !BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { + return null; } - return null; + List> summaryList; + Map formFieldsMap = new HashMap<>(); + processDefinitionInfo.getFormFields().forEach(formFieldStr -> { + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); + if (formField != null) { + formFieldsMap.put(formField.getField(), formField); + } + }); + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { + // 情况一:当自定义了摘要 + summaryList = convertList(processDefinitionInfo.getSummarySetting().getSummary(), item -> { + BpmFormFieldVO formField = formFieldsMap.get(item); + if (formField != null) { + return new KeyValue(formField.getTitle(), + processVariables.getOrDefault(item, "").toString()); + } + return null; + }); + } else { + // 情况二:默认摘要展示前三个表单字段 + summaryList = new ArrayList<>(formFieldsMap.entrySet().stream() + .limit(3) + .map(entry -> new KeyValue<>(entry.getValue().getTitle(), + processVariables.getOrDefault(entry.getValue().getField(), "").toString())) + .toList()); + } + return summaryList; } // ========== Task 相关的工具方法 ========== @@ -317,9 +304,9 @@ public class FlowableUtils { private static Object getExpressionValue(VariableContainer variableContainer, String expressionString, ProcessEngineConfigurationImpl processEngineConfiguration) { - assert processEngineConfiguration!= null; + assert processEngineConfiguration != null; ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager(); - assert expressionManager!= null; + assert expressionManager != null; Expression expression = expressionManager.createExpression(expressionString); return expression.getValue(variableContainer); } From f409a67d2f74f4e351af7d11682c1b3ee09708a9 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sat, 25 Jan 2025 10:41:27 +0800 Subject: [PATCH 092/112] =?UTF-8?q?feat:=20=E6=8A=84=E9=80=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=91=98=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceCopyController.java | 14 +++++++++++++- .../task/vo/cc/BpmProcessInstanceCopyRespVO.java | 5 +++++ .../dataobject/task/BpmProcessInstanceCopyDO.java | 6 ++++++ .../task/BpmProcessInstanceCopyServiceImpl.java | 3 ++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java index e8e2f9c71a..89bba8ecc3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java @@ -9,7 +9,10 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -42,6 +45,8 @@ public class BpmProcessInstanceCopyController { private BpmProcessInstanceCopyService processInstanceCopyService; @Resource private BpmProcessInstanceService processInstanceService; + @Resource + private BpmProcessDefinitionService processDefinitionService; @Resource private AdminUserApi adminUserApi; @@ -62,6 +67,8 @@ public class BpmProcessInstanceCopyController { convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId)); Map userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(), copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator())))); + Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap( + convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessDefinitionId)); return success(convertPage(pageResult, copy -> { BpmProcessInstanceCopyRespVO copyVO = BeanUtils.toBean(copy, BpmProcessInstanceCopyRespVO.class); MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), @@ -69,7 +76,12 @@ public class BpmProcessInstanceCopyController { MapUtils.findAndThen(userMap, copy.getStartUserId(), user -> copyVO.setCreateUser(BeanUtils.toBean(user, UserSimpleBaseVO.class))); MapUtils.findAndThen(processInstanceMap, copyVO.getProcessInstanceId(), - processInstance -> copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime()))); + processInstance -> { + copyVO.setSummary(FlowableUtils.getSummary( + processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()), + processInstance.getProcessVariables())); + copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime())); + }); return copyVO; })); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java index b087c3a441..a7e194b168 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO") @Data @@ -40,4 +42,7 @@ public class BpmProcessInstanceCopyRespVO { @Schema(description = "抄送时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "流程摘要", example = "[]") + private List> summary; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java index 96939f83d2..07f2df6417 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java @@ -49,6 +49,12 @@ public class BpmProcessInstanceCopyDO extends BaseDO { * 关联 ProcessInstance 的 id 属性 */ private String processInstanceId; + /** + * 流程实例的流程定义编号 + * + * 关联 ProcessInstance 的 processDefinitionId 属性 + */ + private String processDefinitionId; /** * 流程分类 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java index 1f90888c48..ed89cfe9db 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java @@ -77,7 +77,8 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy .setUserId(userId).setReason(reason).setStartUserId(Long.valueOf(processInstance.getStartUserId())) .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName()) .setCategory(processDefinition.getCategory()).setTaskId(taskId) - .setActivityId(activityId).setActivityName(activityName)); + .setActivityId(activityId).setActivityName(activityName) + .setProcessDefinitionId(processInstance.getProcessDefinitionId())); processInstanceCopyMapper.insertBatch(copyList); } From 69efe91bdeb40ba5cee68fab57b850637fd06ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=B1=E9=87=8E=E7=BE=A1=E6=B0=91?= Date: Sat, 25 Jan 2025 02:47:03 +0000 Subject: [PATCH 093/112] =?UTF-8?q?=E9=9B=AA=E8=8A=B1ID=E6=BA=A2=E5=87=BA?= =?UTF-8?q?=E4=BA=86=20update=20=20apierrorlog/ApiErrorLogRespVO.java.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 山野羡民 --- .../admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java index 53f52f02c5..8029f1584e 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java @@ -17,7 +17,7 @@ public class ApiErrorLogRespVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @ExcelProperty("编号") - private Integer id; + private Long id; @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "66600cb6-7852-11eb-9439-0242ac130002") @ExcelProperty("链路追踪编号") @@ -25,7 +25,7 @@ public class ApiErrorLogRespVO { @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") @ExcelProperty("用户编号") - private Integer userId; + private Long userId; @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "用户类型", converter = DictConvert.class) From 3342ae1be87ac1cc54f21f206219e61431e49591 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sat, 25 Jan 2025 13:27:37 +0800 Subject: [PATCH 094/112] =?UTF-8?q?feat:=20BPM-=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceController.java | 19 ++++++++ .../task/BpmProcessInstanceConvert.java | 45 +++++++++++++++++-- .../task/BpmProcessInstanceService.java | 2 + .../task/BpmProcessInstanceServiceImpl.java | 37 +++++++++++++++ 4 files changed, 99 insertions(+), 4 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index 3a847ce4e8..dbc0179771 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -109,6 +109,25 @@ public class BpmProcessInstanceController { processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); } + @GetMapping("/report-page") + @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表") + public CommonResult getProcessInstanceReportPage( + @Valid BpmProcessInstanceReportPageReqVO pageReqVO) { + PageResult pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal()))); + } + + // 拼接返回 + Map userMap = adminUserApi.getUserMap( + convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( + pageReqVO.getProcessDefinitionId() + ); + return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult, + userMap, processDefinitionInfo)); + } + @PostMapping("/create") @Operation(summary = "新建流程实例") @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index dfe23ce801..2fa144614b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,16 +2,20 @@ package cn.iocoder.yudao.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceReportPageRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; @@ -35,10 +39,7 @@ import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; import org.mapstruct.factory.Mappers; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -84,6 +85,42 @@ public interface BpmProcessInstanceConvert { return vpPageResult; } + default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult pageResult, + Map userMap, + BpmProcessDefinitionInfoDO processDefinitionInfo) { + PageResult vpPageResult = BeanUtils.toBean(pageResult, + BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class); + // 表单列表 + List formFieldsList = new ArrayList<>(); + processDefinitionInfo.getFormFields().forEach(formFieldStr -> { + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); + if (formField != null) { + formFieldsList.add(formField); + } + }); + for (int i = 0; i < pageResult.getList().size(); i++) { + HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i); + BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i); + respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); + // user + if (userMap != null) { + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId())); + if (startUser != null) { + respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); + } + } + // 表单数据 + List> variables = new ArrayList<>(); + formFieldsList.forEach(formField -> { + variables.add(new KeyValue() + .setKey(formField.getField()) + .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), ""))); + }); + respVO.setVariables(variables); + } + return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList); + } + default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, ProcessDefinition processDefinition, BpmProcessDefinitionInfoDO processDefinitionInfo, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index d37886aa71..bcf18b4341 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -84,6 +84,8 @@ public interface BpmProcessInstanceService { PageResult getProcessInstancePage(Long userId, @Valid BpmProcessInstancePageReqVO pageReqVO); + PageResult getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO); + // TODO @芋艿:重点在 review 下 /** * 获取审批详情。 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index ca13a0af46..56c0b0a334 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -180,6 +180,43 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return new PageResult<>(processInstanceList, processInstanceCount); } + @Override + public PageResult getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) { + // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 + HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .includeProcessVariables() + .processInstanceTenantId(FlowableUtils.getTenantId()) + .orderByProcessInstanceStartTime().desc(); + if (pageReqVO.getStartUserId() != null) { + processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); + } + if (StrUtil.isNotEmpty(pageReqVO.getName())) { + processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); + } + if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { + processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); + } + if (pageReqVO.getStatus() != null) { + processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); + } + if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { + processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); + processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); + } + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); + } + // TODO 流程表单数据也要支持查询 + // 查询数量 + long processInstanceCount = processInstanceQuery.count(); + if (processInstanceCount == 0) { + return PageResult.empty(processInstanceCount); + } + // 查询列表 + List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); + return new PageResult<>(processInstanceList, processInstanceCount); + } private Map getFormFieldsPermission(BpmnModel bpmnModel, String activityId, String taskId) { From 86dc3763fc92637a4e1d31e42d16abbeaee507db Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Jan 2025 17:16:57 +0800 Subject: [PATCH 095/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=95=B0=E6=8D=AE=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceController.java | 37 +++++----- .../flowable/core/util/FlowableUtils.java | 24 +++--- .../task/BpmProcessInstanceService.java | 2 +- .../task/BpmProcessInstanceServiceImpl.java | 74 +++++++++---------- 4 files changed, 70 insertions(+), 67 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index dbc0179771..239e4a640b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -109,24 +109,25 @@ public class BpmProcessInstanceController { processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); } - @GetMapping("/report-page") - @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表") - public CommonResult getProcessInstanceReportPage( - @Valid BpmProcessInstanceReportPageReqVO pageReqVO) { - PageResult pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal()))); - } - - // 拼接返回 - Map userMap = adminUserApi.getUserMap( - convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( - pageReqVO.getProcessDefinitionId() - ); - return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult, - userMap, processDefinitionInfo)); - } + // TODO @lesan:貌似少提交了。ps:不确定和 getProcessInstanceManagerPage 接口的差异哈。 +// @GetMapping("/report-page") +// @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表") +// public CommonResult getProcessInstanceReportPage( +// @Valid BpmProcessInstanceReportPageReqVO pageReqVO) { +// PageResult pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO); +// if (CollUtil.isEmpty(pageResult.getList())) { +// return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal()))); +// } +// +// // 拼接返回 +// Map userMap = adminUserApi.getUserMap( +// convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); +// BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( +// pageReqVO.getProcessDefinitionId() +// ); +// return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult, +// userMap, processDefinitionInfo)); +// } @PostMapping("/create") @Operation(summary = "新建流程实例") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 305380158c..a458567d81 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -26,6 +26,7 @@ import org.flowable.task.api.TaskInfo; import java.util.*; import java.util.concurrent.Callable; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -212,7 +213,8 @@ public class FlowableUtils { || !BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { return null; } - List> summaryList; + + // 解析表单配置 Map formFieldsMap = new HashMap<>(); processDefinitionInfo.getFormFields().forEach(formFieldStr -> { BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); @@ -220,10 +222,11 @@ public class FlowableUtils { formFieldsMap.put(formField.getField(), formField); } }); + + // 情况一:当自定义了摘要 if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { - // 情况一:当自定义了摘要 - summaryList = convertList(processDefinitionInfo.getSummarySetting().getSummary(), item -> { + return convertList(processDefinitionInfo.getSummarySetting().getSummary(), item -> { BpmFormFieldVO formField = formFieldsMap.get(item); if (formField != null) { return new KeyValue(formField.getTitle(), @@ -231,15 +234,14 @@ public class FlowableUtils { } return null; }); - } else { - // 情况二:默认摘要展示前三个表单字段 - summaryList = new ArrayList<>(formFieldsMap.entrySet().stream() - .limit(3) - .map(entry -> new KeyValue<>(entry.getValue().getTitle(), - processVariables.getOrDefault(entry.getValue().getField(), "").toString())) - .toList()); } - return summaryList; + + // 情况二:默认摘要展示前三个表单字段 + return formFieldsMap.entrySet().stream() + .limit(3) + .map(entry -> new KeyValue<>(entry.getValue().getTitle(), + processVariables.getOrDefault(entry.getValue().getField(), "").toString())) + .collect(Collectors.toList()); } // ========== Task 相关的工具方法 ========== diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index bcf18b4341..860959dacd 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -84,7 +84,7 @@ public interface BpmProcessInstanceService { PageResult getProcessInstancePage(Long userId, @Valid BpmProcessInstancePageReqVO pageReqVO); - PageResult getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO); +// PageResult getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO); // TODO @芋艿:重点在 review 下 /** diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 56c0b0a334..4dd39ce191 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -180,43 +180,43 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return new PageResult<>(processInstanceList, processInstanceCount); } - @Override - public PageResult getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) { - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 - HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() - .includeProcessVariables() - .processInstanceTenantId(FlowableUtils.getTenantId()) - .orderByProcessInstanceStartTime().desc(); - if (pageReqVO.getStartUserId() != null) { - processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); - } - if (StrUtil.isNotEmpty(pageReqVO.getName())) { - processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); - } - if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { - processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); - } - if (pageReqVO.getStatus() != null) { - processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { - processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); - processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { - processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); - processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); - } - // TODO 流程表单数据也要支持查询 - // 查询数量 - long processInstanceCount = processInstanceQuery.count(); - if (processInstanceCount == 0) { - return PageResult.empty(processInstanceCount); - } - // 查询列表 - List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); - return new PageResult<>(processInstanceList, processInstanceCount); - } +// @Override +// public PageResult getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) { +// // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 +// HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() +// .includeProcessVariables() +// .processInstanceTenantId(FlowableUtils.getTenantId()) +// .orderByProcessInstanceStartTime().desc(); +// if (pageReqVO.getStartUserId() != null) { +// processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); +// } +// if (StrUtil.isNotEmpty(pageReqVO.getName())) { +// processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); +// } +// if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { +// processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); +// } +// if (pageReqVO.getStatus() != null) { +// processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); +// } +// if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { +// processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); +// processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); +// } +// if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { +// processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); +// processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); +// } +// // TODO 流程表单数据也要支持查询 +// // 查询数量 +// long processInstanceCount = processInstanceQuery.count(); +// if (processInstanceCount == 0) { +// return PageResult.empty(processInstanceCount); +// } +// // 查询列表 +// List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); +// return new PageResult<>(processInstanceList, processInstanceCount); +// } private Map getFormFieldsPermission(BpmnModel bpmnModel, String activityId, String taskId) { From 8f16786471495c2743bd6a1dcf9e13822a416c16 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Jan 2025 17:52:50 +0800 Subject: [PATCH 096/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91Bpm=EF=BC=9A=E8=8E=B7=E5=8F=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=97=E8=A1=A8=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E7=A7=9F=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceConvert.java | 79 +++++++++---------- .../definition/BpmModelServiceImpl.java | 1 + 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index 2fa144614b..cc837543f9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -2,20 +2,16 @@ package cn.iocoder.yudao.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceReportPageRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; @@ -39,7 +35,10 @@ import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; import org.mapstruct.factory.Mappers; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -85,41 +84,41 @@ public interface BpmProcessInstanceConvert { return vpPageResult; } - default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult pageResult, - Map userMap, - BpmProcessDefinitionInfoDO processDefinitionInfo) { - PageResult vpPageResult = BeanUtils.toBean(pageResult, - BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class); - // 表单列表 - List formFieldsList = new ArrayList<>(); - processDefinitionInfo.getFormFields().forEach(formFieldStr -> { - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); - if (formField != null) { - formFieldsList.add(formField); - } - }); - for (int i = 0; i < pageResult.getList().size(); i++) { - HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i); - BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i); - respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); - // user - if (userMap != null) { - AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId())); - if (startUser != null) { - respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); - } - } - // 表单数据 - List> variables = new ArrayList<>(); - formFieldsList.forEach(formField -> { - variables.add(new KeyValue() - .setKey(formField.getField()) - .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), ""))); - }); - respVO.setVariables(variables); - } - return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList); - } +// default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult pageResult, +// Map userMap, +// BpmProcessDefinitionInfoDO processDefinitionInfo) { +// PageResult vpPageResult = BeanUtils.toBean(pageResult, +// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class); +// // 表单列表 +// List formFieldsList = new ArrayList<>(); +// processDefinitionInfo.getFormFields().forEach(formFieldStr -> { +// BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); +// if (formField != null) { +// formFieldsList.add(formField); +// } +// }); +// for (int i = 0; i < pageResult.getList().size(); i++) { +// HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i); +// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i); +// respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); +// // user +// if (userMap != null) { +// AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId())); +// if (startUser != null) { +// respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); +// } +// } +// // 表单数据 +// List> variables = new ArrayList<>(); +// formFieldsList.forEach(formField -> { +// variables.add(new KeyValue() +// .setKey(formField.getField()) +// .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), ""))); +// }); +// respVO.setVariables(variables); +// } +// return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList); +// } default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, ProcessDefinition processDefinition, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java index 23bff80df7..9ccc2f2c92 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java @@ -86,6 +86,7 @@ public class BpmModelServiceImpl implements BpmModelService { if (StrUtil.isNotEmpty(name)) { modelQuery.modelNameLike("%" + name + "%"); } + modelQuery.modelTenantId(FlowableUtils.getTenantId()); return modelQuery.list(); } From 86f568280aa373a1f7bda6ab2e4acf7fa3d635b3 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sun, 26 Jan 2025 11:06:29 +0800 Subject: [PATCH 097/112] =?UTF-8?q?feat:=20BPM-=E6=95=B0=E6=8D=AE=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceController.java | 20 ------- .../instance/BpmProcessInstancePageReqVO.java | 8 +++ .../task/BpmProcessInstanceConvert.java | 38 +------------ .../task/BpmProcessInstanceService.java | 2 - .../task/BpmProcessInstanceServiceImpl.java | 53 ++++++------------- 5 files changed, 25 insertions(+), 96 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index 239e4a640b..3a847ce4e8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -109,26 +109,6 @@ public class BpmProcessInstanceController { processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); } - // TODO @lesan:貌似少提交了。ps:不确定和 getProcessInstanceManagerPage 接口的差异哈。 -// @GetMapping("/report-page") -// @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表") -// public CommonResult getProcessInstanceReportPage( -// @Valid BpmProcessInstanceReportPageReqVO pageReqVO) { -// PageResult pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO); -// if (CollUtil.isEmpty(pageResult.getList())) { -// return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal()))); -// } -// -// // 拼接返回 -// Map userMap = adminUserApi.getUserMap( -// convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); -// BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( -// pageReqVO.getProcessDefinitionId() -// ); -// return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult, -// userMap, processDefinitionInfo)); -// } - @PostMapping("/create") @Operation(summary = "新建流程实例") @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java index dbd314c099..c5859d6607 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java @@ -8,6 +8,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.Map; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -32,7 +33,14 @@ public class BpmProcessInstancePageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] endTime; + @Schema(description = "发起用户编号", example = "1024") private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 + @Schema(description = "动态表单字段查询JSON Str", example = "{}") + private String formFieldsParams; + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java index cc837543f9..6e798e77f2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -80,46 +80,12 @@ public interface BpmProcessInstanceConvert { // 摘要 respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(respVO.getProcessDefinitionId()), pageResult.getList().get(i).getProcessVariables())); + // 表单 + respVO.setFormVariables(pageResult.getList().get(i).getProcessVariables()); } return vpPageResult; } -// default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult pageResult, -// Map userMap, -// BpmProcessDefinitionInfoDO processDefinitionInfo) { -// PageResult vpPageResult = BeanUtils.toBean(pageResult, -// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class); -// // 表单列表 -// List formFieldsList = new ArrayList<>(); -// processDefinitionInfo.getFormFields().forEach(formFieldStr -> { -// BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); -// if (formField != null) { -// formFieldsList.add(formField); -// } -// }); -// for (int i = 0; i < pageResult.getList().size(); i++) { -// HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i); -// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i); -// respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); -// // user -// if (userMap != null) { -// AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId())); -// if (startUser != null) { -// respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); -// } -// } -// // 表单数据 -// List> variables = new ArrayList<>(); -// formFieldsList.forEach(formField -> { -// variables.add(new KeyValue() -// .setKey(formField.getField()) -// .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), ""))); -// }); -// respVO.setVariables(variables); -// } -// return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList); -// } - default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, ProcessDefinition processDefinition, BpmProcessDefinitionInfoDO processDefinitionInfo, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index 860959dacd..d37886aa71 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -84,8 +84,6 @@ public interface BpmProcessInstanceService { PageResult getProcessInstancePage(Long userId, @Valid BpmProcessInstancePageReqVO pageReqVO); -// PageResult getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO); - // TODO @芋艿:重点在 review 下 /** * 获取审批详情。 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 4dd39ce191..409ea0558c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -170,6 +171,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); } + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); + } + // 表单字段查询 + // TODO 应支持多种类型的查询方式,目前只有字符串全等 + if (StrUtil.isNotEmpty(pageReqVO.getFormFieldsParams())) { + JSONObject formFieldsParams = new JSONObject(pageReqVO.getFormFieldsParams()); + for (Map.Entry field : formFieldsParams.entrySet()) { + if (StrUtil.isNotEmpty(field.getValue().toString())) { + processInstanceQuery.variableValueEquals(field.getKey(), field.getValue()); + } + } + } // 查询数量 long processInstanceCount = processInstanceQuery.count(); if (processInstanceCount == 0) { @@ -180,44 +195,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return new PageResult<>(processInstanceList, processInstanceCount); } -// @Override -// public PageResult getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) { -// // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 -// HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() -// .includeProcessVariables() -// .processInstanceTenantId(FlowableUtils.getTenantId()) -// .orderByProcessInstanceStartTime().desc(); -// if (pageReqVO.getStartUserId() != null) { -// processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); -// } -// if (StrUtil.isNotEmpty(pageReqVO.getName())) { -// processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); -// } -// if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { -// processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); -// } -// if (pageReqVO.getStatus() != null) { -// processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); -// } -// if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { -// processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); -// processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); -// } -// if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { -// processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); -// processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); -// } -// // TODO 流程表单数据也要支持查询 -// // 查询数量 -// long processInstanceCount = processInstanceQuery.count(); -// if (processInstanceCount == 0) { -// return PageResult.empty(processInstanceCount); -// } -// // 查询列表 -// List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); -// return new PageResult<>(processInstanceList, processInstanceCount); -// } - private Map getFormFieldsPermission(BpmnModel bpmnModel, String activityId, String taskId) { // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id From 53789d9b8016e2b06a15aae2eeccf1240fbcad36 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 26 Jan 2025 13:00:20 +0800 Subject: [PATCH 098/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=91=20=E8=A7=A3=E6=9E=90=20Http=20=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E8=A7=A6=E5=8F=91=E5=99=A8=E8=BF=94=E5=9B=9E=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 9 ++++ .../task/BpmProcessInstanceService.java | 8 ++++ .../task/BpmProcessInstanceServiceImpl.java | 4 ++ .../task/trigger/BpmHttpRequestTrigger.java | 45 +++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index d3890adf1e..bbd1d2451b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.bpm.enums.definition.*; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; @@ -359,6 +360,14 @@ public class BpmSimpleModelNodeVO { @Schema(description = "请求头参数设置", example = "[]") @Valid private List body; + + /** + * 请求返回处理设置。 用于修改流程表单值 + * key: 表示要修改的流程表单字段 Id. + * value: 接口返回的字段名 + */ + @Schema(description = "请求返回处理设置", example = "[]") + private List> response; } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index d37886aa71..64265b3aa9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -157,4 +157,12 @@ public interface BpmProcessInstanceService { */ void processProcessInstanceCompleted(ProcessInstance instance); + /** + * 更新 ProcessInstance 的变量 + * + * @param processInstanceId 流程编号 + * @param variables 流程变量 + */ + void updateProcessInstanceVariables(String processInstanceId, Map variables); + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index ca13a0af46..f560aa2ee8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -743,4 +743,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService }); } + @Override + public void updateProcessInstanceVariables(String processInstanceId, Map variables) { + runtimeService.setVariables(processInstanceId, variables); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 9b42d0d4d9..9f2ac60a27 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; @@ -17,6 +22,8 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import java.util.HashMap; +import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; @@ -30,6 +37,8 @@ import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_ @Slf4j public class BpmHttpRequestTrigger implements BpmTrigger { + private static final String PARSE_RESPONSE_FIELD = "data"; + @Resource private BpmProcessInstanceService processInstanceService; @@ -67,9 +76,45 @@ public class BpmHttpRequestTrigger implements BpmTrigger { ResponseEntity responseEntity = restTemplate.exchange(setting.getUrl(), HttpMethod.POST, requestEntity, String.class); log.info("[execute][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity); + // 4. 处理请求返回 + if (CollUtil.isNotEmpty(setting.getResponse()) && responseEntity.getStatusCode().is2xxSuccessful() + && StrUtil.isNotEmpty(responseEntity.getBody())) { + // 4.1 获取需要更新的流程变量 + Map updateVariables = getNeedUpdatedVariablesFromResponse(responseEntity.getBody(), setting.getResponse()); + // 4.2 更新流程变量 + if (CollUtil.isNotEmpty(updateVariables)) { + processInstanceService.updateProcessInstanceVariables(processInstanceId, updateVariables); + } + } + } catch (RestClientException e) { log.error("[execute][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); } } + + /** + * 从请求返回值获取需要更新的流程变量。优先从 data 字段获取,如果 data 字段不存在,从根节点获取。 + * + * @param responseBody 请求返回报文体 + * @param responseSettings 返回设置 + * @return 需要更新的流程变量 + */ + private Map getNeedUpdatedVariablesFromResponse(String responseBody, + List> responseSettings) { + Map updateVariables = new HashMap<>(); + if (JSONUtil.isTypeJSONObject(responseBody)) { + JSONObject dataObj = null; + if (JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD) instanceof JSONObject) { + dataObj = (JSONObject) JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD); + } + JSONObject updateObj = dataObj == null ? JSONUtil.parseObj(responseBody) : dataObj; + responseSettings.forEach(respSetting -> { + if (StrUtil.isNotEmpty(respSetting.getKey()) && updateObj.containsKey(respSetting.getValue())) { + updateVariables.put(respSetting.getKey(), updateObj.get(respSetting.getValue())); + } + }); + } + return updateVariables; + } } From f8d6f1e2c44bd26189ab121258e800c9643e90d8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 26 Jan 2025 13:52:01 +0800 Subject: [PATCH 099/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E8=A7=A6=E5=8F=91=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 11 +++++++---- .../task/BpmProcessInstanceService.java | 4 ++-- .../task/BpmProcessInstanceServiceImpl.java | 5 +++-- .../task/trigger/BpmHttpRequestTrigger.java | 18 ++++++++++++------ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index bbd1d2451b..41d14bbb95 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -158,6 +158,7 @@ public class BpmSimpleModelNodeVO { @Schema(description = "值", example = "xxx") @NotEmpty(message = "值不能为空") private String value; + } @Schema(description = "审批节点拒绝处理策略") @@ -362,12 +363,14 @@ public class BpmSimpleModelNodeVO { private List body; /** - * 请求返回处理设置。 用于修改流程表单值 - * key: 表示要修改的流程表单字段 Id. - * value: 接口返回的字段名 + * 请求返回处理设置,用于修改流程表单值 + * + * key:表示要修改的流程表单字段名(name) + * value:接口返回的字段名 */ @Schema(description = "请求返回处理设置", example = "[]") - private List> response; + private List> response; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index 64265b3aa9..55b86a5514 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -160,9 +160,9 @@ public interface BpmProcessInstanceService { /** * 更新 ProcessInstance 的变量 * - * @param processInstanceId 流程编号 + * @param id 流程编号 * @param variables 流程变量 */ - void updateProcessInstanceVariables(String processInstanceId, Map variables); + void updateProcessInstanceVariables(String id, Map variables); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index b2e76aefa3..37be5c26d7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -758,7 +758,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } @Override - public void updateProcessInstanceVariables(String processInstanceId, Map variables) { - runtimeService.setVariables(processInstanceId, variables); + public void updateProcessInstanceVariables(String id, Map variables) { + runtimeService.setVariables(id, variables); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 9f2ac60a27..654af1aab8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -76,7 +76,10 @@ public class BpmHttpRequestTrigger implements BpmTrigger { ResponseEntity responseEntity = restTemplate.exchange(setting.getUrl(), HttpMethod.POST, requestEntity, String.class); log.info("[execute][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity); + + // TODO @jason:建议把请求和失败,放在两个 try catch 里处理。 // 4. 处理请求返回 + // TODO @jason:返回结果,要不统一用 CommonResult,符合这个规范。这样,就可以验证 code 为 0 了。必须符合这个规范~~ if (CollUtil.isNotEmpty(setting.getResponse()) && responseEntity.getStatusCode().is2xxSuccessful() && StrUtil.isNotEmpty(responseEntity.getBody())) { // 4.1 获取需要更新的流程变量 @@ -86,15 +89,15 @@ public class BpmHttpRequestTrigger implements BpmTrigger { processInstanceService.updateProcessInstanceVariables(processInstanceId, updateVariables); } } - } catch (RestClientException e) { log.error("[execute][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); } } - /** - * 从请求返回值获取需要更新的流程变量。优先从 data 字段获取,如果 data 字段不存在,从根节点获取。 + * 从请求返回值获取需要更新的流程变量 + * + * 优先从 data 字段获取,如果 data 字段不存在,从根节点获取 * * @param responseBody 请求返回报文体 * @param responseSettings 返回设置 @@ -103,18 +106,21 @@ public class BpmHttpRequestTrigger implements BpmTrigger { private Map getNeedUpdatedVariablesFromResponse(String responseBody, List> responseSettings) { Map updateVariables = new HashMap<>(); + // TODO @jason:这里 if return 更简洁一点; + // TODO @jason:JSONUtil => JsonUtils,尽量包一层 if (JSONUtil.isTypeJSONObject(responseBody)) { JSONObject dataObj = null; if (JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD) instanceof JSONObject) { dataObj = (JSONObject) JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD); } JSONObject updateObj = dataObj == null ? JSONUtil.parseObj(responseBody) : dataObj; - responseSettings.forEach(respSetting -> { - if (StrUtil.isNotEmpty(respSetting.getKey()) && updateObj.containsKey(respSetting.getValue())) { - updateVariables.put(respSetting.getKey(), updateObj.get(respSetting.getValue())); + responseSettings.forEach(responseSetting -> { + if (StrUtil.isNotEmpty(responseSetting.getKey()) && updateObj.containsKey(responseSetting.getValue())) { + updateVariables.put(responseSetting.getKey(), updateObj.get(responseSetting.getValue())); } }); } return updateVariables; } + } From f47f6d934ee23cc98c440cfb62246b9c4fa8802f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 26 Jan 2025 13:53:02 +0800 Subject: [PATCH 100/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91Bpm=EF=BC=9A=E6=95=B0=E6=8D=AE=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 1 + .../instance/BpmProcessInstancePageReqVO.java | 5 +- .../task/BpmProcessInstanceServiceImpl.java | 306 ++++++++++-------- 3 files changed, 180 insertions(+), 132 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index 41d14bbb95..b5a5ac11c6 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -362,6 +362,7 @@ public class BpmSimpleModelNodeVO { @Valid private List body; + // TODO @json:可能未来看情况,搞个 HttpResponseParam;得看看有没别的业务需要,抽象统一 /** * 请求返回处理设置,用于修改流程表单值 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java index c5859d6607..9d52294887 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java @@ -8,7 +8,6 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import java.util.Map; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -40,7 +39,7 @@ public class BpmProcessInstancePageReqVO extends PageParam { @Schema(description = "发起用户编号", example = "1024") private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 - @Schema(description = "动态表单字段查询JSON Str", example = "{}") - private String formFieldsParams; + @Schema(description = "动态表单字段查询 JSON Str", example = "{}") + private String formFieldsParams; // SpringMVC 在 get 请求下,无法方便的定义 Map 类型的参数,所以通过 String 接收后,逻辑里面转换 } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 37be5c26d7..ca50baef80 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -134,69 +133,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { - return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables().singleResult(); + return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables() + .singleResult(); } @Override public List getHistoricProcessInstances(Set ids) { - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list(); - } - - @Override - public PageResult getProcessInstancePage(Long userId, - BpmProcessInstancePageReqVO pageReqVO) { - // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 - HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() - .includeProcessVariables() - .processInstanceTenantId(FlowableUtils.getTenantId()) - .orderByProcessInstanceStartTime().desc(); - if (userId != null) { // 【我的流程】菜单时,需要传递该字段 - processInstanceQuery.startedBy(String.valueOf(userId)); - } else if (pageReqVO.getStartUserId() != null) { // 【管理流程】菜单时,才会传递该字段 - processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); - } - if (StrUtil.isNotEmpty(pageReqVO.getName())) { - processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); - } - if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { - processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); - } - if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { - processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); - } - if (pageReqVO.getStatus() != null) { - processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { - processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); - processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); - } - if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { - processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); - processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); - } - // 表单字段查询 - // TODO 应支持多种类型的查询方式,目前只有字符串全等 - if (StrUtil.isNotEmpty(pageReqVO.getFormFieldsParams())) { - JSONObject formFieldsParams = new JSONObject(pageReqVO.getFormFieldsParams()); - for (Map.Entry field : formFieldsParams.entrySet()) { - if (StrUtil.isNotEmpty(field.getValue().toString())) { - processInstanceQuery.variableValueEquals(field.getKey(), field.getValue()); - } - } - } - // 查询数量 - long processInstanceCount = processInstanceQuery.count(); - if (processInstanceCount == 0) { - return PageResult.empty(processInstanceCount); - } - // 查询列表 - List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); - return new PageResult<>(processInstanceList, processInstanceCount); + return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables() + .list(); } private Map getFormFieldsPermission(BpmnModel bpmnModel, - String activityId, String taskId) { + String activityId, String taskId) { // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id if (StrUtil.isEmpty(activityId) && StrUtil.isNotEmpty(taskId)) { activityId = Optional.ofNullable(taskService.getHistoricTask(taskId)) @@ -229,8 +177,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } // 1.3 读取其它相关数据 ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( - historicProcessInstance != null ? historicProcessInstance.getProcessDefinitionId() : reqVO.getProcessDefinitionId()); - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(processDefinition.getId()); + historicProcessInstance != null ? historicProcessInstance.getProcessDefinitionId() + : reqVO.getProcessDefinitionId()); + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService + .getProcessDefinitionInfo(processDefinition.getId()); BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); // 2.1 已结束 + 进行中的活动节点 @@ -239,24 +189,29 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService List activities = null; // 流程实例列表 if (reqVO.getProcessInstanceId() != null) { activities = taskService.getActivityListByProcessInstanceId(reqVO.getProcessInstanceId()); - List tasks = taskService.getTaskListByProcessInstanceId(reqVO.getProcessInstanceId(), true); + List tasks = taskService.getTaskListByProcessInstanceId(reqVO.getProcessInstanceId(), + true); endActivityNodes = getEndActivityNodeList(startUserId, bpmnModel, processDefinitionInfo, historicProcessInstance, processInstanceStatus, activities, tasks); - runActivityNodes = getRunApproveNodeList(startUserId, bpmnModel, processDefinition, processVariables, activities, tasks); + runActivityNodes = getRunApproveNodeList(startUserId, bpmnModel, processDefinition, processVariables, + activities, tasks); } // 2.2 流程已经结束,直接 return,无需预测 if (BpmProcessInstanceStatusEnum.isProcessEndStatus(processInstanceStatus)) { - return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, historicProcessInstance, + return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, + historicProcessInstance, processInstanceStatus, endActivityNodes, runActivityNodes, null, null); } // 3.1 计算当前登录用户的待办任务 - // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到 B,会不会表单权限不一致哈。 + // TODO @jason:有一个极端情况,如果一个用户有 2 个 task A 和 B,A 已经通过,B 需要审核。这个时,通过 A 进来,todo 拿到 + // B,会不会表单权限不一致哈。 BpmTaskRespVO todoTask = taskService.getFirstTodoTask(loginUserId, reqVO.getProcessInstanceId()); // 3.2 预测未运行节点的审批信息 - List simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, processDefinitionInfo, + List simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel, + processDefinitionInfo, processVariables, activities); // 4. 拼接最终数据 @@ -264,34 +219,93 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService processInstanceStatus, endActivityNodes, runActivityNodes, simulateActivityNodes, todoTask); } + @Override + @SuppressWarnings("unchecked") + public PageResult getProcessInstancePage(Long userId, + BpmProcessInstancePageReqVO pageReqVO) { + // 1. 构建查询条件 + HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .includeProcessVariables() + .processInstanceTenantId(FlowableUtils.getTenantId()) + .orderByProcessInstanceStartTime().desc(); + if (userId != null) { // 【我的流程】菜单时,需要传递该字段 + processInstanceQuery.startedBy(String.valueOf(userId)); + } else if (pageReqVO.getStartUserId() != null) { // 【管理流程】菜单时,才会传递该字段 + processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId())); + } + if (StrUtil.isNotEmpty(pageReqVO.getName())) { + processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); + } + if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) { + processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey()); + } + if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { + processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); + } + if (pageReqVO.getStatus() != null) { + processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, + pageReqVO.getStatus()); + } + if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { + processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); + processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); + } + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); + } + // 表单字段查询 + Map formFieldsParams = JsonUtils.parseObject(pageReqVO.getFormFieldsParams(), Map.class); + if (CollUtil.isNotEmpty(formFieldsParams)) { + formFieldsParams.forEach((key, value) -> { + if (StrUtil.isEmpty(String.valueOf(value))) { + return; + } + // TODO @lesan:应支持多种类型的查询方式,目前只有字符串全等 + processInstanceQuery.variableValueEquals(key, value); + }); + } + + // 2.1 查询数量 + long processInstanceCount = processInstanceQuery.count(); + if (processInstanceCount == 0) { + return PageResult.empty(processInstanceCount); + } + // 2.2 查询列表 + List processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), + pageReqVO.getPageSize()); + return new PageResult<>(processInstanceList, processInstanceCount); + } + /** * 拼接审批详情的最终数据 *

* 主要是,拼接审批人的用户信息、部门信息 */ private BpmApprovalDetailRespVO buildApprovalDetail(BpmApprovalDetailReqVO reqVO, - BpmnModel bpmnModel, - ProcessDefinition processDefinition, - BpmProcessDefinitionInfoDO processDefinitionInfo, - HistoricProcessInstance processInstance, - Integer processInstanceStatus, - List endApprovalNodeInfos, - List runningApprovalNodeInfos, - List simulateApprovalNodeInfos, - BpmTaskRespVO todoTask) { + BpmnModel bpmnModel, + ProcessDefinition processDefinition, + BpmProcessDefinitionInfoDO processDefinitionInfo, + HistoricProcessInstance processInstance, + Integer processInstanceStatus, + List endApprovalNodeInfos, + List runningApprovalNodeInfos, + List simulateApprovalNodeInfos, + BpmTaskRespVO todoTask) { // 1. 获取所有需要读取用户信息的 userIds - List approveNodes = newArrayList(asList(endApprovalNodeInfos, runningApprovalNodeInfos, simulateApprovalNodeInfos)); + List approveNodes = newArrayList( + asList(endApprovalNodeInfos, runningApprovalNodeInfos, simulateApprovalNodeInfos)); Set userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds(processInstance, approveNodes, todoTask); Map userMap = adminUserApi.getUserMap(userIds); Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); - // 2. 表单权限 String taskId = reqVO.getTaskId() == null && todoTask != null ? todoTask.getId() : reqVO.getTaskId(); Map formFieldsPermission = getFormFieldsPermission(bpmnModel, reqVO.getActivityId(), taskId); // 3. 拼接数据 - return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition, processDefinitionInfo, processInstance, + return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition, + processDefinitionInfo, processInstance, processInstanceStatus, approveNodes, todoTask, formFieldsPermission, userMap, deptMap); } @@ -299,17 +313,19 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService * 获得【已结束】的活动节点们 */ private List getEndActivityNodeList(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, - HistoricProcessInstance historicProcessInstance, Integer processInstanceStatus, - List activities, List tasks) { + BpmProcessDefinitionInfoDO processDefinitionInfo, + HistoricProcessInstance historicProcessInstance, Integer processInstanceStatus, + List activities, List tasks) { // 遍历 tasks 列表,只处理已结束的 UserTask - // 为什么不通过 activities 呢?因为,加签场景下,它只存在于 tasks,没有 activities,导致如果遍历 activities 的话,它无法成为一个节点 + // 为什么不通过 activities 呢?因为,加签场景下,它只存在于 tasks,没有 activities,导致如果遍历 activities + // 的话,它无法成为一个节点 List endTasks = filterList(tasks, task -> task.getEndTime() != null); List approvalNodes = convertList(endTasks, task -> { FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) - .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) ? - BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) + .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) + ? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() + : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) .setStatus(FlowableUtils.getTaskStatus(task)) .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) @@ -334,7 +350,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService .setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName()) .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()) .setStatus(startTask.getStatus()).setTasks(ListUtil.of(startTask)) - .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); + .setStartTime(DateUtils.of(activity.getStartTime())) + .setEndTime(DateUtils.of(activity.getEndTime())); approvalNodes.add(0, startNode); return; } @@ -347,7 +364,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService ActivityNode endNode = new ActivityNode().setId(activity.getId()) .setName(BpmSimpleModelNodeTypeEnum.END_NODE.getName()) .setNodeType(BpmSimpleModelNodeTypeEnum.END_NODE.getType()).setStatus(processInstanceStatus) - .setStartTime(DateUtils.of(activity.getStartTime())).setEndTime(DateUtils.of(activity.getEndTime())); + .setStartTime(DateUtils.of(activity.getStartTime())) + .setEndTime(DateUtils.of(activity.getEndTime())); String reason = FlowableUtils.getProcessInstanceReason(historicProcessInstance); if (StrUtil.isNotEmpty(reason)) { endNode.setTasks(singletonList(new ActivityNodeTask().setId(endNode.getId()) @@ -363,15 +381,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService * 获得【进行中】的活动节点们 */ private List getRunApproveNodeList(Long startUserId, - BpmnModel bpmnModel, - ProcessDefinition processDefinition, - Map processVariables, - List activities, - List tasks) { + BpmnModel bpmnModel, + ProcessDefinition processDefinition, + Map processVariables, + List activities, + List tasks) { // 构建运行中的任务,基于 activityId 分组 List runActivities = filterList(activities, activity -> activity.getEndTime() == null && (StrUtil.equalsAny(activity.getActivityType(), ELEMENT_TASK_USER))); - Map> runningTaskMap = convertMultiMap(runActivities, HistoricActivityInstance::getActivityId); + Map> runningTaskMap = convertMultiMap(runActivities, + HistoricActivityInstance::getActivityId); // 按照 activityId 分组,构建 ApprovalNodeInfo 节点 Map taskMap = convertMap(tasks, HistoricTaskInstance::getId); @@ -381,8 +400,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 构建活动节点 FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, activityId); HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 - ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()).setName(firstActivity.getActivityName()) - .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()).setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) + ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()) + .setName(firstActivity.getActivityName()) + .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) + .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) .setTasks(new ArrayList<>()); @@ -395,7 +416,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService taskService.getAllChildrenTaskListByParentTaskId(activity.getTaskId(), tasks), childTask -> childTask.getEndTime() == null); if (CollUtil.isNotEmpty(childrenTasks)) { - activityNode.getTasks().addAll(convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo)); + activityNode.getTasks().addAll( + convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo)); } } // 处理每个任务的 candidateUsers 属性:如果是依次审批,需要预测它的后续审批人。因为 Task 是审批完一个,创建一个新的 Task @@ -405,8 +427,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 截取当前审批人位置后面的候选人,不包含当前审批人 ActivityNodeTask approvalTaskInfo = CollUtil.getFirst(activityNode.getTasks()); Assert.notNull(approvalTaskInfo, "任务不能为空"); - int index = CollUtil.indexOf(candidateUserIds, userId -> ObjectUtils.equalsAny(userId, approvalTaskInfo.getOwner(), - approvalTaskInfo.getAssignee())); // 委派或者向前加签情况,需要先比较 owner + int index = CollUtil.indexOf(candidateUserIds, + userId -> ObjectUtils.equalsAny(userId, approvalTaskInfo.getOwner(), + approvalTaskInfo.getAssignee())); // 委派或者向前加签情况,需要先比较 owner activityNode.setCandidateUserIds(CollUtil.sub(candidateUserIds, index + 1, candidateUserIds.size())); } return activityNode; @@ -417,10 +440,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService * 获得【预测(未来)】的活动节点们 */ private List getSimulateApproveNodeList(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, - Map processVariables, - List activities) { - // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance 包括了历史的操作,不是只有 startEvent 到当前节点的记录 + BpmProcessDefinitionInfoDO processDefinitionInfo, + Map processVariables, + List activities) { + // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance + // 包括了历史的操作,不是只有 startEvent 到当前节点的记录 Set runActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId); // 情况一:BPMN 设计器 if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) { @@ -430,7 +454,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } // 情况二:SIMPLE 设计器 if (Objects.equals(BpmModelTypeEnum.SIMPLE.getType(), processDefinitionInfo.getModelType())) { - BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); + BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), + BpmSimpleModelNodeVO.class); List simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables); return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel, processDefinitionInfo, processVariables, simpleNode, runActivityIds)); @@ -439,9 +464,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } private ActivityNode buildNotRunApproveNodeForSimple(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, - BpmSimpleModelNodeVO node, Set runActivityIds) { - // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance 包括了历史的操作,不是只有 startEvent 到当前节点的记录 + BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, + BpmSimpleModelNodeVO node, Set runActivityIds) { + // TODO @芋艿:【可优化】在驳回场景下,未来的预测准确性不高。原因是,驳回后,HistoricActivityInstance + // 包括了历史的操作,不是只有 startEvent 到当前节点的记录 if (runActivityIds.contains(node.getId())) { return null; } @@ -474,12 +500,13 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, - BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, - FlowElement node, Set runActivityIds) { + BpmProcessDefinitionInfoDO processDefinitionInfo, Map processVariables, + FlowElement node, Set runActivityIds) { if (runActivityIds.contains(node.getId())) { return null; } - ActivityNode activityNode = new ActivityNode().setId(node.getId()).setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); + ActivityNode activityNode = new ActivityNode().setId(node.getId()) + .setStatus(BpmTaskStatusEnum.NOT_START.getStatus()); // 1. 开始节点 if (node instanceof StartEvent) { @@ -505,7 +532,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } private List getTaskCandidateUserList(BpmnModel bpmnModel, String activityId, - Long startUserId, String processDefinitionId, Map processVariables) { + Long startUserId, String processDefinitionId, Map processVariables) { Set userIds = taskCandidateInvoker.calculateUsersByActivity(bpmnModel, activityId, startUserId, processDefinitionId, processVariables); return new ArrayList<>(userIds); @@ -519,14 +546,16 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return null; } // 1.2 获得流程定义 - BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); + BpmnModel bpmnModel = processDefinitionService + .getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); if (bpmnModel == null) { return null; } BpmSimpleModelNodeVO simpleModel = null; BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( processInstance.getProcessDefinitionId()); - if (processDefinitionInfo != null && BpmModelTypeEnum.SIMPLE.getType().equals(processDefinitionInfo.getModelType())) { + if (processDefinitionInfo != null + && BpmModelTypeEnum.SIMPLE.getType().equals(processDefinitionInfo.getModelType())) { simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(), BpmSimpleModelNodeVO.class); } // 1.3 获得流程实例对应的活动实例列表 + 任务列表 @@ -538,10 +567,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService activityInstance -> activityInstance.getEndTime() == null); Set finishedTaskActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, activityInstance -> activityInstance.getEndTime() != null - && ObjectUtil.notEqual(activityInstance.getActivityType(), BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); + && ObjectUtil.notEqual(activityInstance.getActivityType(), + BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); Set finishedSequenceFlowActivityIds = convertSet(activities, HistoricActivityInstance::getActivityId, activityInstance -> activityInstance.getEndTime() != null - && ObjectUtil.equals(activityInstance.getActivityType(), BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); + && ObjectUtil.equals(activityInstance.getActivityType(), + BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW)); // 特殊:会签情况下,会有部分已完成(审批)、部分未完成(待审批),此时需要 finishedTaskActivityIds 移除掉 finishedTaskActivityIds.removeAll(unfinishedTaskActivityIds); // 特殊:如果流程实例被拒绝,则需要计算是哪个活动节点。 @@ -559,8 +590,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService Set userIds = BpmProcessInstanceConvert.INSTANCE.parseUserIds02(processInstance, tasks); Map userMap = adminUserApi.getUserMap(userIds); Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); - return BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceBpmnModelView(processInstance, tasks, bpmnModel, simpleModel, - unfinishedTaskActivityIds, finishedTaskActivityIds, finishedSequenceFlowActivityIds, rejectTaskActivityIds, + return BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceBpmnModelView(processInstance, tasks, bpmnModel, + simpleModel, + unfinishedTaskActivityIds, finishedTaskActivityIds, finishedSequenceFlowActivityIds, + rejectTaskActivityIds, userMap, deptMap); } @@ -570,7 +603,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 - ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); + ProcessDefinition definition = processDefinitionService + .getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, createReqVO.getStartUserSelectAssignees()); @@ -580,16 +614,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { return FlowableUtils.executeAuthenticatedUserId(userId, () -> { // 获得流程定义 - ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); + ProcessDefinition definition = processDefinitionService + .getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 - return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey(), + return createProcessInstance0(userId, definition, createReqDTO.getVariables(), + createReqDTO.getBusinessKey(), createReqDTO.getStartUserSelectAssignees()); }); } private String createProcessInstance0(Long userId, ProcessDefinition definition, - Map variables, String businessKey, - Map> startUserSelectAssignees) { + Map variables, String businessKey, + Map> startUserSelectAssignees) { // 1.1 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); @@ -597,7 +633,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(definition.getId()); + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService + .getProcessDefinitionInfo(definition.getId()); if (processDefinitionInfo == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } @@ -616,9 +653,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 设置流程变量,发起人 ID variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 BpmProcessInstanceStatusEnum.RUNNING.getStatus()); - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 true,不影响没配置 skipExpression 的节点 + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_SKIP_EXPRESSION_ENABLED, true); // 跳过表达式需要添加此变量为 + // true,不影响没配置 + // skipExpression 的节点 if (CollUtil.isNotEmpty(startUserSelectAssignees)) { - variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, startUserSelectAssignees); + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES, + startUserSelectAssignees); } // 3. 创建流程 @@ -648,7 +688,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService return instance.getId(); } - private void validateStartUserSelectAssignees(ProcessDefinition definition, Map> startUserSelectAssignees) { + private void validateStartUserSelectAssignees(ProcessDefinition definition, + Map> startUserSelectAssignees) { // 1. 获得发起人自选审批人的 UserTask/ServiceTask 列表 BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(definition.getId()); List tasks = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectTaskList(bpmnModel); @@ -683,7 +724,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 1.3 校验允许撤销审批中的申请 - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(instance.getProcessDefinitionId()); + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService + .getProcessDefinitionInfo(instance.getProcessDefinitionId()); Assert.notNull(processDefinitionInfo, "流程定义({})不存在", processDefinitionInfo); if (processDefinitionInfo.getAllowCancelRunningProcess() != null // 防止未配置 AllowCancelRunningProcess , 默认为可取消 && Boolean.FALSE.equals(processDefinitionInfo.getAllowCancelRunningProcess())) { @@ -721,9 +763,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public void updateProcessInstanceReject(ProcessInstance processInstance, String reason) { - runtimeService.setVariable(processInstance.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, + runtimeService.setVariable(processInstance.getProcessInstanceId(), + BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.REJECT.getStatus()); - runtimeService.setVariable(processInstance.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, + runtimeService.setVariable(processInstance.getProcessInstanceId(), + BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON, BpmReasonEnum.REJECT_TASK.format(reason)); } @@ -734,18 +778,22 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 注意:需要基于 instance 设置租户编号,避免 Flowable 内部异步时,丢失租户编号 FlowableUtils.execute(instance.getTenantId(), () -> { // 1.1 获取当前状态 - Integer status = (Integer) instance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); - String reason = (String) instance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); + Integer status = (Integer) instance.getProcessVariables() + .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); + String reason = (String) instance.getProcessVariables() + .get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON); // 1.2 当流程状态还是审批状态中,说明审批通过了,则变更下它的状态 // 为什么这么处理?因为流程完成,并且完成了,说明审批通过了 if (Objects.equals(status, BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { status = BpmProcessInstanceStatusEnum.APPROVE.getStatus(); - runtimeService.setVariable(instance.getId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, status); + runtimeService.setVariable(instance.getId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, + status); } // 2. 发送对应的消息通知 if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) { - messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); + messageService.sendMessageWhenProcessInstanceApprove( + BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); } else if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus())) { messageService.sendMessageWhenProcessInstanceReject( BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceRejectMessage(instance, reason)); From 44486afd957633f789f66bcd7cd612619dc10fb7 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 26 Jan 2025 15:36:14 +0800 Subject: [PATCH 101/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E4=BF=AE=E5=A4=8D=E3=80=91=20Http=20=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=99=A8=E8=BF=94=E5=9B=9E=E5=80=BC=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/util/json/JsonUtils.java | 7 ++ .../task/trigger/BpmHttpRequestTrigger.java | 67 +++++++++---------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java index 2cbe93ca83..3133e50090 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java @@ -199,4 +199,11 @@ public class JsonUtils { return JSONUtil.isTypeJSON(text); } + /** + * 判断字符串是否为 JSON 类型的字符串 + * @param str 字符串 + */ + public static boolean isJsonObject(String str) { + return JSONUtil.isTypeJSONObject(str); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 654af1aab8..17dadd2609 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -2,14 +2,14 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.HttpRequestTriggerSetting; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import com.fasterxml.jackson.core.type.TypeReference; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.runtime.ProcessInstance; @@ -37,8 +37,6 @@ import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_ @Slf4j public class BpmHttpRequestTrigger implements BpmTrigger { - private static final String PARSE_RESPONSE_FIELD = "data"; - @Resource private BpmProcessInstanceService processInstanceService; @@ -72,54 +70,53 @@ public class BpmHttpRequestTrigger implements BpmTrigger { // TODO @芋艿:要不要抽象一个 Http 请求的工具类,方便复用呢? // 3. 发起请求 HttpEntity> requestEntity = new HttpEntity<>(body, headers); + ResponseEntity responseEntity; try { - ResponseEntity responseEntity = restTemplate.exchange(setting.getUrl(), HttpMethod.POST, + responseEntity = restTemplate.exchange(setting.getUrl(), HttpMethod.POST, requestEntity, String.class); log.info("[execute][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity); - - // TODO @jason:建议把请求和失败,放在两个 try catch 里处理。 - // 4. 处理请求返回 - // TODO @jason:返回结果,要不统一用 CommonResult,符合这个规范。这样,就可以验证 code 为 0 了。必须符合这个规范~~ - if (CollUtil.isNotEmpty(setting.getResponse()) && responseEntity.getStatusCode().is2xxSuccessful() - && StrUtil.isNotEmpty(responseEntity.getBody())) { - // 4.1 获取需要更新的流程变量 - Map updateVariables = getNeedUpdatedVariablesFromResponse(responseEntity.getBody(), setting.getResponse()); - // 4.2 更新流程变量 - if (CollUtil.isNotEmpty(updateVariables)) { - processInstanceService.updateProcessInstanceVariables(processInstanceId, updateVariables); - } - } } catch (RestClientException e) { log.error("[execute][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage()); + return; + } + + // 4.1 判断是否需要解析返回值 + if (StrUtil.isEmpty(responseEntity.getBody()) || !responseEntity.getStatusCode().is2xxSuccessful() + || CollUtil.isEmpty(setting.getResponse())) { + return; + } + // 4.2 解析返回值, 返回值必须符合 CommonResult 规范。 + CommonResult> respResult = JsonUtils.parseObjectQuietly(responseEntity.getBody(), + new TypeReference<>() {}); + if (respResult == null || !respResult.isSuccess()){ + return; + } + // 4.3 获取需要更新的流程变量 + Map updateVariables = getNeedUpdatedVariablesFromResponse(respResult.getData(), setting.getResponse()); + // 4.4 更新流程变量 + if (CollUtil.isNotEmpty(updateVariables)) { + processInstanceService.updateProcessInstanceVariables(processInstanceId, updateVariables); } } /** * 从请求返回值获取需要更新的流程变量 * - * 优先从 data 字段获取,如果 data 字段不存在,从根节点获取 - * - * @param responseBody 请求返回报文体 + * @param result 请求返回结果 * @param responseSettings 返回设置 * @return 需要更新的流程变量 */ - private Map getNeedUpdatedVariablesFromResponse(String responseBody, + private Map getNeedUpdatedVariablesFromResponse(Map result, List> responseSettings) { Map updateVariables = new HashMap<>(); - // TODO @jason:这里 if return 更简洁一点; - // TODO @jason:JSONUtil => JsonUtils,尽量包一层 - if (JSONUtil.isTypeJSONObject(responseBody)) { - JSONObject dataObj = null; - if (JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD) instanceof JSONObject) { - dataObj = (JSONObject) JSONUtil.parseObj(responseBody).getObj(PARSE_RESPONSE_FIELD); - } - JSONObject updateObj = dataObj == null ? JSONUtil.parseObj(responseBody) : dataObj; - responseSettings.forEach(responseSetting -> { - if (StrUtil.isNotEmpty(responseSetting.getKey()) && updateObj.containsKey(responseSetting.getValue())) { - updateVariables.put(responseSetting.getKey(), updateObj.get(responseSetting.getValue())); - } - }); + if (CollUtil.isEmpty(result)) { + return updateVariables; } + responseSettings.forEach(responseSetting -> { + if (StrUtil.isNotEmpty(responseSetting.getKey()) && result.containsKey(responseSetting.getValue())) { + updateVariables.put(responseSetting.getKey(), result.get(responseSetting.getValue())); + } + }); return updateVariables; } From b4f93e832f2e1b16e163b8da010d1e36150bc192 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Mon, 27 Jan 2025 09:25:57 +0800 Subject: [PATCH 102/112] =?UTF-8?q?fix:=20=E6=97=A0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E4=B8=AD=E7=BC=80=E4=B8=8D=E8=AE=BE=E7=BD=AERedis=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java index 53a76322fe..57b6fe8676 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -29,6 +29,7 @@ public class BpmProcessIdRedisDAO { public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { // 生成日期前缀 String infix = ""; + boolean expireEnable = true; switch (processIdRule.getInfix()) { case "DAY": infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDD"); @@ -42,13 +43,18 @@ public class BpmProcessIdRedisDAO { case "SECOND": infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHHmmss"); break; + default: + expireEnable = false; + break; } // 生成序号 String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); String key = RedisKeyConstants.BPM_PROCESS_ID + noPrefix; Long no = stringRedisTemplate.opsForValue().increment(key); - stringRedisTemplate.expire(key, Duration.ofDays(1L)); + if (Boolean.TRUE.equals(expireEnable)) { + stringRedisTemplate.expire(key, Duration.ofDays(1L)); + } return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); } From ad94d16a75f2d04380b64de5f8366779f9e0f9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E4=B8=8A=E7=8C=AB=E7=9A=84=E5=B0=8F=E9=B1=BC?= =?UTF-8?q?=E5=84=BF?= <125358+jlynet_cn@user.noreply.gitee.com> Date: Tue, 28 Jan 2025 17:57:32 +0000 Subject: [PATCH 103/112] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=B2=A1=E6=9F=A5?= =?UTF-8?q?=E5=88=B0=E7=94=A8=E6=88=B7=E4=B9=9F=E6=9C=89=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=98=AF=E7=A9=BA=E7=BB=93=E6=9E=9C=E9=9B=86=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E5=AE=9A=E6=98=AFnull=20=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 爱上猫的小鱼儿 <125358+jlynet_cn@user.noreply.gitee.com> --- .../module/trade/service/order/TradeOrderQueryServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java index 314138ae92..71b221c79b 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java @@ -90,7 +90,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { public PageResult getOrderPage(TradeOrderPageReqVO reqVO) { // 根据用户查询条件构建用户编号列表 Set userIds = buildQueryConditionUserIds(reqVO); - if (userIds == null) { // 没查询到用户,说明肯定也没他的订单 + if (userIds == null || userIds.isEmpty()) { // 没查询到用户,说明肯定也没他的订单 return PageResult.empty(); } // 分页查询 From 4e43958fe3000b2cda46ff34b28fb010eadd806e Mon Sep 17 00:00:00 2001 From: mcwindy Date: Wed, 5 Feb 2025 11:42:59 +0800 Subject: [PATCH 104/112] fix typo: adminTenentId -> adminTenantId, appTenentId -> appTenantId --- script/idea/http-client.env.json | 6 ++--- .../admin/chat/AiChatMessageController.http | 4 ++-- .../permission/CrmPermissionController.http | 6 ++--- .../CrmStatisticsCustomerController.http | 24 +++++++++---------- .../CrmStatisticsRankController.http | 4 ++-- .../ErpSaleStatisticsController.http | 4 ++-- .../admin/file/FileConfigController.http | 6 ++--- .../controller/admin/job/JobController.http | 2 +- .../admin/redis/RedisController.http | 2 +- .../IotThinkModelFunctionController.http | 12 +++++----- .../admin/spu/ProductSpuController.http | 2 +- .../app/spu/AppProductSpuController.http | 8 +++---- .../app/activity/AppActivityController.http | 2 +- .../app/bargain/AppBargainHelpController.http | 2 +- .../bargain/AppBargainRecordController.http | 2 +- .../aftersale/TradeAfterSaleController.http | 10 ++++---- .../admin/order/TradeOrderController.http | 6 ++--- .../app/cart/AppCartController.http | 12 +++++----- .../app/order/AppTradeOrderController.http | 16 ++++++------- .../app/address/AppAddressController.http | 12 +++++----- .../app/auth/AppAuthController.http | 16 ++++++------- .../app/user/AppMemberUserController.http | 2 +- .../admin/material/MpMaterialController.http | 2 +- .../admin/menu/MpMenuController.http | 6 ++--- .../admin/message/MpAutoReplyController.http | 2 +- .../admin/message/MpMessageController.http | 6 ++--- .../admin/news/MpDraftController.http | 6 ++--- .../admin/news/MpFreePublishController.http | 4 ++-- .../controller/admin/tag/MpTagController.http | 10 ++++---- .../admin/user/MpUserController.http | 4 ++-- .../app/order/AppPayOrderController.http | 10 ++++---- .../controller/admin/auth/AuthController.http | 8 +++---- .../admin/dict/DictDataController.http | 2 +- .../controller/admin/ip/AreaController.http | 2 +- .../admin/logger/OperateLogController.http | 2 +- .../admin/mail/MailTemplateController.http | 2 +- .../admin/oauth2/OAuth2ClientController.http | 2 +- .../admin/oauth2/OAuth2OpenController.http | 16 ++++++------- .../admin/oauth2/OAuth2UserController.http | 4 ++-- .../admin/permission/MenuController.http | 2 +- .../admin/permission/RoleController.http | 10 ++++---- .../admin/sms/SmsTemplateController.http | 2 +- .../admin/socail/SocialClientController.http | 2 +- .../admin/tenant/TenantController.http | 2 +- .../controller/admin/user/UserController.http | 2 +- .../admin/user/UserProfileController.http | 2 +- 46 files changed, 135 insertions(+), 135 deletions(-) diff --git a/script/idea/http-client.env.json b/script/idea/http-client.env.json index 4a4cb5221e..e6e8a7cf86 100644 --- a/script/idea/http-client.env.json +++ b/script/idea/http-client.env.json @@ -2,16 +2,16 @@ "local": { "baseUrl": "http://127.0.0.1:48080/admin-api", "token": "test1", - "adminTenentId": "1", + "adminTenantId": "1", "appApi": "http://127.0.0.1:48080/app-api", "appToken": "test247", - "appTenentId": "1" + "appTenantId": "1" }, "gateway": { "baseUrl": "http://127.0.0.1:8888/admin-api", "token": "test1", - "adminTenentId": "1", + "adminTenantId": "1", "appApi": "http://127.0.0.1:8888/app-api", "appToken": "test1", diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http index e75e0d3335..4c4c8c0891 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/ai/chat/message/send Content-Type: application/json Authorization: {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "conversationId": "1781604279872581724", @@ -13,7 +13,7 @@ tenant-id: {{adminTenentId}} POST {{baseUrl}}/ai/chat/message/send-stream Content-Type: application/json Authorization: {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "conversationId": "1781604279872581724", diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http index 1ef2bc1a1d..7abc26705c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/crm/permission/create Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "userId": 1, @@ -15,7 +15,7 @@ tenant-id: {{adminTenentId}} PUT {{baseUrl}}/crm/permission/update Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "userId": 1, @@ -28,5 +28,5 @@ tenant-id: {{adminTenentId}} ### 请求 /delete DELETE {{baseUrl}}/crm/permission/delete?bizType=2&bizId=1&id=1 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http index 6b960512d8..4f343165e3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http @@ -2,64 +2,64 @@ ### 1.1 客户总量分析(按日期) GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-date?deptId=100&interval=2×[0]=2024-01-01 00:00:00×[1]=2024-01-29 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 1.2 客户总量统计(按用户) GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-user?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} # == 2. 客户跟进次数分析 == ### 2.1 客户跟进次数分析(按日期) GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-date?deptId=100&interval=2×[0]=2024-01-01 00:00:00×[1]=2024-01-29 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 2.2 客户总量统计(按用户) GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-user?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} # == 3. 客户跟进方式分析 == ### 3.1 客户跟进方式分析 GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-type?deptId=100&interval=2×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} # == 4. 客户成交周期 == ### 4.1 合同摘要信息(客户转化率页面) GET {{baseUrl}}/crm/statistics-customer/get-contract-summary?deptId=100&interval=2×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} # == 5. 客户成交周期 == ### 5.1 获取客户公海分析(按日期) GET {{baseUrl}}/crm/statistics-customer/get-pool-summary-by-date?deptId=100&interval=2×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 5.2 获取客户公海分析(按用户) GET {{baseUrl}}/crm/statistics-customer/get-pool-summary-by-user?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} # == 6. 客户成交周期 == ### 6.1 客户成交周期(按日期) GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-date?deptId=100&interval=2×[0]=2024-01-01 00:00:00×[1]=2024-01-29 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 6.2 获取客户成交周期(按用户) GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-user?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 6.3 获取客户成交周期(按区域) GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-area?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 6.4 获取客户成交周期(按产品) GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-product?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http index e878ba1a93..407562ddbc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http @@ -1,9 +1,9 @@ ### 合同金额排行榜 GET {{baseUrl}}/crm/statistics-rank/get-contract-price-rank?deptId=100×[0]=2022-12-12 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 回款金额排行榜 GET {{baseUrl}}/crm/statistics-rank/get-receivable-price-rank?deptId=100×[0]=2022-12-12 00:00:00×[1]=2024-12-12 23:59:59 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} \ No newline at end of file +tenant-id: {{adminTenantId}} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/statistics/ErpSaleStatisticsController.http b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/statistics/ErpSaleStatisticsController.http index 5f5cab1094..0dca8935c5 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/statistics/ErpSaleStatisticsController.http +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/statistics/ErpSaleStatisticsController.http @@ -1,11 +1,11 @@ ### 请求 /erp/sale-statistics/summary 接口 => 成功 GET {{baseUrl}}/erp/sale-statistics/summary Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} ### 请求 /erp/sale-statistics/time-summary 接口 => 成功 GET {{baseUrl}}/erp/sale-statistics/time-summary Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.http b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.http index 499f64df7d..14b6228c94 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.http +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.http @@ -1,7 +1,7 @@ ### 请求 /infra/file-config/create 接口 => 成功 POST {{baseUrl}}/infra/file-config/create Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} { @@ -21,7 +21,7 @@ Authorization: Bearer {{token}} ### 请求 /infra/file-config/update 接口 => 成功 PUT {{baseUrl}}/infra/file-config/update Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} { @@ -41,5 +41,5 @@ Authorization: Bearer {{token}} ### 请求 /infra/file-config/test 接口 => 成功 GET {{baseUrl}}/infra/file-config/test?id=2 Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.http b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.http index 62f8dd6066..52e7394c5a 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.http +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.http @@ -1,5 +1,5 @@ ### 请求 /infra/job/sync 接口 => 成功 POST {{baseUrl}}/infra/job/sync Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http index 8a0e70fd34..68b5487e27 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.http @@ -1,4 +1,4 @@ ### 请求 /infra/redis/get-monitor-info 接口 => 成功 GET {{baseUrl}}/infra/redis/get-monitor-info Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http index 56464dd80b..84446b0ced 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http @@ -1,7 +1,7 @@ ### 请求 /iot/think-model-function/create 接口 => 成功 POST {{baseUrl}}/iot/think-model-function/create Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} { @@ -32,7 +32,7 @@ Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/create 接口 => 成功 POST {{baseUrl}}/iot/think-model-function/create Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} { @@ -66,7 +66,7 @@ Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/update 接口 => 成功 PUT {{baseUrl}}/iot/think-model-function/update Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} { @@ -97,16 +97,16 @@ Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/delete 接口 => 成功 DELETE {{baseUrl}}/iot/think-model-function/delete?id=7 -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/get 接口 => 成功 GET {{baseUrl}}/iot/think-model-function/get?id=10 -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/list-by-product-id 接口 => 成功 GET {{baseUrl}}/iot/think-model-function/list-by-product-id?productId=1001 -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.http b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.http index 4ab7b4f714..8b20673995 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.http +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.http @@ -1,4 +1,4 @@ ### 获得商品 SPU 明细 GET {{baseUrl}}/product/spu/get-detail?id=4 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.http b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.http index c391b5873d..784c464608 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.http +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.http @@ -1,18 +1,18 @@ ### 获得订单交易的分页(默认) GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 获得订单交易的分页(价格) GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10&sortField=price&sortAsc=true Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 获得订单交易的分页(销售) GET {{appApi}}/product/spu/page?pageNo=1&pageSize=10&sortField=salesCount&sortAsc=true Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 获得商品 SPU 明细 GET {{appApi}}/product/spu/get-detail?id=102 -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.http b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.http index 0dda88c7d8..e74a46a11e 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.http +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.http @@ -2,4 +2,4 @@ GET {{appApi}}/promotion/activity/list-by-spu-ids?spuIds=222&spuIds=633 Authorization: Bearer {{appToken}} Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainHelpController.http b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainHelpController.http index 2e401e9d62..a3b3d225fc 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainHelpController.http +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainHelpController.http @@ -2,7 +2,7 @@ POST {{appApi}}/promotion/bargain-help/create Authorization: Bearer test248 Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "recordId": 26 diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainRecordController.http b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainRecordController.http index 46cbe3c8ec..dde40f8078 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainRecordController.http +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainRecordController.http @@ -2,7 +2,7 @@ POST {{appApi}}/promotion/bargain-record/create Authorization: Bearer {{appToken}} Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "activityId": 1 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http index 81cb35cbf0..f342e948a3 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http @@ -1,18 +1,18 @@ ### 获得交易售后分页 => 成功 GET {{baseUrl}}/trade/after-sale/page?pageNo=1&pageSize=10 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 同意售后 => 成功 PUT {{baseUrl}}/trade/after-sale/agree?id=7 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Content-Type: application/json ### 拒绝售后 => 成功 PUT {{baseUrl}}/trade/after-sale/disagree Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Content-Type: application/json { @@ -23,11 +23,11 @@ Content-Type: application/json ### 确认退款 => 成功 PUT {{baseUrl}}/trade/after-sale/refund?id=6 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Content-Type: application/json ### 确认收货 => 成功 PUT {{baseUrl}}/trade/after-sale/receive?id=7 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} Content-Type: application/json diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http index 7877faadef..5255d1b8f6 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http @@ -1,14 +1,14 @@ ### 获得交易订单分页 => 成功 GET {{baseUrl}}/trade/order/page?pageNo=1&pageSize=10 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 获得交易订单分页 => 成功 GET {{baseUrl}}/trade/order/get-detail?id=21 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 获得交易订单的物流轨迹 => 成功 GET {{baseUrl}}/trade/order/get-express-track-list?id=21 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} \ No newline at end of file +tenant-id: {{adminTenantId}} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http index b341a48866..2eda3c2c36 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http @@ -1,6 +1,6 @@ ### 请求 /trade/cart/add 接口 => 成功 POST {{appApi}}/trade/cart/add -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} Content-Type: application/json @@ -12,7 +12,7 @@ Content-Type: application/json ### 请求 /trade/cart/update 接口 => 成功 PUT {{appApi}}/trade/cart/update -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} Content-Type: application/json @@ -23,20 +23,20 @@ Content-Type: application/json ### 请求 /trade/cart/delete 接口 => 成功 DELETE {{appApi}}/trade/cart/delete?ids=1 -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /trade/cart/get-count 接口 => 成功 GET {{appApi}}/trade/cart/get-count -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /trade/cart/get-count-map 接口 => 成功 GET {{appApi}}/trade/cart/get-count-map -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /trade/cart/list 接口 => 成功 GET {{appApi}}/trade/cart/list -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http index 59490a7736..f51ddff005 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http @@ -1,18 +1,18 @@ ### /trade-order/settlement 获得订单结算信息(基于商品) GET {{appApi}}/trade/order/settlement?type=0&items[0].skuId=1&items[0].count=2&items[1].skuId=2&items[1].count=3&couponId=1 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### /trade-order/settlement 获得订单结算信息(基于购物车) GET {{appApi}}/trade/order/settlement?type=0&items[0].cartId=50&couponId=1 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### /trade-order/create 创建订单(基于商品)【快递】 POST {{appApi}}/trade/order/create Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "pointStatus": true, @@ -31,7 +31,7 @@ tenant-id: {{appTenentId}} POST {{appApi}}/trade/order/create Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "pointStatus": true, @@ -51,19 +51,19 @@ tenant-id: {{appTenentId}} ### 获得订单交易的分页 GET {{appApi}}/trade/order/page?pageNo=1&pageSize=10 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 获得订单交易的详细 GET {{appApi}}/trade/order/get-detail?id=21 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 获得交易订单的物流轨迹 GET {{appApi}}/trade/order/get-express-track-list?id=70 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### /trade-order/settlement-product 获得商品结算信息 GET {{appApi}}/trade/order/settlement-product?spuIds=633 Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} \ No newline at end of file +tenant-id: {{appTenantId}} \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/AppAddressController.http b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/AppAddressController.http index 6bae7c7ebe..a0582e6d3b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/AppAddressController.http +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/address/AppAddressController.http @@ -1,7 +1,7 @@ ### 请求 /create 接口 => 成功 POST {{appApi}}//member/address/create Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} { @@ -16,7 +16,7 @@ Authorization: Bearer {{appToken}} ### 请求 /update 接口 => 成功 PUT {{appApi}}//member/address/update Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} { @@ -32,23 +32,23 @@ Authorization: Bearer {{appToken}} ### 请求 /delete 接口 => 成功 DELETE {{appApi}}//member/address/delete?id=2 Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /get 接口 => 成功 GET {{appApi}}//member/address/get?id=1 Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /get-default 接口 => 成功 GET {{appApi}}//member/address/get-default Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} ### 请求 /list 接口 => 成功 GET {{appApi}}//member/address/list Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} Authorization: Bearer {{appToken}} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http index 5b68d69845..391aa922c4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.http @@ -1,7 +1,7 @@ ### 请求 /login 接口 => 成功 POST {{appApi}}/member/auth/login Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "mobile": "15601691388", @@ -11,7 +11,7 @@ tenant-id: {{appTenentId}} ### 请求 /send-sms-code 接口 => 成功 POST {{appApi}}/member/auth/send-sms-code Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "mobile": "15601691388", @@ -21,7 +21,7 @@ tenant-id: {{appTenentId}} ### 请求 /sms-login 接口 => 成功 POST {{appApi}}/member/auth/sms-login Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} terminal: 30 { @@ -32,7 +32,7 @@ terminal: 30 ### 请求 /social-login 接口 => 成功 POST {{appApi}}/member/auth/social-login Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "type": 34, @@ -43,7 +43,7 @@ tenant-id: {{appTenentId}} ### 请求 /weixin-mini-app-login 接口 => 成功 POST {{appApi}}/member/auth/weixin-mini-app-login Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "phoneCode": "618e6412e0c728f5b8fc7164497463d0158a923c9e7fd86af8bba393b9decbc5", @@ -54,14 +54,14 @@ tenant-id: {{appTenentId}} POST {{appApi}}/member/auth/logout Content-Type: application/json Authorization: Bearer c1b76bdaf2c146c581caa4d7fd81ee66 -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 请求 /auth/refresh-token 接口 => 成功 POST {{appApi}}/member/auth/refresh-token?refreshToken=bc43d929094849a28b3a69f6e6940d70 Content-Type: application/json -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} ### 请求 /auth/create-weixin-jsapi-signature 接口 => 成功 POST {{appApi}}/member/auth/create-weixin-jsapi-signature?url=http://www.iocoder.cn Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.http b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.http index 745556f75a..8ffb70caca 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.http +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.http @@ -1,4 +1,4 @@ ### 请求 /member/user/profile/get 接口 => 没有权限 GET {{appApi}}/member/user/get Authorization: Bearer test245 -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.http index 74b8f40b68..c093adf71c 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/material/MpMaterialController.http @@ -2,4 +2,4 @@ GET {{baseUrl}}/mp/material/page?permanent=true&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/menu/MpMenuController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/menu/MpMenuController.http index 2276b3b4f9..defd7ecb5f 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/menu/MpMenuController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/menu/MpMenuController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/mp/menu/save Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "accountId": "1", @@ -37,7 +37,7 @@ tenant-id: {{adminTenentId}} POST {{baseUrl}}/mp/menu/save Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "accountId": "1", @@ -47,4 +47,4 @@ tenant-id: {{adminTenentId}} ### 请求 /mp/menu/list 接口 => 成功 GET {{baseUrl}}/mp/menu/list?accountId=1 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.http index dbb3a7b22b..8d17c6bd52 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.http @@ -2,4 +2,4 @@ GET {{baseUrl}}/mp/auto-reply/page?accountId=1&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.http index b9f9721c9b..16677d4301 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.http @@ -2,13 +2,13 @@ GET {{baseUrl}}/mp/message/page?accountId=1&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/message/send 接口 => 成功(文本) POST {{baseUrl}}/mp/message/send Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "userId": 3, @@ -20,7 +20,7 @@ tenant-id: {{adminTenentId}} POST {{baseUrl}}/mp/message/send Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "userId": 3, diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http index 87f9d432a1..ea754292c3 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpDraftController.http @@ -2,13 +2,13 @@ GET {{baseUrl}}/mp/draft/page?accountId=1&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/draft/create 接口 => 成功 POST {{baseUrl}}/mp/draft/create?accountId=1 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "articles": [ @@ -35,7 +35,7 @@ tenant-id: {{adminTenentId}} PUT {{baseUrl}}/mp/draft/update?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-q-G9pdsmZw0OYG4FzHQkKfpLfEwIH51wy2bxisx8PvW Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} [{ "title": "我是标题(OOO)", diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http index 122413200e..246a95c4a0 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/news/MpFreePublishController.http @@ -2,12 +2,12 @@ GET {{baseUrl}}/mp/free-publish/page?accountId=1&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/free-publish/submit 接口 => 成功 POST {{baseUrl}}/mp/free-publish/submit?accountId=1&mediaId=r6ryvl6LrxBU0miaST4Y-vilmd7iS51D8IPddxflWrau0hIQ2ovY8YanO5jlgUcM Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} {} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/tag/MpTagController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/tag/MpTagController.http index fe79105ba7..a888145e1f 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/tag/MpTagController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/tag/MpTagController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/mp/tag/create Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "accountId": "1", @@ -13,7 +13,7 @@ tenant-id: {{adminTenentId}} PUT {{baseUrl}}/mp/tag/update Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "id": "3", @@ -24,16 +24,16 @@ tenant-id: {{adminTenentId}} DELETE {{baseUrl}}/mp/tag/delete?id=3 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/tag/page 接口 => 成功 GET {{baseUrl}}/mp/tag/page?accountId=1&pageNo=1&pageSize=10 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/tag/sync 接口 => 成功 POST {{baseUrl}}/mp/tag/sync?accountId=1 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/user/MpUserController.http b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/user/MpUserController.http index 7c615810fc..c78356aad1 100644 --- a/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/user/MpUserController.http +++ b/yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/user/MpUserController.http @@ -2,13 +2,13 @@ POST {{baseUrl}}/mp/user/sync?accountId=1 Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /mp/user/update 接口 => 成功 PUT {{baseUrl}}/mp/user/update Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "id": "3", diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.http b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.http index 14ce54ef92..4fe1898b4d 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.http +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.http @@ -2,7 +2,7 @@ POST {{appApi}}/pay/order/submit Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "id": 174, @@ -13,7 +13,7 @@ tenant-id: {{appTenentId}} POST {{appApi}}/pay/order/submit Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "id": 202, @@ -27,7 +27,7 @@ tenant-id: {{appTenentId}} POST {{appApi}}/pay/order/submit Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "id": 202, @@ -41,7 +41,7 @@ tenant-id: {{appTenentId}} POST {{appApi}}/pay/order/submit Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "id": 202, @@ -55,7 +55,7 @@ tenant-id: {{appTenentId}} POST {{appApi}}/pay/order/submit Content-Type: application/json Authorization: Bearer {{appToken}} -tenant-id: {{appTenentId}} +tenant-id: {{appTenantId}} { "id": 202, diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http index 00ae2ba2b3..f42dfcd030 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.http @@ -1,7 +1,7 @@ ### 请求 /login 接口 => 成功 POST {{baseUrl}}/system/auth/login Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} tag: Yunai.local { @@ -14,7 +14,7 @@ tag: Yunai.local ### 请求 /login 接口 => 成功(无验证码) POST {{baseUrl}}/system/auth/login Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "username": "admin", @@ -24,10 +24,10 @@ tenant-id: {{adminTenentId}} ### 请求 /get-permission-info 接口 => 成功 GET {{baseUrl}}/system/auth/get-permission-info Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /list-menus 接口 => 成功 GET {{baseUrl}}/system/list-menus Authorization: Bearer {{token}} #Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http index f524315026..5a7ce8ee15 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.http @@ -1,4 +1,4 @@ ### 请求 /menu/list 接口 => 成功 GET {{baseUrl}}/system/dict-data/list-all-simple Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.http index f1b893d016..14165619ef 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.http @@ -1,5 +1,5 @@ ### 获得地区树 GET {{baseUrl}}/system/area/tree Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http index 4853581656..be3102eb6f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.http @@ -1,4 +1,4 @@ ### 请求 /system/operate-log/page 接口 => 成功 GET {{baseUrl}}/system/operate-log/page Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http index f3c47f514d..9ad2ed2085 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/system/mail-template/send-mail Authorization: Bearer {{token}} Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "templateCode": "test_01", diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2ClientController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2ClientController.http index dcf60a6cf2..f8d7b8931d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2ClientController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2ClientController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/system/oauth2-client/create Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "id": "1", diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2OpenController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2OpenController.http index 725a5d4f59..f770ed91d7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2OpenController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2OpenController.http @@ -1,13 +1,13 @@ ### 请求 /system/oauth2/authorize 接口 => 成功 GET {{baseUrl}}/system/oauth2/authorize?clientId=default Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /system/oauth2/authorize + token 接口 => 成功 POST {{baseUrl}}/system/oauth2/authorize Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} response_type=token&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=true @@ -15,7 +15,7 @@ response_type=token&client_id=default&scope={"user.read": true}&redirect_uri=htt POST {{baseUrl}}/system/oauth2/authorize Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} response_type=code&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=false @@ -23,7 +23,7 @@ response_type=code&client_id=default&scope={"user.read": true}&redirect_uri=http POST {{baseUrl}}/system/oauth2/token Content-Type: application/x-www-form-urlencoded Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} grant_type=authorization_code&redirect_uri=https://www.iocoder.cn&code=189956c07a174588a97157eabef2f93a @@ -31,7 +31,7 @@ grant_type=authorization_code&redirect_uri=https://www.iocoder.cn&code=189956c07 POST {{baseUrl}}/system/oauth2/token Content-Type: application/x-www-form-urlencoded Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} grant_type=password&username=admin&password=admin123&scope=user.read @@ -39,16 +39,16 @@ grant_type=password&username=admin&password=admin123&scope=user.read POST {{baseUrl}}/system/oauth2/token Content-Type: application/x-www-form-urlencoded Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} grant_type=refresh_token&refresh_token=00895465d6994f72a9d926ceeed0f588 ### 请求 /system/oauth2/token + DELETE 接口 => 成功 DELETE {{baseUrl}}/system/oauth2/token?token=ca8a188f464441d6949c51493a2b7596 Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /system/oauth2/check-token 接口 => 成功 POST {{baseUrl}}/system/oauth2/check-token?token=620d307c5b4148df8a98dd6c6c547106 Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2UserController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2UserController.http index 13c8545bda..9e76c7cdcc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2UserController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/oauth2/OAuth2UserController.http @@ -1,13 +1,13 @@ ### 请求 /system/oauth2/user/get 接口 => 成功 GET {{baseUrl}}/system/oauth2/user/get Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### 请求 /system/oauth2/user/update 接口 => 成功 PUT {{baseUrl}}/system/oauth2/user/update Content-Type: application/json Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "nickname": "芋道源码" diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http index a90d8b8ab3..fbaff1e509 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.http @@ -1,4 +1,4 @@ ### 请求 /menu/list 接口 => 成功 GET {{baseUrl}}/system/menu/list Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http index c68b86b759..375180a344 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/system/role/create Authorization: Bearer {{token}} Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "name": "测试角色", @@ -14,7 +14,7 @@ tenant-id: {{adminTenentId}} POST {{baseUrl}}/system/role/update Authorization: Bearer {{token}} Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "id": 100, @@ -26,7 +26,7 @@ tenant-id: {{adminTenentId}} POST {{baseUrl}}/system/role/delete Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} roleId=14 @@ -34,9 +34,9 @@ roleId=14 GET {{baseUrl}}/system/role/get?id=100 Content-Type: application/x-www-form-urlencoded Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} ### /role/page 成功 GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http index ee24e928be..3b975c39dd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsTemplateController.http @@ -2,7 +2,7 @@ POST {{baseUrl}}/system/sms-template/send-sms Authorization: Bearer {{token}} Content-Type: application/json -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "templateCode": "test_01", diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http index 5ab64392a7..9909b519ad 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http @@ -3,7 +3,7 @@ POST {{baseUrl}}/system/social-client/send-subscribe-message Authorization: Bearer {{token}} Content-Type: application/json #Authorization: Bearer test100 -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "userId": 247, diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.http index a4d517385b..38aa594eaf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.http @@ -5,7 +5,7 @@ GET {{baseUrl}}/system/tenant/get-id-by-name?name=芋道源码 POST {{baseUrl}}/system/tenant/create Content-Type: application/json Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} { "name": "芋道", diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http index 7d7f6227e8..90f0c98324 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.http @@ -2,4 +2,4 @@ GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 Authorization: Bearer {{token}} #Authorization: Bearer test100 -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http index f06037b37b..c94c2ad23b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.http @@ -1,4 +1,4 @@ ### 请求 /system/user/profile/get 接口 => 没有权限 GET {{baseUrl}}/system/user/profile/get Authorization: Bearer {{token}} -tenant-id: {{adminTenentId}} +tenant-id: {{adminTenantId}} From a23b0480f159eaad446b7b93b182b565f8c455de Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Thu, 6 Feb 2025 14:14:14 +0800 Subject: [PATCH 105/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=91=20=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E8=A1=A8=E5=8D=95=E6=95=B0=E6=8D=AE=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmTriggerTypeEnum.java | 4 +- .../vo/model/simple/BpmSimpleModelNodeVO.java | 27 ++++- .../flowable/core/util/BpmnModelUtils.java | 7 ++ .../flowable/core/util/SimpleModelUtils.java | 99 +++++++++---------- .../trigger/BpmUpdateNormalFormTrigger.java | 53 ++++++++++ 5 files changed, 137 insertions(+), 53 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java index 66f34e6559..95c278492a 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java @@ -16,7 +16,9 @@ import java.util.Arrays; @AllArgsConstructor public enum BpmTriggerTypeEnum implements ArrayValuable { - HTTP_REQUEST(1, "发起 HTTP 请求"); + HTTP_REQUEST(1, "发起 HTTP 请求"), + UPDATE_NORMAL_FORM(2, "更新流程表单"); + /** * 触发器执行动作类型 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index b5a5ac11c6..c7dd31125a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -345,6 +345,11 @@ public class BpmSimpleModelNodeVO { @Valid private HttpRequestTriggerSetting httpRequestSetting; + /** + * 更新流程表单触发器设置 + */ + private UpdateNormalFormTriggerSetting updateNormalFormSetting; + @Schema(description = "http 请求触发器设置", example = "{}") @Data public static class HttpRequestTriggerSetting { @@ -365,14 +370,32 @@ public class BpmSimpleModelNodeVO { // TODO @json:可能未来看情况,搞个 HttpResponseParam;得看看有没别的业务需要,抽象统一 /** * 请求返回处理设置,用于修改流程表单值 - * + *

* key:表示要修改的流程表单字段名(name) * value:接口返回的字段名 */ @Schema(description = "请求返回处理设置", example = "[]") private List> response; - } + @Schema(description = "更新流程表单触发器设置", example = "{}") + @Data + public static class UpdateNormalFormTriggerSetting { + + @Schema(description = "条件类型", example = "1") + @InEnum(BpmSimpleModeConditionTypeEnum.class) + @NotNull(message = "条件类型不能为空") + private Integer conditionType; + + @Schema(description = "条件表达式", example = "${day>3}") + private String conditionExpression; + + @Schema(description = "条件组", example = "{}") + private ConditionGroups conditionGroups; + + @Schema(description = "更新的表单字段", example = "userName") + @NotEmpty(message = "更新的表单字段不能为空") + private Map updateFormFields; + } } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java index eae4eb988b..3f22c7c259 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java @@ -64,6 +64,13 @@ public class BpmnModelUtils { addExtensionElement(element, name, String.valueOf(value)); } + public static void addExtensionElementJson(FlowElement element, String name, Object value) { + if (value == null) { + return; + } + addExtensionElement(element, name, JsonUtils.toJsonString(value)); + } + public static void addExtensionElement(FlowElement element, String name, Map attributes) { if (attributes == null) { return; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 97c5f8a707..561db886d2 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.*; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; import cn.iocoder.yudao.module.bpm.enums.definition.*; @@ -626,54 +625,52 @@ public class SimpleModelUtils { public static SequenceFlow buildSequenceFlow(String sourceId, String targetId, BpmSimpleModelNodeVO node) { - String conditionExpression = buildConditionExpression(node); + String conditionExpression = buildConditionExpression(node.getConditionSetting()); return buildBpmnSequenceFlow(sourceId, targetId, node.getId(), node.getName(), conditionExpression); } - /** - * 构造条件表达式 - * - * @param node 条件节点 - */ - public static String buildConditionExpression(BpmSimpleModelNodeVO node) { - return buildConditionExpression(node.getConditionSetting().getConditionType(), node.getConditionSetting().getConditionExpression(), - node.getConditionSetting().getConditionGroups()); - } - public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterSetting router) { - return buildConditionExpression(router.getConditionType(), router.getConditionExpression(), - router.getConditionGroups()); - } + } - public static String buildConditionExpression(Integer conditionType, String conditionExpression, - ConditionGroups conditionGroups) { - BpmSimpleModeConditionTypeEnum conditionTypeEnum = BpmSimpleModeConditionTypeEnum.valueOf(conditionType); - if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.EXPRESSION) { - return conditionExpression; + /** + * 构造条件表达式 + */ + public static String buildConditionExpression(BpmSimpleModelNodeVO.ConditionSetting conditionSetting) { + return buildConditionExpression(conditionSetting.getConditionType(), conditionSetting.getConditionExpression(), + conditionSetting.getConditionGroups()); + } + + public static String buildConditionExpression(BpmSimpleModelNodeVO.RouterSetting routerSetting) { + return buildConditionExpression(routerSetting.getConditionType(), routerSetting.getConditionExpression(), + routerSetting.getConditionGroups()); + } + + public static String buildConditionExpression(Integer conditionType, String conditionExpression, ConditionGroups conditionGroups) { + BpmSimpleModeConditionTypeEnum conditionTypeEnum = BpmSimpleModeConditionTypeEnum.valueOf(conditionType); + if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.EXPRESSION) { + return conditionExpression; + } + if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.RULE) { + if (conditionGroups == null || CollUtil.isEmpty(conditionGroups.getConditions())) { + return null; } - if (conditionTypeEnum == BpmSimpleModeConditionTypeEnum.RULE) { - if (conditionGroups == null || CollUtil.isEmpty(conditionGroups.getConditions())) { - return null; + List strConditionGroups = CollectionUtils.convertList(conditionGroups.getConditions(), item -> { + if (CollUtil.isEmpty(item.getRules())) { + return ""; } - List strConditionGroups = CollectionUtils.convertList(conditionGroups.getConditions(), item -> { - if (CollUtil.isEmpty(item.getRules())) { - return ""; - } - // 构造规则表达式 - List list = CollectionUtils.convertList(item.getRules(), (rule) -> { - String rightSide = NumberUtil.isNumber(rule.getRightSide()) ? rule.getRightSide() - : "\"" + rule.getRightSide() + "\""; // 如果非数值类型加引号 - return String.format(" %s %s var:convertByType(%s,%s)", rule.getLeftSide(), rule.getOpCode(), rule.getLeftSide(), rightSide); - }); - // 构造条件组的表达式 - Boolean and = item.getAnd(); - return "(" + CollUtil.join(list, and ? " && " : " || ") + ")"; + // 构造规则表达式 + List list = CollectionUtils.convertList(item.getRules(), (rule) -> { + String rightSide = NumberUtil.isNumber(rule.getRightSide()) ? rule.getRightSide() + : "\"" + rule.getRightSide() + "\""; // 如果非数值类型加引号 + return String.format(" %s %s var:convertByType(%s,%s)", rule.getLeftSide(), rule.getOpCode(), rule.getLeftSide(), rightSide); }); - return String.format("${%s}", CollUtil.join(strConditionGroups, conditionGroups.getAnd() ? " && " : " || ")); - } - return null; + // 构造条件组的表达式 + Boolean and = item.getAnd(); + return "(" + CollUtil.join(list, and ? " && " : " || ") + ")"; + }); + return String.format("${%s}", CollUtil.join(strConditionGroups, conditionGroups.getAnd() ? " && " : " || ")); } - + return null; } public static class DelayTimerNodeConvert implements NodeConvert { @@ -727,9 +724,10 @@ public class SimpleModelUtils { if (node.getTriggerSetting() != null) { addExtensionElement(serviceTask, TRIGGER_TYPE, node.getTriggerSetting().getType()); if (node.getTriggerSetting().getHttpRequestSetting() != null) { - // TODO @jason:加个 addExtensionElementJson 方法,方便设置 JSON 类型的属性 - addExtensionElement(serviceTask, TRIGGER_PARAM, - JsonUtils.toJsonString(node.getTriggerSetting().getHttpRequestSetting())); + addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getHttpRequestSetting()); + } + if (node.getTriggerSetting().getUpdateNormalFormSetting() != null) { + addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getUpdateNormalFormSetting()); } } return serviceTask; @@ -760,7 +758,7 @@ public class SimpleModelUtils { } public static SequenceFlow buildSequenceFlow(String nodeId, BpmSimpleModelNodeVO.RouterSetting router) { - String conditionExpression = ConditionNodeConvert.buildConditionExpression(router); + String conditionExpression = SimpleModelUtils.buildConditionExpression(router); return buildBpmnSequenceFlow(nodeId, router.getNodeId(), null, null, conditionExpression); } @@ -804,7 +802,7 @@ public class SimpleModelUtils { // 查找满足条件的 BpmSimpleModelNodeVO 节点 BpmSimpleModelNodeVO matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) - && evalConditionExpress(variables, conditionNode)); + && evalConditionExpress(variables, conditionNode.getConditionSetting())); if (matchConditionNode == null) { matchConditionNode = CollUtil.findOne(currentNode.getConditionNodes(), conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); @@ -819,7 +817,7 @@ public class SimpleModelUtils { // 查找满足条件的 BpmSimpleModelNodeVO 节点 Collection matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), conditionNode -> !BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow()) - && evalConditionExpress(variables, conditionNode)); + && evalConditionExpress(variables, conditionNode.getConditionSetting())); if (CollUtil.isEmpty(matchConditionNodes)) { matchConditionNodes = CollUtil.filterNew(currentNode.getConditionNodes(), conditionNode -> BooleanUtil.isTrue(conditionNode.getConditionSetting().getDefaultFlow())); @@ -841,16 +839,17 @@ public class SimpleModelUtils { simulateNextNode(currentNode.getChildNode(), variables, resultNodes); } - public static boolean evalConditionExpress(Map variables, BpmSimpleModelNodeVO conditionNode) { - return BpmnModelUtils.evalConditionExpress(variables, ConditionNodeConvert.buildConditionExpression(conditionNode)); + public static boolean evalConditionExpress(Map variables, BpmSimpleModelNodeVO.ConditionSetting conditionSetting) { + return BpmnModelUtils.evalConditionExpress(variables, buildConditionExpression(conditionSetting)); } // TODO @芋艿:【高】要不要优化下,抽个 HttpUtils + /** * 添加 HTTP 请求参数。请求头或者请求体 * - * @param params HTTP 请求参数 - * @param paramSettings HTTP 请求参数设置 + * @param params HTTP 请求参数 + * @param paramSettings HTTP 请求参数设置 * @param processVariables 流程变量 */ public static void addHttpRequestParam(MultiValueMap params, diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java new file mode 100644 index 0000000000..2a1298e9ea --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.bpm.service.task.trigger; + +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.UpdateNormalFormTriggerSetting; +import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.stereotype.Component; + +import java.util.Map; + + +/** + * BPM 更新流程表单触发器 + * + * @author jason + */ +@Component +@Slf4j +public class BpmUpdateNormalFormTrigger implements BpmTrigger { + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Override + public BpmTriggerTypeEnum getType() { + return BpmTriggerTypeEnum.UPDATE_NORMAL_FORM; + } + + @Override + public void execute(String processInstanceId, String param) { + // 1. 解析更新流程表单配置 + UpdateNormalFormTriggerSetting setting = JsonUtils.parseObject(param, UpdateNormalFormTriggerSetting.class); + if (setting == null) { + log.error("[execute][流程({}) 更新流程表单触发器配置为空]", processInstanceId); + return; + } + // 2.获取流程变量 + ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); + Map processVariables = processInstance.getProcessVariables(); + String expression = SimpleModelUtils.buildConditionExpression(setting.getConditionType(), setting.getConditionExpression(), + setting.getConditionGroups()); + + // 3.满足条件,更新流程表单 + if(BpmnModelUtils.evalConditionExpress(processVariables, expression)) { + processInstanceService.updateProcessInstanceVariables(processInstanceId, setting.getUpdateFormFields()); + } + } +} From f5050807e1f9b6a0284af024f7cc8a9678434547 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Fri, 7 Feb 2025 22:45:03 +0800 Subject: [PATCH 106/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=20=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E8=A1=A8=E5=8D=95=E6=95=B0=E6=8D=AE=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/model/simple/BpmSimpleModelNodeVO.java | 22 +++++-------------- .../flowable/core/util/SimpleModelUtils.java | 6 ++--- .../trigger/BpmUpdateNormalFormTrigger.java | 21 +++++------------- 3 files changed, 12 insertions(+), 37 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index c7dd31125a..fed50ff05e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -346,9 +346,9 @@ public class BpmSimpleModelNodeVO { private HttpRequestTriggerSetting httpRequestSetting; /** - * 更新流程表单触发器设置 + * 流程表单触发器设置 */ - private UpdateNormalFormTriggerSetting updateNormalFormSetting; + private NormalFormTriggerSetting normalFormSetting; @Schema(description = "http 请求触发器设置", example = "{}") @Data @@ -378,23 +378,11 @@ public class BpmSimpleModelNodeVO { private List> response; } - @Schema(description = "更新流程表单触发器设置", example = "{}") + @Schema(description = "流程表单触发器设置", example = "{}") @Data - public static class UpdateNormalFormTriggerSetting { + public static class NormalFormTriggerSetting { - @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionTypeEnum.class) - @NotNull(message = "条件类型不能为空") - private Integer conditionType; - - @Schema(description = "条件表达式", example = "${day>3}") - private String conditionExpression; - - @Schema(description = "条件组", example = "{}") - private ConditionGroups conditionGroups; - - @Schema(description = "更新的表单字段", example = "userName") - @NotEmpty(message = "更新的表单字段不能为空") + @Schema(description = "修改的表单字段", example = "userName") private Map updateFormFields; } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index 561db886d2..309c11cf83 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -628,8 +628,6 @@ public class SimpleModelUtils { String conditionExpression = buildConditionExpression(node.getConditionSetting()); return buildBpmnSequenceFlow(sourceId, targetId, node.getId(), node.getName(), conditionExpression); } - - } /** @@ -726,8 +724,8 @@ public class SimpleModelUtils { if (node.getTriggerSetting().getHttpRequestSetting() != null) { addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getHttpRequestSetting()); } - if (node.getTriggerSetting().getUpdateNormalFormSetting() != null) { - addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getUpdateNormalFormSetting()); + if (node.getTriggerSetting().getNormalFormSetting() != null) { + addExtensionElementJson(serviceTask, TRIGGER_PARAM, node.getTriggerSetting().getNormalFormSetting()); } } return serviceTask; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java index 2a1298e9ea..ea38c740c8 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java @@ -1,19 +1,14 @@ package cn.iocoder.yudao.module.bpm.service.task.trigger; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.UpdateNormalFormTriggerSetting; +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.NormalFormTriggerSetting; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Component; -import java.util.Map; - - /** * BPM 更新流程表单触发器 * @@ -34,19 +29,13 @@ public class BpmUpdateNormalFormTrigger implements BpmTrigger { @Override public void execute(String processInstanceId, String param) { // 1. 解析更新流程表单配置 - UpdateNormalFormTriggerSetting setting = JsonUtils.parseObject(param, UpdateNormalFormTriggerSetting.class); + NormalFormTriggerSetting setting = JsonUtils.parseObject(param, NormalFormTriggerSetting.class); if (setting == null) { log.error("[execute][流程({}) 更新流程表单触发器配置为空]", processInstanceId); return; } - // 2.获取流程变量 - ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId); - Map processVariables = processInstance.getProcessVariables(); - String expression = SimpleModelUtils.buildConditionExpression(setting.getConditionType(), setting.getConditionExpression(), - setting.getConditionGroups()); - - // 3.满足条件,更新流程表单 - if(BpmnModelUtils.evalConditionExpress(processVariables, expression)) { + // 2.更新流程变量 + if (CollUtil.isNotEmpty(setting.getUpdateFormFields())) { processInstanceService.updateProcessInstanceVariables(processInstanceId, setting.getUpdateFormFields()); } } From 9569c3fbed80541ff685c35d427f4d63280ad867 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 06:55:56 +0800 Subject: [PATCH 107/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9A=E8=A7=A6=E5=8F=91=E5=99=A8=20-?= =?UTF-8?q?=20=E8=A1=A8=E5=8D=95=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/common/util/json/JsonUtils.java | 1 + .../module/bpm/enums/definition/BpmTriggerTypeEnum.java | 3 +-- .../definition/vo/model/simple/BpmSimpleModelNodeVO.java | 5 +++++ .../bpm/service/task/trigger/BpmHttpRequestTrigger.java | 7 ++++--- .../service/task/trigger/BpmUpdateNormalFormTrigger.java | 2 ++ 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java index 3133e50090..8bb8765917 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java @@ -206,4 +206,5 @@ public class JsonUtils { public static boolean isJsonObject(String str) { return JSONUtil.isTypeJSONObject(str); } + } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java index 95c278492a..9a2f073726 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmTriggerTypeEnum.java @@ -17,8 +17,7 @@ import java.util.Arrays; public enum BpmTriggerTypeEnum implements ArrayValuable { HTTP_REQUEST(1, "发起 HTTP 请求"), - UPDATE_NORMAL_FORM(2, "更新流程表单"); - + UPDATE_NORMAL_FORM(2, "更新流程表单"); // TODO @jason:FORM_UPDATE /** * 触发器执行动作类型 diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index fed50ff05e..291cf4d830 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -345,6 +345,8 @@ public class BpmSimpleModelNodeVO { @Valid private HttpRequestTriggerSetting httpRequestSetting; + // TODO @jason:这个要不直接叫 formSetting,更好理解一点哈 + // TODO @jason:如果搞成 List,是不是可以做条件组了?微信讨论哈 /** * 流程表单触发器设置 */ @@ -376,6 +378,7 @@ public class BpmSimpleModelNodeVO { */ @Schema(description = "请求返回处理设置", example = "[]") private List> response; + } @Schema(description = "流程表单触发器设置", example = "{}") @@ -384,6 +387,8 @@ public class BpmSimpleModelNodeVO { @Schema(description = "修改的表单字段", example = "userName") private Map updateFormFields; + } + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 17dadd2609..52936f93f9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -81,13 +81,14 @@ public class BpmHttpRequestTrigger implements BpmTrigger { } // 4.1 判断是否需要解析返回值 - if (StrUtil.isEmpty(responseEntity.getBody()) || !responseEntity.getStatusCode().is2xxSuccessful() + if (StrUtil.isEmpty(responseEntity.getBody()) + || !responseEntity.getStatusCode().is2xxSuccessful() || CollUtil.isEmpty(setting.getResponse())) { return; } // 4.2 解析返回值, 返回值必须符合 CommonResult 规范。 - CommonResult> respResult = JsonUtils.parseObjectQuietly(responseEntity.getBody(), - new TypeReference<>() {}); + CommonResult> respResult = JsonUtils.parseObjectQuietly( + responseEntity.getBody(), new TypeReference<>() {}); if (respResult == null || !respResult.isSuccess()){ return; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java index ea38c740c8..deab1f5e36 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java @@ -9,6 +9,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +// TODO @jason:改成 BpmFormUpdateTrigger /** * BPM 更新流程表单触发器 * @@ -39,4 +40,5 @@ public class BpmUpdateNormalFormTrigger implements BpmTrigger { processInstanceService.updateProcessInstanceVariables(processInstanceId, setting.getUpdateFormFields()); } } + } From 129e9868fb104ca2d771920562e3a91ea3dfdc8d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 07:04:06 +0800 Subject: [PATCH 108/112] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9AID=20=E7=BC=96=E7=A0=81=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java index 57b6fe8676..0c31fbfa16 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/BpmProcessIdRedisDAO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.dal.redis; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import jakarta.annotation.Resource; import org.springframework.data.redis.core.StringRedisTemplate; @@ -29,7 +30,6 @@ public class BpmProcessIdRedisDAO { public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { // 生成日期前缀 String infix = ""; - boolean expireEnable = true; switch (processIdRule.getInfix()) { case "DAY": infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDD"); @@ -43,16 +43,14 @@ public class BpmProcessIdRedisDAO { case "SECOND": infix = DateUtil.format(LocalDateTime.now(), "yyyyMMDDHHmmss"); break; - default: - expireEnable = false; - break; } // 生成序号 String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); String key = RedisKeyConstants.BPM_PROCESS_ID + noPrefix; Long no = stringRedisTemplate.opsForValue().increment(key); - if (Boolean.TRUE.equals(expireEnable)) { + if (StrUtil.isEmpty(infix)) { + // 特殊:没有前缀,则不能过期,不能每次都是从 0 开始 stringRedisTemplate.expire(key, Duration.ofDays(1L)); } return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); From 949fa225093bd4e9d0c9115b95dbb693411ef852 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 07:15:59 +0800 Subject: [PATCH 109/112] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=89=8D=E7=BC=80=EF=BC=8C=E6=97=A5=E5=BF=97=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=8F=92=E5=85=A5=20#731?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/web/core/filter/ApiRequestFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java index b702515590..7b064e8d6e 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java @@ -20,8 +20,8 @@ public abstract class ApiRequestFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) { // 只过滤 API 请求的地址 - return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAdminApi().getPrefix(), - webProperties.getAppApi().getPrefix()); + String apiUri = request.getRequestURI().substring(request.getContextPath().length()); + return !StrUtil.startWithAny(apiUri, webProperties.getAdminApi().getPrefix(), webProperties.getAppApi().getPrefix()); } } From d75d71d7d0e1308399d6e8d94acf30e2d834d622 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 07:26:30 +0800 Subject: [PATCH 110/112] =?UTF-8?q?1218=20=E5=A6=82=E6=9E=9C=E6=B2=A1?= =?UTF-8?q?=E6=9F=A5=E5=88=B0=E7=94=A8=E6=88=B7=E4=B9=9F=E6=9C=89=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E6=98=AF=E7=A9=BA=E7=BB=93=E6=9E=9C=E9=9B=86=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E5=AE=9A=E6=98=AFnull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/service/order/TradeOrderQueryServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java index 4522f956af..54b2aa4185 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java @@ -91,7 +91,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { public PageResult getOrderPage(TradeOrderPageReqVO reqVO) { // 根据用户查询条件构建用户编号列表 Set userIds = buildQueryConditionUserIds(reqVO); - if (userIds == null) { // 没查询到用户,说明肯定也没他的订单 + if (CollUtil.isEmpty(userIds)) { // 没查询到用户,说明肯定也没他的订单 return PageResult.empty(); } // 分页查询 @@ -122,7 +122,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { public TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO) { // 根据用户查询条件构建用户编号列表 Set userIds = buildQueryConditionUserIds(reqVO); - if (userIds == null) { // 没查询到用户,说明肯定也没他的订单 + if (CollUtil.isEmpty(userIds)) { // 没查询到用户,说明肯定也没他的订单 return new TradeOrderSummaryRespVO(); } // 查询每个售后状态对应的数量、金额 From cf7ff1ca8ab8d15e76885cc7424f5588caaa3160 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 08:11:52 +0800 Subject: [PATCH 111/112] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=91CRM=EF=BC=9ACrmBusinessController=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=9D=83=E9=99=90=E6=A0=87=E8=AF=86=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/controller/admin/business/CrmBusinessController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index 7c2dae2233..33e8d84abd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -127,8 +127,8 @@ public class CrmBusinessController { } @GetMapping("/simple-all-list") - @Operation(summary = "获得联系人的精简列表") - @PreAuthorize("@ss.hasPermission('crm:contact:query')") + @Operation(summary = "获得商机的精简列表") + @PreAuthorize("@ss.hasPermission('crm:business:query')") public CommonResult> getSimpleContactList() { CrmBusinessPageReqVO reqVO = new CrmBusinessPageReqVO(); reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页 From f7c56ad4ebba4eed76d93733f1712a7b07d214f1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 9 Feb 2025 11:40:53 +0800 Subject: [PATCH 112/112] =?UTF-8?q?=E3=80=90=E5=90=8C=E6=AD=A5=E3=80=91jdk?= =?UTF-8?q?21=20=E5=92=8C=20jdk8=20=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 4 ++-- .../bpm/service/task/trigger/BpmHttpRequestTrigger.java | 4 ++-- .../bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index ff7fdf9f0a..a321e6ee4b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -41,8 +41,6 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.constants.BpmnXMLConstants; import org.flowable.bpmn.model.*; @@ -60,6 +58,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import javax.validation.Valid; +import javax.annotation.Resource; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java index 52936f93f9..4f81510025 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmHttpRequestTrigger.java @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import com.fasterxml.jackson.core.type.TypeReference; -import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.http.HttpEntity; @@ -22,6 +21,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -88,7 +88,7 @@ public class BpmHttpRequestTrigger implements BpmTrigger { } // 4.2 解析返回值, 返回值必须符合 CommonResult 规范。 CommonResult> respResult = JsonUtils.parseObjectQuietly( - responseEntity.getBody(), new TypeReference<>() {}); + responseEntity.getBody(), new TypeReference>>() {}); if (respResult == null || !respResult.isSuccess()){ return; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java index deab1f5e36..d5e50dee3f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/trigger/BpmUpdateNormalFormTrigger.java @@ -5,10 +5,11 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TriggerSetting.NormalFormTriggerSetting; import cn.iocoder.yudao.module.bpm.enums.definition.BpmTriggerTypeEnum; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; -import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.Resource; + // TODO @jason:改成 BpmFormUpdateTrigger /** * BPM 更新流程表单触发器