Merge branch 'feature/REQ-5965' into dev

This commit is contained in:
wangli 2025-10-30 14:59:49 +08:00
commit 7f235042fa
35 changed files with 844 additions and 22 deletions

View File

@ -17,11 +17,13 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
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.bpmn.process.BpmnProcessInstanceVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
@ -180,6 +182,17 @@ public interface ProcessInstanceApi {
CommonResponse<Map<String, Object>> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, CommonResponse<Map<String, Object>> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId); @Nullable @RequestParam(required = false) String tenantId);
/**
* 更新流程实例中的业务自定义变量集合
*
* @param dto
* @return
*/
@Operation(summary = "更新流程实例中的业务自定义变量集合")
@PostMapping("/api/process/instance/biz/custom/variables/update")
@InvokeMode(SYNC)
CommonResponse<Boolean> updateProcessBizCustomVariables(@Validated @RequestBody BpmnProcessInstanceVariablesUpdateDTO dto);
/** /**
* 查询所有的审批流 * 查询所有的审批流
* *
@ -358,4 +371,15 @@ public interface ProcessInstanceApi {
@Manageable @Manageable
@InvokeMode(SYNC) @InvokeMode(SYNC)
CommonResponse<List<ExtProcessLogVO>> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto); CommonResponse<List<ExtProcessLogVO>> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto);
/**
* 获取流程实例的条件字段信息仅用于同意抽屉展示
*
* @param processInstanceId
* @return
*/
@Operation(summary = "获取流程实例的条件字段信息, 仅用于同意抽屉展示")
@GetMapping("/api/process/instance/conditions")
@InvokeMode(SYNC)
CommonResponse<List<ConditionPermissionMetaInfo>> getConditions(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId);
} }

View File

@ -4,8 +4,10 @@ import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable; import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO; import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.Print4ProcessLogDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.response.bpmn.process.PrintData4LogVO;
import cn.azxo.framework.common.model.CommonResponse; import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -66,7 +68,7 @@ public interface PrintAdminApi {
* 获取指定流程下用于替换打印的相关变量 * 获取指定流程下用于替换打印的相关变量
* *
* @param processInstanceId * @param processInstanceId
* @return * @return 仅是 kv 集合
*/ */
@Operation(summary = "获取指定流程下用于替换打印的相关变量") @Operation(summary = "获取指定流程下用于替换打印的相关变量")
@GetMapping("/api/print/admin/field/variables") @GetMapping("/api/print/admin/field/variables")
@ -74,4 +76,16 @@ public interface PrintAdminApi {
@InvokeMode(SYNC) @InvokeMode(SYNC)
CommonResponse<Map<String, Object>> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId, CommonResponse<Map<String, Object>> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId,
@RequestParam(required = false, defaultValue = "true") Boolean throwException); @RequestParam(required = false, defaultValue = "true") Boolean throwException);
/**
* 获取用于打印审批日志公共模板的数据
*
* @param dto
* @return
*/
@Operation(summary = "获取用于打印审批日志公共模板的数据")
@PostMapping("/api/print/admin/process/log/data/v2")
@Manageable
@InvokeMode(SYNC)
CommonResponse<PrintData4LogVO> getPrintDataForProcessLog(@Validated @RequestBody Print4ProcessLogDTO dto);
} }

View File

@ -117,6 +117,7 @@ public interface BpmnConstants {
String CONFIG_ACTIVITY_SIGNATURE = "signature"; String CONFIG_ACTIVITY_SIGNATURE = "signature";
String CONFIG_FIELD_META = "field"; String CONFIG_FIELD_META = "field";
String CONFIG_FIELD_PERMISSION = "fieldPermission"; String CONFIG_FIELD_PERMISSION = "fieldPermission";
String CONFIG_CONDITION_PERMISSION = "conditionPermission";
String CONFIG_FIELD_OPTION = "option"; String CONFIG_FIELD_OPTION = "option";
String CONFIG_NODE_TYPE = "nodeType"; String CONFIG_NODE_TYPE = "nodeType";
String CONFIG_BUTTON_TYPE_INITIATOR = "initiator"; String CONFIG_BUTTON_TYPE_INITIATOR = "initiator";
@ -126,6 +127,7 @@ public interface BpmnConstants {
String CONFIG_SIGN_TYPE = "signType"; String CONFIG_SIGN_TYPE = "signType";
String CONFIG_AREA_FILTER_ENABLE = "areaFilterEnable"; String CONFIG_AREA_FILTER_ENABLE = "areaFilterEnable";
String CONFIG_SPECIALTY_FILTER_ENABLE = "specialtyFilterEnable"; String CONFIG_SPECIALTY_FILTER_ENABLE = "specialtyFilterEnable";
String CONFIG_ONLY_IN_PROJECT_ENABLE = "onlyInProjectEnable";
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";
@ -259,7 +261,11 @@ public interface BpmnConstants {
/** /**
* 签署业务自定义文档的顺序位置类型 * 签署业务自定义文档的顺序位置类型
*/ */
String SIGN_BIZ_CUSTOM_DOC_ADD_TYPE = "[_SIGN_BIZ_CUSTOM_DOC_ADD_TYPE_]"; String SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE = "[_SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE_]";
/**
* 签署业务业务对所有文档顺序排序
*/
String SIGN_BIZ_BASED_FILE_TAG_ORDER = "[_SIGN_BIZ_BASED_FILE_TAG_ORDER_]";
/** /**
* 签署业务基于业务自定义变量的传入 * 签署业务基于业务自定义变量的传入
*/ */

View File

@ -29,14 +29,20 @@ public interface VariableConstants {
//=============== 打印时的变量集合中 key 的命名 ================= //=============== 打印时的变量集合中 key 的命名 =================
String VAR_PREFIX = "业务变量"; String VAR_PREFIX = "业务变量";
String PRINT_VAR_PROCESS_NAME = "processName";
String PRINT_VAR_PROCESS_NAME_DESC = "审批名称";
String PRINT_VAR_PROCESS_DEFINITION_KEY = "processDefinitionKey"; String PRINT_VAR_PROCESS_DEFINITION_KEY = "processDefinitionKey";
String PRINT_VAR_PROCESS_DEFINITION_KEY_DESC = "业务名称"; String PRINT_VAR_PROCESS_DEFINITION_KEY_DESC = "业务名称";
String PRINT_VAR_PROCESS_BELONG_TENANT_ID = "tenantId";
String PRINT_VAR_PROCESS_BELONG_TENANT_ID_DESC = "所属租户";
String PRINT_VAR_PROCESS_INSTANCE_ID = "processInstanceId"; String PRINT_VAR_PROCESS_INSTANCE_ID = "processInstanceId";
String PRINT_VAR_PROCESS_INSTANCE_ID_DESC = "审批编号"; String PRINT_VAR_PROCESS_INSTANCE_ID_DESC = "审批编号";
String PRINT_VAR_PROCESS_START_TIME = "startTime"; String PRINT_VAR_PROCESS_START_TIME = "startTime";
String PRINT_VAR_PROCESS_START_TIME_DESC = "发起时间"; String PRINT_VAR_PROCESS_START_TIME_DESC = "发起时间";
String PRINT_VAR_PROCESS_END_TIME = "endTime"; String PRINT_VAR_PROCESS_END_TIME = "endTime";
String PRINT_VAR_PROCESS_END_TIME_DESC = "审批结束时间"; String PRINT_VAR_PROCESS_END_TIME_DESC = "审批结束时间";
String PRINT_VAR_PROCESS_RESULT = "processResult";
String PRINT_VAR_PROCESS_RESULT_DESC = "审批结果";
String PRINT_VAR_PROCESS_INITIATOR = "initiator"; String PRINT_VAR_PROCESS_INITIATOR = "initiator";
String PRINT_VAR_PROCESS_INITIATOR_DESC = "发起者"; String PRINT_VAR_PROCESS_INITIATOR_DESC = "发起者";
String PRINT_VAR_PROCESS_INITIATOR_NAME = "initiatorName"; String PRINT_VAR_PROCESS_INITIATOR_NAME = "initiatorName";
@ -54,7 +60,7 @@ public interface VariableConstants {
String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME = "activityName"; String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME = "activityName";
String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC = "节点名称"; String PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC = "节点名称";
String PRINT_VAR_PROCESS_LOG_APPROVER_NAME = "approverName"; String PRINT_VAR_PROCESS_LOG_APPROVER_NAME = "approverName";
String PRINT_VAR_PROCESS_LOG_APPROVER_NAME_DESC = "审批人"; String PRINT_VAR_PROCESS_LOG_APPROVER_NAME_DESC = "姓名";
String PRINT_VAR_PROCESS_LOG_UNIT = "unit"; String PRINT_VAR_PROCESS_LOG_UNIT = "unit";
String PRINT_VAR_PROCESS_LOG_UNIT_DESC = "单位"; String PRINT_VAR_PROCESS_LOG_UNIT_DESC = "单位";
String PRINT_VAR_PROCESS_LOG_POSITION = "position"; String PRINT_VAR_PROCESS_LOG_POSITION = "position";
@ -66,7 +72,9 @@ public interface VariableConstants {
String PRINT_VAR_PROCESS_LOG_SIGNATURE = "signature"; String PRINT_VAR_PROCESS_LOG_SIGNATURE = "signature";
String PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC = "电子签名"; String PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC = "电子签名";
String PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT = "activityResult"; String PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT = "activityResult";
String PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT_DESC = "节点状态"; String PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT_DESC = "审批结果";
String PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME = "activityOperationTime";
String PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME_DESC = "日期";
String PRINT_VAR_PROCESS_LOG_OPERATION = "operationDesc"; String PRINT_VAR_PROCESS_LOG_OPERATION = "operationDesc";
String PRINT_VAR_PROCESS_LOG_OPERATION_DESC = "操作描述"; String PRINT_VAR_PROCESS_LOG_OPERATION_DESC = "操作描述";
} }

View File

@ -40,6 +40,11 @@ public class CooperationOrgDTO implements Serializable {
*/ */
private List<String> includeSpecialtyCodes; private List<String> includeSpecialtyCodes;
/**
* 控制仅支持工程内人员参与审批
*/
private List<Long> projectIds;
/** /**
* 企业组织架构范围 * 企业组织架构范围
**/ **/

View File

@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
/** /**
@ -29,8 +30,9 @@ public class CustomDocDTO implements Serializable {
*/ */
private Long id; private Long id;
/** /**
* 文件名称,可能会包含变量 * 文件名称
*/ */
@NotBlank(message = "业务自定义文件名称不能为空")
private String fileName; private String fileName;
/** /**
@ -39,20 +41,21 @@ public class CustomDocDTO implements Serializable {
private String fileTag; private String fileTag;
/** /**
* 文件 wps code * 如果业务是使用在线文档则一定会有 wps code如果有则传入
* <p> * <p>
* wps 文件的标识通过{@link cn.axzo.nanopart.doc.api.anonymous.DocAnonymousDatabaseApi#createFile(cn.axzo.nanopart.doc.api.anonymous.request.AnonymousCreateFileRequest)} 接口创建文件后返回的 fileCode * wps 文件的标识通过{@link cn.axzo.nanopart.doc.api.anonymous.DocAnonymousDatabaseApi#createFile(cn.axzo.nanopart.doc.api.anonymous.request.AnonymousCreateFileRequest)} 接口创建文件后返回的 fileCode
*/ */
private String fileCode; private String fileCode;
/** /**
* oss 地址的文件标识 * 不管是在线文件还是本地上传必须包含 oss 地址的文件标识
*/ */
@NotBlank(message = "文件的 oss key 不能为空") @NotBlank(message = "业务自定义文件的 oss key 不能为空")
private String fileKey; private String fileKey;
/** /**
* 文件的类型 * 文件的类型
*/ */
@NotNull(message = "业务自定义文件的类型不能为空")
private FileTypeEnum fileType; private FileTypeEnum fileType;
} }

View File

@ -10,6 +10,7 @@ import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum; import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum; 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.model.request.form.ConditionPermissionMetaInfo;
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;
@ -201,6 +202,12 @@ public class BpmnJsonNodeProperty {
@ApiModelProperty(value = "表单字段权限控制") @ApiModelProperty(value = "表单字段权限控制")
private List<FormPermissionMetaInfo> fieldPermission; private List<FormPermissionMetaInfo> fieldPermission;
/**
* 条件字段权限配置
*/
@ApiModelProperty(value = "条件字段权限控制")
private List<ConditionPermissionMetaInfo> conditionPermission;
/** /**
* 区域过滤开关 * 区域过滤开关
*/ */
@ -213,4 +220,9 @@ public class BpmnJsonNodeProperty {
@ApiModelProperty(value = "专业过滤开关", notes = "true: 开启专业过滤, false: 关闭专业过滤") @ApiModelProperty(value = "专业过滤开关", notes = "true: 开启专业过滤, false: 关闭专业过滤")
private Boolean specialtyFilterEnable; private Boolean specialtyFilterEnable;
/**
* 工程内人员开关
*/
@ApiModelProperty(value = "仅工程内人员开关", notes = "true: 仅工程内人员, false: 非仅工程内人员")
private Boolean onlyInProjectEnable;
} }

View File

@ -0,0 +1,32 @@
package cn.axzo.workflow.common.model.request.bpmn.print;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/**
* 获取内置公共模板打印数据的入参模型
*
* @author wangli
* @since 2025-10-30 10:43
*/
@ApiModel("获取内置公共模板打印数据的入参模型")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Print4ProcessLogDTO {
/**
* 流程实例 ID
*/
@ApiModelProperty(value = "流程实例 ID")
@NotBlank(message = "流程实例 ID 不能为空")
private String processInstanceId;
}

View File

@ -131,12 +131,20 @@ public class BpmnProcessInstanceCreateDTO extends BpmnProcessInstanceCreateWithF
private List<CustomDocDTO> customDocs; private List<CustomDocDTO> customDocs;
/** /**
* "签字业务"专用自定义文档的顺序位置信息在流程模板配置文档之前还是之后 * "签字业务"专用自定义文档的顺序位置信息在流程模板配置文档之前还是之后, 该属性与{@link BpmnProcessInstanceCreateDTO#basedFileTagOrder} 互斥
* <p> * <p>
* 可选值first(之前)last(之后), 如果为空默认为 last * 可选值first(之前)last(之后), 如果为空默认为 last
*/ */
@ApiModelProperty(value = "自定义文档顺序位置", notes = "可选值first(之前)、last(之后), 如果为空,默认为 last") @ApiModelProperty(value = "自定义文档顺序位置", notes = "可选值first(之前)、last(之后), 如果为空,默认为 last")
private String docAddType; private String docAddOrderType = "last";
/**
* "签字业务"专用, 该属性与{@link BpmnProcessInstanceCreateDTO#docAddOrderType} 互斥
* <p>
* 业务对所有文档的顺序覆盖必须对全量文档进行设置
*/
@ApiModelProperty(value = "业务对所有文档的顺序覆盖")
public List<String> basedFileTagOrder;
/** /**
* 仅针对签署业务设置审批完成后的最终签署人列表该属性仅为透传业务消费时请从 MQ 广播事件中的 variables 中通过 key= {@link BpmnConstants#SIGNATORIES } 获取 * 仅针对签署业务设置审批完成后的最终签署人列表该属性仅为透传业务消费时请从 MQ 广播事件中的 variables 中通过 key= {@link BpmnConstants#SIGNATORIES } 获取

View File

@ -0,0 +1,38 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.util.Map;
/**
* 更新流程实例中变量集合的入参模型
*
* @author wangli
* @since 2025-10-24 10:56
*/
@ApiModel("更新流程实例中变量集合的入参模型")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BpmnProcessInstanceVariablesUpdateDTO {
/**
* 流程实例 ID
*/
@NotBlank(message = "流程实例 ID 不能为空")
private String processInstanceId;
/**
* 业务管理中定义变量的入参, 如果 key 在创建时已存在则进行覆盖更新否则新增变量
* <p>
* 对应创建流程实例中的 {@link BpmnProcessInstanceCreateDTO#bizCustomVariables} 属性
*/
private Map<String, Object> bizCustomVariables;
}

View File

@ -0,0 +1,105 @@
package cn.axzo.workflow.common.model.request.form;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 表单字段权限信息
*
* @author wangli
* @since 2024-11-07 11:09
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ConditionPermissionMetaInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 条件标识
*/
private String conditionCode;
/**
* 条件名称
*/
private String conditionName;
/**
* 单选框
* 条件类型(text/number/checkbox/radio)
*/
private String conditionType;
/**
* 可编辑必填
*/
@Builder.Default
private Boolean required = false;
/**
* 可编辑非必填
*/
@Builder.Default
private Boolean editable = false;
/**
* 只读
*/
@Builder.Default
private Boolean readonly = true;
/**
* 隐藏
*/
@Builder.Default
private Boolean hidden = false;
/**
* 前端回显字段后端不做任何消费逻辑
*/
private String value;
/**
* 类型是单选复选时的选项值
*/
private String options;
// 将对象的属性转换为对应的整数表示
public int toBinary() {
int binaryValue = 0;
binaryValue |= (required ? 1 : 0) << 3;
binaryValue |= (editable ? 1 : 0) << 2;
binaryValue |= (readonly ? 1 : 0) << 1;
binaryValue |= (hidden ? 1 : 0);
return binaryValue;
}
// 从整数表示还原出对象
public static ConditionPermissionMetaInfo fromBinary(String conditionCode, String conditionName, String conditionType, int binaryValue) {
boolean required = ((binaryValue >> 3) & 1) == 1;
boolean editable = ((binaryValue >> 2) & 1) == 1;
boolean readonly = ((binaryValue >> 1) & 1) == 1;
boolean hidden = (binaryValue & 1) == 1;
return new ConditionPermissionMetaInfo(conditionCode, conditionName, conditionType, required, editable, readonly, hidden, null, null);
}
public ConditionPermissionMetaInfo toReadonly() {
if (required || editable || readonly) {
setRequired(false);
setEditable(false);
setReadonly(true);
setHidden(false);
}
return this;
}
public String toBinaryString() {
return String.format("%04d", Integer.parseInt(Integer.toBinaryString(toBinary()), 10));
}
}

View File

@ -0,0 +1,60 @@
package cn.axzo.workflow.common.model.response;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
* 审批日志项模型
*
* @author wangli
* @since 2025-10-30 14:22
*/
@Data
@Builder
public class ProcessLogItemDTO {
@Builder.Default
private String label = "审批流程";
/**
* 审批意见
*/
private String advice;
/**
* 节点名称
*/
@ApiModelProperty(value = "节点名称")
private String activityName;
/**
* 操作描述
*/
@ApiModelProperty(value = "操作描述")
private String operationDesc;
/**
* 图片列表
*/
@ApiModelProperty(value = "图片列表")
private List<AttachmentDTO> imageList;
/**
* 附件列表
*/
@ApiModelProperty(value = "附件列表")
private List<AttachmentDTO> fileList;
/**
* 手写签名地址
*/
@ApiModelProperty(value = "手写签名地址")
private String signatureUrl;
/**
* 操作时间
*/
@ApiModelProperty(value = "操作时间")
private String operationTime;
}

View File

@ -0,0 +1,31 @@
package cn.axzo.workflow.common.model.response;
import lombok.Builder;
import lombok.Data;
/**
* 审批日志公共打印模板的字段项模型
*
* @author wangli
* @since 2025-10-30 10:38
*/
@Data
@Builder
public class TableItemDTO {
/**
* 中文
*/
private String label;
/**
* 字段 code
*/
private String code;
/**
* 字段类型
*/
private String type;
/**
*
*/
private Object value;
}

View File

@ -0,0 +1,50 @@
package cn.axzo.workflow.common.model.response.bpmn.process;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.response.ProcessLogItemDTO;
import cn.axzo.workflow.common.model.response.TableItemDTO;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 新版的审批日志公共模板的数据响应模型
*
* @author wangli
* @since 2025-10-30 10:28
*/
@ApiModel("新版的审批日志公共模板的数据响应模型")
@Data
@Accessors(chain = true)
public class PrintData4LogVO {
/**
* 标题
*/
private String processName;
/**
* 发起租户名称
*/
private String tenantName;
/**
* 创建时间
*/
private String createAt;
/**
* 审批状态
*/
private BpmnProcessInstanceResultEnum result;
/**
* 系统变量表格项
*/
private List<TableItemDTO> systemVarItems;
/**
* 审批日志表格项
*/
private List<ProcessLogItemDTO> logItems;
}

View File

@ -31,6 +31,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignPendingProperty; import cn.axzo.workflow.common.model.request.bpmn.BpmnSignPendingProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSmsProperty; import cn.axzo.workflow.common.model.request.bpmn.BpmnSmsProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf; import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
import cn.axzo.workflow.common.model.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo; import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
@ -82,6 +83,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIE
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_CONDITION_PERMISSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD; 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;
@ -93,6 +95,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SP
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE; 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_ONLY_IN_PROJECT_ENABLE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN; import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
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;
@ -648,6 +651,10 @@ public final class BpmnMetaParserHelper {
return defaultValid(flowElement, CONFIG_SPECIALTY_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false); return defaultValid(flowElement, CONFIG_SPECIALTY_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false);
} }
public static Boolean getOnlyInProjectEnable(FlowElement flowElement) {
return defaultValid(flowElement, CONFIG_ONLY_IN_PROJECT_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();
@ -692,6 +699,10 @@ public final class BpmnMetaParserHelper {
}.getType())); }.getType()));
} }
public static Optional<List<ConditionPermissionMetaInfo>> getConditionPermissionConf(FlowElement flowElement) {
return defaultValid(flowElement, CONFIG_CONDITION_PERMISSION).map(element -> JSON.parseObject(element.getElementText(), new TypeReference<List<ConditionPermissionMetaInfo>>() {
}.getType()));
}
public static Optional<ImmutableTable<String, String, Integer>> getFormFieldPermissionForCalc(FlowElement flowElement) { public static Optional<ImmutableTable<String, String, Integer>> getFormFieldPermissionForCalc(FlowElement flowElement) {
List<FormPermissionMetaInfo> fieldMetaInfos = getFormFieldPermissionConf(flowElement).orElse(new ArrayList<>()); List<FormPermissionMetaInfo> fieldMetaInfos = getFormFieldPermissionConf(flowElement).orElse(new ArrayList<>());
return getFormFieldPermissionForModel(fieldMetaInfos); return getFormFieldPermissionForModel(fieldMetaInfos);

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.core.conf;
import cn.axzo.workflow.core.common.utils.SpringContextUtils; import cn.axzo.workflow.core.common.utils.SpringContextUtils;
import cn.axzo.workflow.core.engine.behavior.CustomActivityBehaviorFactory; import cn.axzo.workflow.core.engine.behavior.CustomActivityBehaviorFactory;
import cn.axzo.workflow.core.engine.cfg.CustomDefaultInternalJobManager;
import cn.axzo.workflow.core.engine.cmd.CustomCommandContextFactory; import cn.axzo.workflow.core.engine.cmd.CustomCommandContextFactory;
import cn.axzo.workflow.core.engine.formhandler.CustomFormFieldHandler; import cn.axzo.workflow.core.engine.formhandler.CustomFormFieldHandler;
import cn.axzo.workflow.core.engine.id.BasedNacosSnowflakeIdGenerator; import cn.axzo.workflow.core.engine.id.BasedNacosSnowflakeIdGenerator;
@ -143,6 +144,7 @@ public class FlowableConfiguration {
configuration.setFormFieldValidationEnabled(true); configuration.setFormFieldValidationEnabled(true);
configuration.setFormFieldHandler(new CustomFormFieldHandler()); configuration.setFormFieldHandler(new CustomFormFieldHandler());
configuration.setConfigurators(Lists.newArrayList(new CustomJobServiceConfiguration())); configuration.setConfigurators(Lists.newArrayList(new CustomJobServiceConfiguration()));
configuration.setInternalJobManager(new CustomDefaultInternalJobManager(configuration));
}; };
} }

View File

@ -25,6 +25,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIE
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_CONDITION_PERMISSION;
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_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_COOPERATE_TYPES;
@ -68,6 +69,8 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
// "表单权限设置" // "表单权限设置"
setFormFieldExtensionElement(node, serviceTask); setFormFieldExtensionElement(node, serviceTask);
// "条件权限设置"
setConditionExtensionElement(node, serviceTask);
return serviceTask; return serviceTask;
} }
@ -399,6 +402,17 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
serviceTask.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); serviceTask.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
} }
private static void setConditionExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
if (Objects.isNull(node.getProperty())) {
return;
}
ExtensionElement fieldElement = new ExtensionElement();
fieldElement.setName(CONFIG_CONDITION_PERMISSION);
fieldElement.setElementText(Objects.nonNull(node.getProperty().getConditionPermission()) ?
JSON.toJSONString(node.getProperty().getConditionPermission()) : null);
serviceTask.addExtensionElement(fieldElement);
}
private static void setFormFieldExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) { private static void setFormFieldExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
if (Objects.isNull(node.getProperty())) { if (Objects.isNull(node.getProperty())) {
return; return;

View File

@ -45,12 +45,14 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_
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_CONDITION_PERMISSION;
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_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_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_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_FILTER;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE; import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ONLY_IN_PROJECT_ENABLE;
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;
@ -99,6 +101,8 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
setApprovalExtensionElement(node, userTask); setApprovalExtensionElement(node, userTask);
// "表单权限设置" // "表单权限设置"
setFormFieldExtensionElement(node, userTask); setFormFieldExtensionElement(node, userTask);
// "条件权限设置"
setConditionExtensionElement(node, userTask);
// "高级设置",包含按钮配置,自动过审配置 // "高级设置",包含按钮配置,自动过审配置
setAdvancedExtensionElement(node, userTask); setAdvancedExtensionElement(node, userTask);
// "待办消息模板配置" // "待办消息模板配置"
@ -183,6 +187,14 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
specialtyFilterEnableElement.addAttribute(specialtyFilterEnableAttribute); specialtyFilterEnableElement.addAttribute(specialtyFilterEnableAttribute);
userTask.addExtensionElement(specialtyFilterEnableElement); userTask.addExtensionElement(specialtyFilterEnableElement);
ExtensionElement onlyInProjectEnableElement = new ExtensionElement();
onlyInProjectEnableElement.setName(CONFIG_ONLY_IN_PROJECT_ENABLE);
ExtensionAttribute onlyInProjectEnableAttribute = new ExtensionAttribute();
onlyInProjectEnableAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
onlyInProjectEnableAttribute.setValue(String.valueOf(Boolean.TRUE.equals(node.getProperty().getOnlyInProjectEnable())));
onlyInProjectEnableElement.addAttribute(onlyInProjectEnableAttribute);
userTask.addExtensionElement(onlyInProjectEnableElement);
//添加自动审批配置 //添加自动审批配置
ExtensionElement autoApprovalExtensionElement = new ExtensionElement(); ExtensionElement autoApprovalExtensionElement = new ExtensionElement();
ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute(); ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
@ -191,6 +203,17 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
userTask.addExtensionElement(autoApprovalExtensionElement); userTask.addExtensionElement(autoApprovalExtensionElement);
} }
private static void setConditionExtensionElement(BpmnJsonNode node, UserTask userTask) {
if (Objects.isNull(node.getProperty()) || CollectionUtils.isEmpty(node.getProperty().getConditionPermission())) {
return;
}
ExtensionElement fieldElement = new ExtensionElement();
fieldElement.setName(CONFIG_CONDITION_PERMISSION);
fieldElement.setElementText(Objects.nonNull(node.getProperty().getConditionPermission()) ?
JSON.toJSONString(node.getProperty().getConditionPermission()) : null);
userTask.addExtensionElement(fieldElement);
}
private static void setFormFieldExtensionElement(BpmnJsonNode node, UserTask userTask) { private static void setFormFieldExtensionElement(BpmnJsonNode node, UserTask userTask) {
if (Objects.isNull(node.getProperty()) || CollectionUtils.isEmpty(node.getProperty().getFieldPermission())) { if (Objects.isNull(node.getProperty()) || CollectionUtils.isEmpty(node.getProperty().getFieldPermission())) {
return; return;

View File

@ -0,0 +1,31 @@
package cn.axzo.workflow.core.engine.cfg;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.impl.cfg.DefaultInternalJobManager;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.job.api.Job;
/**
* 为解决引擎底层定时任务的 NPE 问题
*
* @author wangli
* @since 2025-10-24 17:42
*/
@Slf4j
public class CustomDefaultInternalJobManager extends DefaultInternalJobManager {
public CustomDefaultInternalJobManager(ProcessEngineConfigurationImpl processEngineConfiguration) {
super(processEngineConfiguration);
}
@Override
protected void handleJobDeleteInternal(Job job) {
ExecutionEntity executionEntity = getExecutionEntityManager().findById(job.getExecutionId());
log.info("handleJobDeleteInternal job.eId:{}, job.piId:{} ", job.getExecutionId(), job.getProcessInstanceId());
if (executionEntity == null) {
log.warn("handleJobDeleteInternal executionEntity is null for job.eId:{}, job.piId:{} ", job.getExecutionId(), job.getProcessInstanceId());
return;
}
super.handleJobDeleteInternal(job);
}
}

View File

@ -161,6 +161,7 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
} }
task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus()); task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus());
// 更新流程内的变量
runtimeService.setVariables(task.getProcessInstanceId(), variables); runtimeService.setVariables(task.getProcessInstanceId(), variables);
// 记录电子签名的图片 // 记录电子签名的图片
recordSignature(task, runtimeService); recordSignature(task, runtimeService);

View File

@ -180,6 +180,7 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
nextApprover); nextApprover);
} }
task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus()); task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + taskId, APPROVED.getStatus());
// 更新流程实例变量
runtimeService.setVariables(task.getProcessInstanceId(), variables); runtimeService.setVariables(task.getProcessInstanceId(), variables);
// 记录电子签名的图片 // 记录电子签名的图片
recordSignature(task, runtimeService); recordSignature(task, runtimeService);

View File

@ -0,0 +1,64 @@
package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.model.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import com.alibaba.fastjson.JSON;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 获取指定流程节点配置的条件权限信息
*
* @author wangli
* @since 2025-10-29 18:02
*/
public class CustomGetConditionPermissionsCmd extends AbstractCommand<List<ConditionPermissionMetaInfo>> {
private final String processInstanceId;
public CustomGetConditionPermissionsCmd(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
@Override
public String paramToJsonString() {
Map<String, Object> params = new HashMap<>();
params.put("processInstanceId", processInstanceId);
return JSON.toJSONString(params);
}
@Override
public List<ConditionPermissionMetaInfo> execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if (Objects.isNull(processInstance)) {
return Collections.emptyList();
}
TaskService taskService = processEngineConfiguration.getTaskService();
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).active().list();
if (CollectionUtils.isEmpty(tasks)) {
return Collections.emptyList();
}
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processInstance.getProcessDefinitionId());
FlowElement flowElement = bpmnModel.getFlowElement(tasks.get(0).getId());
List<ConditionPermissionMetaInfo> conditions = BpmnMetaParserHelper.getConditionPermissionConf(flowElement).orElse(Collections.emptyList());
conditions.forEach(e -> e.setValue(null));
return conditions;
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.workflow.core.engine.cmd; package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.dto.SignatureDTO; import cn.axzo.workflow.common.model.dto.SignatureDTO;
import cn.axzo.workflow.core.common.utils.SpringContextUtils; import cn.axzo.workflow.core.common.utils.SpringContextUtils;
import cn.axzo.workflow.core.service.CategoryService; import cn.axzo.workflow.core.service.CategoryService;
@ -22,10 +23,13 @@ import java.util.Objects;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY; import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_BELONG_TENANT_ID;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_DEFINITION_KEY; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_DEFINITION_KEY;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_END_TIME; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_END_TIME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_NAME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_RESULT;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
@ -63,9 +67,13 @@ public class CustomGetProcessInstanceVariablesCmd extends AbstractCommand<Map<St
HistoryService historyService = processEngineConfiguration.getHistoryService(); HistoryService historyService = processEngineConfiguration.getHistoryService();
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).includeProcessVariables().singleResult(); .processInstanceId(processInstanceId).includeProcessVariables().singleResult();
variables.put(PRINT_VAR_PROCESS_NAME, instance.getName());
variables.put(PRINT_VAR_PROCESS_BELONG_TENANT_ID, instance.getTenantId());
// 添加流程开始时间 // 添加流程开始时间
variables.put(PRINT_VAR_PROCESS_START_TIME, sdf.format(instance.getStartTime())); variables.put(PRINT_VAR_PROCESS_START_TIME, sdf.format(instance.getStartTime()));
variables.put(PRINT_VAR_PROCESS_END_TIME, Objects.nonNull(instance.getEndTime()) ? sdf.format(instance.getEndTime()) : null); variables.put(PRINT_VAR_PROCESS_END_TIME, Objects.nonNull(instance.getEndTime()) ? sdf.format(instance.getEndTime()) : null);
variables.put(PRINT_VAR_PROCESS_RESULT, BpmnProcessInstanceResultEnum.fromValue(instance.getBusinessStatus()));
// 添加流程业务 ID // 添加流程业务 ID
addProcessDefinitionKey(variables, instance); addProcessDefinitionKey(variables, instance);

View File

@ -0,0 +1,61 @@
package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
/**
* 覆写指定流程中的变量
*
* @author wangli
* @since 2025-02-08 10:14
*/
@Slf4j
public class CustomOverrideProcessVariablesCmd extends AbstractCommand<Void> implements Serializable {
private static final long serialVersionUID = 1L;
private final String processInstanceId;
private final Map<String, Object> variables;
public CustomOverrideProcessVariablesCmd(String processInstanceId, Map<String, Object> variables) {
this.processInstanceId = processInstanceId;
this.variables = variables;
}
@Override
public String paramToJsonString() {
Map<String, Object> params = new HashMap<>();
params.put("processInstanceId", processInstanceId);
params.put("formVariables", variables);
return JSON.toJSONString(params);
}
@Override
public Void executeInternal(CommandContext commandContext) {
if (CollectionUtils.isEmpty(variables)) {
return null;
}
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if (Objects.nonNull(processInstance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_NOT_EXISTS);
}
runtimeService.setVariables(processInstanceId, variables);
return null;
}
}

View File

@ -10,10 +10,12 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
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.bpmn.process.BpmnProcessInstanceVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
@ -211,4 +213,8 @@ public interface BpmnProcessInstanceService {
boolean hasPrintTemplate(String processInstanceId, String processDefinitionId); boolean hasPrintTemplate(String processInstanceId, String processDefinitionId);
List<DocPendingVO> processInstanceSelectDocs(ProcessDocQueryDTO dto); List<DocPendingVO> processInstanceSelectDocs(ProcessDocQueryDTO dto);
void overrideProcessVariables(BpmnProcessInstanceVariablesUpdateDTO dto);
List<ConditionPermissionMetaInfo> getConditions(String processInstanceId);
} }

View File

@ -30,6 +30,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
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.bpmn.process.BpmnProcessInstanceVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
@ -39,6 +40,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
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.request.bpmn.task.ExtHiTaskSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
import cn.axzo.workflow.common.model.request.category.CategorySearchDTO; import cn.axzo.workflow.common.model.request.category.CategorySearchDTO;
import cn.axzo.workflow.common.model.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationItemResultVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationItemResultVO;
@ -65,8 +67,10 @@ import cn.axzo.workflow.core.engine.cmd.CustomCancelProcessInstanceAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCancelProcessInstanceCmd; import cn.axzo.workflow.core.engine.cmd.CustomCancelProcessInstanceCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCarbonCopyUserSelectorCmd; import cn.axzo.workflow.core.engine.cmd.CustomCarbonCopyUserSelectorCmd;
import cn.axzo.workflow.core.engine.cmd.CustomForecastUserTaskAssigneeCmd; import cn.axzo.workflow.core.engine.cmd.CustomForecastUserTaskAssigneeCmd;
import cn.axzo.workflow.core.engine.cmd.CustomGetConditionPermissionsCmd;
import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
import cn.axzo.workflow.core.engine.cmd.CustomOverrideFormVariablesByLatestInstanceCmd; import cn.axzo.workflow.core.engine.cmd.CustomOverrideFormVariablesByLatestInstanceCmd;
import cn.axzo.workflow.core.engine.cmd.CustomOverrideProcessVariablesCmd;
import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener; import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener;
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation; import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst; import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
@ -190,8 +194,9 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_INITIA
import static cn.axzo.workflow.common.constant.BpmnConstants.PENDING_TEMPLATE_VARIABLE; import static cn.axzo.workflow.common.constant.BpmnConstants.PENDING_TEMPLATE_VARIABLE;
import static cn.axzo.workflow.common.constant.BpmnConstants.PROCESS_OWNERSHIP_APPLICATION; import static cn.axzo.workflow.common.constant.BpmnConstants.PROCESS_OWNERSHIP_APPLICATION;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATORIES; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATORIES;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_BASED_FILE_TAG_ORDER;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOCS; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOCS;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOC_ADD_TYPE; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE_DOC_IDS; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE_DOC_IDS;
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;
@ -500,8 +505,12 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
dto.getVariables().put(SIGN_PROCESS_ENABLE_DOC_IDS, dto.getDocIds()); dto.getVariables().put(SIGN_PROCESS_ENABLE_DOC_IDS, dto.getDocIds());
dto.getVariables().put(SIGN_VARIABLE, dto.getBizCustomVariables()); dto.getVariables().put(SIGN_VARIABLE, dto.getBizCustomVariables());
dto.getVariables().put(SIGNATORIES, dto.getSignatories()); dto.getVariables().put(SIGNATORIES, dto.getSignatories());
// 业务自定义文档
dto.getVariables().put(SIGN_BIZ_CUSTOM_DOCS, dto.getCustomDocs()); dto.getVariables().put(SIGN_BIZ_CUSTOM_DOCS, dto.getCustomDocs());
dto.getVariables().put(SIGN_BIZ_CUSTOM_DOC_ADD_TYPE, StringUtils.hasText(dto.getDocAddType()) ? dto.getDocAddType() : "last"); // 业务自定义文档追加顺序类型
dto.getVariables().put(SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE, StringUtils.hasText(dto.getDocAddOrderType()) ? dto.getDocAddOrderType() : "last");
// 基于业务的标签排序
dto.getVariables().put(SIGN_BIZ_BASED_FILE_TAG_ORDER, dto.getBasedFileTagOrder());
} }
}); });
dto.getVariables().put(INTERNAL_INITIATOR, dto.getInitiator().toJson()); dto.getVariables().put(INTERNAL_INITIATOR, dto.getInitiator().toJson());
@ -1805,7 +1814,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
}); });
} }
public List<AttachmentDTO> getAttachmentByType(Map<String, List<Attachment>> attachmentByTaskMap, String public static List<AttachmentDTO> getAttachmentByType(Map<String, List<Attachment>> attachmentByTaskMap, String
taskId, AttachmentTypeEnum type) { taskId, AttachmentTypeEnum type) {
return ListUtils.emptyIfNull(attachmentByTaskMap.get(taskId)).stream() return ListUtils.emptyIfNull(attachmentByTaskMap.get(taskId)).stream()
.filter(attachment -> Objects.equals(type.getType(), attachment.getType())) .filter(attachment -> Objects.equals(type.getType(), attachment.getType()))
@ -1914,7 +1923,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
List<CustomDocDTO> bizCustomDocs = Optional.ofNullable( List<CustomDocDTO> bizCustomDocs = Optional.ofNullable(
runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class)) runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class))
.orElse(Collections.emptyList()); .orElse(Collections.emptyList());
String customAddType = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOC_ADD_TYPE, String.class); String customAddType = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE, String.class);
boolean appendLast = "last".equals(customAddType); boolean appendLast = "last".equals(customAddType);
Comparator<DocBaseVO> orderComparator = Comparator.comparing( Comparator<DocBaseVO> orderComparator = Comparator.comparing(
@ -1951,4 +1960,16 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
return docs; return docs;
} }
@Override
public void overrideProcessVariables(BpmnProcessInstanceVariablesUpdateDTO dto) {
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
commandExecutor.execute(new CustomOverrideProcessVariablesCmd(dto.getProcessInstanceId(), dto.getBizCustomVariables()));
}
@Override
public List<ConditionPermissionMetaInfo> getConditions(String processInstanceId) {
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
return commandExecutor.execute(new CustomGetConditionPermissionsCmd(processInstanceId));
}
} }

View File

@ -39,6 +39,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit; 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.getApproverSpecifyValueV2;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getOnlyInProjectEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
/** /**
@ -76,6 +77,7 @@ public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
.initiatorPersonId(initiator.parsePersonId()) .initiatorPersonId(initiator.parsePersonId())
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet()) .areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet()) .specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(orgDTO.getProjectIds()) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent()); .querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
switch (optRange.get()) { switch (optRange.get()) {
case within_the_project: case within_the_project:

View File

@ -28,6 +28,7 @@ import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_proj
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.getAreaFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorLeaderRangeUnit; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorLeaderRangeUnit;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getOnlyInProjectEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
/** /**
@ -69,6 +70,7 @@ public class BasedInitiatorLeaderV2TaskAssigneeSelector extends AbstractBpmnTask
.initiatorPersonId(initiator.parsePersonId()) .initiatorPersonId(initiator.parsePersonId())
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet()) .areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet()) .specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(orgDTO.getProjectIds()) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent()); .querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
FlowTaskAssignerV2Req request = v2ReqBuilder.build(); FlowTaskAssignerV2Req request = v2ReqBuilder.build();

View File

@ -42,6 +42,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2; 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.getAreaFilterEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getOnlyInProjectEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
/** /**
@ -80,6 +81,7 @@ public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
.initiatorPersonId(initiator.parsePersonId()) .initiatorPersonId(initiator.parsePersonId())
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet()) .areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet()) .specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(orgDTO.getProjectIds()) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent()); .querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
switch (optRange.get()) { switch (optRange.get()) {
case within_the_project: case within_the_project:

View File

@ -43,6 +43,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2; 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.getAreaFilterEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getOnlyInProjectEnable;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
/** /**
@ -82,6 +83,7 @@ public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSel
.initiatorPersonId(initiator.parsePersonId()) .initiatorPersonId(initiator.parsePersonId())
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet()) .areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet()) .specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
.projectIds(getOnlyInProjectEnable(flowElement) ? Sets.newHashSet(orgDTO.getProjectIds()) : Sets.newHashSet())
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent()); .querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
switch (optRange.get()) { switch (optRange.get()) {
case within_the_project: case within_the_project:

View File

@ -37,12 +37,17 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
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.IntStream;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_BASED_FILE_TAG_ORDER;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOCS; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOCS;
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOC_ADD_TYPE; import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
/** /**
@ -118,12 +123,24 @@ public class FirstCopyTemplateFileTaskEvent_105_Listener extends AbstractBpmnEve
.fileType(customDoc.getFileType()) .fileType(customDoc.getFileType())
.build()); .build());
} }
List<String> basedFileTagOrder = runtimeService.getVariable(processInstanceId, SIGN_BIZ_BASED_FILE_TAG_ORDER, List.class);
if (Objects.nonNull(basedFileTagOrder)) {
// 基于 fileTag 排序
Map<String, Integer> fileTagOrderMap = IntStream.range(0, basedFileTagOrder.size())
.boxed()
.collect(Collectors.toMap(basedFileTagOrder::get, i -> i, (a, b) -> a));
String customAddType = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOC_ADD_TYPE, String.class); docTemplates.sort(Comparator.comparing(d -> fileTagOrderMap.getOrDefault(d.getFileTag(), Integer.MAX_VALUE)));
if (Objects.equals("last", customAddType)) { docTemplates = docTemplates.stream().sorted(Comparator.comparingInt(d -> fileTagOrderMap.getOrDefault(d.getFileTag(), Integer.MAX_VALUE)))
docTemplates.addAll(customDocTemplates); .collect(Collectors.toList());
} else { } else {
docTemplates.addAll(0, customDocTemplates); // 基于前插还是后插排序
String customAddType = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOC_ADD_ORDER_TYPE, String.class);
if (Objects.equals("last", customAddType)) {
docTemplates.addAll(customDocTemplates);
} else {
docTemplates.addAll(0, customDocTemplates);
}
} }
processSign.setDocTemplate(docTemplates); processSign.setDocTemplate(docTemplates);

View File

@ -21,6 +21,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
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.bpmn.process.BpmnProcessInstanceVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.SuperBpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
@ -28,6 +29,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverRead
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
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.request.form.ConditionPermissionMetaInfo;
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
@ -384,6 +386,15 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
return success(processInstance.getProcessVariables()); return success(processInstance.getProcessVariables());
} }
@Override
@Operation(summary = "更新流程实例中的业务自定义变量集合")
@PostMapping("/biz/custom/variables/update")
public CommonResponse<Boolean> updateProcessBizCustomVariables(@Validated @RequestBody BpmnProcessInstanceVariablesUpdateDTO dto) {
log.info("更新流程实例中的业务自定义变量集合 updateProcessBizCustomVariables===>>>参数:{}", JSONUtil.toJsonStr(dto));
bpmnProcessInstanceService.overrideProcessVariables(dto);
return success(true);
}
/** /**
* 枢智业务(审批台账专用) * 枢智业务(审批台账专用)
* *
@ -602,4 +613,17 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
return logVO; return logVO;
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
} }
/**
* 获取流程实例的条件字段信息
*
* @param processInstanceId
* @return
*/
@Operation(summary = "获取流程实例的条件字段信息, 仅用于同意抽屉展示")
@GetMapping("/conditions")
@Override
public CommonResponse<List<ConditionPermissionMetaInfo>> getConditions(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId) {
return success(bpmnProcessInstanceService.getConditions(processInstanceId));
}
} }

View File

@ -4,29 +4,40 @@ import cn.axzo.maokai.api.client.OrganizationalNodeUserQueryApi;
import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq; import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq;
import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp; import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp;
import cn.axzo.workflow.client.feign.manage.PrintAdminApi; import cn.axzo.workflow.client.feign.manage.PrintAdminApi;
import cn.axzo.workflow.common.constant.VariableConstants;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.enums.VarTypeEnum; import cn.axzo.workflow.common.enums.VarTypeEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.print.FieldAttributeDTO; import cn.axzo.workflow.common.model.dto.print.FieldAttributeDTO;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO; import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.Print4ProcessLogDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
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.common.model.request.category.CategoryGroupVarSearchDto; import cn.axzo.workflow.common.model.request.category.CategoryGroupVarSearchDto;
import cn.axzo.workflow.common.model.response.ProcessLogItemDTO;
import cn.axzo.workflow.common.model.response.TableItemDTO;
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.bpmn.process.BpmnProcessInstanceLogVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.PrintData4LogVO;
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo; import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd;
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService; import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.BpmnProcessModelService; import cn.axzo.workflow.core.service.BpmnProcessModelService;
import cn.axzo.workflow.core.service.CategoryGroupService; import cn.axzo.workflow.core.service.CategoryGroupService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.axzo.workflow.server.common.util.RpcExternalUtil; import cn.axzo.workflow.server.common.util.RpcExternalUtil;
import cn.axzo.workflow.server.controller.web.bpmn.BpmnProcessInstanceController; import cn.axzo.workflow.server.controller.web.bpmn.BpmnProcessInstanceController;
import cn.azxo.framework.common.model.CommonResponse; import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -35,6 +46,8 @@ import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.api.FlowableObjectNotFoundException;
import org.flowable.common.engine.impl.interceptor.CommandExecutor; import org.flowable.common.engine.impl.interceptor.CommandExecutor;
import org.flowable.engine.TaskService;
import org.flowable.engine.task.Attachment;
import org.flowable.form.api.FormInfo; import org.flowable.form.api.FormInfo;
import org.flowable.form.api.FormRepositoryService; import org.flowable.form.api.FormRepositoryService;
import org.flowable.form.model.FormContainer; import org.flowable.form.model.FormContainer;
@ -80,6 +93,7 @@ import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCE
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_POSITION; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_POSITION;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_POSITION_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_POSITION_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_UNIT; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_UNIT;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INITIATOR_UNIT_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_INSTANCE_ID_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOGS; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOGS;
@ -87,7 +101,10 @@ import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCE
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NAME_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NODE_TYPE; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_NODE_TYPE;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ADVICE; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ADVICE;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ADVICE_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_ADVICE_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_APPROVER_NAME; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_APPROVER_NAME;
@ -101,12 +118,15 @@ import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCE
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_UNIT; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_UNIT;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_UNIT_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_LOG_UNIT_DESC;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_NAME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_RESULT;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME;
import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME_DESC; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_START_TIME_DESC;
import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.form; import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.form;
import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.sign; import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.sign;
import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.signature; import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.signature;
import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.system; import static cn.axzo.workflow.common.enums.PrintFieldCategoryEnum.system;
import static cn.axzo.workflow.core.service.impl.BpmnProcessInstanceServiceImpl.getAttachmentByType;
import static cn.azxo.framework.common.model.CommonResponse.success; import static cn.azxo.framework.common.model.CommonResponse.success;
/** /**
@ -138,6 +158,10 @@ public class PrintAdminController implements PrintAdminApi {
private CategoryGroupService categoryGroupService; private CategoryGroupService categoryGroupService;
@Resource @Resource
private BpmnProcessModelService bpmnProcessModelService; private BpmnProcessModelService bpmnProcessModelService;
@Resource
private ExtAxProcessLogService processLogService;
@Resource
private TaskService taskService;
/** /**
* 查询指定流程实例是否能使用打印 * 查询指定流程实例是否能使用打印
@ -322,8 +346,13 @@ public class PrintAdminController implements PrintAdminApi {
.setCode(activity.getId()) .setCode(activity.getId())
.setFieldCategoryType(signature) .setFieldCategoryType(signature)
.setFieldFormType("signature") .setFieldFormType("signature")
.setAttributes(Lists.newArrayList(new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_SIGNATURE).setName(PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT), .setAttributes(Lists.newArrayList(
new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_ADVICE).setName(PRINT_VAR_PROCESS_LOG_ADVICE_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT)))) new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_APPROVER_NAME).setName(PRINT_VAR_PROCESS_LOG_APPROVER_NAME_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT),
new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT).setName(PRINT_VAR_PROCESS_LOG_ACTIVITY_RESULT_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT),
new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_ADVICE).setName(PRINT_VAR_PROCESS_LOG_ADVICE_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT),
new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_SIGNATURE).setName(PRINT_VAR_PROCESS_LOG_SIGNATURE_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT),
new FieldAttributeDTO().setCode(PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME).setName(PRINT_VAR_PROCESS_LOG_ACTIVITY_OPERATION_TIME_DESC).setFieldFormType(FORM_FIELD_TYPE_INPUT)
)))
.collect(Collectors.toList()) .collect(Collectors.toList())
); );
@ -448,4 +477,72 @@ public class PrintAdminController implements PrintAdminApi {
return users.stream().sorted(Comparator.comparing(OrgNodeUserBriefInfoResp::getExited).reversed()) return users.stream().sorted(Comparator.comparing(OrgNodeUserBriefInfoResp::getExited).reversed())
.collect(Collectors.toList()).stream().findFirst(); .collect(Collectors.toList()).stream().findFirst();
} }
@Operation(summary = "获取用于打印审批日志公共模板的数据")
@PostMapping("/process/log/data/v2")
@Override
public CommonResponse<PrintData4LogVO> getPrintDataForProcessLog(@Validated @RequestBody Print4ProcessLogDTO dto) {
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
Map<String, Object> variables = commandExecutor.execute(new CustomGetProcessInstanceVariablesCmd(dto.getProcessInstanceId()));
PrintData4LogVO vo = new PrintData4LogVO();
vo.setProcessName((String) variables.getOrDefault(PRINT_VAR_PROCESS_NAME, ""));
vo.setTenantName(String.valueOf(variables.get(VariableConstants.PRINT_VAR_PROCESS_BELONG_TENANT_ID)));
vo.setCreateAt(String.valueOf(variables.get(VariableConstants.PRINT_VAR_PROCESS_START_TIME)));
vo.setResult((BpmnProcessInstanceResultEnum) variables.get(PRINT_VAR_PROCESS_RESULT));
List<TableItemDTO> systemVarItems = new ArrayList<>();
systemVarItems.add(TableItemDTO.builder()
.label(PRINT_VAR_PROCESS_INSTANCE_ID_DESC)
.code(PRINT_VAR_PROCESS_INSTANCE_ID)
.type(FORM_FIELD_TYPE_INPUT)
.value(variables.get(PRINT_VAR_PROCESS_INSTANCE_ID))
.build());
// 解析发起人
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(variables.getOrDefault(PRINT_VAR_PROCESS_INITIATOR, null));
if (Objects.nonNull(initiator)) {
Optional<OrgNodeUserBriefInfoResp> user = getUserInfo(initiator);
systemVarItems.add(TableItemDTO.builder()
.label(PRINT_VAR_PROCESS_INITIATOR_NAME_DESC)
.code(PRINT_VAR_PROCESS_INITIATOR_NAME)
.type(FORM_FIELD_TYPE_INPUT)
.value(user.isPresent() ? user.get().getRealName() : "")
.build());
systemVarItems.add(TableItemDTO.builder()
.label(PRINT_VAR_PROCESS_INITIATOR_UNIT_DESC)
.code(PRINT_VAR_PROCESS_INITIATOR_UNIT_DESC)
.type(FORM_FIELD_TYPE_INPUT)
.value(user.isPresent() ? user.get().getOrganizationalUnitName() : "")
.build());
}
vo.setSystemVarItems(systemVarItems);
// 审批日志
List<ProcessLogItemDTO> logItems = new ArrayList<>();
Map<String, List<Attachment>> attachmentByTaskMap =
taskService.getProcessInstanceAttachments(dto.getProcessInstanceId()).stream()
.collect(Collectors.groupingBy(Attachment::getTaskId));
ExtAxProcessLog query = new ExtAxProcessLog();
query.setProcessInstanceId(dto.getProcessInstanceId());
processLogService.genericQuery(query).stream()
.sorted(Comparator.comparing(ExtAxProcessLog::getEndTime, Comparator.nullsLast(Comparator.naturalOrder())))
.collect(Collectors.toList())
.forEach(log -> {
logItems.add(ProcessLogItemDTO.builder()
.advice(log.getAdvice())
.activityName(log.getActivityName())
.operationDesc(log.getOperationDesc())
.imageList(getAttachmentByType(attachmentByTaskMap, log.getTaskId(), AttachmentTypeEnum.image))
.fileList(getAttachmentByType(attachmentByTaskMap, log.getTaskId(), AttachmentTypeEnum.file))
.signatureUrl(getAttachmentByType(attachmentByTaskMap, log.getTaskId(), AttachmentTypeEnum.signature).stream().findFirst().orElse(new AttachmentDTO()).getUrl())
.operationTime(DateUtil.format(log.getEndTime(), "yyyy.MM.dd HH:mm:ss"))
.build());
});
vo.setLogItems(logItems);
return success(vo);
}
} }

View File

@ -3,6 +3,7 @@ package cn.axzo.workflow.starter.api;
import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.model.dto.SignFileDTO; import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO; import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
@ -15,6 +16,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceChe
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
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.bpmn.process.BpmnProcessInstanceVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverReadStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
@ -36,6 +38,8 @@ import cn.axzo.workflow.common.model.request.feature.DingTalkStarterAlterDTO;
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.FormVariablesUpdateDTO; import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
import cn.axzo.workflow.common.model.request.form.model.WpsFileConfigVariableDTO;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO; import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
@ -43,6 +47,7 @@ import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
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.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.common.util.ThreadUtil; import cn.axzo.workflow.common.util.ThreadUtil;
import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration; import cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration;
@ -152,6 +157,7 @@ public interface WorkflowCoreService {
/** /**
* 获取指定审批业务的流程表单设置 * 获取指定审批业务的流程表单设置
*
* @param dto * @param dto
* @return * @return
*/ */
@ -172,6 +178,26 @@ public interface WorkflowCoreService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto); FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto);
/**
* 获取指定表单审批的实例数据
*
* @param dto
* @return
*/
@PostMapping("/api/form/admin/instance/form/data")
@InvokeMode(SYNC)
List<FormDataVO> getFormData(@Validated @RequestBody FromDataSearchDTO dto);
/**
* 获取 WPS 文档中所有可配置的流程相关变量
*
* @param dto
* @return
*/
@PostMapping("/api/form/admin/wps/file/config/variables")
@InvokeMode(SYNC)
List<PrintFieldDTO> getWpsFileConfigVariables(@Validated @RequestBody WpsFileConfigVariableDTO dto);
/** /**
* 创建流程前的节点列表 * 创建流程前的节点列表
* 用于发起人自选 * 用于发起人自选
@ -283,6 +309,17 @@ public interface WorkflowCoreService {
@InvokeMode(SYNC) @InvokeMode(SYNC)
Map<String, Object> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId); Map<String, Object> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 更新流程实例中的业务自定义变量集合
*
* @param dto
* @return
*/
@Operation(summary = "更新流程实例中的业务自定义变量集合")
@PostMapping("/api/process/instance/biz/custom/variables/update")
@InvokeMode(SYNC)
Boolean updateProcessBizCustomVariables(@Validated @RequestBody BpmnProcessInstanceVariablesUpdateDTO dto);
/** /**
* 校验指定流程实例下,是否存在指定的审批人正处理待审批 * 校验指定流程实例下,是否存在指定的审批人正处理待审批
* *

View File

@ -120,7 +120,7 @@ public interface WorkflowManageService {
@GetMapping("/api/print/admin/field/variables") @GetMapping("/api/print/admin/field/variables")
@Manageable @Manageable
@InvokeMode(SYNC) @InvokeMode(SYNC)
Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId); Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId, @RequestParam(required = false, defaultValue = "true") Boolean throwException);
/** /**
* 查询管理员 * 查询管理员