From c49f34d22815b34500cd2475ef369a061c8521f4 Mon Sep 17 00:00:00 2001 From: yang chen Date: Thu, 23 Oct 2025 16:28:24 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(bpm):=20=E6=B7=BB=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E6=8A=84=E9=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增抄送用户编号数组字段 - 添加抄送原因校验规则 - 完善抄送请求VO结构定义 - 增加Swagger文档注解说明- 实现抄送用户不能为空的校验逻辑 --- .../vo/instance/BpmProcessInstanceCopyCreateReqVO.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java index bf438c8..fa179de 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java @@ -1,10 +1,14 @@ package com.jeelowcode.service.bpm.controller.vo.instance; import io.swagger.v3.oas.annotations.media.Schema; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; + import lombok.Data; +import java.util.Collection; + @Schema(description = "管理后台 - 流程实例抄送的创建 Request VO") @Data public class BpmProcessInstanceCopyCreateReqVO { @@ -17,4 +21,8 @@ public class BpmProcessInstanceCopyCreateReqVO { @NotBlank(message = "抄送原因不能为空") private String reason; + @Schema(description = "抄送的用户编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") + @NotEmpty(message = "抄送用户不能为空") + private Collection userIds; + } From a0e768d2101bb6e6227b96f4ba277b128af5a689 Mon Sep 17 00:00:00 2001 From: yang chen Date: Mon, 27 Oct 2025 09:10:10 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(bpm):=20=E6=94=AF=E6=8C=81=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=9B=E5=BB=BA=E6=8A=84=E9=80=81=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 Collectors 类以支持流式处理 - 将单个抄送流程创建改为批量创建 -为每个用户 ID 生成独立的抄送记录 - 使用 insertBatch 方法提高插入效率 -保持原有字段设置逻辑不变 - 修复可能的空指针异常风险 --- .../BpmProcessInstanceCopyServiceImpl.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java index 0966801..bfd3f72 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java @@ -30,6 +30,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import static com.jeelowcode.tool.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -124,13 +125,17 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop } // 2. 创建抄送流程 - BpmProcessInstanceCopyDO copy = new BpmProcessInstanceCopyDO() - .setTaskId(reqVO.getTaskId()).setTaskName(task.getName()) - .setProcessInstanceId(processInstanceId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) - .setProcessInstanceName(processInstance.getName()) - .setCategory(null) // TODO 芋艿:貌似新版本,没 processInstance.getProcessDefinitionCategory() 字段? - .setReason(reqVO.getReason()); - processInstanceCopyMapper.insert(copy); + List copyList = + reqVO.getUserIds().stream().map(singleUserId -> + new BpmProcessInstanceCopyDO() + .setTaskId(reqVO.getTaskId()).setTaskName(task.getName()) + .setProcessInstanceId(processInstanceId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) + .setProcessInstanceName(processInstance.getName()) + .setUserId(singleUserId) + .setCategory(null) // TODO 芋艿:貌似新版本,没 processInstance.getProcessDefinitionCategory() 字段? + .setReason(reqVO.getReason()) + ).collect(Collectors.toList()); + processInstanceCopyMapper.insertBatch(copyList); } @Override From 9ac1584494ead4c90d650e1e53c46af7a2e09466 Mon Sep 17 00:00:00 2001 From: yang chen Date: Mon, 27 Oct 2025 09:40:05 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat(bpm):=20=E4=BF=AE=E6=94=B9=E6=8A=84?= =?UTF-8?q?=E9=80=81=E7=94=A8=E6=88=B7=E5=AD=97=E6=AE=B5=E5=90=8D=E4=B8=BA?= =?UTF-8?q?options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将BpmProcessInstanceCopyCreateReqVO中的userIds字段重命名为options - 更新BpmProcessInstanceCopyServiceImpl中使用该字段的代码逻辑 --- .../vo/instance/BpmProcessInstanceCopyCreateReqVO.java | 2 +- .../bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java index fa179de..74ae34f 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyCreateReqVO.java @@ -23,6 +23,6 @@ public class BpmProcessInstanceCopyCreateReqVO { @Schema(description = "抄送的用户编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") @NotEmpty(message = "抄送用户不能为空") - private Collection userIds; + private Collection options; } diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java index bfd3f72..71271b8 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java @@ -126,7 +126,7 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop // 2. 创建抄送流程 List copyList = - reqVO.getUserIds().stream().map(singleUserId -> + reqVO.getOptions().stream().map(singleUserId -> new BpmProcessInstanceCopyDO() .setTaskId(reqVO.getTaskId()).setTaskName(task.getName()) .setProcessInstanceId(processInstanceId).setStartUserId(Long.valueOf(processInstance.getStartUserId())) From 3c01a72dad31617785b818d8e0023df9ef29fa47 Mon Sep 17 00:00:00 2001 From: yang chen Date: Mon, 27 Oct 2025 09:51:22 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix(bpm):=E4=BF=AE=E5=A4=8D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=9B=E5=BB=BA=E8=80=85=E6=98=B5?= =?UTF-8?q?=E7=A7=B0=E8=AE=BE=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正了创建者昵称设置的目标对象,从user改为copy对象- 确保流程实例复制页面正确显示创建者昵称- 保持与其他用户相关信息设置逻辑的一致性 --- .../bpm/config/convert/cc/BpmProcessInstanceCopyConvert.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/config/convert/cc/BpmProcessInstanceCopyConvert.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/config/convert/cc/BpmProcessInstanceCopyConvert.java index e69d5c1..e081757 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/config/convert/cc/BpmProcessInstanceCopyConvert.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/config/convert/cc/BpmProcessInstanceCopyConvert.java @@ -29,7 +29,7 @@ public interface BpmProcessInstanceCopyConvert { List list = BeanUtils.toBean(page.getList(), BpmProcessInstanceCopyPageItemRespVO.class, copy -> { - MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), user -> user.setNickname(user.getNickname())); + MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()), user -> copy.setCreatorNickname(user.getNickname())); MapUtils.findAndThen(userMap, copy.getStartUserId(), user -> copy.setStartUserNickname(user.getNickname())); MapUtils.findAndThen(taskNameMap, copy.getTaskId(), copy::setTaskName); MapUtils.findAndThen(processInstaneNameMap, copy.getProcessInstanceId(), copy::setProcessInstanceName); From b82ee9bbe56c76246b6f2beec8fac5095370e33c Mon Sep 17 00:00:00 2001 From: yang chen Date: Mon, 27 Oct 2025 10:22:41 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(bpm):=20=E4=BF=AE=E6=AD=A3=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=A4=8D=E5=88=B6=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E5=AD=97=E6=AE=B5=E5=90=8D-=20=E5=B0=86=20Bp?= =?UTF-8?q?mProcessInstanceCopyMapper=20=E4=B8=AD=E7=9A=84=20createTime=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E5=AD=97=E6=AE=B5=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3=E4=B8=BA=20searchCreateTime=20-=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20BpmProcessInstanceCopyMyPageReqVO=20=E4=B8=AD=E7=9A=84=20cre?= =?UTF-8?q?ateTime=20=E5=AD=97=E6=AE=B5=E5=90=8D=E4=B8=BA=20searchCreateTi?= =?UTF-8?q?me-=20=E7=A1=AE=E4=BF=9D=E5=89=8D=E5=90=8E=E7=AB=AF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8F=82=E6=95=B0=E5=AD=97=E6=AE=B5=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E9=81=BF=E5=85=8D=E5=9B=A0=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=AF=BC=E8=87=B4=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/instance/BpmProcessInstanceCopyMyPageReqVO.java | 2 +- .../service/bpm/mapper/BpmProcessInstanceCopyMapper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java index c6807e9..1f11f54 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/controller/vo/instance/BpmProcessInstanceCopyMyPageReqVO.java @@ -25,6 +25,6 @@ public class BpmProcessInstanceCopyMyPageReqVO extends PageParam { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; + private LocalDateTime[] searchCreateTime; } diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/mapper/BpmProcessInstanceCopyMapper.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/mapper/BpmProcessInstanceCopyMapper.java index ed01a5e..5f7b984 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/mapper/BpmProcessInstanceCopyMapper.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/mapper/BpmProcessInstanceCopyMapper.java @@ -15,7 +15,7 @@ public interface BpmProcessInstanceCopyMapper extends BaseMapperX Date: Mon, 27 Oct 2025 11:17:16 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(bpm):=20=E5=AE=9E=E7=8E=B0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8A=84=E9=80=81=E6=8E=A8=E9=80=81=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增待办系统推送逻辑 - 集成 PortalRequest 和用户信息服务 - 构造并发送抄送待办请求 - 添加异常处理和日志记录- 支持创建人、接收人和发起人信息获取 - 实现待办消息的 PC 端跳转链接配置 --- .../BpmProcessInstanceCopyServiceImpl.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java index 71271b8..11ff117 100644 --- a/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java +++ b/jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java @@ -2,8 +2,15 @@ package com.jeelowcode.service.bpm.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.jeelowcode.framework.utils.tool.spring.SpringUtils; +import com.jeelowcode.service.bpm.config.framework.portal.core.PortalRequest; +import com.jeelowcode.service.bpm.config.framework.portal.core.dto.PortalTodoResponseDTO; +import com.jeelowcode.service.bpm.config.framework.portal.core.dto.ReceiveCCRequestDTO; +import com.jeelowcode.service.system.api.IApiAdminUserApi; +import com.jeelowcode.service.system.dto.AdminUserRespDTO; import com.jeelowcode.tool.framework.common.pojo.PageResult; import com.jeelowcode.service.bpm.controller.vo.instance.BpmProcessInstanceCopyCreateReqVO; import com.jeelowcode.service.bpm.controller.vo.instance.BpmProcessInstanceCopyMyPageReqVO; @@ -16,6 +23,7 @@ import com.jeelowcode.service.bpm.service.IBpmProcessInstanceCopyService; import com.jeelowcode.service.bpm.service.IBpmProcessInstanceService; import com.jeelowcode.service.bpm.service.IBpmTaskService; import com.jeelowcode.service.bpm.dto.BpmDelegateExecutionDTO; +import com.jeelowcode.tool.framework.common.util.object.ObjectUtils; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.DelegateExecution; @@ -29,10 +37,12 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import static com.jeelowcode.tool.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jeelowcode.tool.framework.common.util.json.JsonUtils.toJsonString; /** * 流程抄送 Service 实现类 @@ -59,6 +69,9 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop @Resource @Lazy private IBpmProcessInstanceService bpmProcessInstanceService; + @Lazy + @Resource + private IApiAdminUserApi apiAdminUserApi; @Override public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) { @@ -136,6 +149,37 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop .setReason(reqVO.getReason()) ).collect(Collectors.toList()); processInstanceCopyMapper.insertBatch(copyList); + + // 3.推送给待办系统 + PortalRequest portalRequest = SpringUtils.getBean(PortalRequest.class); + // 3.1 如果没有配置待办平台,则结束这个监听任务的执行 + if (ObjectUtil.isNull(portalRequest)) return; + // 3.2 调用待办系统,发送待办消息 + try { + copyList.stream().map(copy -> { + AdminUserRespDTO creatorUser = apiAdminUserApi.getUser(Long.parseLong(copy.getCreator())); + AdminUserRespDTO receiverUser = apiAdminUserApi.getUser(copy.getUserId()); + AdminUserRespDTO startUser = apiAdminUserApi.getUser(copy.getStartUserId()); + return new ReceiveCCRequestDTO() + .setFlowId(copy.getProcessInstanceId()) + .setRequestName(copy.getProcessInstanceName() + "-" + startUser.getNickname() + "-" + DateUtil.formatDateTime(processInstance.getStartTime())) + .setWorkflowName(copy.getProcessInstanceName()) + .setNodeName(copy.getTaskName()) + .setPcUrl("/process-instance/detail?id=" + copy.getProcessInstanceId()) + .setCreator(creatorUser.getUsername()) + .setCreateDateTime(copy.getCreateTime()) + .setReceiver(receiverUser.getUsername()) + .setReceiveDateTime(copy.getCreateTime()) + .setReceiveTs(System.currentTimeMillis()); + } + ).forEach(request -> { + PortalTodoResponseDTO response = portalRequest.receiveCCRequest(request); + log.info("[taskCompleted][推送待办成功 response({})]", toJsonString(response)); + }); + } catch (Exception e) { + log.error("[createProcessInstanceCopy][推送待办失败]", e); + } + } @Override