update - 在编写 1.3.0 的接入文档时,优化接口参数模型,以及处理逻辑

This commit is contained in:
wangli 2024-01-15 13:51:32 +08:00
parent c7dd0da1f4
commit d8f1a869cc
16 changed files with 75 additions and 19 deletions

View File

@ -40,7 +40,7 @@ public interface ProcessInstanceApi {
/**
* 我发起的审批列表
*/
@GetMapping("/api/process/instance/page/my")
@PostMapping("/api/process/instance/page/my")
CommonResponse<BpmPageResult<BpmnProcessInstancePageItemVO>> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
/**

View File

@ -154,7 +154,7 @@ public interface ProcessTaskApi {
* 暂停流程任务,并创建机器人节点,等待业务推动
*
* @param dto
* @return
* @return 返回机器人节点任务 ID
*/
@Operation(summary = "创建机器人节点, 暂停流程任务")
@PostMapping("/api/process/task/robot/create")

View File

@ -12,7 +12,7 @@ public enum ProcessActivityEventEnum {
PROCESS_ACTIVITY_START("process-activity", "process-activity-start", "流程活动节点已开始"),
PROCESS_ACTIVITY_WAIT_ASSIGNEE("process-activity", "process-activity-wait-assignee", "流程活动节点等待指定审批人"),
PROCESS_ACTIVITY_TAKE("process-activity", "process-activity-take", "流程活动节点已完成"),
PROCESS_ACTIVITY_TAKE("process-activity", "process-activity-take", "该事件类型暂时不存在"),
PROCESS_ACTIVITY_END("process-activity", "process-activity-end", "流程活动节点已取消"),
;

View File

@ -20,8 +20,10 @@ import java.util.Map;
public class BpmnProcessInstanceCreateDTO {
/**
* 废弃
* 流程定义的 id
*/
@Deprecated
private String processDefinitionId;
/**
* 流程定义的标识
@ -46,6 +48,9 @@ public class BpmnProcessInstanceCreateDTO {
/**
* 组织关系
* <p>
* 用于流程引擎计算对应节点的审批人, 例如第一个审批节点配置的是劳务分包的岗位,第二个审批节点配置的专业分包的角色,
* 那么, 组织关系就需要传入劳务分包的信息以及专业分包的信息,如果还有更多的审批节点配置,以此类推.
*/
@ApiModelProperty(value = "组织关系")
@NotNull(message = "组织关系不能为空")
@ -65,16 +70,18 @@ public class BpmnProcessInstanceCreateDTO {
private BpmnTaskDelegateAssigner initiator;
/**
* 自定义的流程实例名称
* 自定义的流程实例名称, 可为空, 默认使用模型名称
*/
@ApiModelProperty(value = "自定义的流程实例名称")
private String customProcessInstanceName;
/**
* 废弃
* 下级审批人
*/
@ApiModelProperty(value = "下级审批人", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人")
@Valid
@Deprecated
private BpmnTaskDelegateAssigner nextApprover;
}

View File

@ -26,23 +26,35 @@ public class BpmnActivitySetAssigneeDTO {
private String triggerId;
/**
* 暂时无用的参数
* 指定的活动节点 ID
*/
@ApiModelProperty(value = "指定的活动节点 ID", notes = "流程定义中节点的 ID")
@ApiModelProperty(value = "指定的活动节点 ID", notes = "流程定义中节点的 ID", hidden = true)
@Deprecated
private String activityId;
/**
* 暂时无用的参数
* 实例 ID
*/
@ApiModelProperty(value = "实例 ID", hidden = true)
@Deprecated
private String processInstanceId;
/**
* 需要设置的审批人, 业务侧自行去重
* 需要设置的审批人, 业务侧自行去重, 请根据 personId 进行去重, 如果发现有重复, 并抛出异常
*/
@ApiModelProperty(value = "审批人集合信息", notes = "业务传参时,需要注意去重")
@Valid
@NotEmpty(message = "审批人不能为空")
private List<BpmnTaskDelegateAssigner> assigners;
/**
* 是否在服务端去重
* true ,由流程引擎根据引擎规则去重, 但目前服务端去重具有随机性, 只根据 personId 去重.
* <p>
* 如果业务不能接受,请自己主动去重后提交.
*/
private Boolean serverSideDeduplication = false;
}

View File

@ -35,6 +35,7 @@ public class BpmnFlowNodeDTO {
* 机器人节点操作描述
*/
@ApiModelProperty(value = "操作描述")
@Length(max = 100, message = "操作描述长度不能超过100个字符")
private String operationDesc;
}

View File

@ -56,5 +56,4 @@ public class BpmnTaskCountersignDTO implements Serializable {
@NotNull(message = "加签任务发起人不能为空")
private BpmnTaskDelegateAssigner originAssigner;
}

View File

@ -15,6 +15,8 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
/**
* 该模型的属性, 尽量给全, 虽然部分字段是非必填, 但实际上是为了兼容不同场景. ouId: 工人是没人的,但是从业人员一定会有.
* <p>
* 统一的工作流中的人员模型,兼容不同的业务方,如安心筑"唯一"人的定义需要工作台+身份 ID+身份类型;<br/>
* 而枢智业务则只需要简单的 userId 即可
* <p>
@ -82,8 +84,8 @@ public class BpmnTaskDelegateAssigner implements Serializable {
private String ouId;
/**
* 该属性业务接入时无需关系. 尽量保证其他属性都设值.
* 头像
* 仅安心筑使用, 该属性一般不需要传, 而是为消费方添加的字段,自行查后进行数据填充
*/
private String avatar;

View File

@ -45,6 +45,11 @@ public class ProcessActivityDTO implements Serializable {
*/
private String processDefinitionId;
/**
* 业务的唯一标识
*/
private String businessKey;
/**
* 如果是"业务节点", 需要业务使用该 id 进行推动流程后续执行
*/

View File

@ -27,6 +27,7 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
DUMMY_TASK_CREATED_NOT_SUPPORT("012", "当前审批已结束, 不支持创建机器人节点, 实例 ID: 【{}】"),
DUMMY_TASK_CANT_CREATED("013", "当前流程状态下, 不允许创建新的机器人节点, 实例 ID: 【{}】"),
DUMMY_TASK_CANT_REPEAT_CREATE("014", "已存在运行中的机器人节点, 不允许重复创建!"),
ACTIVITY_BIZ_SET_ASSIGNEE_HAS_REPEAT("015", "业务传入的指定审批人存在重复, 请主动根据 personId 去重! "),
;
private String code;

View File

@ -27,12 +27,15 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
@ -290,4 +293,13 @@ public class CustomTaskHelper {
}
}
public static List<BpmnTaskDelegateAssigner> removeDuplicateByPersonId(List<BpmnTaskDelegateAssigner> delegateAssigners) {
if (CollectionUtils.isEmpty(delegateAssigners)) {
return delegateAssigners;
}
return new ArrayList<>(delegateAssigners.stream()
.collect(Collectors.toMap(BpmnTaskDelegateAssigner::getPersonId, Function.identity(), (s, t) -> s))
.values());
}
}

View File

@ -19,6 +19,8 @@ public class BizSpecifyAssigneeEventImpl implements BizSpecifyAssigneeEvent {
private final String activityName;
private final String processInstanceId;
private final String processDefinitionId;
private final String businessKey;
private final String executionId;
private final Map<String, Object> variables;
@ -29,6 +31,7 @@ public class BizSpecifyAssigneeEventImpl implements BizSpecifyAssigneeEvent {
this.activityName = ((ExecutionEntityImpl) execution).getCurrentActivityName();
this.processInstanceId = execution.getProcessInstanceId();
this.processDefinitionId = execution.getProcessDefinitionId();
this.businessKey = ((ExecutionEntityImpl) execution).getBusinessKey();
this.executionId = execution.getId();
this.variables = execution.getVariables();
}
@ -54,6 +57,10 @@ public class BizSpecifyAssigneeEventImpl implements BizSpecifyAssigneeEvent {
return processDefinitionId;
}
public String getBusinessKey() {
return businessKey;
}
public String getExecutionId() {
return executionId;
}

View File

@ -36,8 +36,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK;
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE;
@ -53,6 +51,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessServerVersion;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
import static cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType.ADD_ASSIGNEE;
@ -238,14 +237,6 @@ public class EngineExecutionStartListener implements ExecutionListener {
return removeDuplicateByPersonId(assigners);
}
private List<BpmnTaskDelegateAssigner> removeDuplicateByPersonId(List<BpmnTaskDelegateAssigner> delegateAssigners) {
if (CollectionUtils.isEmpty(delegateAssigners)) {
return delegateAssigners;
}
return new ArrayList<>(delegateAssigners.stream()
.collect(Collectors.toMap(BpmnTaskDelegateAssigner::getPersonId, Function.identity(), (s, t) -> s))
.values());
}
/**
* 枢智版本的逻辑, 不太兼容了暂时先放在这里
*

View File

@ -129,6 +129,7 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen
ProcessActivityDTO dto = new ProcessActivityDTO();
dto.setType(type);
dto.setProcessInstanceId(execution.getProcessInstanceId());
dto.setBusinessKey(execution.getProcessInstanceBusinessKey());
dto.setProcessDefinitionId(execution.getProcessDefinitionId());
// 这个 ID 等于 ExecutionId
dto.setTriggerId(execution.getId());

View File

@ -2,6 +2,8 @@ package cn.axzo.workflow.server.controller.web.bpmn;
import cn.axzo.workflow.client.feign.bpmn.ProcessActivityApi;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import cn.axzo.workflow.core.service.BpmnProcessActivityService;
import cn.axzo.workflow.server.common.annotation.RepeatSubmit;
import cn.azxo.framework.common.model.CommonResponse;
@ -16,6 +18,11 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;
import static cn.axzo.workflow.core.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_HAS_REPEAT;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
/**
* 流程活动相关控制器
@ -56,6 +63,17 @@ public class BpmnProcessActivityController implements ProcessActivityApi {
@Override
@RepeatSubmit
public CommonResponse<Boolean> setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto) {
if (!dto.getServerSideDeduplication()) {
List<String> personIds = new ArrayList<>();
for (BpmnTaskDelegateAssigner assigner : dto.getAssigners()) {
if (personIds.contains(assigner.getPersonId())) {
throw new WorkflowEngineException(ACTIVITY_BIZ_SET_ASSIGNEE_HAS_REPEAT);
}
personIds.add(assigner.getPersonId());
}
} else {
dto.setAssigners(removeDuplicateByPersonId(dto.getAssigners()));
}
bpmnProcessActivityService.setAssignee(dto);
return CommonResponse.success(true);
}

View File

@ -60,7 +60,7 @@ public class BpmnProcessInstanceController implements ProcessInstanceApi {
/**
* 我发起的审批列表
*/
@GetMapping("/page/my")
@PostMapping("/page/my")
@Override
public CommonResponse<BpmPageResult<BpmnProcessInstancePageItemVO>> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto) {
log.info("我发起的审批列表 getOwnTaskPage===>>>参数:{}", JSON.toJSONString(dto));