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 01/21] =?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 02/21] =?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 03/21] =?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 04/21] =?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 05/21] =?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 06/21] =?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 07/21] =?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 08/21] =?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 09/21] =?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 10/21] =?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 11/21] =?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 12/21] =?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 13/21] =?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 4e43958fe3000b2cda46ff34b28fb010eadd806e Mon Sep 17 00:00:00 2001 From: mcwindy Date: Wed, 5 Feb 2025 11:42:59 +0800 Subject: [PATCH 14/21] 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 15/21] =?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 16/21] =?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 17/21] =?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 18/21] =?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 19/21] =?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 20/21] =?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 21/21] =?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); // 不分页