Compare commits

...

7 Commits

Author SHA1 Message Date
091ceb3619 Merge branch 'dev-bpm' into dev
# Conflicts:
#	jeelowcode-service/jeelowcode-service-bpm-biz/src/main/java/com/jeelowcode/service/bpm/service/impl/BpmProcessInstanceCopyServiceImpl.java
2025-10-27 11:35:16 +08:00
6ce3ba89c6 feat(bpm): 实现流程抄送推送待办功能
- 新增待办系统推送逻辑
- 集成 PortalRequest 和用户信息服务
- 构造并发送抄送待办请求
- 添加异常处理和日志记录- 支持创建人、接收人和发起人信息获取
- 实现待办消息的 PC 端跳转链接配置
2025-10-27 11:17:16 +08:00
b82ee9bbe5 fix(bpm): 修正流程实例复制查询条件字段名- 将 BpmProcessInstanceCopyMapper 中的 createTime 查询条件字段更正为 searchCreateTime
- 更新 BpmProcessInstanceCopyMyPageReqVO 中的 createTime 字段名为 searchCreateTime- 确保前后端查询参数字段一致性,避免因字段不匹配导致查询失败
2025-10-27 10:22:41 +08:00
3c01a72dad fix(bpm):修复流程实例创建者昵称设置错误
- 修正了创建者昵称设置的目标对象,从user改为copy对象- 确保流程实例复制页面正确显示创建者昵称- 保持与其他用户相关信息设置逻辑的一致性
2025-10-27 09:51:22 +08:00
9ac1584494 feat(bpm): 修改抄送用户字段名为options
- 将BpmProcessInstanceCopyCreateReqVO中的userIds字段重命名为options
- 更新BpmProcessInstanceCopyServiceImpl中使用该字段的代码逻辑
2025-10-27 09:40:05 +08:00
a0e768d210 feat(bpm): 支持批量创建抄送流程实例
- 引入 Collectors 类以支持流式处理
- 将单个抄送流程创建改为批量创建
-为每个用户 ID 生成独立的抄送记录
- 使用 insertBatch 方法提高插入效率
-保持原有字段设置逻辑不变
- 修复可能的空指针异常风险
2025-10-27 09:10:10 +08:00
c49f34d228 feat(bpm): 添加流程实例抄送功能
- 新增抄送用户编号数组字段
- 添加抄送原因校验规则
- 完善抄送请求VO结构定义
- 增加Swagger文档注解说明- 实现抄送用户不能为空的校验逻辑
2025-10-23 16:28:24 +08:00
5 changed files with 67 additions and 12 deletions

View File

@@ -29,7 +29,7 @@ public interface BpmProcessInstanceCopyConvert {
List<BpmProcessInstanceCopyPageItemRespVO> 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);

View File

@@ -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<Long> options;
}

View File

@@ -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;
}

View File

@@ -15,7 +15,7 @@ public interface BpmProcessInstanceCopyMapper extends BaseMapperX<BpmProcessInst
.eqIfPresent(BpmProcessInstanceCopyDO::getUserId, loginUserId)
.eqIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceId, reqVO.getProcessInstanceId())
.likeIfPresent(BpmProcessInstanceCopyDO::getProcessInstanceName, reqVO.getProcessInstanceName())
.betweenIfPresent(BpmProcessInstanceCopyDO::getCreateTime, reqVO.getCreateTime())
.betweenIfPresent(BpmProcessInstanceCopyDO::getCreateTime, reqVO.getSearchCreateTime())
.orderByDesc(BpmProcessInstanceCopyDO::getId));
}
}

View File

@@ -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,9 +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 实现类
@@ -58,6 +69,9 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop
@Resource
@Lazy
private IBpmProcessInstanceService bpmProcessInstanceService;
@Lazy
@Resource
private IApiAdminUserApi apiAdminUserApi;
@Override
public boolean makeCopy(BpmCandidateSourceInfo sourceInfo) {
@@ -124,15 +138,48 @@ public class BpmProcessInstanceCopyServiceImpl implements IBpmProcessInstanceCop
}
// 2. 创建抄送流程
BpmProcessInstanceCopyDO copy = new BpmProcessInstanceCopyDO()
.setTaskId(reqVO.getTaskId()).setTaskName(task.getName())
.setProcessInstanceId(processInstanceId)
.setStartUserId(Long.valueOf(processInstance.getStartUserId()))
.setUserId(userId)
.setProcessInstanceName(processInstance.getName())
.setCategory(null) // TODO 芋艿:貌似新版本,没 processInstance.getProcessDefinitionCategory() 字段?
.setReason(reqVO.getReason());
processInstanceCopyMapper.insert(copy);
List<BpmProcessInstanceCopyDO> copyList =
reqVO.getOptions().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);
// 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