Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9381d0c71b | |||
| 4c907394f6 | |||
| 779ff51ffc | |||
| f28b69760e | |||
| efb57e02da | |||
| 06e3d59a0a | |||
| 0526c6d18e | |||
| d8124a67dd | |||
| 1daacaf4b9 | |||
| 7815149d4c | |||
| 791ee00e5f | |||
| 36a09735e3 | |||
| c2055522b3 | |||
| cd7b43e0bd | |||
| 53d99d15f6 | |||
| a80d0c3c18 | |||
| 336dec3bd5 | |||
| fd05e284c8 | |||
| 6e1b1665c9 | |||
| 5792036284 | |||
| 74c4a86f4e | |||
| 3da15cb8e4 | |||
| 916c47a3a6 | |||
|
|
b35e8c0ba0 | ||
|
|
cd5055ecf3 | ||
| 6ca73dc237 | |||
| 7211d400f9 | |||
| 5f1bc815ae | |||
| 75858d7aea | |||
| 480c3b857e | |||
| 28c6c6031c | |||
| 93ad50c2a7 | |||
| c3ccfef057 | |||
| ea70a4a8e8 | |||
| 89364d1f54 | |||
| d43a071f89 | |||
| aeda3ef08b | |||
| a27fbc4696 | |||
| e9d835084f | |||
| 78c9a9b04f | |||
| 8fd3641d41 | |||
| b16ee3cba6 | |||
| 9fda02747f | |||
| 8673273039 | |||
|
|
b42ed0b38c | ||
|
|
c2eb8fde54 | ||
|
|
33ed38f2f9 | ||
|
|
bb0d93cfce | ||
|
|
b939780106 | ||
|
|
b4422c34f0 | ||
|
|
fe86607764 | ||
|
|
f916a1b5e1 | ||
|
|
6b0cd3befd | ||
|
|
adb2c9a46d | ||
|
|
572997a49d | ||
|
|
be8eb0a619 | ||
|
|
1e77d6da33 | ||
|
|
8e287b3f24 | ||
|
|
9f04654d00 | ||
|
|
4610efa3f9 | ||
|
|
f21d2282d4 | ||
| 6fdb3f99ff | |||
| 8eb48df1e5 | |||
| 99b7609d14 | |||
| 1831d01da4 | |||
| 380a8b0d5b | |||
| ca4091d9ac | |||
| 07cecf2962 | |||
| fe1e9a245f | |||
| f8d66181ea | |||
| 159ba5d6ad | |||
| 7c5c21fbbd | |||
| c9bc7d2cb2 | |||
| 86f7f2ba0b | |||
| b3e3652082 | |||
| 8d26d4e300 | |||
| 65b2369b2b | |||
|
|
25b7c72948 | ||
|
|
0ed3545f98 | ||
|
|
6f0e863ed5 | ||
|
|
bcb853b1e7 | ||
|
|
67993d0052 | ||
| bef50d332b | |||
| f36ea20de3 | |||
| 5243b7783e | |||
| 8f28086a1c | |||
| 80659928d1 | |||
| 1caf060e55 | |||
| 81aa5d25a1 | |||
| 3d635a0901 | |||
| 8f451a5a2a | |||
| d6c43ce299 |
2
pom.xml
2
pom.xml
@ -16,7 +16,7 @@
|
|||||||
<name>Workflow Engine</name>
|
<name>Workflow Engine</name>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>1.5.3-SNAPSHOT</revision>
|
<revision>1.5.4-SNAPSHOT</revision>
|
||||||
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
|
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
|
||||||
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
|
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
|
||||||
<axzo-dependencies.org.version>1.0.0-SNAPSHOT</axzo-dependencies.org.version>
|
<axzo-dependencies.org.version>1.0.0-SNAPSHOT</axzo-dependencies.org.version>
|
||||||
|
|||||||
@ -6,10 +6,13 @@ import cn.axzo.workflow.common.annotation.Manageable;
|
|||||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||||
|
import cn.axzo.workflow.common.model.response.form.instance.FormDataVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||||
import cn.azxo.framework.common.model.CommonResponse;
|
import cn.azxo.framework.common.model.CommonResponse;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@ -36,6 +39,7 @@ public interface FormAdminApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取指定审批业务的流程表单设置,
|
* 获取指定审批业务的流程表单设置,
|
||||||
|
*
|
||||||
* @param dto
|
* @param dto
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -55,4 +59,14 @@ public interface FormAdminApi {
|
|||||||
@PostMapping("/api/form/admin/instance/render")
|
@PostMapping("/api/form/admin/instance/render")
|
||||||
@InvokeMode(SYNC)
|
@InvokeMode(SYNC)
|
||||||
CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto);
|
CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定表单审批的实例数据
|
||||||
|
*
|
||||||
|
* @param dto
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("/api/form/admin/instance/form/data")
|
||||||
|
@InvokeMode(SYNC)
|
||||||
|
CommonResponse<List<FormDataVO>> getFormData(@Validated @RequestBody FromDataSearchDTO dto);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,6 +33,7 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
|
|||||||
PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
|
PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
|
||||||
PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
|
PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
|
||||||
PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
|
PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
|
||||||
|
PROCESS_INSTANCE_CREATE_PARAM_ERROR("021", "当前审批业务必须传入叶子节点(CooperationOrgDTO.nodeId)"),
|
||||||
;
|
;
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String message;
|
private final String message;
|
||||||
|
|||||||
@ -41,7 +41,8 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
|
|||||||
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
|
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
|
||||||
REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
|
REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
|
||||||
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
|
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
|
||||||
REMIND_TASK_TOO_MANY("027", "催办任务数据异常")
|
REMIND_TASK_TOO_MANY("027", "催办任务数据异常"),
|
||||||
|
PROCESS_SET_ASSIGNEE_PARAM_ERROR("028", "当前审批业务审批人模型中 NodeId 必传(topNodeId/nodeId均可), 触发 ID: 【{}】"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
|
|||||||
@ -20,6 +20,9 @@ public enum FlowableEngineRespCode implements IModuleRespCode {
|
|||||||
ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"),
|
ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"),
|
||||||
ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"),
|
ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"),
|
||||||
ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"),
|
ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"),
|
||||||
|
ENGINE_POSITION_V2_CONFIG_INVALID("008", "新版本岗位配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||||
|
ENGINE_ROLE_V2_CONFIG_INVALID("009", "新版本角色配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||||
|
ENGINE_IDENTITY_V2_CONFIG_INVALID("009", "新版本身份配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
|
|||||||
@ -22,6 +22,7 @@ public enum OtherRespCode implements IModuleRespCode {
|
|||||||
ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"),
|
ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"),
|
||||||
ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"),
|
ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"),
|
||||||
MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"),
|
MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"),
|
||||||
|
ASSIGNEE_NODE_ID_NOT_EXISTS("010", "审批人 nodeId 不存在, 请检查参数是否正确")
|
||||||
;
|
;
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
|
|||||||
@ -65,6 +65,7 @@ public interface BpmnConstants {
|
|||||||
String FLOW_SERVER_VERSION_130 = "1.3.0";
|
String FLOW_SERVER_VERSION_130 = "1.3.0";
|
||||||
// 1.4.2 开始启用新版本日志
|
// 1.4.2 开始启用新版本日志
|
||||||
String FLOW_SERVER_VERSION_142 = "1.4.2";
|
String FLOW_SERVER_VERSION_142 = "1.4.2";
|
||||||
|
String FLOW_CATEGORY_VERSION = "categoryVersion";
|
||||||
String CONFIG_SIGN = "signConfig";
|
String CONFIG_SIGN = "signConfig";
|
||||||
String CONFIG_NOTICE = "noticeConfig";
|
String CONFIG_NOTICE = "noticeConfig";
|
||||||
String CONFIG_APPROVE = "approveConfig";
|
String CONFIG_APPROVE = "approveConfig";
|
||||||
@ -99,6 +100,15 @@ public interface BpmnConstants {
|
|||||||
String CONFIG_SIGN_APPROVER_ROLE_LIMIT = "roleLimit";
|
String CONFIG_SIGN_APPROVER_ROLE_LIMIT = "roleLimit";
|
||||||
String CONFIG_APPROVER_SCOPE = "approverScope";
|
String CONFIG_APPROVER_SCOPE = "approverScope";
|
||||||
String CONFIG_APPROVER_SPECIFY = "approverSpecify";
|
String CONFIG_APPROVER_SPECIFY = "approverSpecify";
|
||||||
|
String CONFIG_APPROVE_SPECIFY_RANGE = "approverSpecifyRange";
|
||||||
|
String CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE = "approverSpecifyCooperateType";
|
||||||
|
String CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT = "approverSpecifyRangeOrgLimit";
|
||||||
|
String CONFIG_APPROVE_SPECIFY_RANGE_UNIT = "approverSpecifyRangeUnit";
|
||||||
|
String CONFIG_INITIATOR_SPECIFIED_RANGE = "initiatorSpecifiedRange";
|
||||||
|
String CONFIG_INITIATOR_SPECIFIED_FILTER = "initiatorSpecifiedFilter";
|
||||||
|
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES = "excludeIdentityTypes";
|
||||||
|
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES = "excludeCooperateShipTypes";
|
||||||
|
String CONFIG_INITIATOR_LEADER_RANGE_UNIT = "initiatorLeaderRangeUnit";
|
||||||
String CONFIG_APPROVER_MODE_TYPE = "approverModeType";
|
String CONFIG_APPROVER_MODE_TYPE = "approverModeType";
|
||||||
String CONFIG_APPROVER_EMPTY_HANDLE_TYPE = "approverEmptyHandleType";
|
String CONFIG_APPROVER_EMPTY_HANDLE_TYPE = "approverEmptyHandleType";
|
||||||
String CONFIG_ACTIVITY_SIGNATURE = "signature";
|
String CONFIG_ACTIVITY_SIGNATURE = "signature";
|
||||||
@ -111,6 +121,8 @@ public interface BpmnConstants {
|
|||||||
String CONFIG_BUTTON_TYPE_HISTORY = "history";
|
String CONFIG_BUTTON_TYPE_HISTORY = "history";
|
||||||
String CONFIG_BUTTON_TYPE_CARBON_COPY = "carbonCopy";
|
String CONFIG_BUTTON_TYPE_CARBON_COPY = "carbonCopy";
|
||||||
String CONFIG_SIGN_TYPE = "signType";
|
String CONFIG_SIGN_TYPE = "signType";
|
||||||
|
String CONFIG_AREA_FILTER_ENABLE = "areaFilterEnable";
|
||||||
|
String CONFIG_SPECIALTY_FILTER_ENABLE = "specialtyFilterEnable";
|
||||||
String ELEMENT_ATTRIBUTE_NAME = "name";
|
String ELEMENT_ATTRIBUTE_NAME = "name";
|
||||||
String ELEMENT_ATTRIBUTE_VALUE = "value";
|
String ELEMENT_ATTRIBUTE_VALUE = "value";
|
||||||
String ELEMENT_ATTRIBUTE_DESC = "desc";
|
String ELEMENT_ATTRIBUTE_DESC = "desc";
|
||||||
@ -122,6 +134,7 @@ public interface BpmnConstants {
|
|||||||
String ELEMENT_ATTRIBUTE_TYPE = "type";
|
String ELEMENT_ATTRIBUTE_TYPE = "type";
|
||||||
String ELEMENT_ATTRIBUTE_ORG_LIMIT = "orgLimit";
|
String ELEMENT_ATTRIBUTE_ORG_LIMIT = "orgLimit";
|
||||||
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY = "approverSpecify";
|
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY = "approverSpecify";
|
||||||
|
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY_RANGE = "approverSpecifyRange";
|
||||||
String START_EVENT_ID = "startEventNode";
|
String START_EVENT_ID = "startEventNode";
|
||||||
String SEQUENCE_FLOW_ID = "SequenceFlowId";
|
String SEQUENCE_FLOW_ID = "SequenceFlowId";
|
||||||
String END_EVENT_ID = "endEventNode";
|
String END_EVENT_ID = "endEventNode";
|
||||||
|
|||||||
@ -8,23 +8,36 @@ package cn.axzo.workflow.common.enums;
|
|||||||
*/
|
*/
|
||||||
public enum ApproverSpecifyEnum {
|
public enum ApproverSpecifyEnum {
|
||||||
|
|
||||||
position("position", "指定岗位"),
|
position("position", "指定岗位", 1),
|
||||||
role("role", "指定角色"),
|
role("role", "指定角色", 1),
|
||||||
identity("identity", "指定身份"),
|
identity("identity", "指定身份", 1),
|
||||||
initiatorLeader("initiatorLeader", "发起人主管"),
|
initiatorLeader("initiatorLeader", "发起人主管", 1),
|
||||||
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管"),
|
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管", 1),
|
||||||
fixedPerson("fixedPerson", "固定人员"),
|
fixedPerson("fixedPerson", "固定人员", 1),
|
||||||
preNodeSpecified("preNodeSpecified", "上级节点指定"),
|
preNodeSpecified("preNodeSpecified", "上级节点指定", 1),
|
||||||
initiatorSpecified("initiatorSpecified", "发起时指定"),
|
initiatorSpecified("initiatorSpecified", "发起时指定", 1),
|
||||||
// 该枚举,目前主要为了区别签署业务与审批业务的不同配法,选择该项时,意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
|
// 该枚举,目前主要为了区别签署业务与审批业务的不同配法,选择该项时,意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
|
||||||
signerRelated("signerRelated", "签署人相关组织"),
|
signerRelated("signerRelated", "签署人相关组织", 1),
|
||||||
|
|
||||||
|
// 新配置规则的审批人指定方式
|
||||||
|
position_v2("position_v2", "指定岗位", 2),
|
||||||
|
role_v2("role_v2", "指定角色", 2),
|
||||||
|
identity_v2("identity_v2", "指定身份", 2),
|
||||||
|
initiatorSpecified_v2("initiatorSpecified_v2", "发起人自选", 2),
|
||||||
|
initiator_v2("initiator_v2", "发起人自己", 2),
|
||||||
|
initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
|
||||||
|
fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
|
||||||
|
preAllNodApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
|
||||||
;
|
;
|
||||||
|
|
||||||
private String type;
|
private String type;
|
||||||
private String desc;
|
private String desc;
|
||||||
|
private Integer version;
|
||||||
|
|
||||||
ApproverSpecifyEnum(String type, String desc) {
|
ApproverSpecifyEnum(String type, String desc, Integer version) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
|
this.version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
@ -42,4 +55,12 @@ public enum ApproverSpecifyEnum {
|
|||||||
public void setDesc(String desc) {
|
public void setDesc(String desc) {
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(Integer version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,41 @@
|
|||||||
|
package cn.axzo.workflow.common.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审批人指定的二次范围限定枚举
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-13 14:32
|
||||||
|
*/
|
||||||
|
public enum ApproverSpecifyRangeEnum {
|
||||||
|
|
||||||
|
within_the_project("within_the_project", "项目内岗位"),
|
||||||
|
within_the_project_construction_units("within_the_project_construction_units", "项目内参建单位的企业岗位"),
|
||||||
|
specified_org("specified_org", "审批单指定的末级组织"),
|
||||||
|
initiator("initiator", "审批单发起人"),
|
||||||
|
pre_node_approver("pre_node_approver", "上节点审批人"),
|
||||||
|
;
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
private String desc;
|
||||||
|
|
||||||
|
ApproverSpecifyRangeEnum(String type, String desc) {
|
||||||
|
this.type = type;
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDesc(String desc) {
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
package cn.axzo.workflow.common.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审批人指定的范围“单位”枚举
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-13 15:05
|
||||||
|
*/
|
||||||
|
public enum ApproverSpecifyRangeUnitEnum {
|
||||||
|
in_project("in_project", "项目内", null),
|
||||||
|
in_ent("in_ent", "企业内", null),
|
||||||
|
in_group_lv_1("in_group_lv_1", "集团岗位,上一级", 1),
|
||||||
|
in_group_lv_2("in_group_lv_2", "集团岗位,上二级", 2),
|
||||||
|
in_group_lv_3("in_group_lv_3", "集团岗位,上三级", 3),
|
||||||
|
in_group_lv_4("in_group_lv_4", "集团岗位,上四级", 4),
|
||||||
|
in_group_lv_top("in_group_lv_top", "集团岗位,总公司", Integer.MAX_VALUE),
|
||||||
|
UNKNOWN("UNKNOWN", "未知范围", null)
|
||||||
|
;
|
||||||
|
private final String type;
|
||||||
|
private final String desc;
|
||||||
|
private final Integer value;
|
||||||
|
|
||||||
|
ApproverSpecifyRangeUnitEnum(String type, String desc, Integer value) {
|
||||||
|
this.type = type;
|
||||||
|
this.desc = desc;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
package cn.axzo.workflow.common.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参建单位类型枚举
|
||||||
|
* <p>
|
||||||
|
* 拷贝自 cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-13 14:51
|
||||||
|
*/
|
||||||
|
public enum CooperateShipTypeEnum {
|
||||||
|
PROJ_PRIMARY_CONTRACTING_UNIT(1, "施工总承包"),
|
||||||
|
PROJ_CONSTRUCTION_UNIT(2, "建设单位"),
|
||||||
|
PROJ_SUPERVISION_UNIT(3, "监理单位"),
|
||||||
|
PROJ_LABOR_SUBCONTRACTING(4, "劳务分包"),
|
||||||
|
PROJ_PROFESSIONAL_SUBCONTRACTING(5, "专业承包"),
|
||||||
|
OMS(6, "OMS"),
|
||||||
|
ENT_COMMON(7, "企业通用"),
|
||||||
|
ENT_TEAM(8, "企业内班组"),
|
||||||
|
PROJ_TEAM(9, "项目内班组"),
|
||||||
|
ENT_GROUP(10, "企业内小组"),
|
||||||
|
PROJ_GROUP(11, "项目内小组"),
|
||||||
|
SURVEY_UNIT(12, "地勘单位"),
|
||||||
|
DESIGN_UNIT(13, "设计单位"),
|
||||||
|
OTHER(30, "其他");
|
||||||
|
|
||||||
|
private final Integer code;
|
||||||
|
private final String desc;
|
||||||
|
|
||||||
|
CooperateShipTypeEnum(Integer code, String desc) {
|
||||||
|
this.code = code;
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,143 @@
|
|||||||
|
package cn.axzo.workflow.common.enums;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.model.dto.AmountFieldDTO;
|
||||||
|
import cn.axzo.workflow.common.model.dto.ContactsPersonDTO;
|
||||||
|
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程引擎表单字段类型枚举
|
||||||
|
* <p>
|
||||||
|
* 参考文档:{@see https://alidocs.dingtalk.com/i/nodes/ZgpG2NdyVXKy17o6fQ5nKGvMWMwvDqPk}
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-04 11:44
|
||||||
|
*/
|
||||||
|
public enum FormFieldTypeEnum {
|
||||||
|
input("input", "文本", new TypeReference<String>() {
|
||||||
|
}),
|
||||||
|
textarea("textarea", "多行文本", new TypeReference<String>() {
|
||||||
|
}),
|
||||||
|
upload("upload", "上传文件", new TypeReference<List<UploadFieldDTO>>() {
|
||||||
|
}),
|
||||||
|
image("image", "图片", new TypeReference<List<UploadFieldDTO>>() {
|
||||||
|
}),
|
||||||
|
date("date", "日期", new TypeReference<String>() {
|
||||||
|
}),
|
||||||
|
customComponent("customComponent", "自定义组件", new TypeReference<List<Map<String, Object>>>() {
|
||||||
|
}),
|
||||||
|
taskOrder("taskOrder", "任务顺序", new TypeReference<Map<String, Object>>() {
|
||||||
|
}),
|
||||||
|
rectifyOrder("rectifyOrder", "整改顺序", new TypeReference<Map<String, Object>>() {
|
||||||
|
}),
|
||||||
|
changeSignatureOrder("changeSignatureOrder", "变更签署顺序", new TypeReference<Map<String, Object>>() {
|
||||||
|
}),
|
||||||
|
contacts("contacts", "联系人", new TypeReference<List<ContactsPersonDTO>>() {
|
||||||
|
}),
|
||||||
|
amount("amount", "金额", new TypeReference<AmountFieldDTO>() {
|
||||||
|
}),
|
||||||
|
decimal("decimal", "小数", new TypeReference<Map<String, Object>>() {
|
||||||
|
}),
|
||||||
|
;
|
||||||
|
|
||||||
|
private final String type;
|
||||||
|
private final String desc;
|
||||||
|
private final TypeReference<?> typeReference;
|
||||||
|
|
||||||
|
FormFieldTypeEnum(String type, String desc, TypeReference<?> typeReference) {
|
||||||
|
this.type = type;
|
||||||
|
this.desc = desc;
|
||||||
|
this.typeReference = typeReference;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypeReference<?> getTypeReference() {
|
||||||
|
return typeReference;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FormFieldTypeEnum valueOfType(String type) {
|
||||||
|
return Arrays.stream(FormFieldTypeEnum.values())
|
||||||
|
.filter(i -> Objects.equals(i.getType(), type))
|
||||||
|
.findAny()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object parseValue(String type, Object fieldValue, Map<String, Object> fieldParams) {
|
||||||
|
FormFieldTypeEnum fieldType = valueOfType(type);
|
||||||
|
if (fieldType == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
TypeReference<?> typeReference = fieldType.getTypeReference();
|
||||||
|
if (typeReference == null || typeReference.getType() == null) {
|
||||||
|
return fieldValue;
|
||||||
|
}
|
||||||
|
if (fieldValue == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
try {
|
||||||
|
// 如果已经是目标类型,直接返回
|
||||||
|
if (objectMapper.constructType(typeReference.getType()).getRawClass().isInstance(fieldValue)) {
|
||||||
|
return fieldValue;
|
||||||
|
}
|
||||||
|
// 先转为字符串再反序列化
|
||||||
|
String json = fieldValue.toString();
|
||||||
|
if (!(fieldValue instanceof String)) {
|
||||||
|
json = objectMapper.writeValueAsString(fieldValue);
|
||||||
|
}
|
||||||
|
Object defaultValue = handleDefault(fieldParams, json, fieldType);
|
||||||
|
if (Objects.nonNull(defaultValue)) {
|
||||||
|
return fieldValue;
|
||||||
|
}
|
||||||
|
if (Objects.equals(type, "decimal")) {
|
||||||
|
// 特殊处理 decimal 类型,确保返回的 Map 包含 unit 字段
|
||||||
|
Map<String, Object> decimalMap = new HashMap<>();
|
||||||
|
decimalMap.put("value", fieldValue);
|
||||||
|
decimalMap.put("unit", fieldParams.getOrDefault("unit", ""));
|
||||||
|
return decimalMap;
|
||||||
|
}
|
||||||
|
return objectMapper.readValue(json, typeReference);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("字段值解析失败: " + fieldValue, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object handleDefault(Map<String, Object> fieldParams, String json, FormFieldTypeEnum fieldType) {
|
||||||
|
if (Objects.equals("[]", json)) {
|
||||||
|
switch (fieldType) {
|
||||||
|
case upload:
|
||||||
|
case image:
|
||||||
|
case customComponent:
|
||||||
|
case taskOrder:
|
||||||
|
case rectifyOrder:
|
||||||
|
case changeSignatureOrder:
|
||||||
|
case contacts:
|
||||||
|
// 对于这些类型,返回空列表而不是空字符串
|
||||||
|
return Collections.emptyList();
|
||||||
|
case decimal:
|
||||||
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
|
map.put("value", 0);
|
||||||
|
map.put("unit", fieldParams.getOrDefault("unit", ""));
|
||||||
|
return map;
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package cn.axzo.workflow.common.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新版配置下的发起人自选的范围限定枚举
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-13 15:13
|
||||||
|
*/
|
||||||
|
public enum InitiatorSpecifiedRangeEnum {
|
||||||
|
self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
|
||||||
|
self_in_project("self_in_project", "项目内本组织所有成员"),
|
||||||
|
in_project("in_project", "项目内所有成员"),
|
||||||
|
in_ent("in_ent", "企业内所有成员"),
|
||||||
|
;
|
||||||
|
private final String type;
|
||||||
|
private final String desc;
|
||||||
|
|
||||||
|
InitiatorSpecifiedRangeEnum(String type, String desc) {
|
||||||
|
this.type = type;
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,6 +17,8 @@ public enum SignApproverOrgLimitEnum {
|
|||||||
LV_4("LV_4", "上4级组织", 4),
|
LV_4("LV_4", "上4级组织", 4),
|
||||||
LV_5("LV_5", "上5级组织", 5),
|
LV_5("LV_5", "上5级组织", 5),
|
||||||
LV_ALL("LV_ALL", "所有组织", -1),
|
LV_ALL("LV_ALL", "所有组织", -1),
|
||||||
|
LV_TOP("LV_TOP", "顶层组织", Integer.MAX_VALUE),
|
||||||
|
UNKNOWN("UNKNOWN", "未知层级", null)
|
||||||
;
|
;
|
||||||
|
|
||||||
private final String type;
|
private final String type;
|
||||||
|
|||||||
@ -11,6 +11,10 @@ import lombok.Data;
|
|||||||
@Data
|
@Data
|
||||||
public class NextNodePreCheckAlterDTO {
|
public class NextNodePreCheckAlterDTO {
|
||||||
|
|
||||||
|
private String processDefinitionKey;
|
||||||
|
|
||||||
|
private String processDefinitionName;
|
||||||
|
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
|
|
||||||
private String activityId;
|
private String activityId;
|
||||||
|
|||||||
@ -12,6 +12,11 @@ import java.util.Date;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class AlterDTO {
|
public class AlterDTO {
|
||||||
|
|
||||||
|
private String processDefinitionKey;
|
||||||
|
|
||||||
|
private String processDefinitionName;
|
||||||
|
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
|
|
||||||
private String activityId;
|
private String activityId;
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package cn.axzo.workflow.common.model.dto;
|
package cn.axzo.workflow.common.model.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -15,6 +16,7 @@ import lombok.NoArgsConstructor;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public class ContactsPersonDTO {
|
public class ContactsPersonDTO {
|
||||||
/**
|
/**
|
||||||
* xx:xx:xx
|
* xx:xx:xx
|
||||||
|
|||||||
@ -23,6 +23,22 @@ import java.util.List;
|
|||||||
@Builder
|
@Builder
|
||||||
public class CooperationOrgDTO implements Serializable {
|
public class CooperationOrgDTO implements Serializable {
|
||||||
private static final long serialVersionUID = 4739924705980062997L;
|
private static final long serialVersionUID = 4739924705980062997L;
|
||||||
|
/**
|
||||||
|
* 叶子节点ID(末级节点),仅限用于新的项目配置模式
|
||||||
|
* <p>
|
||||||
|
* 该参数的用意是基于组织架构的一条线审批,而叶子节点则是为了确认最底层,人岗架会基于 nodeId 向上推出“线”的范围。
|
||||||
|
*/
|
||||||
|
private Long nodeId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于人权事的,指定某些管理管辖人员
|
||||||
|
*/
|
||||||
|
private List<String> includeAreaCodes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于人权事的,指定专业管辖人员
|
||||||
|
*/
|
||||||
|
private List<String> includeSpecialtyCodes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 企业组织架构范围
|
* 企业组织架构范围
|
||||||
|
|||||||
@ -22,5 +22,6 @@ import java.io.Serializable;
|
|||||||
public class TermNodeAddTimerJobDTO implements Serializable {
|
public class TermNodeAddTimerJobDTO implements Serializable {
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
private String activityId;
|
private String activityId;
|
||||||
private String timeCycle;
|
private Integer delayTime;
|
||||||
|
private String timeUnit;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,12 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
|||||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
||||||
|
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
|
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
@ -52,6 +57,43 @@ public class BpmnJsonNodeProperty {
|
|||||||
@NotBlank(message = "审批人指定不能为空")
|
@NotBlank(message = "审批人指定不能为空")
|
||||||
private ApproverSpecifyEnum approverSpecify;
|
private ApproverSpecifyEnum approverSpecify;
|
||||||
|
|
||||||
|
//*************** 针对新配置中的岗位、角色、身份的扩展配置 Start ****************
|
||||||
|
@ApiModelProperty(value = "任务节点:对选择的 approverSpecify 做的二次范围限定配置")
|
||||||
|
private ApproverSpecifyRangeEnum approverSpecifyRange;
|
||||||
|
/**
|
||||||
|
* cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为positions_within_the_project_construction_units,做的二次范围限定配置的级联选择")
|
||||||
|
private CooperateShipTypeEnum cooperateShipType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为specified_org,做的二次范围限定配置的级联选择的值")
|
||||||
|
private SignApproverOrgLimitEnum approverSpecifyRangeOrgLimit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 该属性,当 approverSpecify = initiatorLeader_v2 时,也会被应用为限定单位内主管还是项目内主管
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为specified_org,做的二次范围限定配置的级联选择的值")
|
||||||
|
private ApproverSpecifyRangeUnitEnum approverSpecifyRangeUnit;
|
||||||
|
|
||||||
|
//*************** 针对新配置中的岗位、角色、身份的扩展配置 End ****************
|
||||||
|
|
||||||
|
//*************** approverSpecify 为 initiatorSpecified_v2 发起人自选时的一些扩展配置 Start ****************
|
||||||
|
@ApiModelProperty(value = "任务节点: 当选择approverSpecify的值为 initiatorSpecified_v2,做的范围选择的值")
|
||||||
|
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
|
||||||
|
@ApiModelProperty(value = "是否开起发起人的筛选策略")
|
||||||
|
private Boolean initiatorSpecifiedFilter;
|
||||||
|
/**
|
||||||
|
* 需要排除的身份类型
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "需要排除的身份类型")
|
||||||
|
private List<String> excludeIdentityTypes;
|
||||||
|
/**
|
||||||
|
* 需要排查的参建单位类型
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "需要排除的参建单位类型")
|
||||||
|
private List<String> excludeCooperateShipTypes;
|
||||||
|
//*************** approverSpecify 为 initiatorSpecified_v2 发起人自选时的一些扩展配置 End ****************
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 签署确认节点的审批人限定规则
|
* 签署确认节点的审批人限定规则
|
||||||
*/
|
*/
|
||||||
@ -147,7 +189,7 @@ public class BpmnJsonNodeProperty {
|
|||||||
|
|
||||||
//************* 抄送节点Start **************//
|
//************* 抄送节点Start **************//
|
||||||
/**
|
/**
|
||||||
* 抄送节点配置
|
* 抄送节点配置,(老的配置)
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "抄送节点: 多组配置,最多五组")
|
@ApiModelProperty(value = "抄送节点: 多组配置,最多五组")
|
||||||
private List<BpmnCarbonCopyConf> carbonCopyConf;
|
private List<BpmnCarbonCopyConf> carbonCopyConf;
|
||||||
@ -159,4 +201,16 @@ public class BpmnJsonNodeProperty {
|
|||||||
@ApiModelProperty(value = "表单字段权限控制")
|
@ApiModelProperty(value = "表单字段权限控制")
|
||||||
private List<FormPermissionMetaInfo> fieldPermission;
|
private List<FormPermissionMetaInfo> fieldPermission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 区域过滤开关
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "区域过滤开关", notes = "true: 开启区域过滤, false: 关闭区域过滤")
|
||||||
|
private Boolean areaFilterEnable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业过滤开关
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "专业过滤开关", notes = "true: 开启专业过滤, false: 关闭专业过滤")
|
||||||
|
private Boolean specialtyFilterEnable;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程关联文档搜索入参模型
|
* 流程关联文档搜索入参模型
|
||||||
*
|
*
|
||||||
@ -22,6 +24,7 @@ public class DocQueryDTO {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例 ID
|
* 流程实例 ID
|
||||||
|
* 该参数与 processDefinitionKey 二选一, 如果有值,则优先使用实例 ID,仅查询实例下使用的文档
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "流程实例 ID")
|
@ApiModelProperty(value = "流程实例 ID")
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
@ -32,6 +35,13 @@ public class DocQueryDTO {
|
|||||||
@ApiModelProperty(value = "流程定义 KEY(业务 ID)")
|
@ApiModelProperty(value = "流程定义 KEY(业务 ID)")
|
||||||
private String processDefinitionKey;
|
private String processDefinitionKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义 KEY 列表(业务 ID 列表)
|
||||||
|
* 当选择使用 processDefinitionKey/s 时,则查询模板对应默认的文档列表
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "流程定义 KEY 列表(业务 ID 列表)")
|
||||||
|
private List<String> processDefinitionKeys;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 租户 ID,对应工作台 ID
|
* 租户 ID,对应工作台 ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -240,9 +240,15 @@ public class BpmnTaskDelegateAssigner extends BaseBpmnTaskDelegateAssigner imple
|
|||||||
public Long parsePersonId() {
|
public Long parsePersonId() {
|
||||||
if (NumberUtils.isDigits(personId)) {
|
if (NumberUtils.isDigits(personId)) {
|
||||||
return Long.parseLong(personId);
|
return Long.parseLong(personId);
|
||||||
} else {
|
|
||||||
return 0L;
|
|
||||||
}
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long parseNodeId() {
|
||||||
|
if (NumberUtils.isDigits(nodeId)) {
|
||||||
|
return Long.parseLong(nodeId);
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|||||||
@ -87,4 +87,10 @@ public class CategoryCreateDTO {
|
|||||||
@ApiModelProperty(value = "是否展示在发起工作台,默认为false")
|
@ApiModelProperty(value = "是否展示在发起工作台,默认为false")
|
||||||
private Boolean displayInitiateMenu = false;
|
private Boolean displayInitiateMenu = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 版本号
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "版本号")
|
||||||
|
private Integer version;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义分类的查询入参模型
|
* 自定义分类的查询入参模型
|
||||||
*/
|
*/
|
||||||
@ -31,6 +33,11 @@ public class CategorySearchDTO extends BpmPageParam {
|
|||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "字典值", example = "new_business")
|
@ApiModelProperty(value = "字典值", example = "new_business")
|
||||||
private String value;
|
private String value;
|
||||||
|
/**
|
||||||
|
* 字典类型列表, bpm_model_category
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "字典值列表", example = "[\"new_business\", \"another_business\"]")
|
||||||
|
private List<String> values;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典状态, 0 停用, 1 启用
|
* 字典状态, 0 停用, 1 启用
|
||||||
@ -44,6 +51,12 @@ public class CategorySearchDTO extends BpmPageParam {
|
|||||||
@ApiModelProperty(value = "工作台类型值, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台")
|
@ApiModelProperty(value = "工作台类型值, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台")
|
||||||
private String workspaceTypeCode;
|
private String workspaceTypeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工作台类型值列表, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "工作台类型值列表, 1企业工作台 2项目部工作台 3政务监管工作台 6OMS工作台")
|
||||||
|
private List<String> workspaceTypeCodes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 租户 ID
|
* 租户 ID
|
||||||
*/
|
*/
|
||||||
@ -55,6 +68,11 @@ public class CategorySearchDTO extends BpmPageParam {
|
|||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "业务类型")
|
@ApiModelProperty(value = "业务类型")
|
||||||
private BusinessTypeEnum businessType;
|
private BusinessTypeEnum businessType;
|
||||||
|
/**
|
||||||
|
* 业务类型列表
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "业务类型列表")
|
||||||
|
private List<BusinessTypeEnum> businessTypes;
|
||||||
|
|
||||||
@ApiModelProperty(value = "根据创建时间排序")
|
@ApiModelProperty(value = "根据创建时间排序")
|
||||||
private String orderCreateAt;
|
private String orderCreateAt;
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
package cn.axzo.workflow.common.model.request.form.instance;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单数据搜索入参模型
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-07-29 14:33
|
||||||
|
*/
|
||||||
|
@ApiModel("表单数据搜索入参模型")
|
||||||
|
@Data
|
||||||
|
public class FromDataSearchDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例 ID
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "流程实例ID")
|
||||||
|
@NotBlank(message = "流程实例 ID 不能为空")
|
||||||
|
private String processInstanceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务 ID, 获取指定任务绑定的表单数据时使用,一般不传值,获取最新的表单数据即可
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "任务 ID")
|
||||||
|
private String taskId;
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
|||||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
@ -12,6 +13,8 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发起流程前的节点列表中每个节点的模型配置信息
|
* 发起流程前的节点列表中每个节点的模型配置信息
|
||||||
*
|
*
|
||||||
@ -57,10 +60,41 @@ public class BpmnNodeConfigVO {
|
|||||||
* fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型,则该节点下的人,会默认回显至该上级模型属性中
|
* fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型,则该节点下的人,会默认回显至该上级模型属性中
|
||||||
* initiatorLeader("initiatorLeader", "发起人主管"),
|
* initiatorLeader("initiatorLeader", "发起人主管"),
|
||||||
* initiatorSpecified("initiatorSpecified", "发起人自选"),
|
* initiatorSpecified("initiatorSpecified", "发起人自选"),
|
||||||
|
* <p>
|
||||||
|
* // 新配置规则的审批人指定方式
|
||||||
|
* position_v2("position_v2", "指定岗位", 2),
|
||||||
|
* role_v2("role_v2", "指定角色", 2),
|
||||||
|
* identity_v2("identity_v2", "指定身份", 2),
|
||||||
|
* initiatorSpecified_v2("initiatorSpecified_v2", "发起人自选", 2),
|
||||||
|
* initiator_v2("initiator_v2", "发起人自己", 2),
|
||||||
|
* initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
|
||||||
|
* fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
|
||||||
|
* pre_all_node_approver_v2("pre_all_node_approver_v2", "所有前序节点审批人", 2),
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "审批人指定")
|
@ApiModelProperty(value = "审批人指定")
|
||||||
private ApproverSpecifyEnum approverSpecifyEnum;
|
private ApproverSpecifyEnum approverSpecifyEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
|
||||||
|
* self_in_project("self_in_project", "项目内本组织所有成员"),
|
||||||
|
* in_project("in_project", "项目内所有成员"),
|
||||||
|
* in_ent("in_ent", "企业内所有成员"),
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyEnum的值为 initiatorSpecified_v2,做的范围选择的值")
|
||||||
|
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开起发起人的筛选策略")
|
||||||
|
private Boolean initiatorSpecifiedFilter;
|
||||||
|
/**
|
||||||
|
* 需要排除的身份类型
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "需要排除的身份类型")
|
||||||
|
private List<String> excludeIdentityTypes;
|
||||||
|
/**
|
||||||
|
* 需要排查的参建单位类型
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "需要排除的参建单位类型")
|
||||||
|
private List<String> excludeCooperateShipTypes;
|
||||||
/**
|
/**
|
||||||
* 审批人为空时的处理方式
|
* 审批人为空时的处理方式
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@ -44,6 +44,9 @@ public class CategoryItemVO {
|
|||||||
@ApiModelProperty(value = "是否展示在发起工作台")
|
@ApiModelProperty(value = "是否展示在发起工作台")
|
||||||
private Boolean displayInitiateMenu;
|
private Boolean displayInitiateMenu;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "版本号")
|
||||||
|
private Integer version;
|
||||||
|
|
||||||
@ApiModelProperty(value = "更新时间")
|
@ApiModelProperty(value = "更新时间")
|
||||||
private Date updateAt;
|
private Date updateAt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,6 +75,11 @@ public class ProcessInstanceDocumentVO {
|
|||||||
*/
|
*/
|
||||||
private String initiatorName;
|
private String initiatorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起人模型 JSON 字符串
|
||||||
|
*/
|
||||||
|
private String initiatorJsonStr;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 实例对应的流程引擎服务端迭代版本
|
* 实例对应的流程引擎服务端迭代版本
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -0,0 +1,44 @@
|
|||||||
|
package cn.axzo.workflow.common.model.response.form.instance;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.enums.FormFieldTypeEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单实例数据的响应模型
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-04 10:54
|
||||||
|
*/
|
||||||
|
@ApiModel("表单实例数据的响应模型")
|
||||||
|
@Data
|
||||||
|
public class FormDataVO {
|
||||||
|
private String fieldId;
|
||||||
|
|
||||||
|
private Object fieldValue;
|
||||||
|
|
||||||
|
private FormFieldTypeEnum fieldType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字表单组件的格式化值:数字+单位
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Object getFormatDecimalValue() {
|
||||||
|
switch (fieldType) {
|
||||||
|
case decimal:
|
||||||
|
Map<String, Object> decimalMap = (Map<String, Object>) fieldValue;
|
||||||
|
Object value = decimalMap.getOrDefault("value", "");
|
||||||
|
if (Objects.isNull(value)) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return value + "" + decimalMap.getOrDefault("unit", "");
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return fieldValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,12 @@
|
|||||||
package cn.axzo.workflow.core.common.utils;
|
package cn.axzo.workflow.core.common.utils;
|
||||||
|
|
||||||
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
|
import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||||
@ -10,9 +15,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
|
|||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
|
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
|
||||||
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
|
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
|
||||||
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
|
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
|
||||||
@ -100,6 +103,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||||
@ -120,13 +124,24 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAG
|
|||||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
|
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
|
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY;
|
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValue;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
|
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getUpgradeApprovalConf;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BPMN json 格式转换工具
|
* BPMN json 格式转换工具
|
||||||
@ -182,11 +197,12 @@ public final class BpmnJsonConverterUtil {
|
|||||||
/**
|
/**
|
||||||
* 将 json 格式数据转的 BpmnJsonNode 对象,转换成 Flowable 标准的模型 {@link BpmnModel}
|
* 将 json 格式数据转的 BpmnJsonNode 对象,转换成 Flowable 标准的模型 {@link BpmnModel}
|
||||||
*
|
*
|
||||||
* @param bpmnJsonNode json 格式对象,可以直接解析
|
* @param bpmnJsonNode json 格式对象,可以直接解析
|
||||||
* @param approveConf 流程高审批相关高级配置
|
* @param approveConf 流程高审批相关高级配置
|
||||||
* @param noticeConf
|
* @param noticeConf
|
||||||
* @param buttonConf
|
* @param buttonConf
|
||||||
* @param fieldConf
|
* @param fieldConf
|
||||||
|
* @param categoryVersion 用于区分新老版本配置
|
||||||
* @return {@link BpmnModel}
|
* @return {@link BpmnModel}
|
||||||
*/
|
*/
|
||||||
public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
|
public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
|
||||||
@ -197,7 +213,8 @@ public final class BpmnJsonConverterUtil {
|
|||||||
BpmnNoticeConf noticeConf,
|
BpmnNoticeConf noticeConf,
|
||||||
BpmnButtonConf buttonConf,
|
BpmnButtonConf buttonConf,
|
||||||
List<BpmnFieldConf> fieldConf,
|
List<BpmnFieldConf> fieldConf,
|
||||||
String serverVersionStr) {
|
String serverVersionStr,
|
||||||
|
Integer categoryVersion) {
|
||||||
if (Objects.isNull(bpmnJsonNode)) {
|
if (Objects.isNull(bpmnJsonNode)) {
|
||||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "JSON 数据为空");
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "JSON 数据为空");
|
||||||
}
|
}
|
||||||
@ -209,16 +226,21 @@ public final class BpmnJsonConverterUtil {
|
|||||||
ExtensionAttribute serverVersion = new ExtensionAttribute();
|
ExtensionAttribute serverVersion = new ExtensionAttribute();
|
||||||
serverVersion.setName(FLOW_SERVER_VERSION);
|
serverVersion.setName(FLOW_SERVER_VERSION);
|
||||||
serverVersion.setValue(serverVersionStr);
|
serverVersion.setValue(serverVersionStr);
|
||||||
|
ExtensionAttribute categoryVersionAttr = new ExtensionAttribute();
|
||||||
|
categoryVersionAttr.setName(FLOW_CATEGORY_VERSION);
|
||||||
|
categoryVersionAttr.setValue(String.valueOf(categoryVersion));
|
||||||
ExtensionAttribute jsonMetaValue = new ExtensionAttribute();
|
ExtensionAttribute jsonMetaValue = new ExtensionAttribute();
|
||||||
jsonMetaValue.setName(FLOW_NODE_JSON);
|
jsonMetaValue.setName(FLOW_NODE_JSON);
|
||||||
jsonMetaValue.setValue(JSONUtil.toJsonStr(bpmnJsonNode));
|
jsonMetaValue.setValue(JSONUtil.toJsonStr(bpmnJsonNode));
|
||||||
|
|
||||||
|
|
||||||
Process mainProcess = new Process();
|
Process mainProcess = new Process();
|
||||||
mainProcess.setId(id);
|
mainProcess.setId(id);
|
||||||
mainProcess.setName(name);
|
mainProcess.setName(name);
|
||||||
mainProcess.setDocumentation(documentation);
|
mainProcess.setDocumentation(documentation);
|
||||||
mainProcess.addAttribute(modelType);
|
mainProcess.addAttribute(modelType);
|
||||||
mainProcess.addAttribute(serverVersion);
|
mainProcess.addAttribute(serverVersion);
|
||||||
|
mainProcess.addAttribute(categoryVersionAttr);
|
||||||
mainProcess.addAttribute(jsonMetaValue);
|
mainProcess.addAttribute(jsonMetaValue);
|
||||||
|
|
||||||
//设置流程审批相关高级配置
|
//设置流程审批相关高级配置
|
||||||
@ -768,7 +790,7 @@ public final class BpmnJsonConverterUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
|
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
|
||||||
Process process, String formKey) {
|
Process process, String formKey) {
|
||||||
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
|
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
|
||||||
FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
|
FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
|
||||||
if (Objects.nonNull(bpmnJsonNode)) {
|
if (Objects.nonNull(bpmnJsonNode)) {
|
||||||
@ -812,24 +834,32 @@ public final class BpmnJsonConverterUtil {
|
|||||||
String content = new String(bytes, StandardCharsets.UTF_8);
|
String content = new String(bytes, StandardCharsets.UTF_8);
|
||||||
|
|
||||||
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
|
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
|
||||||
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.SIGN, "id", "测试", "test-form", "remark",
|
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.FLOWABLE, "id", "测试", "test-form", "remark",
|
||||||
model.getJsonModel().getApproveConf(),
|
model.getJsonModel().getApproveConf(),
|
||||||
model.getJsonModel().getSignConf(),
|
model.getJsonModel().getSignConf(),
|
||||||
model.getJsonModel().getNoticeConf(),
|
model.getJsonModel().getNoticeConf(),
|
||||||
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
|
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
|
||||||
"1.3.1-SNAPSHOT");
|
"1.3.1-SNAPSHOT",
|
||||||
|
2);
|
||||||
|
|
||||||
getNoticeConfig(bpmnModel.getMainProcess());
|
getNoticeConfig(bpmnModel.getMainProcess());
|
||||||
getSignConfig(bpmnModel.getMainProcess());
|
getSignConfig(bpmnModel.getMainProcess());
|
||||||
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
|
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
|
||||||
|
|
||||||
FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
|
FlowElement flowElement = bpmnModel.getFlowElement("node_779068202795_ltht");
|
||||||
Optional<BpmnUpgradeApprovalConf> upgradeApprovalConf = getUpgradeApprovalConf(flowElement);
|
Optional<InitiatorSpecifiedRangeEnum> initiatorSpecifyRange = getInitiatorSpecifyRange(flowElement);
|
||||||
// Optional<BpmnSignApproverLimit> signApproverLimit = getSignApproverLimit(flowElement);
|
Optional<Boolean> initiatorSpecifiedFilter = getInitiatorSpecifiedFilter(flowElement);
|
||||||
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
|
Optional<List<String>> excludeIdentityTypes = getExcludeIdentityTypes(flowElement);
|
||||||
// Optional<List<BpmnCarbonCopyConf>> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
|
Optional<List<String>> excludeCooperateShipTypes = getExcludeCooperateShipTypes(flowElement);
|
||||||
// (serviceTask);
|
Optional<Integer> categoryVersion = getCategoryVersion(bpmnModel.getMainProcess());
|
||||||
|
Optional<ApproverSpecifyRangeEnum> approverSpecifyRange = getApproverSpecifyRange(flowElement);
|
||||||
|
Optional<String> approverSpecifyValue = getApproverSpecifyValue(flowElement);
|
||||||
|
Optional<String> approverSpecifyValueV2 = getApproverSpecifyValueV2(flowElement);
|
||||||
|
Optional<CooperateShipTypeEnum> cooperateShipType = getCooperateShipType(flowElement);
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
Optional<SignApproverOrgLimitEnum> approverSpecifyRangeOrgLimit = getApproverSpecifyRangeOrgLimit(flowElement);
|
||||||
|
Boolean areaFilterEnable = getAreaFilterEnable(flowElement);
|
||||||
|
Boolean specialtyFilterEnable = getSpecialtyFilterEnable(flowElement);
|
||||||
// generateImage(bpmnModel);
|
// generateImage(bpmnModel);
|
||||||
|
|
||||||
byte[] xml = transformBytes(bpmnModel);
|
byte[] xml = transformBytes(bpmnModel);
|
||||||
|
|||||||
@ -4,11 +4,15 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
|||||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||||
import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
|
import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
|
||||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||||
import cn.axzo.workflow.common.enums.BpmnSignType;
|
import cn.axzo.workflow.common.enums.BpmnSignType;
|
||||||
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
||||||
|
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
|
import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
|
||||||
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
||||||
@ -63,6 +67,11 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_AREA_FILTER_ENABLE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_META;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_META;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
||||||
@ -77,6 +86,10 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
|
||||||
@ -84,6 +97,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVE
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SPECIALTY_FILTER_ENABLE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
|
||||||
@ -94,6 +108,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORG_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORG_LIMIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SUPPORT_BATCH_OPERATION_DEFAULT_VALUE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.SUPPORT_BATCH_OPERATION_DEFAULT_VALUE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
|
||||||
@ -127,6 +142,24 @@ public final class BpmnMetaParserHelper {
|
|||||||
return Optional.ofNullable(process.getAttributeValue(null, FLOW_SERVER_VERSION));
|
return Optional.ofNullable(process.getAttributeValue(null, FLOW_SERVER_VERSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<Integer> getCategoryVersion(Process process) {
|
||||||
|
if(Objects.isNull(process)) {
|
||||||
|
return Optional.of(0);
|
||||||
|
}
|
||||||
|
String categoryVersion = process.getAttributeValue(null, FLOW_CATEGORY_VERSION);
|
||||||
|
if (StringUtils.hasText(categoryVersion)) {
|
||||||
|
try {
|
||||||
|
return Optional.of(Integer.parseInt(categoryVersion));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// 如果转换失败,返回空
|
||||||
|
return Optional.of(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果没有设置版本号,返回空
|
||||||
|
return Optional.of(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Optional<BpmnApproveConf> getProcessApproveConf(Process process) {
|
public static Optional<BpmnApproveConf> getProcessApproveConf(Process process) {
|
||||||
List<ExtensionElement> elements = process.getExtensionElements().getOrDefault(CONFIG_APPROVE, Collections.emptyList());
|
List<ExtensionElement> elements = process.getExtensionElements().getOrDefault(CONFIG_APPROVE, Collections.emptyList());
|
||||||
BpmnApproveConf conf = new BpmnApproveConf();
|
BpmnApproveConf conf = new BpmnApproveConf();
|
||||||
@ -438,8 +471,13 @@ public final class BpmnMetaParserHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Optional<ApproverSpecifyEnum> getApproverSpecify(FlowElement flowElement) {
|
public static Optional<ApproverSpecifyEnum> getApproverSpecify(FlowElement flowElement) {
|
||||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
if (Objects.nonNull(flowElement) ){
|
||||||
return getApproverSpecify((UserTask) flowElement);
|
if(flowElement instanceof UserTask) {
|
||||||
|
return getApproverSpecify((UserTask) flowElement);
|
||||||
|
|
||||||
|
} else if(flowElement instanceof ServiceTask) {
|
||||||
|
return getApproverSpecify((ServiceTask) flowElement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
@ -448,6 +486,164 @@ public final class BpmnMetaParserHelper {
|
|||||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<ApproverSpecifyEnum> getApproverSpecify(ServiceTask serviceTask) {
|
||||||
|
return defaultValid(serviceTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static Optional<ApproverSpecifyRangeEnum> getApproverSpecifyRange(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getApproverSpecifyRange((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<ApproverSpecifyRangeEnum> getApproverSpecifyRange(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyRangeEnum.valueOf(element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE, Collections.emptyList())
|
||||||
|
.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<SignApproverOrgLimitEnum> getApproverSpecifyRangeOrgLimit(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getApproverSpecifyRangeOrgLimit((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<SignApproverOrgLimitEnum> getApproverSpecifyRangeOrgLimit(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> SignApproverOrgLimitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<CooperateShipTypeEnum> getCooperateShipType(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getCooperateShipType((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<CooperateShipTypeEnum> getCooperateShipType(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> CooperateShipTypeEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<ApproverSpecifyRangeUnitEnum> getApproverSpecifyRangeUnit(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getApproverSpecifyRangeUnit((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<ApproverSpecifyRangeUnitEnum> getApproverSpecifyRangeUnit(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_UNIT, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> ApproverSpecifyRangeUnitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<InitiatorSpecifiedRangeEnum> getInitiatorSpecifyRange(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getInitiatorSpecifyRange((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<InitiatorSpecifiedRangeEnum> getInitiatorSpecifyRange(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_RANGE, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> InitiatorSpecifiedRangeEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<Boolean> getInitiatorSpecifiedFilter(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getInitiatorSpecifiedFilter(((UserTask) flowElement));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<Boolean> getInitiatorSpecifiedFilter(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_FILTER, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> Boolean.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<List<String>> getExcludeIdentityTypes(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getExcludeIdentityTypes((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<List<String>> getExcludeIdentityTypes(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> JSON.parseArray(e.getElementText(), String.class)));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<List<String>> getExcludeCooperateShipTypes(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getExcludeIdentityTypes((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<List<String>> getExcludeCooperateShipTypes(UserTask userTask) {
|
||||||
|
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||||
|
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||||
|
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES, Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.findFirst()
|
||||||
|
.map(e -> JSON.parseArray(e.getElementText(), String.class)));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Optional<String> getApproverSpecifyValue(FlowElement flowElement) {
|
public static Optional<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
return getApproverSpecifyValue((UserTask) flowElement);
|
return getApproverSpecifyValue((UserTask) flowElement);
|
||||||
@ -459,6 +655,17 @@ public final class BpmnMetaParserHelper {
|
|||||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<String> getApproverSpecifyValueV2(FlowElement flowElement) {
|
||||||
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
|
return getApproverSpecifyValueV2((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<String> getApproverSpecifyValueV2(UserTask userTask) {
|
||||||
|
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> element.getChildElements().getOrDefault(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE, Collections.emptyList()).get(0).getElementText());
|
||||||
|
}
|
||||||
|
|
||||||
public static Optional<ApproverEmptyHandleTypeEnum> getApproverEmptyHandleType(FlowElement flowElement) {
|
public static Optional<ApproverEmptyHandleTypeEnum> getApproverEmptyHandleType(FlowElement flowElement) {
|
||||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||||
return getApproverEmptyHandleType((UserTask) flowElement);
|
return getApproverEmptyHandleType((UserTask) flowElement);
|
||||||
@ -486,6 +693,14 @@ public final class BpmnMetaParserHelper {
|
|||||||
&& Objects.equals(specifyEnum, ApproverSpecifyEnum.initiatorSpecified);
|
&& Objects.equals(specifyEnum, ApproverSpecifyEnum.initiatorSpecified);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean getAreaFilterEnable(FlowElement flowElement){
|
||||||
|
return defaultValid(flowElement, CONFIG_AREA_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean getSpecialtyFilterEnable(FlowElement flowElement){
|
||||||
|
return defaultValid(flowElement, CONFIG_SPECIALTY_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false);
|
||||||
|
}
|
||||||
|
|
||||||
private static Optional<ExtensionElement> defaultValid(FlowElement flowElement, String elementName) {
|
private static Optional<ExtensionElement> defaultValid(FlowElement flowElement, String elementName) {
|
||||||
if (Objects.isNull(flowElement)) {
|
if (Objects.isNull(flowElement)) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
@ -588,7 +803,7 @@ public final class BpmnMetaParserHelper {
|
|||||||
BpmnUpgradeApprovalConf conf = new BpmnUpgradeApprovalConf();
|
BpmnUpgradeApprovalConf conf = new BpmnUpgradeApprovalConf();
|
||||||
Boolean enabled = Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED));
|
Boolean enabled = Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED));
|
||||||
conf.setEnabled(enabled);
|
conf.setEnabled(enabled);
|
||||||
if(Objects.equals(Boolean.TRUE, enabled)) {
|
if (Objects.equals(Boolean.TRUE, enabled)) {
|
||||||
conf.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_ORG_LIMIT)));
|
conf.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_ORG_LIMIT)));
|
||||||
conf.setApproverSpecify(ApproverSpecifyEnum.valueOf(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_APPROVER_SPECIFY)));
|
conf.setApproverSpecify(ApproverSpecifyEnum.valueOf(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_APPROVER_SPECIFY)));
|
||||||
conf.setSpecifyValue(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE).get(0).getElementText());
|
conf.setSpecifyValue(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE).get(0).getElementText());
|
||||||
|
|||||||
@ -19,7 +19,6 @@ import java.util.concurrent.TimeUnit;
|
|||||||
@Data
|
@Data
|
||||||
@RefreshScope
|
@RefreshScope
|
||||||
public class SupportRefreshProperties {
|
public class SupportRefreshProperties {
|
||||||
|
|
||||||
@Value("${workflow.apiLog.enable: false}")
|
@Value("${workflow.apiLog.enable: false}")
|
||||||
private Boolean apiLogEnable;
|
private Boolean apiLogEnable;
|
||||||
|
|
||||||
@ -92,4 +91,5 @@ public class SupportRefreshProperties {
|
|||||||
|
|
||||||
@Value("${workflow.imTemplateCode:}")
|
@Value("${workflow.imTemplateCode:}")
|
||||||
private String imTemplateCode;
|
private String imTemplateCode;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,25 +1,43 @@
|
|||||||
package cn.axzo.workflow.core.converter.json;
|
package cn.axzo.workflow.core.converter.json;
|
||||||
|
|
||||||
import cn.axzo.framework.jackson.utility.JSON;
|
import cn.axzo.framework.jackson.utility.JSON;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||||
import org.flowable.bpmn.model.ExtensionAttribute;
|
import org.flowable.bpmn.model.ExtensionAttribute;
|
||||||
import org.flowable.bpmn.model.ExtensionElement;
|
import org.flowable.bpmn.model.ExtensionElement;
|
||||||
import org.flowable.bpmn.model.Process;
|
import org.flowable.bpmn.model.Process;
|
||||||
import org.flowable.bpmn.model.ServiceTask;
|
import org.flowable.bpmn.model.ServiceTask;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVAL_METHOD;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIES;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIES;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_OBJECT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_OBJECT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_SPECIFY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_SPECIFY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_NAME;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_NAME;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
|
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,17 +53,290 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
|||||||
serviceTask.setId(node.getId());
|
serviceTask.setId(node.getId());
|
||||||
serviceTask.setName(node.getName());
|
serviceTask.setName(node.getName());
|
||||||
|
|
||||||
// 设置抄送具体的实现类
|
Integer categoryVersion = getCategoryVersion(process).orElse(0);
|
||||||
setCarbonCopyDelegate(serviceTask);
|
if (categoryVersion < 2) {
|
||||||
|
|
||||||
// 持久化节点抄送配置元数据
|
// 设置抄送具体的实现类
|
||||||
setCarbonCopyExtensionElement(node, serviceTask);
|
setCarbonCopyDelegate(serviceTask);
|
||||||
|
|
||||||
|
// 持久化节点抄送配置元数据
|
||||||
|
setCarbonCopyExtensionElement(node, serviceTask);
|
||||||
|
} else {
|
||||||
|
// 设置抄送具体的实现类
|
||||||
|
setCarbonCopyDelegateV2(serviceTask);
|
||||||
|
// 持久化节点抄送配置元数据
|
||||||
|
setCarbonCopyExtensionElementV2(node, serviceTask);
|
||||||
|
}
|
||||||
|
|
||||||
// "表单权限设置"
|
// "表单权限设置"
|
||||||
setFormFieldExtensionElement(node, serviceTask);
|
setFormFieldExtensionElement(node, serviceTask);
|
||||||
return serviceTask;
|
return serviceTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setCarbonCopyDelegateV2(ServiceTask serviceTask) {
|
||||||
|
serviceTask.setImplementation("${engineCarbonCopyV2EventListener}");
|
||||||
|
serviceTask.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setCarbonCopyExtensionElementV2(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||||
|
BpmnJsonNodeProperty property = node.getProperty();
|
||||||
|
if (Objects.isNull(property)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Objects.nonNull(property.getApproverSpecify())) {
|
||||||
|
// 审批人指定
|
||||||
|
ExtensionElement approverSpecifyElement = new ExtensionElement();
|
||||||
|
approverSpecifyElement.setName(CONFIG_APPROVER_SPECIFY);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyValueAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
||||||
|
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
||||||
|
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyDescAttribute.setValue("审批人指定");
|
||||||
|
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
||||||
|
|
||||||
|
if (property.getApproverSpecify().name().contains("_v2")) {
|
||||||
|
switch (property.getApproverSpecify()) {
|
||||||
|
case position_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少岗位的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangePosition = new ExtensionElement();
|
||||||
|
approverSpecifyRangePosition.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||||
|
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
if (Objects.isNull(property.getCooperateShipType())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||||
|
}
|
||||||
|
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||||
|
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||||
|
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||||
|
|
||||||
|
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||||
|
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangePosition);
|
||||||
|
break;
|
||||||
|
case role_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少角色的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangeRole = new ExtensionElement();
|
||||||
|
approverSpecifyRangeRole.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
ExtensionAttribute approverSpecifyRangeRoleAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeRoleAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeRoleAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeRoleDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeRoleDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
if (Objects.isNull(property.getCooperateShipType())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||||
|
}
|
||||||
|
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||||
|
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||||
|
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||||
|
|
||||||
|
approverSpecifyRangeRole.addChildElement(cooperateShipType);
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeRole);
|
||||||
|
break;
|
||||||
|
case identity_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少身份的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangeIdentity = new ExtensionElement();
|
||||||
|
approverSpecifyRangeIdentity.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
ExtensionAttribute approverSpecifyRangeIdentityAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeIdentityAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeIdentityAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeIdentityDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeIdentityDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeIdentityDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||||
|
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "身份“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "身份“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "身份“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeIdentity);
|
||||||
|
break;
|
||||||
|
case initiatorSpecified_v2:
|
||||||
|
if (Objects.isNull(property.getInitiatorSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人自选的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement initiatorSpecifyRange = new ExtensionElement();
|
||||||
|
initiatorSpecifyRange.setName(CONFIG_INITIATOR_SPECIFIED_RANGE);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorSpecifyRangeAttribute = new ExtensionAttribute();
|
||||||
|
initiatorSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
initiatorSpecifyRangeAttribute.setValue(property.getInitiatorSpecifyRange().getType());
|
||||||
|
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||||
|
initiatorSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
initiatorSpecifyRangeDescAttribute.setValue(property.getInitiatorSpecifyRange().getDesc());
|
||||||
|
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeDescAttribute);
|
||||||
|
|
||||||
|
approverSpecifyElement.addChildElement(initiatorSpecifyRange);
|
||||||
|
|
||||||
|
boolean enableFilter = Boolean.TRUE.equals(property.getInitiatorSpecifiedFilter());
|
||||||
|
ExtensionElement InitiatorSpecifiedFilter = new ExtensionElement();
|
||||||
|
InitiatorSpecifiedFilter.setName(CONFIG_INITIATOR_SPECIFIED_FILTER);
|
||||||
|
ExtensionAttribute InitiatorSpecifiedFilterAttribute = new ExtensionAttribute();
|
||||||
|
InitiatorSpecifiedFilterAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
InitiatorSpecifiedFilterAttribute.setValue(String.valueOf(enableFilter));
|
||||||
|
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute InitiatorSpecifiedFilterDescAttribute = new ExtensionAttribute();
|
||||||
|
InitiatorSpecifiedFilterDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
InitiatorSpecifiedFilterDescAttribute.setValue("是否开起发起人的筛选策略");
|
||||||
|
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(InitiatorSpecifiedFilter);
|
||||||
|
|
||||||
|
if (enableFilter) {
|
||||||
|
ExtensionElement excludeIdentityTypes = new ExtensionElement();
|
||||||
|
excludeIdentityTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES);
|
||||||
|
excludeIdentityTypes.setElementText(JSON.toJSONString(
|
||||||
|
CollectionUtils.isEmpty(property.getExcludeIdentityTypes()) ? new ArrayList<>() : property.getExcludeIdentityTypes())
|
||||||
|
);
|
||||||
|
approverSpecifyElement.addChildElement(excludeIdentityTypes);
|
||||||
|
|
||||||
|
ExtensionElement excludeCooperateShipTypes = new ExtensionElement();
|
||||||
|
excludeCooperateShipTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES);
|
||||||
|
excludeCooperateShipTypes.setElementText(JSON.toJSONString(
|
||||||
|
CollectionUtils.isEmpty(property.getExcludeCooperateShipTypes()) ? new ArrayList<>() : property.getExcludeCooperateShipTypes())
|
||||||
|
);
|
||||||
|
approverSpecifyElement.addChildElement(excludeCooperateShipTypes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case initiator_v2:
|
||||||
|
break;
|
||||||
|
case initiatorLeader_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人主管的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement initiatorLeader = new ExtensionElement();
|
||||||
|
initiatorLeader.setName(CONFIG_INITIATOR_LEADER_RANGE_UNIT);
|
||||||
|
ExtensionAttribute initiatorLeaderAttribute = new ExtensionAttribute();
|
||||||
|
initiatorLeaderAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
initiatorLeaderAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
initiatorLeader.addAttribute(initiatorLeaderAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorLeaderDescAttribute = new ExtensionAttribute();
|
||||||
|
initiatorLeaderDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
initiatorLeaderDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
initiatorLeader.addAttribute(initiatorLeaderDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(initiatorLeader);
|
||||||
|
break;
|
||||||
|
case fixedPerson_v2:
|
||||||
|
break;
|
||||||
|
case preAllNodApprover_v2:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 审批人指定的具体值
|
||||||
|
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||||
|
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||||
|
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||||
|
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||||
|
serviceTask.addExtensionElement(approverSpecifyElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void setCarbonCopyExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
|
private static void setCarbonCopyExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||||
if (Objects.isNull(node.getProperty())) {
|
if (Objects.isNull(node.getProperty())) {
|
||||||
return;
|
return;
|
||||||
@ -120,4 +411,53 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
|||||||
JSON.toJSONString(node.getProperty().getFieldPermission()) : null);
|
JSON.toJSONString(node.getProperty().getFieldPermission()) : null);
|
||||||
serviceTask.addExtensionElement(fieldElement);
|
serviceTask.addExtensionElement(fieldElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips) {
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeOrgLimit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联组织配置");
|
||||||
|
}
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联配置");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||||
|
addCascadeConfig(property, parentElement, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加级联配置协议转换
|
||||||
|
*
|
||||||
|
* @param property
|
||||||
|
* @param parentElement
|
||||||
|
*/
|
||||||
|
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||||
|
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||||
|
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||||
|
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||||
|
specifiedOrgAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
specifiedOrgAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().name());
|
||||||
|
specifiedOrg.addAttribute(specifiedOrgAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute specifiedOrgDescAttribute = new ExtensionAttribute();
|
||||||
|
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||||
|
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||||
|
parentElement.addChildElement(specifiedOrg);
|
||||||
|
|
||||||
|
if (containsRangeUnit) {
|
||||||
|
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||||
|
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||||
|
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
|||||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
||||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||||
@ -25,6 +26,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
|
||||||
@ -33,15 +35,26 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMP
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_MODE_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_MODE_TYPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_AREA_FILTER_ENABLE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CURRENT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CURRENT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_HISTORY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_HISTORY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_INITIATOR;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_INITIATOR;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_LIMIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SPECIALTY_FILTER_ENABLE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
||||||
@ -152,9 +165,24 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
|||||||
buildMetaButton(buttonConf.getHistory(), CONFIG_BUTTON_TYPE_HISTORY, buttonConfigElement);
|
buildMetaButton(buttonConf.getHistory(), CONFIG_BUTTON_TYPE_HISTORY, buttonConfigElement);
|
||||||
buildMetaButton(buttonConf.getCarbonCopy(), CONFIG_BUTTON_TYPE_CARBON_COPY, buttonConfigElement);
|
buildMetaButton(buttonConf.getCarbonCopy(), CONFIG_BUTTON_TYPE_CARBON_COPY, buttonConfigElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
userTask.addExtensionElement(buttonConfigElement);
|
userTask.addExtensionElement(buttonConfigElement);
|
||||||
|
|
||||||
|
ExtensionElement areaFilterEnableElement = new ExtensionElement();
|
||||||
|
areaFilterEnableElement.setName(CONFIG_AREA_FILTER_ENABLE);
|
||||||
|
ExtensionAttribute areaFilterEnableAttribute = new ExtensionAttribute();
|
||||||
|
areaFilterEnableAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
|
||||||
|
areaFilterEnableAttribute.setValue(String.valueOf(Boolean.TRUE.equals(node.getProperty().getAreaFilterEnable())));
|
||||||
|
areaFilterEnableElement.addAttribute(areaFilterEnableAttribute);
|
||||||
|
userTask.addExtensionElement(areaFilterEnableElement);
|
||||||
|
|
||||||
|
ExtensionElement specialtyFilterEnableElement = new ExtensionElement();
|
||||||
|
specialtyFilterEnableElement.setName(CONFIG_SPECIALTY_FILTER_ENABLE);
|
||||||
|
ExtensionAttribute specialtyFilterEnableAttribute = new ExtensionAttribute();
|
||||||
|
specialtyFilterEnableAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
|
||||||
|
specialtyFilterEnableAttribute.setValue(String.valueOf(Boolean.TRUE.equals(node.getProperty().getSpecialtyFilterEnable())));
|
||||||
|
specialtyFilterEnableElement.addAttribute(specialtyFilterEnableAttribute);
|
||||||
|
userTask.addExtensionElement(specialtyFilterEnableElement);
|
||||||
|
|
||||||
//添加自动审批配置
|
//添加自动审批配置
|
||||||
ExtensionElement autoApprovalExtensionElement = new ExtensionElement();
|
ExtensionElement autoApprovalExtensionElement = new ExtensionElement();
|
||||||
ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
|
ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
|
||||||
@ -268,13 +296,244 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
|||||||
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
||||||
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
||||||
|
|
||||||
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
||||||
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
approverSpecifyDescAttribute.setValue("审批人指定");
|
approverSpecifyDescAttribute.setValue("审批人指定");
|
||||||
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
||||||
|
|
||||||
|
if (property.getApproverSpecify().name().contains("_v2")) {
|
||||||
|
switch (property.getApproverSpecify()) {
|
||||||
|
case position_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少岗位的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangePosition = new ExtensionElement();
|
||||||
|
approverSpecifyRangePosition.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||||
|
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
if (Objects.isNull(property.getCooperateShipType())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||||
|
}
|
||||||
|
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||||
|
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||||
|
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||||
|
|
||||||
|
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||||
|
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangePosition);
|
||||||
|
break;
|
||||||
|
case role_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少角色的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangeRole = new ExtensionElement();
|
||||||
|
approverSpecifyRangeRole.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
ExtensionAttribute approverSpecifyRangeRoleAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeRoleAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeRoleAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeRoleDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeRoleDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
if (Objects.isNull(property.getCooperateShipType())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||||
|
}
|
||||||
|
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||||
|
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||||
|
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||||
|
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||||
|
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||||
|
|
||||||
|
approverSpecifyRangeRole.addChildElement(cooperateShipType);
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeRole);
|
||||||
|
break;
|
||||||
|
case identity_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少身份的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement approverSpecifyRangeIdentity = new ExtensionElement();
|
||||||
|
approverSpecifyRangeIdentity.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||||
|
ExtensionAttribute approverSpecifyRangeIdentityAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeIdentityAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeIdentityAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||||
|
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeIdentityDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeIdentityDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeIdentityDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||||
|
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||||
|
|
||||||
|
switch (property.getApproverSpecifyRange()) {
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||||
|
case specified_org:
|
||||||
|
checkCascadeConfig(property, "身份“审批单指定的末级组织”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
checkCascadeConfig(property, "身份“审批单发起人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
checkCascadeConfig(property, "身份“上节点审批人”");
|
||||||
|
addCascadeConfig(property, approverSpecifyElement, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
approverSpecifyElement.addChildElement(approverSpecifyRangeIdentity);
|
||||||
|
break;
|
||||||
|
case initiatorSpecified_v2:
|
||||||
|
if (Objects.isNull(property.getInitiatorSpecifyRange())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人自选的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement initiatorSpecifyRange = new ExtensionElement();
|
||||||
|
initiatorSpecifyRange.setName(CONFIG_INITIATOR_SPECIFIED_RANGE);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorSpecifyRangeAttribute = new ExtensionAttribute();
|
||||||
|
initiatorSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
initiatorSpecifyRangeAttribute.setValue(property.getInitiatorSpecifyRange().getType());
|
||||||
|
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||||
|
initiatorSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
initiatorSpecifyRangeDescAttribute.setValue(property.getInitiatorSpecifyRange().getDesc());
|
||||||
|
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeDescAttribute);
|
||||||
|
|
||||||
|
approverSpecifyElement.addChildElement(initiatorSpecifyRange);
|
||||||
|
|
||||||
|
boolean enableFilter = Boolean.TRUE.equals(property.getInitiatorSpecifiedFilter());
|
||||||
|
ExtensionElement InitiatorSpecifiedFilter = new ExtensionElement();
|
||||||
|
InitiatorSpecifiedFilter.setName(CONFIG_INITIATOR_SPECIFIED_FILTER);
|
||||||
|
ExtensionAttribute InitiatorSpecifiedFilterAttribute = new ExtensionAttribute();
|
||||||
|
InitiatorSpecifiedFilterAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
InitiatorSpecifiedFilterAttribute.setValue(String.valueOf(enableFilter));
|
||||||
|
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute InitiatorSpecifiedFilterDescAttribute = new ExtensionAttribute();
|
||||||
|
InitiatorSpecifiedFilterDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
InitiatorSpecifiedFilterDescAttribute.setValue("是否开起发起人的筛选策略");
|
||||||
|
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(InitiatorSpecifiedFilter);
|
||||||
|
|
||||||
|
if (enableFilter) {
|
||||||
|
ExtensionElement excludeIdentityTypes = new ExtensionElement();
|
||||||
|
excludeIdentityTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES);
|
||||||
|
excludeIdentityTypes.setElementText(JSON.toJSONString(
|
||||||
|
CollectionUtils.isEmpty(property.getExcludeIdentityTypes()) ? new ArrayList<>() : property.getExcludeIdentityTypes())
|
||||||
|
);
|
||||||
|
approverSpecifyElement.addChildElement(excludeIdentityTypes);
|
||||||
|
|
||||||
|
ExtensionElement excludeCooperateShipTypes = new ExtensionElement();
|
||||||
|
excludeCooperateShipTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES);
|
||||||
|
excludeCooperateShipTypes.setElementText(JSON.toJSONString(
|
||||||
|
CollectionUtils.isEmpty(property.getExcludeCooperateShipTypes()) ? new ArrayList<>() : property.getExcludeCooperateShipTypes())
|
||||||
|
);
|
||||||
|
approverSpecifyElement.addChildElement(excludeCooperateShipTypes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case initiator_v2:
|
||||||
|
break;
|
||||||
|
case initiatorLeader_v2:
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人主管的二级配置");
|
||||||
|
}
|
||||||
|
ExtensionElement initiatorLeader = new ExtensionElement();
|
||||||
|
initiatorLeader.setName(CONFIG_INITIATOR_LEADER_RANGE_UNIT);
|
||||||
|
ExtensionAttribute initiatorLeaderAttribute = new ExtensionAttribute();
|
||||||
|
initiatorLeaderAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
initiatorLeaderAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
initiatorLeader.addAttribute(initiatorLeaderAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute initiatorLeaderDescAttribute = new ExtensionAttribute();
|
||||||
|
initiatorLeaderDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
initiatorLeaderDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
initiatorLeader.addAttribute(initiatorLeaderDescAttribute);
|
||||||
|
approverSpecifyElement.addChildElement(initiatorLeader);
|
||||||
|
break;
|
||||||
|
case fixedPerson_v2:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
// 审批人指定的具体值
|
// 审批人指定的具体值
|
||||||
approverSpecifyElement.setElementText(property.getSpecifyValue());
|
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||||
|
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||||
|
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||||
|
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||||
userTask.addExtensionElement(approverSpecifyElement);
|
userTask.addExtensionElement(approverSpecifyElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,7 +592,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
|||||||
|
|
||||||
// “提级审批配置”
|
// “提级审批配置”
|
||||||
BpmnUpgradeApprovalConf upgradeApprovalConf = property.getUpgradeApprovalConf();
|
BpmnUpgradeApprovalConf upgradeApprovalConf = property.getUpgradeApprovalConf();
|
||||||
if(Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())){
|
if (Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())) {
|
||||||
ExtensionElement upgradeApprovalElement = new ExtensionElement();
|
ExtensionElement upgradeApprovalElement = new ExtensionElement();
|
||||||
upgradeApprovalElement.setName(TEMPLATE_UPGRADE_APPROVAL_CONF);
|
upgradeApprovalElement.setName(TEMPLATE_UPGRADE_APPROVAL_CONF);
|
||||||
ExtensionAttribute upgradeApprovalEnabledAttribute = new ExtensionAttribute();
|
ExtensionAttribute upgradeApprovalEnabledAttribute = new ExtensionAttribute();
|
||||||
@ -363,6 +622,56 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips) {
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeOrgLimit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联组织配置");
|
||||||
|
}
|
||||||
|
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||||
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联配置");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||||
|
addCascadeConfig(property, parentElement, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加级联配置协议转换
|
||||||
|
*
|
||||||
|
* @param property
|
||||||
|
* @param parentElement
|
||||||
|
*/
|
||||||
|
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||||
|
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||||
|
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||||
|
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||||
|
specifiedOrgAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
specifiedOrgAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().name());
|
||||||
|
specifiedOrg.addAttribute(specifiedOrgAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute specifiedOrgDescAttribute = new ExtensionAttribute();
|
||||||
|
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||||
|
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||||
|
parentElement.addChildElement(specifiedOrg);
|
||||||
|
|
||||||
|
if (containsRangeUnit) {
|
||||||
|
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||||
|
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||||
|
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||||
|
|
||||||
|
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||||
|
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||||
|
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||||
|
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置执行监听
|
* 设置执行监听
|
||||||
*
|
*
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import org.flowable.common.engine.impl.interceptor.CommandContext;
|
|||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.job.service.TimerJobService;
|
||||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -54,6 +55,9 @@ public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements S
|
|||||||
}
|
}
|
||||||
addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意");
|
addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意");
|
||||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||||
|
// 告警节点生产的定时任务需要删除,否则会因为外键约束导致触发功能会重试,并抛出触发节点不存在的问题
|
||||||
|
TimerJobService timerJobService = CommandContextUtil.getTimerJobService();
|
||||||
|
timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId()).forEach(timerJobService::deleteTimerJob);
|
||||||
runtimeService.trigger(dto.getTriggerId());
|
runtimeService.trigger(dto.getTriggerId());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,24 +1,19 @@
|
|||||||
package cn.axzo.workflow.core.engine.cmd;
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
import cn.axzo.workflow.common.model.dto.TermNodeAddTimerJobDTO;
|
import cn.axzo.workflow.common.model.dto.TermNodeAddTimerJobDTO;
|
||||||
import cn.axzo.workflow.core.converter.json.NotSupportConverter;
|
|
||||||
import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler;
|
import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.bpmn.model.TimerEventDefinition;
|
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.ManagementService;
|
import org.flowable.engine.ManagementService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.jobexecutor.TimerEventHandler;
|
|
||||||
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
|
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
import org.flowable.engine.impl.util.TimerUtil;
|
import org.flowable.job.service.TimerJobService;
|
||||||
import org.flowable.engine.runtime.Execution;
|
|
||||||
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
||||||
import org.springframework.util.CollectionUtils;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义添加定时任务的逻辑
|
* 自定义添加定时任务的逻辑
|
||||||
@ -41,37 +36,39 @@ public class CustomAddTimerJobCmd extends AbstractCommand<Void> implements Seria
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void executeInternal(CommandContext commandContext) {
|
public Void executeInternal(CommandContext commandContext) {
|
||||||
log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, timeCycle: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getTimeCycle());
|
log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, delayTime: {}, timeUnit: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getDelayTime(), dto.getTimeUnit());
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
|
|
||||||
ManagementService managementService = processEngineConfiguration.getManagementService();
|
ManagementService managementService = processEngineConfiguration.getManagementService();
|
||||||
String tableName = managementService.getTableName(Execution.class);
|
Date alterTime;
|
||||||
List<Execution> list = processEngineConfiguration.getRuntimeService()
|
switch (dto.getTimeUnit()) {
|
||||||
.createNativeExecutionQuery()
|
case "M":
|
||||||
.sql("SELECT * FROM " + tableName + " WHERE PROC_INST_ID_ = #{instanceId} AND ACT_ID_ = #{activityId} AND IS_ACTIVE_ = 1 AND TASK_COUNT_ = 1")
|
alterTime = DateUtil.offsetDay(new Date(), dto.getDelayTime());
|
||||||
.parameter("instanceId", dto.getProcessInstanceId())
|
break;
|
||||||
.parameter("activityId", dto.getActivityId())
|
case "H":
|
||||||
.list();
|
alterTime = DateUtil.offsetHour(new Date(), dto.getDelayTime());
|
||||||
if (CollectionUtils.isEmpty(list)) {
|
break;
|
||||||
return null;
|
default:
|
||||||
|
alterTime = DateUtil.offsetSecond(new Date(), dto.getDelayTime());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list.get(list.size() - 1) instanceof ExecutionEntity) {
|
managementService.executeCommand(context -> {
|
||||||
ExecutionEntity executionEntity = (ExecutionEntity) list.get(list.size() - 1);
|
TimerJobService timerJobService = CommandContextUtil.getTimerJobService();
|
||||||
TimerEventDefinition timerEventDefinition = new TimerEventDefinition();
|
TimerJobEntity timerJobEntity = timerJobService.createTimerJob();
|
||||||
timerEventDefinition.setTimeCycle(dto.getTimeCycle());
|
timerJobEntity.setJobType("timer");
|
||||||
TimerJobEntity timerJob = TimerUtil.createTimerEntityForTimerEventDefinition(timerEventDefinition,
|
timerJobEntity.setJobHandlerType(AsyncTermNodeAlterJobHandler.TYPE); // 这里填写你自定义的 JobHandler 类型
|
||||||
new NotSupportConverter.NotSupportFlowElement(),
|
timerJobEntity.setProcessInstanceId(dto.getProcessInstanceId());
|
||||||
false, executionEntity, AsyncTermNodeAlterJobHandler.TYPE,
|
timerJobEntity.setExecutionId(null);
|
||||||
TimerEventHandler.createConfiguration(executionEntity.getCurrentActivityId(), null,
|
timerJobEntity.setDuedate(alterTime); // 立即执行
|
||||||
timerEventDefinition.getCalendarName()));
|
timerJobEntity.setRepeat(null); // 不重复
|
||||||
if (timerJob != null) {
|
timerJobEntity.setRetries(1);
|
||||||
CommandContextUtil.getTimerJobService().scheduleTimerJob(timerJob);
|
timerJobEntity.setJobHandlerConfiguration(dto.getActivityId()); // 可选,传递参数
|
||||||
}
|
timerJobService.scheduleTimerJob(timerJobEntity);
|
||||||
} else {
|
return null;
|
||||||
log.warn("未找到 execution entity");
|
});
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,9 @@ import cn.axzo.workflow.common.model.dto.SignatureDTO;
|
|||||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||||
|
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||||
|
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import org.apache.commons.collections4.ListUtils;
|
import org.apache.commons.collections4.ListUtils;
|
||||||
import org.flowable.common.engine.impl.identity.Authentication;
|
import org.flowable.common.engine.impl.identity.Authentication;
|
||||||
@ -155,12 +158,23 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
|
|||||||
// 记录电子签名的图片
|
// 记录电子签名的图片
|
||||||
recordSignature(task, runtimeService);
|
recordSignature(task, runtimeService);
|
||||||
|
|
||||||
|
resetApproverNode(task.getProcessInstanceId());
|
||||||
|
|
||||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||||
|
|
||||||
executeSynchronous(task, taskService, runtimeService);
|
executeSynchronous(task, taskService, runtimeService);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void resetApproverNode(String processInstanceId) {
|
||||||
|
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||||
|
ExtAxProcessLog processLog = logService.findByProcessIdAndTaskIdWithDeleted(processInstanceId, taskId);
|
||||||
|
if (CollectionUtils.isEmpty(processLog.getAssigneeFull())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
approver.setNodeId(processLog.getAssigneeFull().get(0).getNodeId());
|
||||||
|
}
|
||||||
|
|
||||||
private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
|
private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
|
||||||
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
|
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
|
||||||
if (Objects.isNull(signatures)) {
|
if (Objects.isNull(signatures)) {
|
||||||
|
|||||||
@ -178,12 +178,23 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
|
|||||||
// 记录电子签名的图片
|
// 记录电子签名的图片
|
||||||
recordSignature(task, runtimeService);
|
recordSignature(task, runtimeService);
|
||||||
|
|
||||||
|
resetApproverNode(task.getProcessInstanceId());
|
||||||
|
|
||||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||||
|
|
||||||
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
|
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void resetApproverNode(String processInstanceId) {
|
||||||
|
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||||
|
ExtAxProcessLog processLog = logService.findByProcessIdAndTaskIdWithDeleted(processInstanceId, taskId);
|
||||||
|
if (CollectionUtils.isEmpty(processLog.getAssigneeFull())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
approver.setNodeId(processLog.getAssigneeFull().get(0).getNodeId());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 表单校验
|
* 表单校验
|
||||||
*
|
*
|
||||||
|
|||||||
@ -46,7 +46,7 @@ public class CustomBizSpecifyAssigneeToTaskAsyncCmd extends AbstractCommand<Stri
|
|||||||
//校验
|
//校验
|
||||||
validate(processEngineConfiguration.getRuntimeService(), dto.getTriggerId(), task, dto.getAssigners());
|
validate(processEngineConfiguration.getRuntimeService(), dto.getTriggerId(), task, dto.getAssigners());
|
||||||
|
|
||||||
validProcessInstance(commandContext, task);
|
validProcessInstance(commandContext, task, dto.getAssigners());
|
||||||
|
|
||||||
return startAsync(processEngineConfiguration, task);
|
return startAsync(processEngineConfiguration, task);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,8 +2,11 @@ package cn.axzo.workflow.core.engine.cmd;
|
|||||||
|
|
||||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||||
|
import cn.axzo.workflow.core.service.CategoryService;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.HistoryService;
|
import org.flowable.engine.HistoryService;
|
||||||
import org.flowable.engine.ManagementService;
|
import org.flowable.engine.ManagementService;
|
||||||
@ -12,11 +15,13 @@ import org.flowable.engine.TaskService;
|
|||||||
import org.flowable.engine.history.HistoricProcessInstance;
|
import org.flowable.engine.history.HistoricProcessInstance;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.job.api.Job;
|
import org.flowable.job.api.Job;
|
||||||
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -28,12 +33,17 @@ import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE
|
|||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
|
||||||
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_SET_ASSIGNEE_PARAM_ERROR;
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||||
|
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -62,8 +72,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
|
|
||||||
public static Task getOperateTask(TaskService taskService, String executionId) {
|
public static Task getOperateTask(TaskService taskService, String executionId) {
|
||||||
return taskService.createTaskQuery().executionId(executionId)
|
return taskService.createTaskQuery().executionId(executionId)
|
||||||
.taskAssignee(NO_ASSIGNEE)
|
.taskAssignee(NO_ASSIGNEE)
|
||||||
.singleResult();
|
.singleResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,6 +84,11 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
* @param assigners
|
* @param assigners
|
||||||
*/
|
*/
|
||||||
public static void validate(RuntimeService runtimeService, String executionId, Task task, List<BpmnTaskDelegateAssigner> assigners) {
|
public static void validate(RuntimeService runtimeService, String executionId, Task task, List<BpmnTaskDelegateAssigner> assigners) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId());
|
||||||
|
boolean present = assigners.stream().anyMatch(assigner -> !StringUtils.hasText(assigner.getNodeId()));
|
||||||
|
if (present && getCategoryVersion(bpmnModel.getMainProcess()).orElse(0) > 0) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
validTask(task, executionId);
|
validTask(task, executionId);
|
||||||
//校验审批人数量是否超过限制
|
//校验审批人数量是否超过限制
|
||||||
validTaskAssignerCount(runtimeService, (TaskEntity) task, assigners);
|
validTaskAssignerCount(runtimeService, (TaskEntity) task, assigners);
|
||||||
@ -82,13 +97,13 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
@Override
|
@Override
|
||||||
public Boolean execute(CommandContext commandContext) {
|
public Boolean execute(CommandContext commandContext) {
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
TaskEntity task = (TaskEntity) getOperateTask(taskService, executionId);
|
TaskEntity task = (TaskEntity) getOperateTask(taskService, executionId);
|
||||||
//校验
|
//校验
|
||||||
validate(processEngineConfiguration.getRuntimeService(), executionId, task, addedAssigners);
|
validate(processEngineConfiguration.getRuntimeService(), executionId, task, addedAssigners);
|
||||||
|
|
||||||
validProcessInstance(commandContext, task);
|
validProcessInstance(commandContext, task, addedAssigners);
|
||||||
|
|
||||||
changeAssigneeSnapshot(commandContext, task);
|
changeAssigneeSnapshot(commandContext, task);
|
||||||
|
|
||||||
@ -114,9 +129,9 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void validProcessInstance(CommandContext commandContext, Task task) {
|
public static void validProcessInstance(CommandContext commandContext, Task task, List<BpmnTaskDelegateAssigner> addedAssigners) {
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
||||||
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
|
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
|
||||||
if (Objects.isNull(processInstance)) {
|
if (Objects.isNull(processInstance)) {
|
||||||
@ -125,17 +140,29 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
if (!Objects.equals(PROCESSING.getStatus(), processInstance.getBusinessStatus())) {
|
if (!Objects.equals(PROCESSING.getStatus(), processInstance.getBusinessStatus())) {
|
||||||
throw new WorkflowEngineException(PROCESS_CANT_SET_ASSIGNEE);
|
throw new WorkflowEngineException(PROCESS_CANT_SET_ASSIGNEE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CategoryService categoryService = SpringContextUtils.getBean(CategoryService.class);
|
||||||
|
categoryService.get(BPM_MODEL_CATEGORY, processInstance.getProcessDefinitionKey())
|
||||||
|
.ifPresent(category -> {
|
||||||
|
if (category.getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && category.getVersion() > 0) {
|
||||||
|
for (BpmnTaskDelegateAssigner assigner : addedAssigners) {
|
||||||
|
if (!StringUtils.hasText(assigner.getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(PROCESS_SET_ASSIGNEE_PARAM_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void changeAssigneeSnapshot(CommandContext commandContext, Task task) {
|
private void changeAssigneeSnapshot(CommandContext commandContext, Task task) {
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
|
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
|
||||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
|
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
|
||||||
|
|
||||||
for (BpmnTaskDelegateAssigner assigner : originAssingeeList) {
|
for (BpmnTaskDelegateAssigner assigner : originAssingeeList) {
|
||||||
if (Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
|
if (Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
|
||||||
@ -145,8 +172,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
|||||||
}
|
}
|
||||||
originAssingeeList.addAll(addedAssigners);
|
originAssingeeList.addAll(addedAssigners);
|
||||||
runtimeService.setVariable(task.getProcessInstanceId(),
|
runtimeService.setVariable(task.getProcessInstanceId(),
|
||||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
|
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
|
||||||
originAssingeeList);
|
originAssingeeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAssignee(CommandContext commandContext, TaskService taskService, Task task) {
|
private void addAssignee(CommandContext commandContext, TaskService taskService, Task task) {
|
||||||
|
|||||||
@ -1,13 +1,16 @@
|
|||||||
package cn.axzo.workflow.core.engine.cmd;
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||||
import cn.axzo.workflow.core.engine.job.AsyncCountersignUserTaskJobHandler;
|
import cn.axzo.workflow.core.engine.job.AsyncCountersignUserTaskJobHandler;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.job.service.JobService;
|
import org.flowable.job.service.JobService;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
@ -17,6 +20,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
||||||
|
|
||||||
@ -44,6 +49,8 @@ public class CustomCountersignUserTaskAsyncCmd extends AbstractCommand<Void> imp
|
|||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||||
|
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
|
|
||||||
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
||||||
|
|
||||||
// validTaskAssignerDuplicated(commandContext, (TaskEntity) task, dto.getTargetAssignerList());
|
// validTaskAssignerDuplicated(commandContext, (TaskEntity) task, dto.getTargetAssignerList());
|
||||||
@ -75,4 +82,12 @@ public class CustomCountersignUserTaskAsyncCmd extends AbstractCommand<Void> imp
|
|||||||
jobService.scheduleAsyncJob(job);
|
jobService.scheduleAsyncJob(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
boolean present = dto.getTargetAssignerList().stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && present) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package cn.axzo.workflow.core.engine.cmd;
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum;
|
import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||||
@ -9,11 +10,13 @@ import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
|||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.TaskInfo;
|
import org.flowable.task.api.TaskInfo;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
@ -29,9 +32,11 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COUNTERSIGN_ASSIGNER_SHOW_NUMBER;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COUNTERSIGN_ASSIGNER_SHOW_NUMBER;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.COUNTERSIGN;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.COUNTERSIGN;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
|
||||||
@ -95,6 +100,8 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand<Void> implemen
|
|||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||||
|
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
|
|
||||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||||
|
|
||||||
validTaskAssignerCount(processEngineConfiguration.getRuntimeService(), task, targetTaskAssigneeList);
|
validTaskAssignerCount(processEngineConfiguration.getRuntimeService(), task, targetTaskAssigneeList);
|
||||||
@ -180,4 +187,12 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand<Void> implemen
|
|||||||
completeVirtualTask(commandContext, virtualTask);
|
completeVirtualTask(commandContext, virtualTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
boolean present = targetTaskAssigneeList.stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && present) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
|||||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||||
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.cfg.IdGenerator;
|
import org.flowable.common.engine.impl.cfg.IdGenerator;
|
||||||
import org.flowable.common.engine.impl.identity.Authentication;
|
import org.flowable.common.engine.impl.identity.Authentication;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
@ -15,10 +16,12 @@ import org.flowable.engine.TaskService;
|
|||||||
import org.flowable.engine.history.HistoricProcessInstance;
|
import org.flowable.engine.history.HistoricProcessInstance;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
|
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
|
||||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -27,6 +30,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||||
@ -36,6 +40,7 @@ import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_CREA
|
|||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_REPEAT_CREATE;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_REPEAT_CREATE;
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_ERROR;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_ERROR;
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_NOT_SUPPORT;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_NOT_SUPPORT;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static org.flowable.task.api.Task.DEFAULT_PRIORITY;
|
import static org.flowable.task.api.Task.DEFAULT_PRIORITY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,6 +130,7 @@ public class CustomCreateDummyTaskCmd extends AbstractCommand<String> implements
|
|||||||
taskService.saveTask(task);
|
taskService.saveTask(task);
|
||||||
|
|
||||||
if (Objects.nonNull(operator)) {
|
if (Objects.nonNull(operator)) {
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
CommandContextUtil.getEntityCache().findInCache(HistoricTaskInstanceEntity.class).stream()
|
CommandContextUtil.getEntityCache().findInCache(HistoricTaskInstanceEntity.class).stream()
|
||||||
.filter(i -> Objects.equals(i.getId(), task.getId())).findAny()
|
.filter(i -> Objects.equals(i.getId(), task.getId())).findAny()
|
||||||
.ifPresent(i -> i.setAssignee(operator.buildAssigneeId()));
|
.ifPresent(i -> i.setAssignee(operator.buildAssigneeId()));
|
||||||
@ -154,4 +160,11 @@ public class CustomCreateDummyTaskCmd extends AbstractCommand<String> implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && !StringUtils.hasText(operator.getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,44 @@
|
|||||||
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
|
import org.flowable.common.engine.impl.interceptor.Command;
|
||||||
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.form.api.FormEngineConfigurationApi;
|
||||||
|
import org.flowable.form.api.FormInstance;
|
||||||
|
import org.flowable.form.api.FormService;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 算 cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd 的另一种实现吧
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-07-29 15:19
|
||||||
|
*/
|
||||||
|
public class CustomGetFormDataValuesCmd implements Command<byte[]> {
|
||||||
|
private final String processInstanceId;
|
||||||
|
private final String taskId;
|
||||||
|
|
||||||
|
public CustomGetFormDataValuesCmd(String processInstanceId, String taskId) {
|
||||||
|
this.processInstanceId = processInstanceId;
|
||||||
|
this.taskId = taskId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] execute(CommandContext commandContext) {
|
||||||
|
FormEngineConfigurationApi formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration(commandContext);
|
||||||
|
|
||||||
|
FormService formService = formEngineConfiguration.getFormService();
|
||||||
|
List<FormInstance> list = formService.createFormInstanceQuery().processInstanceId(processInstanceId).list();
|
||||||
|
FormInstance formInstance = list.stream().max(Comparator.comparing(FormInstance::getSubmittedDate)).orElse(null);
|
||||||
|
if (StringUtils.hasText(taskId)) {
|
||||||
|
formInstance = list.stream().filter(i -> Objects.equals(i.getTaskId(), taskId)).findFirst()
|
||||||
|
.orElse(formInstance);
|
||||||
|
}
|
||||||
|
return formInstance.getFormValueBytes();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -35,6 +35,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCES
|
|||||||
* @since 2025-01-21 10:24
|
* @since 2025-01-21 10:24
|
||||||
*/
|
*/
|
||||||
public class CustomGetFormInstanceLatestValuesCmd extends GetFormInstanceValuesCmd {
|
public class CustomGetFormInstanceLatestValuesCmd extends GetFormInstanceValuesCmd {
|
||||||
|
private static final long serialVersionUID = -1017881786777839488L;
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
private Boolean throwException;
|
private Boolean throwException;
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -52,6 +53,7 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
* eg. we1:1:202504021034000000001 or we1
|
* eg. we1:1:202504021034000000001 or we1
|
||||||
*/
|
*/
|
||||||
private String processDefinitionId;
|
private String processDefinitionId;
|
||||||
|
private List<String> getProcessDefinitionIds;
|
||||||
private String tenantId;
|
private String tenantId;
|
||||||
private Boolean filterEnable = true;
|
private Boolean filterEnable = true;
|
||||||
/**
|
/**
|
||||||
@ -84,9 +86,10 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
this.extAxReModelService = extAxReModelService;
|
this.extAxReModelService = extAxReModelService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CustomGetModelDocsCmd(String processInstanceId, String processDefinitionId, String tenantId, ExtAxModelDocMapper extAxModelDocMapper, ExtAxReModelService extAxReModelService) {
|
public CustomGetModelDocsCmd(String processInstanceId, String processDefinitionId, List<String> processDefinitionIds, String tenantId, ExtAxModelDocMapper extAxModelDocMapper, ExtAxReModelService extAxReModelService) {
|
||||||
this.processInstanceId = processInstanceId;
|
this.processInstanceId = processInstanceId;
|
||||||
this.processDefinitionId = processDefinitionId;
|
this.processDefinitionId = processDefinitionId;
|
||||||
|
this.getProcessDefinitionIds = processDefinitionIds;
|
||||||
this.tenantId = tenantId;
|
this.tenantId = tenantId;
|
||||||
this.extAxModelDocMapper = extAxModelDocMapper;
|
this.extAxModelDocMapper = extAxModelDocMapper;
|
||||||
this.extAxReModelService = extAxReModelService;
|
this.extAxReModelService = extAxReModelService;
|
||||||
@ -107,7 +110,8 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
check();
|
check();
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
|
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
|
||||||
ProcessDefinition processDefinition;
|
|
||||||
|
List<ProcessDefinition> processDefinitions = new ArrayList<>();
|
||||||
List<Long> enableDocIds = new ArrayList<>();
|
List<Long> enableDocIds = new ArrayList<>();
|
||||||
if (StringUtils.hasText(processInstanceId)) {
|
if (StringUtils.hasText(processInstanceId)) {
|
||||||
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
||||||
@ -129,37 +133,71 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(instance.getProcessDefinitionId()).singleResult();
|
processDefinitions.add(repositoryService.createProcessDefinitionQuery().processDefinitionId(instance.getProcessDefinitionId()).singleResult());
|
||||||
} else {
|
} else {
|
||||||
List<ProcessDefinition> definitions = repositoryService.createProcessDefinitionQuery()
|
List<ProcessDefinition> definitions = new ArrayList<>();
|
||||||
.processDefinitionKey(parseProcessDefinitionKey())
|
if (StringUtils.hasText(processDefinitionId)) {
|
||||||
.list();
|
definitions.addAll(repositoryService.createProcessDefinitionQuery()
|
||||||
|
.processDefinitionKey(parseProcessDefinitionKey(processDefinitionId))
|
||||||
|
.list());
|
||||||
|
} else {
|
||||||
|
List<String> definitionIds = getProcessDefinitionIds.stream().filter(StringUtils::hasText).map(this::parseProcessDefinitionKey).collect(Collectors.toList());
|
||||||
|
definitions.addAll(repositoryService.createNativeProcessDefinitionQuery()
|
||||||
|
.sql("SELECT * FROM ACT_RE_PROCDEF WHERE KEY_ IN " + definitionIds.stream().map(i -> "'" + i + "'").collect(Collectors.joining(",", "(", ")")))
|
||||||
|
.list());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (CollectionUtils.isEmpty(definitions)) {
|
if (CollectionUtils.isEmpty(definitions)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
Optional<ProcessDefinition> first = definitions.stream().filter(i -> i.getTenantId().equals(tenantId))
|
// 按 key 分组,每组取 version 最大的 ProcessDefinition
|
||||||
.max(Comparator.comparing(ProcessDefinition::getVersion));
|
Map<String, List<ProcessDefinition>> maxVersionMap = definitions.stream()
|
||||||
if (first.isPresent()) {
|
// .filter(i -> i.getTenantId().equals(tenantId))
|
||||||
processDefinition = first.get();
|
.collect(Collectors.groupingBy(
|
||||||
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
|
ProcessDefinition::getKey,
|
||||||
Model model = commandExecutor.execute(new CustomGetModelByDefinitionIdCmd(processDefinition.getId()));
|
Collectors.toList()));
|
||||||
BpmnModelExtVO modelStatus = extAxReModelService.getStatusByModelId(model.getId());
|
|
||||||
if (Objects.equals(0, modelStatus.getStatus())) {
|
maxVersionMap.forEach((k, definitionList) -> {
|
||||||
processDefinition = definitions.stream().filter(i -> i.getTenantId().equals(NO_TENANT_ID)).max(Comparator.comparing(ProcessDefinition::getVersion)).get();
|
Optional<ProcessDefinition> first = definitionList.stream()
|
||||||
|
.filter(i -> Objects.equals(i.getKey(), k))
|
||||||
|
.filter(i -> i.getTenantId().equals(tenantId))
|
||||||
|
.max(Comparator.comparing(ProcessDefinition::getVersion));
|
||||||
|
if (first.isPresent()) {
|
||||||
|
ProcessDefinition processDefinition = first.get();
|
||||||
|
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
|
||||||
|
Model model = commandExecutor.execute(new CustomGetModelByDefinitionIdCmd(processDefinition.getId()));
|
||||||
|
BpmnModelExtVO modelStatus = extAxReModelService.getStatusByModelId(model.getId());
|
||||||
|
if (Objects.equals(0, modelStatus.getStatus())) {
|
||||||
|
processDefinitions.add(definitions.stream()
|
||||||
|
.filter(i -> Objects.equals(i.getKey(), k))
|
||||||
|
.filter(i -> i.getTenantId().equals(NO_TENANT_ID))
|
||||||
|
.max(Comparator.comparing(ProcessDefinition::getVersion)).get());
|
||||||
|
} else {
|
||||||
|
processDefinitions.add(processDefinition);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
processDefinitions.add(first.orElseGet(() -> definitions.stream()
|
||||||
|
.filter(i -> Objects.equals(i.getKey(), k))
|
||||||
|
.filter(i -> i.getTenantId().equals(NO_TENANT_ID))
|
||||||
|
.max(Comparator.comparing(ProcessDefinition::getVersion)).get()));
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
processDefinition = first.orElseGet(() -> definitions.stream().filter(i -> i.getTenantId().equals(NO_TENANT_ID)).max(Comparator.comparing(ProcessDefinition::getVersion)).get());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtAxModelDoc query = new ExtAxModelDoc();
|
List<ExtAxModelDoc> docs = new ArrayList<>();
|
||||||
query.setModelKey(processDefinition.getKey());
|
if (!CollectionUtils.isEmpty(processDefinitions)) {
|
||||||
if (Objects.equals(Boolean.TRUE, filterEnable)) {
|
for (ProcessDefinition processDefinition : processDefinitions) {
|
||||||
query.setStatus(filterEnable);
|
ExtAxModelDoc query = new ExtAxModelDoc();
|
||||||
|
query.setModelKey(processDefinition.getKey());
|
||||||
|
if (Objects.equals(Boolean.TRUE, filterEnable)) {
|
||||||
|
query.setStatus(filterEnable);
|
||||||
|
}
|
||||||
|
query.setTenantId(processDefinition.getTenantId());
|
||||||
|
query.setTempFile(false);
|
||||||
|
docs.addAll(extAxModelDocMapper.selectList(buildQueryWrapper(query)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
query.setTenantId(processDefinition.getTenantId());
|
|
||||||
query.setTempFile(false);
|
|
||||||
List<ExtAxModelDoc> docs = extAxModelDocMapper.selectList(buildQueryWrapper(query));
|
|
||||||
|
|
||||||
if (filterSelect) {
|
if (filterSelect) {
|
||||||
docs = docs.stream().filter(i -> enableDocIds.contains(i.getId())).collect(Collectors.toList());
|
docs = docs.stream().filter(i -> enableDocIds.contains(i.getId())).collect(Collectors.toList());
|
||||||
@ -167,7 +205,7 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
return BeanMapper.copyList(docs, DocBaseVO.class, (s, t) -> t.setFileType(FileTypeEnum.valueOfType(s.getFileType())));
|
return BeanMapper.copyList(docs, DocBaseVO.class, (s, t) -> t.setFileType(FileTypeEnum.valueOfType(s.getFileType())));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String parseProcessDefinitionKey() {
|
private String parseProcessDefinitionKey(String processDefinitionId) {
|
||||||
if (StringUtils.hasText(processDefinitionId)) {
|
if (StringUtils.hasText(processDefinitionId)) {
|
||||||
return processDefinitionId.split(":")[0];
|
return processDefinitionId.split(":")[0];
|
||||||
}
|
}
|
||||||
@ -175,7 +213,7 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void check() {
|
private void check() {
|
||||||
if (!StringUtils.hasText(processInstanceId) && !StringUtils.hasText(processDefinitionId)) {
|
if (!StringUtils.hasText(processInstanceId) && (!StringUtils.hasText(processDefinitionId)) && CollectionUtils.isEmpty(getProcessDefinitionIds)) {
|
||||||
throw new WorkflowEngineException(MODEL_FILE_QUERY_ERROR);
|
throw new WorkflowEngineException(MODEL_FILE_QUERY_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,7 +75,7 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman
|
|||||||
|
|
||||||
private final String processInstanceId;
|
private final String processInstanceId;
|
||||||
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
|
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
|
||||||
private static final List<String> SUPPORTED_FORM_TYPES = Lists.newArrayList("input", "date", "textarea", "image", "contacts", "amount");
|
private static final List<String> SUPPORTED_FORM_TYPES = Lists.newArrayList("input", "date", "textarea", "image", "contacts", "amount", "decimal");
|
||||||
|
|
||||||
public CustomGetProcessInstanceVariablesToObjectCmd(String processInstanceId) {
|
public CustomGetProcessInstanceVariablesToObjectCmd(String processInstanceId) {
|
||||||
this.processInstanceId = processInstanceId;
|
this.processInstanceId = processInstanceId;
|
||||||
@ -210,6 +210,15 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman
|
|||||||
.type(convert(field.getType()))
|
.type(convert(field.getType()))
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
} else if (Objects.equals(field.getType(), "decimal")) {
|
||||||
|
if (StringUtils.hasText(fieldValue.toString())) {
|
||||||
|
variables.add(VariableObjectDTO.builder()
|
||||||
|
.key(field.getId())
|
||||||
|
.desc(field.getName())
|
||||||
|
.value(fieldValue + String.valueOf(field.getParam("unit")))
|
||||||
|
.type(convert(field.getType()))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
variables.add(VariableObjectDTO.builder()
|
variables.add(VariableObjectDTO.builder()
|
||||||
.key(field.getId())
|
.key(field.getId())
|
||||||
@ -300,6 +309,7 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman
|
|||||||
case "textarea":
|
case "textarea":
|
||||||
case "amount":
|
case "amount":
|
||||||
case "contacts":
|
case "contacts":
|
||||||
|
case "decimal":
|
||||||
return VariableObjectDTO.Type.text;
|
return VariableObjectDTO.Type.text;
|
||||||
case "image":
|
case "image":
|
||||||
return VariableObjectDTO.Type.img;
|
return VariableObjectDTO.Type.img;
|
||||||
|
|||||||
@ -1,14 +1,17 @@
|
|||||||
package cn.axzo.workflow.core.engine.cmd;
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||||
import cn.axzo.workflow.core.engine.job.AsyncResetApproversUserTaskJobHandler;
|
import cn.axzo.workflow.core.engine.job.AsyncResetApproversUserTaskJobHandler;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.job.service.JobService;
|
import org.flowable.job.service.JobService;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
@ -17,6 +20,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,6 +56,8 @@ public class CustomResetTaskApproversAsyncCmd extends AbstractCommand<Void> impl
|
|||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||||
|
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
|
|
||||||
validTask(historicTaskInstance, task, dto.getOriginAssigner(), null);
|
validTask(historicTaskInstance, task, dto.getOriginAssigner(), null);
|
||||||
|
|
||||||
startAsync(processEngineConfiguration, task);
|
startAsync(processEngineConfiguration, task);
|
||||||
@ -78,4 +85,12 @@ public class CustomResetTaskApproversAsyncCmd extends AbstractCommand<Void> impl
|
|||||||
jobService.scheduleAsyncJob(job);
|
jobService.scheduleAsyncJob(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
boolean present = dto.getTargetAssignerList().stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && present) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package cn.axzo.workflow.core.engine.cmd;
|
package cn.axzo.workflow.core.engine.cmd;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||||
@ -7,12 +8,14 @@ import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
|||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.identity.Authentication;
|
import org.flowable.common.engine.impl.identity.Authentication;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
||||||
@ -24,6 +27,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||||
@ -33,6 +37,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ASSIGNEE_SKIP_
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.UPGRADED;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.UPGRADED;
|
||||||
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||||
@ -83,7 +88,7 @@ public class CustomResetTaskApproversCmd extends AbstractCommand<Void> implement
|
|||||||
|
|
||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||||
|
|
||||||
resolveOriginTask(commandContext, taskService, task);
|
resolveOriginTask(commandContext, taskService, task);
|
||||||
@ -151,4 +156,12 @@ public class CustomResetTaskApproversCmd extends AbstractCommand<Void> implement
|
|||||||
taskService.saveTask(task);
|
taskService.saveTask(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
boolean present = targetTaskAssigneeList.stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && present) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,10 +5,13 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
|||||||
import cn.axzo.workflow.core.engine.job.AsyncTransferUserTaskJobHandler;
|
import cn.axzo.workflow.core.engine.job.AsyncTransferUserTaskJobHandler;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.job.service.JobService;
|
import org.flowable.job.service.JobService;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
@ -19,6 +22,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,8 +53,11 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand<Void> implem
|
|||||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
HistoricTaskInstanceQuery taskQuery = processEngineConfiguration.getHistoryService().createHistoricTaskInstanceQuery();
|
HistoricTaskInstanceQuery taskQuery = processEngineConfiguration.getHistoryService().createHistoricTaskInstanceQuery();
|
||||||
HistoricTaskInstance historicTaskInstance = taskQuery.taskId(dto.getTaskId()).singleResult();
|
HistoricTaskInstance historicTaskInstance = taskQuery.taskId(dto.getTaskId()).singleResult();
|
||||||
|
|
||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
|
|
||||||
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
||||||
startAsync(processEngineConfiguration, task);
|
startAsync(processEngineConfiguration, task);
|
||||||
return null;
|
return null;
|
||||||
@ -76,4 +84,12 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand<Void> implem
|
|||||||
jobService.scheduleAsyncJob(job);
|
jobService.scheduleAsyncJob(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && StringUtils.isNotBlank(dto.getTargetAssigner().getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,12 +7,14 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
|||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.identity.Authentication;
|
import org.flowable.common.engine.impl.identity.Authentication;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
||||||
@ -28,6 +30,7 @@ import java.util.Map;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||||
@ -37,6 +40,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TRANSFER_TO;
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TRANSFER_TO_ADVICE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.TRANSFER_TO_ADVICE;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.TRANSFER;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.TRANSFER;
|
||||||
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addMultiTask;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addMultiTask;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||||
@ -97,6 +101,8 @@ public class CustomTransferUserTaskCmd extends AbstractCommand<Void> implements
|
|||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||||
|
|
||||||
|
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||||
|
|
||||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||||
|
|
||||||
|
|
||||||
@ -123,6 +129,14 @@ public class CustomTransferUserTaskCmd extends AbstractCommand<Void> implements
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||||
|
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||||
|
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||||
|
if (categoryVersion > 0 && StringUtils.isNotBlank(targetTaskAssignee.getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void resolveOriginTask(CommandContext commandContext, TaskService taskService, TaskEntity task) {
|
private void resolveOriginTask(CommandContext commandContext, TaskService taskService, TaskEntity task) {
|
||||||
BpmnTaskDelegateAssigner assigner = buildDummyAssigner("transfer", TASK_ASSIGNEE_SKIP_FLAT, "dummyApprover");
|
BpmnTaskDelegateAssigner assigner = buildDummyAssigner("transfer", TASK_ASSIGNEE_SKIP_FLAT, "dummyApprover");
|
||||||
task.setAssignee(assigner.buildAssigneeId());
|
task.setAssignee(assigner.buildAssigneeId());
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import org.flowable.variable.api.delegate.VariableScope;
|
|||||||
* @since 2024-09-09 14:36
|
* @since 2024-09-09 14:36
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AsyncActivityTriggerJobHandler extends AbstractJobHandler implements JobHandler {
|
public class AsyncActivityTriggerJobHandler extends AbstractExecuteWithLockJobHandler implements JobHandler {
|
||||||
public static final String TYPE = "async-activity-trigger";
|
public static final String TYPE = "async-activity-trigger";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -27,7 +27,7 @@ public class AsyncActivityTriggerJobHandler extends AbstractJobHandler implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
public void executeInternal(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
||||||
log.info("AsyncActivityTriggerJobHandler executing...");
|
log.info("AsyncActivityTriggerJobHandler executing...");
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
|||||||
import org.flowable.variable.api.delegate.VariableScope;
|
import org.flowable.variable.api.delegate.VariableScope;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AsyncCancelProcessInstanceJobHandler extends AbstractJobHandler implements JobHandler {
|
public class AsyncCancelProcessInstanceJobHandler extends AbstractExecuteWithLockJobHandler implements JobHandler {
|
||||||
|
|
||||||
public static final String TYPE = "async-cancel-process";
|
public static final String TYPE = "async-cancel-process";
|
||||||
|
|
||||||
@ -30,11 +30,12 @@ public class AsyncCancelProcessInstanceJobHandler extends AbstractJobHandler imp
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
public void executeInternal(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
||||||
log.info("AsyncCancelProcessInstanceHandler executing...,jobInfo:{}", JSONUtil.toJsonStr(job));
|
log.info("AsyncCancelProcessInstanceHandler executing...,jobInfo:{}", JSONUtil.toJsonStr(job));
|
||||||
log(job);
|
log(job);
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
BpmnProcessInstanceCancelDTO dto = JSONUtil.toBean(job.getCustomValues(), BpmnProcessInstanceCancelDTO.class);
|
BpmnProcessInstanceCancelDTO dto = JSONUtil.toBean(job.getCustomValues(), BpmnProcessInstanceCancelDTO.class);
|
||||||
processEngineConfiguration.getCommandExecutor().execute(new CustomCancelProcessInstanceCmd((SuperBpmnProcessInstanceCancelDTO) dto, extAxHiTaskInstService));
|
processEngineConfiguration.getCommandExecutor().execute(new CustomCancelProcessInstanceCmd((SuperBpmnProcessInstanceCancelDTO) dto, extAxHiTaskInstService));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,29 +3,35 @@ package cn.axzo.workflow.core.engine.job;
|
|||||||
import cn.axzo.basics.common.util.NumberUtil;
|
import cn.axzo.basics.common.util.NumberUtil;
|
||||||
import cn.axzo.workflow.common.model.dto.AlterDTO;
|
import cn.axzo.workflow.common.model.dto.AlterDTO;
|
||||||
import cn.axzo.workflow.common.model.dto.TermNodePausingDTO;
|
import cn.axzo.workflow.common.model.dto.TermNodePausingDTO;
|
||||||
|
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||||
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||||
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
|
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
|
||||||
import cn.axzo.workflow.core.engine.tx.listener.DeleteTimerJobTransactionListener;
|
|
||||||
import cn.axzo.workflow.core.listener.Alter;
|
import cn.axzo.workflow.core.listener.Alter;
|
||||||
|
import cn.axzo.workflow.core.service.CategoryService;
|
||||||
|
import cn.hutool.core.date.DateTime;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.common.engine.impl.cfg.TransactionState;
|
|
||||||
import org.flowable.common.engine.impl.context.Context;
|
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
|
import org.flowable.engine.ManagementService;
|
||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.TaskService;
|
import org.flowable.engine.TaskService;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
import org.flowable.job.service.JobHandler;
|
import org.flowable.job.service.JobHandler;
|
||||||
|
import org.flowable.job.service.TimerJobService;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
|
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.variable.api.delegate.VariableScope;
|
import org.flowable.variable.api.delegate.VariableScope;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_NODE_ALTER;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_NODE_ALTER;
|
||||||
|
|
||||||
@ -53,12 +59,16 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements
|
|||||||
public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
|
||||||
log.warn("AsyncTermNodeAlterJobHandler exec start...");
|
log.warn("AsyncTermNodeAlterJobHandler exec start...");
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
JSONObject jsonObject = JSON.parseObject(job.getJobHandlerConfiguration());
|
// JSONObject jsonObject = JSON.parseObject(job.getJobHandlerConfiguration());
|
||||||
if (!jsonObject.containsKey("activityId")) {
|
// if (!jsonObject.containsKey("activityId")) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
String activityId = job.getJobHandlerConfiguration();
|
||||||
|
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||||
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(job.getProcessInstanceId()).singleResult();
|
||||||
|
if(Objects.isNull(processInstance)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String activityId = jsonObject.getString("activityId");
|
|
||||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
|
||||||
TermNodePausingDTO dto = runtimeService.getVariable(job.getProcessInstanceId(), BIZ_NODE_ALTER + activityId, TermNodePausingDTO.class);
|
TermNodePausingDTO dto = runtimeService.getVariable(job.getProcessInstanceId(), BIZ_NODE_ALTER + activityId, TermNodePausingDTO.class);
|
||||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||||
List<Task> tasks = taskService.createTaskQuery()
|
List<Task> tasks = taskService.createTaskQuery()
|
||||||
@ -71,53 +81,85 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements
|
|||||||
tasks.forEach(e -> {
|
tasks.forEach(e -> {
|
||||||
sb.append("id:").append(e.getId()).append(", assignee: ").append(e.getAssignee());
|
sb.append("id:").append(e.getId()).append(", assignee: ").append(e.getAssignee());
|
||||||
});
|
});
|
||||||
log.info("tasks size:{}", JSON.toJSONString(sb));
|
log.info("tasks size:{}, info: {}", tasks.size(), JSON.toJSONString(sb));
|
||||||
if (CollectionUtils.isEmpty(tasks) || tasks.size() > 1 || hasAssignee(tasks.get(0).getAssignee())) {
|
if (CollectionUtils.isEmpty(tasks) || tasks.size() > 1 || hasAssignee(tasks.get(0).getAssignee())) {
|
||||||
deleteTimerJob(dto);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DateUtil.compare(DateUtil.date(), DateUtil.offsetMinute(tasks.get(0).getCreateTime(), refreshProperties.getPauseDelay())) <= 0) {
|
|
||||||
|
if (DateUtil.compare(DateUtil.date(), getDateTime(tasks.get(0).getCreateTime())) <= 0) {
|
||||||
|
ManagementService managementService = processEngineConfiguration.getManagementService();
|
||||||
|
managementService.executeCommand(context -> {
|
||||||
|
TimerJobService timerJobService = CommandContextUtil.getTimerJobService();
|
||||||
|
TimerJobEntity timerJobEntity = timerJobService.createTimerJob();
|
||||||
|
timerJobEntity.setJobType("timer");
|
||||||
|
timerJobEntity.setJobHandlerType(AsyncTermNodeAlterJobHandler.TYPE); // 这里填写你自定义的 JobHandler 类型
|
||||||
|
timerJobEntity.setProcessInstanceId(dto.getProcessInstanceId());
|
||||||
|
timerJobEntity.setExecutionId(null);
|
||||||
|
timerJobEntity.setDuedate(getDateTime(new Date())); // 立即执行
|
||||||
|
timerJobEntity.setRepeat(null); // 不重复
|
||||||
|
timerJobEntity.setRetries(1);
|
||||||
|
timerJobEntity.setJobHandlerConfiguration(dto.getActivityId()); // 可选,传递参数
|
||||||
|
timerJobService.scheduleTimerJob(timerJobEntity);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 不允许重复告警
|
// 不允许重复告警
|
||||||
if (!refreshProperties.getRepeatAlter() && dto.getRetries() > 0) {
|
if (!refreshProperties.getRepeatAlter() && dto.getRetries() > 0) {
|
||||||
deleteTimerJob(dto);
|
return;
|
||||||
|
}
|
||||||
|
// 超过告警次数
|
||||||
|
if (refreshProperties.getAlterRetries() != 0 && dto.getRetries() >= refreshProperties.getAlterRetries()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CategoryService bean = SpringContextUtils.getBean(CategoryService.class);
|
||||||
|
Optional<CategoryItemVO> bpmModelCategory = bean.get("bpm_model_category", processInstance.getProcessDefinitionKey());
|
||||||
|
// 发送告警对象
|
||||||
|
Alter alter = SpringContextUtils.getBean(Alter.class);
|
||||||
|
AlterDTO alterDTO = new AlterDTO();
|
||||||
|
alterDTO.setProcessDefinitionKey(processInstance.getProcessDefinitionKey());
|
||||||
|
alterDTO.setProcessDefinitionName(bpmModelCategory.orElse(new CategoryItemVO()).getLabel());
|
||||||
|
alterDTO.setProcessInstanceId(dto.getProcessInstanceId());
|
||||||
|
alterDTO.setActivityId(dto.getActivityId());
|
||||||
|
alterDTO.setTaskId(tasks.get(0).getId());
|
||||||
|
alterDTO.setStartTime(tasks.get(0).getCreateTime());
|
||||||
|
alterDTO.setPrettyStartTime(DateUtil.formatDateTime(tasks.get(0).getCreateTime()));
|
||||||
|
if (Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) {
|
||||||
|
alter.invoke(alterDTO);
|
||||||
|
|
||||||
if (refreshProperties.getAlterRetries() == 0 || dto.getRetries() < refreshProperties.getAlterRetries()) {
|
// 记录告警次数
|
||||||
// 发送告警对象
|
incRetries(job, dto, runtimeService, activityId);
|
||||||
Alter alter = SpringContextUtils.getBean(Alter.class);
|
|
||||||
AlterDTO alterDTO = new AlterDTO();
|
|
||||||
alterDTO.setProcessInstanceId(dto.getProcessInstanceId());
|
|
||||||
alterDTO.setActivityId(dto.getActivityId());
|
|
||||||
alterDTO.setTaskId(tasks.get(0).getId());
|
|
||||||
alterDTO.setStartTime(tasks.get(0).getCreateTime());
|
|
||||||
alterDTO.setPrettyStartTime(DateUtil.formatDateTime(tasks.get(0).getCreateTime()));
|
|
||||||
if (Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) {
|
|
||||||
alter.invoke(alterDTO);
|
|
||||||
|
|
||||||
// 记录告警次数
|
|
||||||
incRetries(job, dto, runtimeService, activityId);
|
|
||||||
|
|
||||||
if (refreshProperties.getAlterRetries() != 0 && dto.getRetries() >= refreshProperties.getAlterRetries()) {
|
|
||||||
deleteTimerJob(dto);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DateTime getDateTime(Date date) {
|
||||||
|
DateTime dateTime;
|
||||||
|
switch (refreshProperties.getAlterIntervalUnit()) {
|
||||||
|
case MINUTES:
|
||||||
|
dateTime = DateUtil.offsetMinute(date, refreshProperties.getPauseDelay());
|
||||||
|
break;
|
||||||
|
case HOURS:
|
||||||
|
dateTime = DateUtil.offsetHour(date, refreshProperties.getPauseDelay());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dateTime = DateUtil.offsetSecond(date, refreshProperties.getPauseDelay());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
private void incRetries(JobEntity job, TermNodePausingDTO dto, RuntimeService runtimeService, String activityId) {
|
private void incRetries(JobEntity job, TermNodePausingDTO dto, RuntimeService runtimeService, String activityId) {
|
||||||
dto.setRetries(dto.getRetries() + 1);
|
dto.setRetries(dto.getRetries() + 1);
|
||||||
runtimeService.setVariable(job.getProcessInstanceId(), BIZ_NODE_ALTER + activityId, dto);
|
runtimeService.setVariable(job.getProcessInstanceId(), BIZ_NODE_ALTER + activityId, dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteTimerJob(TermNodePausingDTO dto) {
|
// private void deleteTimerJob(TermNodePausingDTO dto) {
|
||||||
Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED,
|
// Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED,
|
||||||
new DeleteTimerJobTransactionListener(dto));
|
// new DeleteTimerJobTransactionListener(dto));
|
||||||
}
|
// }
|
||||||
|
|
||||||
private Boolean hasAssignee(String assignee) {
|
private Boolean hasAssignee(String assignee) {
|
||||||
if (!StringUtils.hasText(assignee)) {
|
if (!StringUtils.hasText(assignee)) {
|
||||||
|
|||||||
@ -3,9 +3,11 @@ package cn.axzo.workflow.core.engine.job;
|
|||||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||||
import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO;
|
import cn.axzo.workflow.common.model.NextNodePreCheckAlterDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||||
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||||
import cn.axzo.workflow.core.deletage.BpmnTaskAssigneeSelector;
|
import cn.axzo.workflow.core.deletage.BpmnTaskAssigneeSelector;
|
||||||
import cn.axzo.workflow.core.listener.Alter;
|
import cn.axzo.workflow.core.listener.Alter;
|
||||||
|
import cn.axzo.workflow.core.service.CategoryService;
|
||||||
import cn.axzo.workflow.core.service.support.FlowNodeForecastService;
|
import cn.axzo.workflow.core.service.support.FlowNodeForecastService;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -16,10 +18,12 @@ import org.flowable.bpmn.model.ServiceTask;
|
|||||||
import org.flowable.bpmn.model.UserTask;
|
import org.flowable.bpmn.model.UserTask;
|
||||||
import org.flowable.common.engine.api.query.QueryProperty;
|
import org.flowable.common.engine.api.query.QueryProperty;
|
||||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||||
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.delegate.DelegateExecution;
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
import org.flowable.engine.runtime.Execution;
|
import org.flowable.engine.runtime.Execution;
|
||||||
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
import org.flowable.job.service.JobHandler;
|
import org.flowable.job.service.JobHandler;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
import org.flowable.variable.api.delegate.VariableScope;
|
import org.flowable.variable.api.delegate.VariableScope;
|
||||||
@ -28,6 +32,7 @@ import org.springframework.util.CollectionUtils;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
||||||
@ -56,6 +61,11 @@ public class NextActivityConfigCheckJobHandler extends AbstractJobHandler implem
|
|||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
FlowNodeForecastService forecastService = SpringContextUtils.getBean(FlowNodeForecastService.class);
|
FlowNodeForecastService forecastService = SpringContextUtils.getBean(FlowNodeForecastService.class);
|
||||||
String currentActivityId = job.getJobHandlerConfiguration();
|
String currentActivityId = job.getJobHandlerConfiguration();
|
||||||
|
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||||
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(job.getProcessInstanceId()).singleResult();
|
||||||
|
if (Objects.isNull(processInstance)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
List<FlowElement> flowElements = forecastService.performProcessForecasting(job.getProcessInstanceId(), null, currentActivityId, false);
|
List<FlowElement> flowElements = forecastService.performProcessForecasting(job.getProcessInstanceId(), null, currentActivityId, false);
|
||||||
if (CollectionUtils.isEmpty(flowElements)) {
|
if (CollectionUtils.isEmpty(flowElements)) {
|
||||||
return;
|
return;
|
||||||
@ -65,9 +75,13 @@ public class NextActivityConfigCheckJobHandler extends AbstractJobHandler implem
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 有任何异常,则通过钉钉告警
|
// 有任何异常,则通过钉钉告警
|
||||||
log.warn("NextActivityConfigCheckJobHandler msg: {}", e.getMessage(), e);
|
log.warn("NextActivityConfigCheckJobHandler msg: {}", e.getMessage(), e);
|
||||||
|
CategoryService bean = SpringContextUtils.getBean(CategoryService.class);
|
||||||
|
Optional<CategoryItemVO> bpmModelCategory = bean.get("bpm_model_category", processInstance.getProcessDefinitionKey());
|
||||||
Alter alter = SpringContextUtils.getBean(Alter.class);
|
Alter alter = SpringContextUtils.getBean(Alter.class);
|
||||||
FlowElement flowElement = ListUtils.emptyIfNull(flowElements).stream().filter(i -> i instanceof UserTask || i instanceof ReceiveTask || i instanceof ServiceTask).findFirst().orElse(null);
|
FlowElement flowElement = ListUtils.emptyIfNull(flowElements).stream().filter(i -> i instanceof UserTask || i instanceof ReceiveTask || i instanceof ServiceTask).findFirst().orElse(null);
|
||||||
NextNodePreCheckAlterDTO alterDTO = new NextNodePreCheckAlterDTO();
|
NextNodePreCheckAlterDTO alterDTO = new NextNodePreCheckAlterDTO();
|
||||||
|
alterDTO.setProcessDefinitionKey(processInstance.getProcessDefinitionKey());
|
||||||
|
alterDTO.setProcessDefinitionName(bpmModelCategory.orElse(new CategoryItemVO()).getLabel());
|
||||||
alterDTO.setProcessInstanceId(job.getProcessInstanceId());
|
alterDTO.setProcessInstanceId(job.getProcessInstanceId());
|
||||||
alterDTO.setActivityId(Objects.nonNull(flowElement) ? flowElement.getId() : null);
|
alterDTO.setActivityId(Objects.nonNull(flowElement) ? flowElement.getId() : null);
|
||||||
alterDTO.setErrorMsg(e.getMessage());
|
alterDTO.setErrorMsg(e.getMessage());
|
||||||
@ -130,9 +144,9 @@ public class NextActivityConfigCheckJobHandler extends AbstractJobHandler implem
|
|||||||
/**
|
/**
|
||||||
* 计算节点的待审批人为空时, 执行模型配置中的审批人为空时的处理方式
|
* 计算节点的待审批人为空时, 执行模型配置中的审批人为空时的处理方式
|
||||||
*
|
*
|
||||||
* @param assigners 节点计算的待审批人集合, 可能为空
|
* @param assigners 节点计算的待审批人集合, 可能为空
|
||||||
* @param flowElement 当前节点
|
* @param flowElement 当前节点
|
||||||
* @param execution 当前执行实例
|
* @param execution 当前执行实例
|
||||||
*/
|
*/
|
||||||
private void emptyAssigneeHandle(List<BpmnTaskDelegateAssigner> assigners, FlowElement flowElement,
|
private void emptyAssigneeHandle(List<BpmnTaskDelegateAssigner> assigners, FlowElement flowElement,
|
||||||
DelegateExecution execution) {
|
DelegateExecution execution) {
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
package cn.axzo.workflow.core.engine.listener;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.flowable.engine.delegate.ExecutionListener;
|
||||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部分有告警设置的,在节点正常执行后,将清除告警
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-04-24 16:03
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RefreshScope
|
||||||
|
@Slf4j
|
||||||
|
@Deprecated
|
||||||
|
public class EngineAlarmClearEventListener implements ExecutionListener {
|
||||||
|
private static final long serialVersionUID = -4246836140144129539L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notify(DelegateExecution execution) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,128 @@
|
|||||||
|
package cn.axzo.workflow.core.engine.listener;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
|
||||||
|
import cn.axzo.workflow.core.engine.event.MessagePushEventBuilder;
|
||||||
|
import cn.axzo.workflow.core.engine.event.MessagePushEventImpl;
|
||||||
|
import cn.axzo.workflow.core.engine.event.MessagePushEventType;
|
||||||
|
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
|
||||||
|
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||||
|
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.Process;
|
||||||
|
import org.flowable.bpmn.model.ServiceTask;
|
||||||
|
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
|
||||||
|
import org.flowable.engine.RuntimeService;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.flowable.engine.delegate.JavaDelegate;
|
||||||
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||||
|
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||||
|
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||||
|
import org.flowable.spring.SpringProcessEngineConfiguration;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CARBON_ASSIGNER_LIMIT_NUMBER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||||
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||||
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
|
||||||
|
import static cn.axzo.workflow.core.listener.AbstractBpmnEventListener.parseProcessDefinitionKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抄送功能的具体实现
|
||||||
|
* <p>
|
||||||
|
* 只负责完成抄送自身功能即可, 关于审批日志中需要记录抄送节点的功能,由 CustomServiceTaskDelegateExpressionActivityBehavior 完成
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 08/03/2024 17:17
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RefreshScope
|
||||||
|
@Slf4j
|
||||||
|
public class EngineCarbonCopyV2EventListener implements JavaDelegate {
|
||||||
|
@Value("${workflow.carbonCopyTemplateCode}")
|
||||||
|
private String carbonCopyTemplateCode;
|
||||||
|
@Resource
|
||||||
|
private EngineExecutionStartListener engineExecutionStartListener;
|
||||||
|
@Resource
|
||||||
|
private SpringProcessEngineConfiguration springProcessEngineConfiguration;
|
||||||
|
@Resource
|
||||||
|
private ExtAxHiTaskInstService extAxHiTaskInstService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(DelegateExecution execution) {
|
||||||
|
log.info("EngineCarbonCopyEventListener exec...,processInstanceId: {}", execution.getProcessInstanceId());
|
||||||
|
String currentActivityId = execution.getCurrentActivityId();
|
||||||
|
String processDefinitionId = execution.getProcessDefinitionId();
|
||||||
|
String processInstanceId = execution.getProcessInstanceId();
|
||||||
|
Process mainProcess = ProcessDefinitionUtil.getBpmnModel(processDefinitionId).getMainProcess();
|
||||||
|
|
||||||
|
ServiceTask serviceTask = (ServiceTask) mainProcess.getFlowElement(currentActivityId);
|
||||||
|
|
||||||
|
List<BpmnTaskDelegateAssigner> carbonUsers = new ArrayList<>();
|
||||||
|
getApproverSpecify(serviceTask).ifPresent(specify -> {
|
||||||
|
carbonUsers.addAll(engineExecutionStartListener.approverSelect(specify.getType(), serviceTask, execution, false));
|
||||||
|
});
|
||||||
|
|
||||||
|
List<BpmnTaskDelegateAssigner> limitedAssigners = getLimitedElementList(removeDuplicateByPersonId(carbonUsers), CARBON_ASSIGNER_LIMIT_NUMBER);
|
||||||
|
|
||||||
|
RuntimeService runtimeService =
|
||||||
|
springProcessEngineConfiguration.getProcessEngineConfiguration().getRuntimeService();
|
||||||
|
runtimeService.setVariable(processInstanceId,
|
||||||
|
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, limitedAssigners);
|
||||||
|
|
||||||
|
// 发送抄送事件
|
||||||
|
invokeCarbonCopy(limitedAssigners, getNoticeConfig(mainProcess), getActivitySignature(serviceTask), execution);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void invokeCarbonCopy(List<BpmnTaskDelegateAssigner> carbonUsers,
|
||||||
|
Optional<BpmnNoticeConf> noticeConf,
|
||||||
|
Boolean activitySignature, DelegateExecution execution) {
|
||||||
|
if (CollectionUtils.isEmpty(carbonUsers)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
|
||||||
|
FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher();
|
||||||
|
|
||||||
|
BpmnNoticeConf bpmnNoticeConf = noticeConf.map(conf -> {
|
||||||
|
if (!StringUtils.hasText(conf.getCarbonCopy().getCarbonCopyMessageId())) {
|
||||||
|
conf.getCarbonCopy().setCarbonCopyMessageId(carbonCopyTemplateCode);
|
||||||
|
}
|
||||||
|
return conf;
|
||||||
|
}).orElse(null);
|
||||||
|
MessagePushEventImpl event = MessagePushEventBuilder.createEvent(MessagePushEventType.CARBON_COPY,
|
||||||
|
carbonUsers, bpmnNoticeConf, execution.getProcessInstanceId(),
|
||||||
|
parseProcessDefinitionKey(execution.getProcessDefinitionId()),
|
||||||
|
execution.getTenantId(), getCarbonTaskId(execution), activitySignature);
|
||||||
|
eventDispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCarbonTaskId(DelegateExecution execution) {
|
||||||
|
AtomicReference<String> taskId = new AtomicReference<>(null);
|
||||||
|
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
|
||||||
|
searchDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
||||||
|
searchDTO.setTaskDefinitionKey(execution.getCurrentActivityId());
|
||||||
|
extAxHiTaskInstService.queryList(searchDTO)
|
||||||
|
.stream()
|
||||||
|
.max(Comparator.comparing(ExtAxHiTaskInst::getCreateAt))
|
||||||
|
.ifPresent(i -> taskId.set(i.getTaskId()));
|
||||||
|
return taskId.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -63,6 +63,7 @@ import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAs
|
|||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
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.common.utils.BpmnMetaParserHelper.getProcessServerVersion;
|
||||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||||
@ -102,11 +103,12 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
|||||||
|
|
||||||
// 从 version=1.2.1-SNAPSHOT 开始,才给 process 节点增加了 serverVersion 属性
|
// 从 version=1.2.1-SNAPSHOT 开始,才给 process 节点增加了 serverVersion 属性
|
||||||
Optional<String> processServerVersion = getProcessServerVersion(mainProcess);
|
Optional<String> processServerVersion = getProcessServerVersion(mainProcess);
|
||||||
|
Optional<Integer> categoryVersion = getCategoryVersion(mainProcess);
|
||||||
if (processServerVersion.isPresent()) {
|
if (processServerVersion.isPresent()) {
|
||||||
// 创建检查下个节点的配置
|
// 创建检查下个节点的配置
|
||||||
createCheckNextActivityJob(execution.getProcessInstanceId(), currentActivityId);
|
createCheckNextActivityJob(execution.getProcessInstanceId(), currentActivityId);
|
||||||
calcTaskAssigner121(execution, userTask, processServerVersion.get(), assigneeListVariableName,
|
calcTaskAssigner121(execution, userTask, processServerVersion.get(), assigneeListVariableName,
|
||||||
currentActivityId);
|
currentActivityId, categoryVersion.orElse(0));
|
||||||
} else {
|
} else {
|
||||||
calcTaskAssignerDefault(execution, userTask, currentActivityId, assigneeListVariableName);
|
calcTaskAssignerDefault(execution, userTask, currentActivityId, assigneeListVariableName);
|
||||||
}
|
}
|
||||||
@ -139,7 +141,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void calcTaskAssigner121(DelegateExecution execution, UserTask userTask, String processServerVersion,
|
private void calcTaskAssigner121(DelegateExecution execution, UserTask userTask, String processServerVersion,
|
||||||
String assigneeListVariableName, String currentActivityId) {
|
String assigneeListVariableName, String currentActivityId, Integer categoryVersion) {
|
||||||
Optional<BpmnFlowNodeType> nodeType = getNodeType(userTask);
|
Optional<BpmnFlowNodeType> nodeType = getNodeType(userTask);
|
||||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_121);
|
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_121);
|
||||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(processServerVersion);
|
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(processServerVersion);
|
||||||
@ -184,8 +186,11 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
|||||||
assigners.addAll(approverSelect(specify.getType(), userTask, execution, true));
|
assigners.addAll(approverSelect(specify.getType(), userTask, execution, true));
|
||||||
});
|
});
|
||||||
|
|
||||||
// 审批候选人为空时的兜底
|
// 只有老版本的配置会走这里, 新版本配置会直接在找过的过程中直接由人岗架接口内部处理超管
|
||||||
emptyAssigneeHandle(assigners, userTask, execution);
|
if (categoryVersion < 2) {
|
||||||
|
// 审批候选人为空时的兜底,
|
||||||
|
emptyAssigneeHandle(assigners, userTask, execution);
|
||||||
|
}
|
||||||
List<BpmnTaskDelegateAssigner> resultAssigners = getLimitedElementList(assigners, APPROVAL_ASSIGNER_LIMIT_NUMBER);
|
List<BpmnTaskDelegateAssigner> resultAssigners = getLimitedElementList(assigners, APPROVAL_ASSIGNER_LIMIT_NUMBER);
|
||||||
for (BpmnTaskDelegateAssigner user : resultAssigners) {
|
for (BpmnTaskDelegateAssigner user : resultAssigners) {
|
||||||
assigneeIdList.add(user.buildAssigneeId());
|
assigneeIdList.add(user.buildAssigneeId());
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
package cn.axzo.workflow.core.engine.listener;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.flowable.engine.delegate.JavaDelegate;
|
||||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 节点运行超时告警
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-04-24 14:21
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RefreshScope
|
||||||
|
@Slf4j
|
||||||
|
@Deprecated
|
||||||
|
public class EngineNodeTimeoutAlterDelegate implements JavaDelegate {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(DelegateExecution execution) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -22,7 +22,7 @@ public class AddTimerJobTransactionListener implements TransactionListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(CommandContext commandContext) {
|
public void execute(CommandContext commandContext) {
|
||||||
log.info("add timer job listener. instanceId: {}, activityId: {}, timeCycle: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getTimeCycle());
|
log.info("add timer job listener. instanceId: {}, activityId: {}, delayTime: {}, timeUnit: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getDelayTime(), dto.getTimeUnit());
|
||||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||||
processEngineConfiguration.getCommandExecutor().execute(new CustomAddTimerJobCmd(dto));
|
processEngineConfiguration.getCommandExecutor().execute(new CustomAddTimerJobCmd(dto));
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import cn.axzo.workflow.core.common.context.ActivityOperationContext;
|
|||||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||||
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
|
import cn.axzo.workflow.core.conf.SupportRefreshProperties;
|
||||||
import cn.axzo.workflow.core.engine.tx.listener.AddTimerJobTransactionListener;
|
import cn.axzo.workflow.core.engine.tx.listener.AddTimerJobTransactionListener;
|
||||||
import cn.axzo.workflow.core.engine.tx.listener.DeleteTimerJobTransactionListener;
|
|
||||||
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
|
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
|
||||||
import cn.axzo.workflow.core.listener.BpmnActivityEventListener;
|
import cn.axzo.workflow.core.listener.BpmnActivityEventListener;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -91,7 +90,8 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE
|
|||||||
TermNodeAddTimerJobDTO addTimerJobDTO = new TermNodeAddTimerJobDTO();
|
TermNodeAddTimerJobDTO addTimerJobDTO = new TermNodeAddTimerJobDTO();
|
||||||
addTimerJobDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
addTimerJobDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
||||||
addTimerJobDTO.setActivityId(execution.getCurrentActivityId());
|
addTimerJobDTO.setActivityId(execution.getCurrentActivityId());
|
||||||
addTimerJobDTO.setTimeCycle("R100/PT" + refreshProperties.getAlterInterval() + timeUnit);
|
addTimerJobDTO.setDelayTime(refreshProperties.getAlterInterval());
|
||||||
|
addTimerJobDTO.setTimeUnit(timeUnit);
|
||||||
|
|
||||||
Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED,
|
Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED,
|
||||||
new AddTimerJobTransactionListener(addTimerJobDTO));
|
new AddTimerJobTransactionListener(addTimerJobDTO));
|
||||||
@ -104,27 +104,4 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 节点已取消
|
|
||||||
*
|
|
||||||
* @param execution
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onEnd(DelegateExecution execution) {
|
|
||||||
// ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
|
|
||||||
// ManagementService managementService = processEngineConfiguration.getManagementService();
|
|
||||||
// Job timerJob = managementService.createTimerJobQuery()
|
|
||||||
// .elementId(execution.getCurrentActivityId())
|
|
||||||
// .processInstanceId(execution.getProcessInstanceId())
|
|
||||||
// .singleResult();
|
|
||||||
// if (Objects.nonNull(timerJob)) {
|
|
||||||
// CommandContextUtil.getTimerJobService().deleteTimerJob((TimerJobEntity) timerJob);
|
|
||||||
// }
|
|
||||||
TermNodePausingDTO dto = new TermNodePausingDTO();
|
|
||||||
dto.setActivityId(execution.getCurrentActivityId());
|
|
||||||
dto.setProcessInstanceId(execution.getProcessInstanceId());
|
|
||||||
dto.setRetries(1);
|
|
||||||
Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED,
|
|
||||||
new DeleteTimerJobTransactionListener(dto));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,4 +79,9 @@ public class ExtAxDict extends BaseEntity<ExtAxDict> {
|
|||||||
* 是否展示在发起工作台
|
* 是否展示在发起工作台
|
||||||
*/
|
*/
|
||||||
private Boolean displayInitiateMenu;
|
private Boolean displayInitiateMenu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 版本号
|
||||||
|
*/
|
||||||
|
private Integer version;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,9 +3,12 @@ package cn.axzo.workflow.core.service;
|
|||||||
import cn.axzo.workflow.common.model.dto.BpmnFormRelationSearchDTO;
|
import cn.axzo.workflow.common.model.dto.BpmnFormRelationSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||||
|
import cn.axzo.workflow.common.model.response.form.instance.FormDataVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -22,4 +25,6 @@ public interface FormCoreService {
|
|||||||
FormDefinitionVO getStartForm(StartFormSearchDTO dto);
|
FormDefinitionVO getStartForm(StartFormSearchDTO dto);
|
||||||
|
|
||||||
FormInstanceVO getFormInstance(FormDetailDTO dto);
|
FormInstanceVO getFormInstance(FormDetailDTO dto);
|
||||||
|
|
||||||
|
List<FormDataVO> getFormData(FromDataSearchDTO dto);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -165,7 +165,8 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
|
|||||||
dto.getJsonModel().getNoticeConf(),
|
dto.getJsonModel().getNoticeConf(),
|
||||||
dto.getJsonModel().getButtonConf(),
|
dto.getJsonModel().getButtonConf(),
|
||||||
dto.getJsonModel().getFieldConf(),
|
dto.getJsonModel().getFieldConf(),
|
||||||
serviceVersion);
|
serviceVersion,
|
||||||
|
optCategory.get().getVersion());
|
||||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||||
updateProcessDefinition(model.getId(), bpmn);
|
updateProcessDefinition(model.getId(), bpmn);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -154,6 +154,7 @@ import java.util.function.Function;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static cn.axzo.workflow.client.config.WorkflowRequestInterceptor.HEADER_SERVER_NAME;
|
import static cn.axzo.workflow.client.config.WorkflowRequestInterceptor.HEADER_SERVER_NAME;
|
||||||
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CREATE_PARAM_ERROR;
|
||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.RUNNING_INSTANCE_ONLY_FORECAST;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.RUNNING_INSTANCE_ONLY_FORECAST;
|
||||||
@ -162,6 +163,7 @@ import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS
|
|||||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_INVALID;
|
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_INVALID;
|
||||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_SUSPENDED;
|
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_SUSPENDED;
|
||||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_KEY_NOT_EXISTS;
|
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_KEY_NOT_EXISTS;
|
||||||
|
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPMN_FILE_SUFFIX;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BPMN_FILE_SUFFIX;
|
||||||
@ -187,9 +189,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE
|
|||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_VARIABLE;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_VARIABLE;
|
||||||
import static cn.axzo.workflow.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
|
import static cn.axzo.workflow.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
|
||||||
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS;
|
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS;
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed;
|
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed_empty;
|
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed_empty;
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection;
|
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection_empty;
|
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection_empty;
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.human;
|
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.human;
|
||||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.transferToAdmin;
|
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.transferToAdmin;
|
||||||
@ -211,6 +211,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETE
|
|||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
|
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
|
||||||
import static cn.axzo.workflow.common.enums.WorkspaceType.GOVERNMENT;
|
import static cn.axzo.workflow.common.enums.WorkspaceType.GOVERNMENT;
|
||||||
|
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
|
||||||
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.countSql;
|
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.countSql;
|
||||||
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.sqlConnectors;
|
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.sqlConnectors;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||||
@ -220,6 +221,10 @@ 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.getApproverSpecify;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
||||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
|
||||||
@ -421,6 +426,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
|||||||
.approvalMethodEnum(getApprovalMethod(fe).orElse(null))
|
.approvalMethodEnum(getApprovalMethod(fe).orElse(null))
|
||||||
.approverScopeEnum(getApproverScope(fe).orElse(null))
|
.approverScopeEnum(getApproverScope(fe).orElse(null))
|
||||||
.approverSpecifyEnum(approverSpecifyEnum)
|
.approverSpecifyEnum(approverSpecifyEnum)
|
||||||
|
.initiatorSpecifyRange(getInitiatorSpecifyRange(fe).orElse(null))
|
||||||
|
.initiatorSpecifiedFilter(getInitiatorSpecifiedFilter(fe).orElse(null))
|
||||||
|
.excludeIdentityTypes(getExcludeIdentityTypes(fe).orElse(null))
|
||||||
|
.excludeCooperateShipTypes(getExcludeCooperateShipTypes(fe).orElse(null))
|
||||||
.approverEmptyHandleTypeEnum(getApproverEmptyHandleType(fe).orElse(null))
|
.approverEmptyHandleTypeEnum(getApproverEmptyHandleType(fe).orElse(null))
|
||||||
.signature(getActivitySignature(fe))
|
.signature(getActivitySignature(fe))
|
||||||
.signApproverLimit(getSignApproverLimit(fe).orElse(null))
|
.signApproverLimit(getSignApproverLimit(fe).orElse(null))
|
||||||
@ -466,7 +475,15 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
|||||||
throw new WorkflowEngineException(PROCESS_DEFINITION_IS_INVALID, dto.getProcessDefinitionKey());
|
throw new WorkflowEngineException(PROCESS_DEFINITION_IS_INVALID, dto.getProcessDefinitionKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//新版入参 nodeId 校验
|
||||||
|
if (categoryItemVO.isPresent() && categoryItemVO.get().getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && categoryItemVO.get().getVersion() > 0) {
|
||||||
|
if (Objects.isNull(dto.getCooperationOrg().getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(PROCESS_INSTANCE_CREATE_PARAM_ERROR);
|
||||||
|
}
|
||||||
|
if (!StringUtils.hasText(dto.getInitiator().getNodeId())) {
|
||||||
|
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
categoryItemVO.ifPresent(itemVO -> {
|
categoryItemVO.ifPresent(itemVO -> {
|
||||||
dto.getVariables().put(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.getType(Integer.valueOf(itemVO.getWorkspaceTypeCode())).getCode());
|
dto.getVariables().put(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.getType(Integer.valueOf(itemVO.getWorkspaceTypeCode())).getCode());
|
||||||
dto.getVariables().put(INTERNAL_PROCESS_BIZ_TYPE, itemVO.getBusinessType().getType());
|
dto.getVariables().put(INTERNAL_PROCESS_BIZ_TYPE, itemVO.getBusinessType().getType());
|
||||||
@ -1415,7 +1432,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
|||||||
.findAny()
|
.findAny()
|
||||||
.ifPresent(i -> {
|
.ifPresent(i -> {
|
||||||
authorizedButtons.addAll(chooseButtons(logVO, CONFIG_BUTTON_TYPE_CURRENT));
|
authorizedButtons.addAll(chooseButtons(logVO, CONFIG_BUTTON_TYPE_CURRENT));
|
||||||
supportUpgrade.set(Objects.equals(Boolean.TRUE,i.getSupportUpgradeApproval()));
|
supportUpgrade.set(Objects.equals(Boolean.TRUE, i.getSupportUpgradeApproval()));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -1586,63 +1603,63 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
|||||||
ListUtils.emptyIfNull(forecasting).stream()
|
ListUtils.emptyIfNull(forecasting).stream()
|
||||||
.filter(i -> Objects.equals(Boolean.TRUE, i.getFutureNode()))
|
.filter(i -> Objects.equals(Boolean.TRUE, i.getFutureNode()))
|
||||||
.forEach(e -> {
|
.forEach(e -> {
|
||||||
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
|
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
|
||||||
.taskDefinitionKey(e.getId())
|
.taskDefinitionKey(e.getId())
|
||||||
.name(e.getName())
|
.name(e.getName())
|
||||||
.approvalMethod(e.getApprovalMethod())
|
.approvalMethod(e.getApprovalMethod())
|
||||||
.nodeType(e.getNodeType())
|
.nodeType(e.getNodeType())
|
||||||
.nodeMode(e.getNodeMode())
|
.nodeMode(e.getNodeMode())
|
||||||
.forecastAssignees(e.getForecastAssigners())
|
.forecastAssignees(e.getForecastAssigners())
|
||||||
.build();
|
.build();
|
||||||
if (Objects.nonNull(e.getApprovalMethod())) {
|
if (Objects.nonNull(e.getApprovalMethod())) {
|
||||||
switch (e.getApprovalMethod()) {
|
switch (e.getApprovalMethod()) {
|
||||||
case bizSpecify:
|
case bizSpecify:
|
||||||
build.setOperationDesc("动态审批人");
|
build.setOperationDesc("动态审批人");
|
||||||
break;
|
break;
|
||||||
case nobody:
|
case nobody:
|
||||||
build.setOperationDesc("系统处理");
|
build.setOperationDesc("系统处理");
|
||||||
break;
|
break;
|
||||||
case autoPassed:
|
case autoPassed:
|
||||||
build.setOperationDesc("无需审批人,自动同意");
|
build.setOperationDesc("无需审批人,自动同意");
|
||||||
break;
|
break;
|
||||||
case autoRejection:
|
case autoRejection:
|
||||||
build.setOperationDesc("无需审批人,自动驳回");
|
build.setOperationDesc("无需审批人,自动驳回");
|
||||||
break;
|
break;
|
||||||
case autoPassed_empty:
|
case autoPassed_empty:
|
||||||
build.setOperationDesc("未找到审批人,自动同意");
|
build.setOperationDesc("未找到审批人,自动同意");
|
||||||
break;
|
break;
|
||||||
case autoRejection_empty:
|
case autoRejection_empty:
|
||||||
build.setOperationDesc("未找到审批人,自动驳回");
|
build.setOperationDesc("未找到审批人,自动驳回");
|
||||||
break;
|
break;
|
||||||
case transferToAdmin:
|
case transferToAdmin:
|
||||||
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
|
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
|
||||||
break;
|
break;
|
||||||
case human:
|
case human:
|
||||||
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
|
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
|
||||||
build.setOperationDesc("");
|
build.setOperationDesc("");
|
||||||
} else {
|
} else {
|
||||||
int countPerson = e.getForecastAssigners().size();
|
int countPerson = e.getForecastAssigners().size();
|
||||||
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
|
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
|
||||||
build.setOperationDesc(countPerson + "人会签,需要全部同意");
|
build.setOperationDesc(countPerson + "人会签,需要全部同意");
|
||||||
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
|
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
|
||||||
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
|
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
|
||||||
}
|
}
|
||||||
if (Objects.equals(countPerson, 1)) {
|
if (Objects.equals(countPerson, 1)) {
|
||||||
// 如果未来节点是单人,则按单人节点展示
|
// 如果未来节点是单人,则按单人节点展示
|
||||||
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
|
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
|
||||||
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
|
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
|
||||||
build.setForecastAssignees(null);
|
build.setForecastAssignees(null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
}
|
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
|
||||||
}
|
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "人");
|
||||||
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
|
}
|
||||||
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "人");
|
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
|
||||||
}
|
tasks.add(build);
|
||||||
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
|
});
|
||||||
tasks.add(build);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getHistoricTasks(List<ExtAxProcessLog> logs,
|
private void getHistoricTasks(List<ExtAxProcessLog> logs,
|
||||||
|
|||||||
@ -282,7 +282,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
|||||||
dto.getJsonModel().getNoticeConf(),
|
dto.getJsonModel().getNoticeConf(),
|
||||||
dto.getJsonModel().getButtonConf(),
|
dto.getJsonModel().getButtonConf(),
|
||||||
dto.getJsonModel().getFieldConf(),
|
dto.getJsonModel().getFieldConf(),
|
||||||
serviceVersion);
|
serviceVersion,
|
||||||
|
optCategory.get().getVersion());
|
||||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||||
processDefinitionService.updateProcessDefinition(model.getId(), bpmn);
|
processDefinitionService.updateProcessDefinition(model.getId(), bpmn);
|
||||||
@ -376,7 +377,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
|||||||
dto.getJsonModel().getNoticeConf(),
|
dto.getJsonModel().getNoticeConf(),
|
||||||
dto.getJsonModel().getButtonConf(),
|
dto.getJsonModel().getButtonConf(),
|
||||||
dto.getJsonModel().getFieldConf(),
|
dto.getJsonModel().getFieldConf(),
|
||||||
serviceVersion);
|
serviceVersion,
|
||||||
|
optCategory.get().getVersion());
|
||||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||||
processDefinitionService.updateProcessDefinition(originModel.getId(), bpmn);
|
processDefinitionService.updateProcessDefinition(originModel.getId(), bpmn);
|
||||||
|
|||||||
@ -118,6 +118,7 @@ public class CategoryServiceImpl extends ServiceImpl<ExtAxDictMapper, ExtAxDict>
|
|||||||
dict.setBusinessType(dto.getBusinessType());
|
dict.setBusinessType(dto.getBusinessType());
|
||||||
dict.setIcon(dto.getIcon());
|
dict.setIcon(dto.getIcon());
|
||||||
dict.setDisplayInitiateMenu(dto.getDisplayInitiateMenu());
|
dict.setDisplayInitiateMenu(dto.getDisplayInitiateMenu());
|
||||||
|
dict.setVersion(dto.getVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -221,14 +222,17 @@ public class CategoryServiceImpl extends ServiceImpl<ExtAxDictMapper, ExtAxDict>
|
|||||||
.eq(StringUtils.isNotBlank(dto.getDictType()), ExtAxDict::getType, dto.getDictType())
|
.eq(StringUtils.isNotBlank(dto.getDictType()), ExtAxDict::getType, dto.getDictType())
|
||||||
.like(StringUtils.isNotBlank(dto.getLabel()), ExtAxDict::getLabel, dto.getLabel())
|
.like(StringUtils.isNotBlank(dto.getLabel()), ExtAxDict::getLabel, dto.getLabel())
|
||||||
.eq(StringUtils.isNotBlank(dto.getValue()), ExtAxDict::getValue, dto.getValue())
|
.eq(StringUtils.isNotBlank(dto.getValue()), ExtAxDict::getValue, dto.getValue())
|
||||||
|
.in(!CollectionUtils.isEmpty(dto.getValues()), ExtAxDict::getValue, dto.getValues())
|
||||||
.eq(Objects.nonNull(dto.getStatus()), ExtAxDict::getStatus, dto.getStatus())
|
.eq(Objects.nonNull(dto.getStatus()), ExtAxDict::getStatus, dto.getStatus())
|
||||||
.eq(StringUtils.isNotBlank(dto.getWorkspaceTypeCode()), ExtAxDict::getWorkspaceTypeCode,
|
.eq(StringUtils.isNotBlank(dto.getWorkspaceTypeCode()), ExtAxDict::getWorkspaceTypeCode,
|
||||||
dto.getWorkspaceTypeCode())
|
dto.getWorkspaceTypeCode())
|
||||||
|
.in(!CollectionUtils.isEmpty(dto.getWorkspaceTypeCodes()), ExtAxDict::getWorkspaceTypeCode, dto.getWorkspaceTypeCodes())
|
||||||
.eq(ExtAxDict::getTenantId, dto.getTenantId())
|
.eq(ExtAxDict::getTenantId, dto.getTenantId())
|
||||||
.eq(dto.getBusinessType() != null, ExtAxDict::getBusinessType, dto.getBusinessType())
|
.eq(dto.getBusinessType() != null, ExtAxDict::getBusinessType, dto.getBusinessType())
|
||||||
|
.in(!CollectionUtils.isEmpty(dto.getBusinessTypes()), ExtAxDict::getBusinessType, dto.getBusinessTypes())
|
||||||
.eq(ExtAxDict::getIsDelete, 0)
|
.eq(ExtAxDict::getIsDelete, 0)
|
||||||
.orderByDesc(Objects.equals(dto.getOrderCreateAt(), "desc"), ExtAxDict::getCreateAt);
|
.orderByDesc(Objects.equals(dto.getOrderCreateAt(), "desc"), ExtAxDict::getCreateAt);
|
||||||
;
|
;
|
||||||
List<ExtAxDict> extAxDicts = dictMapper.selectList(queryWrapper);
|
List<ExtAxDict> extAxDicts = dictMapper.selectList(queryWrapper);
|
||||||
return categoryConverter.toVos(extAxDicts);
|
return categoryConverter.toVos(extAxDicts);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,7 +78,7 @@ public class ExtAxModelDocServiceImpl implements ExtAxModelDocService {
|
|||||||
public List<DocBaseVO> docList(DocQueryDTO dto) {
|
public List<DocBaseVO> docList(DocQueryDTO dto) {
|
||||||
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
|
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
|
||||||
return commandExecutor.execute(new CustomGetModelDocsCmd(dto.getProcessInstanceId(),
|
return commandExecutor.execute(new CustomGetModelDocsCmd(dto.getProcessInstanceId(),
|
||||||
dto.getProcessDefinitionKey(), dto.getTenantId(), extAxModelDocMapper, extAxReModelService));
|
dto.getProcessDefinitionKey(), dto.getProcessDefinitionKeys(), dto.getTenantId(), extAxModelDocMapper, extAxReModelService));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -1,13 +1,16 @@
|
|||||||
package cn.axzo.workflow.core.service.impl;
|
package cn.axzo.workflow.core.service.impl;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.enums.FormFieldTypeEnum;
|
||||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.dto.BpmnFormRelationSearchDTO;
|
import cn.axzo.workflow.common.model.dto.BpmnFormRelationSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||||
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||||
|
import cn.axzo.workflow.common.model.response.form.instance.FormDataVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||||
import cn.axzo.workflow.core.common.utils.FormHelper;
|
import cn.axzo.workflow.core.common.utils.FormHelper;
|
||||||
@ -28,12 +31,17 @@ import org.flowable.engine.impl.cmd.GetBpmnModelCmd;
|
|||||||
import org.flowable.form.api.FormInfo;
|
import org.flowable.form.api.FormInfo;
|
||||||
import org.flowable.form.api.FormInstanceInfo;
|
import org.flowable.form.api.FormInstanceInfo;
|
||||||
import org.flowable.form.api.FormRepositoryService;
|
import org.flowable.form.api.FormRepositoryService;
|
||||||
|
import org.flowable.form.model.FormContainer;
|
||||||
import org.flowable.form.model.FormField;
|
import org.flowable.form.model.FormField;
|
||||||
import org.flowable.form.model.SimpleFormModel;
|
import org.flowable.form.model.SimpleFormModel;
|
||||||
import org.flowable.spring.SpringProcessEngineConfiguration;
|
import org.flowable.spring.SpringProcessEngineConfiguration;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.text.Normalizer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -130,4 +138,41 @@ public class FormCoreServiceImpl implements FormCoreService {
|
|||||||
bpmnProcessTaskForEsService, dto.getAssigner(), dto.getProcessInstanceId(), dto.getTaskId(), dto.getShowOriginDefaultValue()));
|
bpmnProcessTaskForEsService, dto.getAssigner(), dto.getProcessInstanceId(), dto.getTaskId(), dto.getShowOriginDefaultValue()));
|
||||||
return formInstanceConverter.toVo(formInstanceInfo);
|
return formInstanceConverter.toVo(formInstanceInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FormDataVO> getFormData(FromDataSearchDTO dto) {
|
||||||
|
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
|
||||||
|
FormInstanceInfo formInstanceInfo = commandExecutor.execute(new GetFormInstanceAndPermissionCmd(bpmnFormRelationService,
|
||||||
|
bpmnProcessTaskForEsService, null, dto.getProcessInstanceId(), dto.getTaskId(), true));
|
||||||
|
List<FormField> fields = null;
|
||||||
|
if (Objects.isNull(formInstanceInfo)
|
||||||
|
|| Objects.isNull(formInstanceInfo.getFormModel())
|
||||||
|
|| (formInstanceInfo.getFormModel() instanceof SimpleFormModel) && CollectionUtils.isEmpty(fields = ((SimpleFormModel) formInstanceInfo.getFormModel()).getFields())) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CollectionUtils.isEmpty(fields)) {
|
||||||
|
List<FormDataVO> dataList = new ArrayList<>();
|
||||||
|
fields.forEach(i -> recursiveConvert(i, dataList));
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void recursiveConvert(FormField field, List<FormDataVO> formDataList) {
|
||||||
|
if (Objects.isNull(field)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (field instanceof FormContainer) {
|
||||||
|
((FormContainer) field).getFields().forEach(subField -> subField.forEach(i -> recursiveConvert(i, formDataList)));
|
||||||
|
} else {
|
||||||
|
FormDataVO formDataVO = new FormDataVO();
|
||||||
|
formDataVO.setFieldId(field.getId());
|
||||||
|
formDataVO.setFieldType(FormFieldTypeEnum.valueOfType(field.getType()));
|
||||||
|
// TODO 根据不同数据类型,进行数据转码
|
||||||
|
formDataVO.setFieldValue(FormFieldTypeEnum.parseValue(field.getType(), field.getValue(), field.getParams()));
|
||||||
|
formDataList.add(formDataVO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -145,6 +145,7 @@ public class DingTalkUtils {
|
|||||||
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
|
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
|
||||||
markdown.setTitle("Notice 业务节点长时间停止告警, Env: " + profile);
|
markdown.setTitle("Notice 业务节点长时间停止告警, Env: " + profile);
|
||||||
markdown.setText("#### [" + profile + "]业务节点长时间停止\n" +
|
markdown.setText("#### [" + profile + "]业务节点长时间停止\n" +
|
||||||
|
"> 审批业务: " + alterDTO.getProcessDefinitionName() + "(" + alterDTO.getProcessDefinitionKey() + ")" + "\n\n" +
|
||||||
"> 节点相关信息: " + JSONUtil.toJsonStr(alterDTO) + "\n\n" +
|
"> 节点相关信息: " + JSONUtil.toJsonStr(alterDTO) + "\n\n" +
|
||||||
"> ##### [点击查看审批日志](" + getWebUrl(profile) + "/#/workflow/examples?processInstanceId=" + processInstanceId + ") \n\n" +
|
"> ##### [点击查看审批日志](" + getWebUrl(profile) + "/#/workflow/examples?processInstanceId=" + processInstanceId + ") \n\n" +
|
||||||
"> ##### 提示:如果以上地址提示未登录,请在对应环境 OMS 系统登录后并点击审批管理的功能后,再使用。或者复制实例 ID 到 OMS 中手动查询 \n\n" +
|
"> ##### 提示:如果以上地址提示未登录,请在对应环境 OMS 系统登录后并点击审批管理的功能后,再使用。或者复制实例 ID 到 OMS 中手动查询 \n\n" +
|
||||||
@ -174,7 +175,7 @@ public class DingTalkUtils {
|
|||||||
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
|
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
|
||||||
markdown.setTitle("Notice 审批模板节点预检查告警, Env: " + profile);
|
markdown.setTitle("Notice 审批模板节点预检查告警, Env: " + profile);
|
||||||
markdown.setText("#### [" + profile + "]审批模板节点预检查告警\n" +
|
markdown.setText("#### [" + profile + "]审批模板节点预检查告警\n" +
|
||||||
// "> 相关信息: " + JSONUtil.toJsonStr(alterDTO) + "\n\n" +
|
"> 审批业务: " + alterDTO.getProcessDefinitionName() + "(" + alterDTO.getProcessDefinitionKey() + ")" + "\n\n" +
|
||||||
"> 实例 ID:" + alterDTO.getProcessInstanceId() + "\n\n" +
|
"> 实例 ID:" + alterDTO.getProcessInstanceId() + "\n\n" +
|
||||||
"> 检测节点 ID:" + alterDTO.getActivityId() + "\n\n" +
|
"> 检测节点 ID:" + alterDTO.getActivityId() + "\n\n" +
|
||||||
"> ##### 错误信息:" + alterDTO.getErrorMsg() + "\n\n" +
|
"> ##### 错误信息:" + alterDTO.getErrorMsg() + "\n\n" +
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import static org.dromara.easyes.annotation.rely.Analyzer.IK_MAX_WORD;
|
|||||||
* @since 2024-09-25 20:32
|
* @since 2024-09-25 20:32
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Settings(settingsProvider = CustomIndexSettingProvider.class)
|
@Settings(settingsProvider = CustomIndexSettingProvider.class, replicasNum = 1, shardsNum = 3)
|
||||||
@IndexName(value = "process_instance_document", keepGlobalPrefix = true, refreshPolicy = RefreshPolicy.IMMEDIATE)
|
@IndexName(value = "process_instance_document", keepGlobalPrefix = true, refreshPolicy = RefreshPolicy.IMMEDIATE)
|
||||||
@Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
|
@Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
|
||||||
public class ProcessInstanceDocument {
|
public class ProcessInstanceDocument {
|
||||||
@ -100,6 +100,11 @@ public class ProcessInstanceDocument {
|
|||||||
@IndexField(fieldType = FieldType.KEYWORD)
|
@IndexField(fieldType = FieldType.KEYWORD)
|
||||||
private String initiatorName;
|
private String initiatorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起人模型
|
||||||
|
*/
|
||||||
|
private String initiatorJsonStr;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 实例对应的流程引擎服务端迭代版本
|
* 实例对应的流程引擎服务端迭代版本
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -30,6 +30,13 @@ public interface EsProcessInstanceService {
|
|||||||
*/
|
*/
|
||||||
Boolean deleteIndex();
|
Boolean deleteIndex();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新流程实例索引
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Boolean updateIndex();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增流程实例文档
|
* 新增流程实例文档
|
||||||
*
|
*
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
|||||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||||
import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -85,7 +86,12 @@ public class AggregateProcessInstanceService {
|
|||||||
if (Objects.nonNull(function) && !StringUtils.hasText(initiator.getAssignerName()) && NumberUtil.isNumber(initiator.getPersonId())) {
|
if (Objects.nonNull(function) && !StringUtils.hasText(initiator.getAssignerName()) && NumberUtil.isNumber(initiator.getPersonId())) {
|
||||||
fullAssigner = function.apply(Lists.newArrayList(initiator)).getOrDefault(Long.parseLong(initiator.getPersonId()), null);
|
fullAssigner = function.apply(Lists.newArrayList(initiator)).getOrDefault(Long.parseLong(initiator.getPersonId()), null);
|
||||||
}
|
}
|
||||||
processInstanceDocument.setInitiatorName(Objects.nonNull(fullAssigner) ? fullAssigner.getAssignerName() : StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
if (Objects.nonNull(fullAssigner)) {
|
||||||
|
fullAssigner.setAssignerName(StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||||
|
processInstanceDocument.setInitiatorName(fullAssigner.getAssignerName());
|
||||||
|
processInstanceDocument.setInitiatorJsonStr(JSON.toJSONString(fullAssigner));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
processInstanceDocument.setWorkflowEngineVersion(String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121)));
|
processInstanceDocument.setWorkflowEngineVersion(String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121)));
|
||||||
processInstanceDocument.setProcessCategoryType(WorkspaceType.getType((Integer) variables.getOrDefault(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.UN_KNOW.getCode())).getDesc());
|
processInstanceDocument.setProcessCategoryType(WorkspaceType.getType((Integer) variables.getOrDefault(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.UN_KNOW.getCode())).getDesc());
|
||||||
@ -101,7 +107,7 @@ public class AggregateProcessInstanceService {
|
|||||||
esProcessInstanceService.insert(ES_FIXED_ROUTING, processInstanceDocument);
|
esProcessInstanceService.insert(ES_FIXED_ROUTING, processInstanceDocument);
|
||||||
|
|
||||||
String instanceVersion = String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121))
|
String instanceVersion = String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121))
|
||||||
.replaceAll("-SNAPSHOT","")
|
.replaceAll("-SNAPSHOT", "")
|
||||||
.replaceAll("-RELEASE", "");
|
.replaceAll("-RELEASE", "");
|
||||||
DefaultArtifactVersion version = new DefaultArtifactVersion(instanceVersion);
|
DefaultArtifactVersion version = new DefaultArtifactVersion(instanceVersion);
|
||||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_142);
|
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_142);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
package cn.axzo.workflow.es.service.impl;
|
package cn.axzo.workflow.es.service.impl;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
||||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
|
||||||
import cn.axzo.workflow.es.mapper.EsProcessInstanceMapper;
|
import cn.axzo.workflow.es.mapper.EsProcessInstanceMapper;
|
||||||
import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
||||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||||
@ -10,8 +10,10 @@ import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.easyes.annotation.IndexName;
|
import org.dromara.easyes.annotation.IndexName;
|
||||||
|
import org.dromara.easyes.annotation.rely.FieldType;
|
||||||
import org.dromara.easyes.core.biz.EsPageInfo;
|
import org.dromara.easyes.core.biz.EsPageInfo;
|
||||||
import org.dromara.easyes.core.cache.GlobalConfigCache;
|
import org.dromara.easyes.core.cache.GlobalConfigCache;
|
||||||
|
import org.dromara.easyes.core.conditions.index.LambdaEsIndexWrapper;
|
||||||
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
||||||
import org.dromara.easyes.core.config.GlobalConfig;
|
import org.dromara.easyes.core.config.GlobalConfig;
|
||||||
import org.dromara.easyes.core.toolkit.FieldUtils;
|
import org.dromara.easyes.core.toolkit.FieldUtils;
|
||||||
@ -70,6 +72,19 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
|||||||
return esProcessInstanceMapper.deleteIndex(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
return esProcessInstanceMapper.deleteIndex(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean updateIndex() {
|
||||||
|
GlobalConfig globalConfig = GlobalConfigCache.getGlobalConfig();
|
||||||
|
|
||||||
|
LambdaEsIndexWrapper<ProcessInstanceDocument> wrapper = new LambdaEsIndexWrapper<>();
|
||||||
|
// 指定要更新哪个索引
|
||||||
|
IndexName annotation = AnnotationUtils.findAnnotation(ProcessInstanceDocument.class, IndexName.class);
|
||||||
|
wrapper.indexName(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||||
|
wrapper.mapping("initiator_json_str", FieldType.TEXT);
|
||||||
|
esProcessInstanceMapper.updateIndex(wrapper);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增流程实例文档文档
|
* 新增流程实例文档文档
|
||||||
*
|
*
|
||||||
@ -121,7 +136,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
|||||||
.eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
|
.eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
|
||||||
.and(StringUtils.hasText(dto.getProcessInstanceName()),
|
.and(StringUtils.hasText(dto.getProcessInstanceName()),
|
||||||
w -> w.or(i -> i.eq(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName(), 1.2F))
|
w -> w.or(i -> i.eq(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName(), 1.2F))
|
||||||
.or(j->j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
.or(j -> j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
||||||
)
|
)
|
||||||
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
|
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
|
||||||
.ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
|
.ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiResult;
|
|||||||
import cn.axzo.karma.client.feign.FlowSupportApi;
|
import cn.axzo.karma.client.feign.FlowSupportApi;
|
||||||
import cn.axzo.karma.client.model.request.PersonProfileQueryReq;
|
import cn.axzo.karma.client.model.request.PersonProfileQueryReq;
|
||||||
import cn.axzo.karma.client.model.response.PersonProfileResp;
|
import cn.axzo.karma.client.model.response.PersonProfileResp;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||||
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
||||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
@ -265,4 +266,22 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
|||||||
this.applicationContext = context;
|
this.applicationContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<BpmnTaskDelegateAssigner> convertApprover(List<FlowTaskAssignerV2Resp> flowTaskAssignersV2) {
|
||||||
|
if (CollectionUtils.isEmpty(flowTaskAssignersV2)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return flowTaskAssignersV2.stream()
|
||||||
|
.map(i -> BpmnTaskDelegateAssigner.builder()
|
||||||
|
.assignee(i.getIdentityId())
|
||||||
|
.assigneeType(i.getIdentityType())
|
||||||
|
.assignerName(i.getRealName())
|
||||||
|
.personId(String.valueOf(i.getPersonId()))
|
||||||
|
.tenantId(String.valueOf(i.getWorkspaceId()))
|
||||||
|
.ouId(String.valueOf(i.getOuId()))
|
||||||
|
.avatar(i.getAvatarUrl())
|
||||||
|
.nodeId(i.getNodeId())
|
||||||
|
.build())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
|||||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import groovy.util.logging.Slf4j;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.collections4.ListUtils;
|
import org.apache.commons.collections4.ListUtils;
|
||||||
import org.flowable.bpmn.model.FlowElement;
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
@ -33,10 +35,11 @@ import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TA
|
|||||||
* @author wangli
|
* @author wangli
|
||||||
* @since 2023/11/18 22:56
|
* @since 2023/11/18 22:56
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
|
@AllArgsConstructor
|
||||||
public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
@Resource
|
private final OrgNodeUserApi orgNodeUserApi;
|
||||||
private OrgNodeUserApi orgNodeUserApi;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
|
|||||||
@ -0,0 +1,106 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.foundation.page.PageResp;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.collections4.ListUtils;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.bpmn.model.UserTask;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于固定人员的任务审批人选择器
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-18 14:58
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class BasedFixedPersonV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
private final OrgNodeUserApi orgNodeUserApi;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.fixedPerson_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
|
||||||
|
Boolean throwException) {
|
||||||
|
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||||
|
if (!(flowElement instanceof UserTask)) {
|
||||||
|
return super.select(flowElement, execution, throwException);
|
||||||
|
}
|
||||||
|
BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement)
|
||||||
|
.ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class)));
|
||||||
|
|
||||||
|
Set<Long> workspaceIds = assigners.stream()
|
||||||
|
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||||
|
.filter(StringUtils::hasText)
|
||||||
|
.map(Long::parseLong)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
List<Long> personIds = assigners.stream()
|
||||||
|
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||||
|
.filter(StringUtils::hasText)
|
||||||
|
.map(Long::parseLong)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (CollectionUtils.isEmpty(personIds)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<OrgNodeUserDTO> onlineUsers = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq();
|
||||||
|
searchReq.setWorkspaceIds(workspaceIds);
|
||||||
|
searchReq.setPersonIds(personIds);
|
||||||
|
searchReq.setPage(1);
|
||||||
|
searchReq.setPageSize(personIds.size());
|
||||||
|
PageResp<OrgNodeUserDTO> pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职",
|
||||||
|
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq);
|
||||||
|
if (pageResp != null) {
|
||||||
|
onlineUsers = pageResp.getData();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (Boolean.TRUE.equals(throwException)) {
|
||||||
|
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||||
|
this.getType(), e.getMessage());
|
||||||
|
} else {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只要有在职的人,不会走审批人为空
|
||||||
|
if (ListUtils.emptyIfNull(onlineUsers).stream()
|
||||||
|
.filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||||
|
.anyMatch(u -> assigners.stream()
|
||||||
|
.anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||||
|
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||||
|
return assigners;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,131 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerIdentityEnum;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
|
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections4.ListUtils;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.bpmn.model.UserTask;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_ROLE_V2_CONFIG_INVALID;
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_TYPE_NOT_SUPPORT;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||||
|
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于新版配置的身份查询审批人
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-15 10:58
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
@Resource
|
||||||
|
private OrgNodeUserApi orgNodeUserApi;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.identity_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||||
|
if (!optRange.isPresent()) {
|
||||||
|
throw new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||||
|
}
|
||||||
|
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||||
|
|
||||||
|
// 获取发起人
|
||||||
|
BpmnTaskDelegateAssigner initiator =
|
||||||
|
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||||
|
|
||||||
|
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||||
|
.scene(FlowTaskAssignerQuerySceneEnum.BY_ROLE)
|
||||||
|
.identities(getApproverSpecifyValue(flowElement))
|
||||||
|
.initiatorPersonId(initiator.parsePersonId())
|
||||||
|
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||||
|
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||||
|
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||||
|
switch (optRange.get()) {
|
||||||
|
case within_the_project:
|
||||||
|
log.info("executing role v2 with within_the_project");
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||||
|
.crossDomain(false)
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
throw new WorkflowEngineException(ENGINE_USER_TASK_TYPE_NOT_SUPPORT);
|
||||||
|
case specified_org:
|
||||||
|
log.info("executing role v2 with specified_org");
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
log.info("executing role v2 with initiator");
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(initiator.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
log.info("executing role v2 with pre_node_approver");
|
||||||
|
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(lastOperationApprover.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||||
|
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询角色下的人",
|
||||||
|
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||||
|
return convertApprover(apiResultUsers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<FlowTaskAssignerIdentityEnum> getApproverSpecifyValue(FlowElement flowElement) {
|
||||||
|
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||||
|
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||||
|
.map(i -> i.getString("value"))
|
||||||
|
.map(FlowTaskAssignerIdentityEnum::valueOf)
|
||||||
|
.collect(Collectors.toSet()))
|
||||||
|
.orElse(Collections.emptySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.engine.RuntimeService;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INITIATOR_SPECIFY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于发起人指定的任务审批人选择器
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-18 14:43
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class BasedInitiatorSpecifiedV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
private final RuntimeService runtimeService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.initiatorSpecified_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
populateAssigneeByInitiatorSpecify(assigners, flowElement, execution);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
if (Boolean.TRUE.equals(throwException)) {
|
||||||
|
log.warn("执行查询发起时指定审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage());
|
||||||
|
if (!(t instanceof WorkflowEngineException)) {
|
||||||
|
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||||
|
this.getType(), t.getMessage());
|
||||||
|
}
|
||||||
|
throw t;
|
||||||
|
} else {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return assigners.stream().filter(i -> StringUtils.hasText(i.getPersonId())).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建审批时,传入各个节点应该设置的审批人的数据信息,此处直接设置人
|
||||||
|
*
|
||||||
|
* @param assigners
|
||||||
|
* @param flowElement
|
||||||
|
* @param execution
|
||||||
|
*/
|
||||||
|
private void populateAssigneeByInitiatorSpecify(List<BpmnTaskDelegateAssigner> assigners, FlowElement flowElement, DelegateExecution execution) {
|
||||||
|
String processInstanceId = execution.getProcessInstanceId();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, List<BpmnTaskDelegateAssigner>> initiatorSpecifyMap = runtimeService.getVariable(processInstanceId, INITIATOR_SPECIFY, Map.class);
|
||||||
|
if (CollectionUtils.isEmpty(initiatorSpecifyMap)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assigners.addAll(initiatorSpecifyMap.getOrDefault(flowElement.getId(), Collections.emptyList()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于发起自己的任务审批人选择器
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-18 14:54
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class BasedInitiatorV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.initiator_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
// 获取发起人
|
||||||
|
BpmnTaskDelegateAssigner initiator =
|
||||||
|
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||||
|
return Collections.singletonList(initiator);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,154 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
|
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections4.ListUtils;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.bpmn.model.UserTask;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_POSITION_V2_CONFIG_INVALID;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||||
|
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||||
|
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于新版配置的岗位查询审批人
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-15 10:58
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
@Resource
|
||||||
|
private OrgNodeUserApi orgNodeUserApi;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.position_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||||
|
if (!optRange.isPresent()) {
|
||||||
|
throw new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||||
|
|
||||||
|
// 获取发起人
|
||||||
|
BpmnTaskDelegateAssigner initiator =
|
||||||
|
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||||
|
|
||||||
|
;
|
||||||
|
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||||
|
.scene(FlowTaskAssignerQuerySceneEnum.BY_JOB)
|
||||||
|
.jobCodes(getApproverSpecifyValue(flowElement))
|
||||||
|
.initiatorPersonId(initiator.parsePersonId())
|
||||||
|
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||||
|
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||||
|
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||||
|
switch (optRange.get()) {
|
||||||
|
case within_the_project:
|
||||||
|
log.info("executing position v2 with within_the_project");
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||||
|
.crossDomain(false)
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
log.info("executing position v2 with within_the_project_construction_units");
|
||||||
|
CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||||
|
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||||
|
.crossDomain(true)
|
||||||
|
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name())))
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
log.info("executing position v2 with specified_org");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
log.info("executing position v2 with initiator");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(initiator.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
log.info("executing position v2 with pre_node_approver");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(lastOperationApprover.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||||
|
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询岗位下的人",
|
||||||
|
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||||
|
return convertApprover(apiResultUsers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||||
|
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||||
|
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||||
|
.map(i -> i.getString("value"))
|
||||||
|
.collect(Collectors.toSet()))
|
||||||
|
.orElse(Collections.emptySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||||
|
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CARBON_COPY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于前序节点的任务审批人选择器(除非抄送节点)
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-18 15:11
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class BasedPreAllNodeTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
private final ExtAxProcessLogService processLogService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.preAllNodApprover_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
ExtAxProcessLog query = new ExtAxProcessLog();
|
||||||
|
query.setProcessInstanceId(execution.getProcessInstanceId());
|
||||||
|
List<ExtAxProcessLog> logs = processLogService.genericQuery(query);
|
||||||
|
if (CollectionUtils.isEmpty(logs)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return logs.stream()
|
||||||
|
.filter(i -> !Objects.equals(BpmnFlowNodeType.valueOfType(i.getNodeType()), NODE_CARBON_COPY))
|
||||||
|
.flatMap(log -> !CollectionUtils.isEmpty(log.getAssigneeFull()) ? log.getAssigneeFull().stream() : Stream.empty())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,153 @@
|
|||||||
|
package cn.axzo.workflow.server.controller.delegate;
|
||||||
|
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||||
|
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||||
|
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||||
|
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||||
|
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections4.ListUtils;
|
||||||
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.bpmn.model.UserTask;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_ROLE_V2_CONFIG_INVALID;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||||
|
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||||
|
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||||
|
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于新版配置的角色查询审批人
|
||||||
|
*
|
||||||
|
* @author wangli
|
||||||
|
* @since 2025-08-15 10:58
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||||
|
@Resource
|
||||||
|
private OrgNodeUserApi orgNodeUserApi;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ApproverSpecifyEnum.role_v2.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||||
|
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||||
|
if (!optRange.isPresent()) {
|
||||||
|
throw new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||||
|
}
|
||||||
|
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||||
|
|
||||||
|
// 获取发起人
|
||||||
|
BpmnTaskDelegateAssigner initiator =
|
||||||
|
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||||
|
|
||||||
|
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||||
|
.scene(FlowTaskAssignerQuerySceneEnum.BY_ROLE)
|
||||||
|
.roleIds(getApproverSpecifyValue(flowElement))
|
||||||
|
.initiatorPersonId(initiator.parsePersonId())
|
||||||
|
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||||
|
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||||
|
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||||
|
switch (optRange.get()) {
|
||||||
|
case within_the_project:
|
||||||
|
log.info("executing role v2 with within_the_project");
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||||
|
.crossDomain(false)
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case within_the_project_construction_units:
|
||||||
|
log.info("executing role v2 with within_the_project_construction_units");
|
||||||
|
CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||||
|
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||||
|
.crossDomain(true)
|
||||||
|
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name())))
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case specified_org:
|
||||||
|
log.info("executing role v2 with specified_org");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(orgDTO.getNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case initiator:
|
||||||
|
log.info("executing role v2 with initiator");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(initiator.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
case pre_node_approver:
|
||||||
|
log.info("executing role v2 with pre_node_approver");
|
||||||
|
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||||
|
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||||
|
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||||
|
.nodeId(lastOperationApprover.parseNodeId())
|
||||||
|
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||||
|
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||||
|
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||||
|
.build());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||||
|
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询角色下的人",
|
||||||
|
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||||
|
return convertApprover(apiResultUsers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Long> getApproverSpecifyValue(FlowElement flowElement) {
|
||||||
|
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||||
|
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||||
|
.map(i -> i.getString("value"))
|
||||||
|
.map(Long::valueOf)
|
||||||
|
.collect(Collectors.toSet()))
|
||||||
|
.orElse(Collections.emptySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -146,10 +146,13 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
|
|||||||
req.setWorkspaceAdmin(true);
|
req.setWorkspaceAdmin(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
boolean flag = false;
|
||||||
|
if (CollectionUtils.isEmpty(req.getCooperateTypes())) {
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
List<FlowTaskAssignerResp> flowTaskAssigners =
|
List<FlowTaskAssignerResp> flowTaskAssigners =
|
||||||
parseApiResult(() -> flowSupportApi.listTaskAssignerAdminV2(req),
|
parseApiResult(() -> flowSupportApi.listTaskAssignerAdminV2(req),
|
||||||
"审批节点: " + flowElement.getId() + ", 通过管理员查询审批人",
|
"审批节点: " + flowElement.getId() + ", 通过管理员查询审批人" + (flag ? "需要重新发布选择节点配置" : ""),
|
||||||
"cn.axzo.karma.client.feign.FlowSupportApi#listTaskAssignerAdminV2",
|
"cn.axzo.karma.client.feign.FlowSupportApi#listTaskAssignerAdminV2",
|
||||||
req);
|
req);
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,14 @@ package cn.axzo.workflow.server.controller.web;
|
|||||||
|
|
||||||
import cn.axzo.framework.domain.ServiceException;
|
import cn.axzo.framework.domain.ServiceException;
|
||||||
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
|
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
|
||||||
|
import cn.axzo.workflow.common.model.dto.VariableObjectDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
|
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.definition.FormContentSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.definition.FormContentSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormInstanceSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormInstanceSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
|
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
||||||
|
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd;
|
||||||
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
|
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
|
||||||
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
||||||
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
|
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
|
||||||
@ -18,8 +20,10 @@ import cn.axzo.workflow.server.common.util.ShellUtil;
|
|||||||
import cn.axzo.workflow.server.xxljob.EsIndexOperationJobHandler;
|
import cn.axzo.workflow.server.xxljob.EsIndexOperationJobHandler;
|
||||||
import cn.axzo.workflow.server.xxljob.SpecifyProcessInstanceSyncEsJobHandler;
|
import cn.axzo.workflow.server.xxljob.SpecifyProcessInstanceSyncEsJobHandler;
|
||||||
import cn.azxo.framework.common.model.CommonResponse;
|
import cn.azxo.framework.common.model.CommonResponse;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.bpmn.model.FlowElement;
|
import org.flowable.bpmn.model.FlowElement;
|
||||||
|
import org.flowable.common.engine.impl.interceptor.CommandExecutor;
|
||||||
import org.flowable.common.engine.impl.util.IoUtil;
|
import org.flowable.common.engine.impl.util.IoUtil;
|
||||||
import org.flowable.engine.HistoryService;
|
import org.flowable.engine.HistoryService;
|
||||||
import org.flowable.engine.RepositoryService;
|
import org.flowable.engine.RepositoryService;
|
||||||
@ -368,5 +372,13 @@ public class TestController {
|
|||||||
specifyProcessInstanceSyncEsJobHandler.execute(processInstanceId);
|
specifyProcessInstanceSyncEsJobHandler.execute(processInstanceId);
|
||||||
return CommonResponse.success();
|
return CommonResponse.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/wps/variables")
|
||||||
|
public CommonResponse<String> getWpsVariables(@RequestParam String processInstanceId) {
|
||||||
|
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
|
||||||
|
List<VariableObjectDTO> wpsVariables =
|
||||||
|
commandExecutor.execute(new CustomGetProcessInstanceVariablesToObjectCmd(processInstanceId));
|
||||||
|
return CommonResponse.success(JSON.toJSONString(wpsVariables));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,12 +42,14 @@ import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
|||||||
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
|
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
|
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
|
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
|
||||||
|
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||||
import cn.axzo.workflow.common.valid.group.ValidGroup;
|
import cn.axzo.workflow.common.valid.group.ValidGroup;
|
||||||
import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
|
import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
|
||||||
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||||
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
|
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
|
||||||
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
||||||
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
|
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
|
||||||
|
import cn.axzo.workflow.core.service.CategoryService;
|
||||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||||
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
|
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
|
||||||
import cn.axzo.workflow.core.service.ExtAxReModelService;
|
import cn.axzo.workflow.core.service.ExtAxReModelService;
|
||||||
@ -86,6 +88,7 @@ import javax.validation.constraints.NotNull;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -93,6 +96,7 @@ import java.util.stream.Stream;
|
|||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_ID_NOT_IN_MODEL;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_ID_NOT_IN_MODEL;
|
||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_READ_PARAM_ERROR;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_READ_PARAM_ERROR;
|
||||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_EXT_LOG_PARAM_ERROR;
|
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_EXT_LOG_PARAM_ERROR;
|
||||||
|
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
|
||||||
import static cn.azxo.framework.common.model.CommonResponse.success;
|
import static cn.azxo.framework.common.model.CommonResponse.success;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,6 +129,8 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
|||||||
private ExtAxReModelService extAxReModelService;
|
private ExtAxReModelService extAxReModelService;
|
||||||
@Resource
|
@Resource
|
||||||
private ExtAxProcessLogService extAxProcessLogService;
|
private ExtAxProcessLogService extAxProcessLogService;
|
||||||
|
@Resource
|
||||||
|
private CategoryService categoryService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 超管查询所有流程实例
|
* 超管查询所有流程实例
|
||||||
|
|||||||
@ -511,7 +511,7 @@ public class BpmnProcessModelController implements ProcessModelApi {
|
|||||||
@Operation(summary = "根据业务 ID 获取模型文档列表,自动适配公共模板和代运营")
|
@Operation(summary = "根据业务 ID 获取模型文档列表,自动适配公共模板和代运营")
|
||||||
@PostMapping(value = "/doc/list")
|
@PostMapping(value = "/doc/list")
|
||||||
public CommonResponse<List<DocBaseVO>> docList(@Validated @RequestBody DocQueryDTO dto) {
|
public CommonResponse<List<DocBaseVO>> docList(@Validated @RequestBody DocQueryDTO dto) {
|
||||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getProcessDefinitionKey())) {
|
if (!StringUtils.hasText(dto.getProcessInstanceId()) && (!StringUtils.hasText(dto.getProcessDefinitionKey()) && CollectionUtils.isEmpty(dto.getProcessDefinitionKeys()))) {
|
||||||
throw new WorkflowEngineException(MODEL_FILE_QUERY_ERROR);
|
throw new WorkflowEngineException(MODEL_FILE_QUERY_ERROR);
|
||||||
}
|
}
|
||||||
return success(modelDocService.docList(dto));
|
return success(modelDocService.docList(dto));
|
||||||
|
|||||||
@ -5,8 +5,10 @@ import cn.axzo.workflow.common.model.dto.BpmnFormRelationSearchDTO;
|
|||||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||||
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
||||||
|
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
|
||||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||||
|
import cn.axzo.workflow.common.model.response.form.instance.FormDataVO;
|
||||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||||
import cn.axzo.workflow.core.service.FormCoreService;
|
import cn.axzo.workflow.core.service.FormCoreService;
|
||||||
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
|
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
|
||||||
@ -60,4 +62,10 @@ public class FormAdminController implements FormAdminApi {
|
|||||||
public CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto) {
|
public CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto) {
|
||||||
return success(formCoreService.getFormInstance(dto));
|
return success(formCoreService.getFormInstance(dto));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "获取指定表单审批的实例数据")
|
||||||
|
@PostMapping("/instance/form/data")
|
||||||
|
public CommonResponse<List<FormDataVO>> getFormData(@Validated @RequestBody FromDataSearchDTO dto) {
|
||||||
|
return success(formCoreService.getFormData(dto));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -99,6 +99,7 @@ public class ProcessCategoryController implements ProcessCategoryApi {
|
|||||||
@Override
|
@Override
|
||||||
@RepeatSubmit
|
@RepeatSubmit
|
||||||
public CommonResponse<CategoryItemVO> create(@Validated @RequestBody CategoryCreateDTO req) {
|
public CommonResponse<CategoryItemVO> create(@Validated @RequestBody CategoryCreateDTO req) {
|
||||||
|
req.setVersion(2);
|
||||||
return success(categoryService.createCategory(req));
|
return success(categoryService.createCategory(req));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,15 @@ import com.xxl.job.core.context.XxlJobHelper;
|
|||||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.easyes.common.utils.RestHighLevelClientUtils;
|
||||||
|
import org.dromara.easyes.core.toolkit.IndexUtils;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import static org.dromara.easyes.annotation.rely.AnnotationConstants.DEFAULT_MAX_RESULT_WINDOW;
|
||||||
|
import static org.dromara.easyes.common.utils.RestHighLevelClientUtils.DEFAULT_DS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生产环境下手动创建索引
|
* 生产环境下手动创建索引
|
||||||
*
|
*
|
||||||
@ -20,17 +26,43 @@ import org.springframework.util.StringUtils;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class EsIndexOperationJobHandler {
|
public class EsIndexOperationJobHandler {
|
||||||
private final EsProcessInstanceService esProcessInstanceService;
|
private final EsProcessInstanceService esProcessInstanceService;
|
||||||
|
private final RestHighLevelClientUtils restHighLevelClientUtils;
|
||||||
|
|
||||||
@XxlJob("esIndexOperation")
|
@XxlJob("esIndexOperation")
|
||||||
public ReturnT<String> execute(String param) {
|
public ReturnT<String> execute(String param) {
|
||||||
if (!StringUtils.hasText(param)) {
|
if (!StringUtils.hasText(param)) {
|
||||||
createIndex();
|
createIndex();
|
||||||
} else {
|
} else if (StringUtils.hasText(param) && "delete".equalsIgnoreCase(param.trim())) {
|
||||||
deleteIndex();
|
deleteIndex();
|
||||||
|
} else if (StringUtils.hasText(param) && "update".equalsIgnoreCase(param.trim())) {
|
||||||
|
updateIndex();
|
||||||
|
} else if (StringUtils.hasText(param) && "reindex".equalsIgnoreCase(param.trim())) {
|
||||||
|
reindex();
|
||||||
}
|
}
|
||||||
return ReturnT.SUCCESS;
|
return ReturnT.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void reindex() {
|
||||||
|
log.info("开始执行 reindex 操作...");
|
||||||
|
XxlJobHelper.log("开始执行 reindex 操作...");
|
||||||
|
//获取动态数据源 若未配置多数据源,则使用默认数据源
|
||||||
|
RestHighLevelClient client = restHighLevelClientUtils.getClient(DEFAULT_DS);
|
||||||
|
boolean reindex = IndexUtils.reindex(client, "workflow_engine_test_process_instance_document", "workflow_engine_dev_process_instance_document", DEFAULT_MAX_RESULT_WINDOW);
|
||||||
|
log.info("reindex 操作完成. 响应结果: {}", reindex);
|
||||||
|
XxlJobHelper.log("reindex 操作完成. 响应结果: {}", reindex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新索引
|
||||||
|
*/
|
||||||
|
private void updateIndex() {
|
||||||
|
log.info("开始更新父子文档索引...");
|
||||||
|
XxlJobHelper.log("开始更新父子文档索引...");
|
||||||
|
Boolean index = esProcessInstanceService.updateIndex();
|
||||||
|
log.info("更新完成. 响应结果: {}", index);
|
||||||
|
XxlJobHelper.log("更新完成. 响应结果: {}", index);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除索引
|
* 删除索引
|
||||||
*/
|
*/
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user