update - 在编写 1.3.0 的接入文档时,优化接口参数模型,以及处理逻辑
This commit is contained in:
parent
c7dd0da1f4
commit
d8f1a869cc
@ -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);
|
||||
|
||||
/**
|
||||
|
||||
@ -154,7 +154,7 @@ public interface ProcessTaskApi {
|
||||
* 暂停流程任务,并创建机器人节点,等待业务推动
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
* @return 返回机器人节点任务 ID
|
||||
*/
|
||||
@Operation(summary = "创建机器人节点, 暂停流程任务")
|
||||
@PostMapping("/api/process/task/robot/create")
|
||||
|
||||
@ -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", "流程活动节点已取消"),
|
||||
;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -35,6 +35,7 @@ public class BpmnFlowNodeDTO {
|
||||
* 机器人节点操作描述
|
||||
*/
|
||||
@ApiModelProperty(value = "操作描述")
|
||||
@Length(max = 100, message = "操作描述长度不能超过100个字符")
|
||||
private String operationDesc;
|
||||
|
||||
}
|
||||
|
||||
@ -56,5 +56,4 @@ public class BpmnTaskCountersignDTO implements Serializable {
|
||||
@NotNull(message = "加签任务发起人不能为空")
|
||||
private BpmnTaskDelegateAssigner originAssigner;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -45,6 +45,11 @@ public class ProcessActivityDTO implements Serializable {
|
||||
*/
|
||||
private String processDefinitionId;
|
||||
|
||||
/**
|
||||
* 业务的唯一标识
|
||||
*/
|
||||
private String businessKey;
|
||||
|
||||
/**
|
||||
* 如果是"业务节点", 需要业务使用该 id 进行推动流程后续执行
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
/**
|
||||
* 枢智版本的逻辑, 不太兼容了,暂时先放在这里
|
||||
*
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user