feat(REQ-3004) - 集成表单引擎,测试使用

This commit is contained in:
wangli 2024-11-18 17:20:46 +08:00
parent 1677058381
commit afacb6aa98
14 changed files with 97 additions and 57 deletions

View File

@ -38,7 +38,7 @@ public interface FormInstanceApi {
@InvokeMode(SYNC)
CommonResponse<FormDefinitionVO> getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);
@PostMapping("/api/form/instance/get")
@PostMapping("/api/form/instance/render")
@InvokeMode(SYNC)
CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto);
}

View File

@ -49,8 +49,8 @@ public class FormPermissionMetaInfo implements Serializable {
// 将对象的属性转换为对应的整数表示
public int toBinary() {
int binaryValue = 0;
binaryValue |= (editable? 1 : 0) << 3;
binaryValue |= (required? 1 : 0) << 2;
binaryValue |= (required? 1 : 0) << 3;
binaryValue |= (editable? 1 : 0) << 2;
binaryValue |= (readonly? 1 : 0) << 1;
binaryValue |= (hidden? 1 : 0);
return binaryValue;
@ -58,11 +58,19 @@ public class FormPermissionMetaInfo implements Serializable {
// 从整数表示还原出对象
public static FormPermissionMetaInfo fromBinary(String fieldId, int binaryValue) {
boolean editable = ((binaryValue >> 3) & 1) == 1;
boolean required = ((binaryValue >> 2) & 1) == 1;
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 FormPermissionMetaInfo(fieldId, editable, required, readonly, hidden);
return new FormPermissionMetaInfo(fieldId, required, editable, readonly, hidden);
}
public FormPermissionMetaInfo toReadonly() {
if(required || editable || readonly) {
setRequired(false);
setEditable(false);
setReadonly(true);
}
return this;
}
public String toBinaryString() {

View File

@ -27,5 +27,12 @@ public class StartFormSearchDTO {
/**
* 租户 ID
*/
@ApiModelProperty(value = "租户 ID")
private String tenantId = NO_TENANT_ID;
/**
* 显示原始默认值的变量
*/
@ApiModelProperty(value = "是否显示原始的默认值", hidden = true, notes = "如果为 true 则将默认值中的 ${} 变量不进行替换")
private Boolean showOriginDefaultValue = false;
}

View File

@ -36,4 +36,10 @@ public class FormDetailDTO {
*/
@ApiModelProperty(value = "访问表单的人")
private BpmnTaskDelegateAssigner assigner;
/**
* 显示原始默认值的变量
*/
@ApiModelProperty(value = "是否显示原始的默认值", notes = "如果为 true 则将默认值中的 ${} 变量不进行替换")
private Boolean showOriginDefaultValue = false;
}

View File

@ -20,18 +20,18 @@ public abstract class ExpressionUtil {
throw new RuntimeException("Instantiation not supported");
}
public static String parseString(String exp, Map<String, String> variables) {
public static String parseString(String exp, Map<String, ? extends Object> variables) {
return parseString(null, null, exp, variables);
}
public static String parseString(String prefix, String suffix, String exp, Map<String, String> variables) {
public static String parseString(String prefix, String suffix, String exp, Map<String, ? extends Object> variables) {
if (!StringUtils.hasText(prefix) && !StringUtils.hasText(suffix)) {
prefix = PREFIX;
suffix = SUFFIX;
}
PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper(prefix, suffix);
Properties properties = new Properties();
variables.forEach(properties::setProperty);
variables.forEach((k, v) -> properties.setProperty(k, String.valueOf(v)));
// 自定义PlaceholderResolver实现类用于处理占位符找不到对应值时返回空字符串
PropertyPlaceholderHelper.PlaceholderResolver resolver = placeholder -> properties.getProperty(placeholder, "");

View File

@ -451,10 +451,14 @@ public final class BpmnMetaParserHelper {
return Optional.of(result);
}
@SuppressWarnings("unchecked")
public static List<FormPermissionMetaInfo> mergeAllPermission(List<FormPermissionMetaInfo>... permissions) {
if (permissions.length == 0) {
return Collections.emptyList();
}
if(permissions.length == 1) {
return permissions[0];
}
List<Map<String, Integer>> combinedMap = new ArrayList<>();
for (List<FormPermissionMetaInfo> permission : permissions) {
combinedMap.add(getFormFieldPermissionForModel(permission).orElse(new HashMap<>()));

View File

@ -101,15 +101,9 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
userTask.addExtensionElement(pendingMessageElement);
}
private static void setEmptyAssigneeAutoPassed(BpmnJsonNode node, UserTask userTask) {
if (Objects.nonNull(node.getProperty()) &&
Objects.equals(node.getProperty().getApproverEmptyHandleType(), autoPassed)) {
userTask.setSkipExpression("${" + BPM_ALLOW_SKIP_USER_TASK + userTask.getId() + "}");
}
}
private static void setMultiInstance(BpmnJsonNode node, UserTask userTask) {
if (Objects.isNull(node.getProperty()) || Objects.equals(Boolean.FALSE, node.getProperty().getIsMultiTask())) {
if (Objects.isNull(node.getProperty()) || Objects.equals(NODE_STARTER.getType(), userTask.getId())
||Objects.equals(Boolean.FALSE, node.getProperty().getIsMultiTask())) {
return;
}
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics =

View File

@ -3,15 +3,14 @@ package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import cn.axzo.workflow.common.util.ExpressionUtil;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.BpmnProcessTaskForEsService;
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.impl.el.ExpressionManager;
import org.flowable.common.engine.impl.el.VariableContainerWrapper;
import org.apache.commons.collections4.ListUtils;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.HistoryService;
@ -62,6 +61,7 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
private final BpmnTaskDelegateAssigner assigner;
private String processInstanceId;
private String taskId;
private Boolean showOriginDefaultValue = false;
/**
* 全权通过实例查询一切
@ -88,12 +88,14 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
BpmnProcessTaskForEsService bpmnProcessTaskForEsService,
BpmnTaskDelegateAssigner assigner,
String processInstanceId,
String taskId) {
String taskId,
Boolean showOriginDefaultValue) {
this.bpmnFormRelationService = bpmnFormRelationService;
this.bpmnProcessTaskForEsService = bpmnProcessTaskForEsService;
this.assigner = assigner;
this.processInstanceId = processInstanceId;
this.taskId = taskId;
this.showOriginDefaultValue = showOriginDefaultValue;
}
@Override
@ -116,13 +118,11 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
HistoryService historyService = processEngineConfiguration.getHistoryService();
ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.includeProcessVariables()
.singleResult();
Map<String, Object> processVariables = instance.getProcessVariables();
VariableContainerWrapper variableContainerWrapper = new VariableContainerWrapper(processVariables);
flatField.forEach((fieldId, formField) -> {
Map<String, Object> oldParams = CollectionUtils.isEmpty(formField.getParams()) ? new HashMap<>() : formField.getParams();
@ -132,10 +132,13 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
oldParams.put(FIELD_PROPERTY_READONLY, defaultPermission.getReadonly());
oldParams.put(FIELD_PROPERTY_HIDDEN, defaultPermission.getHidden());
if (oldParams.containsKey(FIELD_PROPERTY_DEFAULT_VALUE)) {
Expression expression = expressionManager.createExpression(String.valueOf(oldParams.getOrDefault(FIELD_PROPERTY_DEFAULT_VALUE, "")));
Object value = expression.getValue(variableContainerWrapper);
oldParams.put(FIELD_PROPERTY_DEFAULT_VALUE, Objects.nonNull(value) ? String.valueOf(value) : null);
String defaultValue = oldParams.getOrDefault(FIELD_PROPERTY_DEFAULT_VALUE, "").toString();
if (!showOriginDefaultValue) {
defaultValue = ExpressionUtil.parseString(String.valueOf(oldParams.get(FIELD_PROPERTY_DEFAULT_VALUE)), processVariables);
}
oldParams.put(FIELD_PROPERTY_DEFAULT_VALUE, defaultValue);
}
formField.setParams(oldParams);
});
return formInstanceInfo;
}
@ -148,7 +151,7 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
// 待审批的节点
List<ExtAxProcessLog> processingLogs = logs.stream()
.filter(e -> Objects.equals(PROCESSING.getStatus(), e.getStatus()) && Objects.isNull(e.getEndTime()))
.filter(e -> (Objects.equals(PROCESSING.getStatus(), e.getStatus()) && Objects.isNull(e.getEndTime())))
.collect(Collectors.toList());
List<FormPermissionMetaInfo> list = binaryMerge(processingLogs, activityMap);
@ -163,15 +166,18 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
list = binaryMerge(finishLogs, activityMap);
if (!CollectionUtils.isEmpty(list)) {
// 这里都是非审批的,统一将所有可见,必填的节点转成只读. [完全忽略隐藏属性]
list.forEach(FormPermissionMetaInfo::toReadonly);
return list;
}
// 默认全字段都是隐藏
ExtAxProcessLog starterLog = logs.stream().filter(e -> Objects.equals(NODE_STARTER.getType(), e.getActivityId()))
.findFirst().orElseThrow(() -> new WorkflowEngineException(FORM_FIELD_NOT_FOUND));
.findFirst().orElse(new ExtAxProcessLog());
return CollectionUtils.isEmpty(starterLog.getFormFieldPermissionConf()) ? new ArrayList<>() : starterLog.getFormFieldPermissionConf();
}
@SuppressWarnings("unchecked")
private List<FormPermissionMetaInfo> binaryMerge(List<ExtAxProcessLog> logs, Map<String, ExtAxProcessLog> activityMap) {
List<List<FormPermissionMetaInfo>> permissions = new ArrayList<>();
collectActivityIds(logs).forEach(id -> {
@ -205,7 +211,7 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
if (assignerMap.containsKey(e.getActivityId())) {
assignerMap.get(e.getActivityId()).addAll(e.getAssigneeFull());
} else {
assignerMap.put(e.getActivityId(), new ArrayList<>());
assignerMap.put(e.getActivityId(), new ArrayList<>(ListUtils.emptyIfNull(e.getAssigneeFull())));
}
});
return assignerMap;

View File

@ -60,7 +60,6 @@ import cn.axzo.workflow.core.service.converter.BpmnProcessInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstancePageItemConverter;
import cn.axzo.workflow.core.service.support.FlowNodeForecastService;
import cn.axzo.workflow.core.service.support.ProcessGraphicService;
import cn.azxo.framework.common.utils.StringUtils;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
@ -102,6 +101,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@ -110,6 +110,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@ -237,19 +238,19 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
public BpmPageResult<BpmnProcessInstancePageItemVO> getMyProcessInstancePage(@Valid BpmnProcessInstanceMyPageReqVO dto) {
HistoricProcessInstanceQuery query =
historyService.createHistoricProcessInstanceQuery().processInstanceTenantId(dto.getTenantId());
if (StringUtils.isNotBlank(dto.getName())) {
if (StringUtils.hasText(dto.getName())) {
query.processInstanceName(dto.getName());
}
if (StringUtils.isNotBlank(dto.getProcessDefinitionId())) {
if (StringUtils.hasText(dto.getProcessDefinitionId())) {
query.processDefinitionId(dto.getProcessDefinitionId());
}
if (StringUtils.isNotBlank(dto.getCategory())) {
if (StringUtils.hasText(dto.getCategory())) {
query.processDefinitionCategory(dto.getCategory());
}
if (StringUtils.isNotBlank(dto.getBusinessKey())) {
if (StringUtils.hasText(dto.getBusinessKey())) {
query.processInstanceBusinessKey(dto.getBusinessKey());
}
if (StringUtils.isNotBlank(dto.getUserId())) {
if (StringUtils.hasText(dto.getUserId())) {
query.startedBy(dto.getUserId());
}
if (Objects.nonNull(dto.getBeginCreateTime())) {
@ -328,7 +329,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public String createProcessInstance(BpmnProcessInstanceCreateDTO dto) {
BpmnProcessDefinitionVO definition = null;
if (StringUtils.isBlank(dto.getProcessDefinitionId())) {
if (!StringUtils.hasText(dto.getProcessDefinitionId())) {
definition = processDefinitionService.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey(), dto.getTenantId());
} else {
definition = processDefinitionService.getProcessDefinition(dto.getProcessDefinitionId());
@ -343,7 +344,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
Optional<CategoryItemVO> categoryItemVO = categoryService.get(BPM_MODEL_CATEGORY, definition.getCategory());
//政务只能使用代运营的流程定义
if (categoryItemVO.isPresent() && categoryItemVO.get().getWorkspaceTypeCode().equals(String.valueOf(GOVERNMENT.getCode()))) {
if (StringUtils.isBlank(definition.getTenantId())) {
if (!StringUtils.hasText(definition.getTenantId())) {
throw new WorkflowEngineException(PROCESS_DEFINITION_IS_INVALID, dto.getProcessDefinitionKey());
}
}
@ -353,7 +354,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
dto.getVariables().put(BIZ_ORG_RELATION, dto.getCooperationOrg());
dto.getVariables().put(WORKFLOW_ENGINE_VERSION, serviceVersion);
dto.getVariables().put(PENDING_TEMPLATE_VARIABLE, dto.getPendingVariables());
dto.getVariables().put(INTERNAL_PROCESS_AGENT, StringUtils.isNotBlank(definition.getTenantId()));
dto.getVariables().put(INTERNAL_PROCESS_AGENT, StringUtils.hasText(definition.getTenantId()));
dto.getVariables().put(CREATE_INSTANCE_PARAMS, JSONUtil.toJsonStr(dto));
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -362,7 +363,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
// 创建流程实例
// 设置流程实例的开始人参考 https://wenku.baidu.com/view/5538062e7a563c1ec5da50e2524de518964bd3f9.html
Authentication.setAuthenticatedUserId(dto.getInitiator().buildAssigneeId());
String name = StringUtils.isNotBlank(dto.getCustomProcessInstanceName()) ? dto.getCustomProcessInstanceName() : definition.getName();
String name = StringUtils.hasText(dto.getCustomProcessInstanceName()) ? dto.getCustomProcessInstanceName() : definition.getName();
// 设置流程名字
ProcessInstanceBuilder instanceBuilder = runtimeService.createProcessInstanceBuilder()
@ -377,6 +378,11 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
// 如果模型没有绑定表单则强制情况表单相关属性避免报错
instanceBuilder.startFormVariables(null).outcome(null);
} else {
dto.getStartFormVariables().entrySet().forEach(e-> {
if(e.getValue() instanceof Collection) {
e.setValue(StringUtils.collectionToCommaDelimitedString((Collection) e.getValue()));
}
});
instanceBuilder.startFormVariables(dto.getStartFormVariables())
.outcome(dto.getOutcome());
}
@ -458,7 +464,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public BpmPageResult<BpmnProcessInstanceAdminPageItemVO> getAdminProcessInstancePage(BpmnProcessInstanceAdminPageReqVO dto) {
List<String> dictValues = new ArrayList<>();
if (StringUtils.isNotBlank(dto.getCategory())) {
if (StringUtils.hasText(dto.getCategory())) {
CategorySearchDTO searchDTO = new CategorySearchDTO();
searchDTO.setDictType(BpmnConstants.BPM_MODEL_CATEGORY);
searchDTO.setLabel(dto.getCategory());
@ -474,7 +480,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
.append(" FROM ").append(tableName)
.append(" RES LEFT OUTER JOIN ACT_RE_PROCDEF DEF ON RES.PROC_DEF_ID_ = DEF.ID_")
.append(" WHERE 1 = 1");
if (StringUtils.isNotBlank(dto.getProcessInstanceId())) {
if (StringUtils.hasText(dto.getProcessInstanceId())) {
List<String> ids = Lists.newArrayList(dto.getProcessInstanceId().replaceAll(" ", "").split(","));
baseQuerySql.append(" AND RES.PROC_INST_ID_ IN (");
for (int i = 0; i < ids.size(); i++) {
@ -486,7 +492,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
}
baseQuerySql.append(")");
}
if (StringUtils.isNotBlank(dto.getName())) {
if (StringUtils.hasText(dto.getName())) {
baseQuerySql.append(" AND RES.NAME_ LIKE #{name}");
query.parameter("name", "%" + dto.getName() + "%");
}
@ -512,7 +518,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
}
baseQuerySql.append(")");
}
if (StringUtils.isNotBlank(dto.getBusinessStatus())) {
if (StringUtils.hasText(dto.getBusinessStatus())) {
baseQuerySql.append(" AND RES.BUSINESS_STATUS_ = #{businessStatus}");
query.parameter("businessStatus", dto.getBusinessStatus());
}
@ -598,7 +604,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public HistoricProcessInstance getHistoricProcessInstance(String id, String tenantId) {
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().processInstanceId(id);
if (StringUtils.isNotBlank(tenantId)) {
if (StringUtils.hasText(tenantId)) {
query.processInstanceTenantId(tenantId);
}
return query.singleResult();
@ -608,7 +614,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
public HistoricProcessInstance getHistoricProcessInstanceByBusinessKey(String businessKey, String tenantId) {
HistoricProcessInstanceQuery query =
historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(businessKey);
if (StringUtils.isNotBlank(tenantId)) {
if (StringUtils.hasText(tenantId)) {
query.processInstanceTenantId(tenantId);
}
return query.singleResult();
@ -617,9 +623,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public BpmnProcessInstanceVO getProcessInstanceVO(BpmnProcessInstanceQueryDTO dto) {
HistoricProcessInstance processInstance = null;
if (StringUtils.isNotBlank(dto.getProcessInstanceId())) {
if (StringUtils.hasText(dto.getProcessInstanceId())) {
processInstance = getProcessInstance(dto.getProcessInstanceId(), dto.getTenantId(), dto.getHasVariable());
} else if (StringUtils.isNotBlank(dto.getBusinessKey())) {
} else if (StringUtils.hasText(dto.getBusinessKey())) {
processInstance = getProcessInstanceByBusinessKey(dto.getBusinessKey(), dto.getTenantId(),
dto.getHasVariable());
}
@ -710,7 +716,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
public ObjectNode getProcessInstanceGraphical(String processInstanceId, @Nullable String tenantId) {
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId);
if (StringUtils.isNotBlank(tenantId)) {
if (StringUtils.hasText(tenantId)) {
query.processInstanceTenantId(tenantId);
}
HistoricProcessInstance processInstance = query.singleResult();
@ -770,20 +776,20 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
NativeHistoricProcessInstanceQuery query = historyService.createNativeHistoricProcessInstanceQuery();
String tableName = managementService.getTableName(HistoricProcessInstance.class);
StringBuilder baseQuerySql = new StringBuilder("SELECT a.* FROM ").append(tableName).append(" a");
if (StringUtils.isNotBlank(dto.getCategory())) {
if (StringUtils.hasText(dto.getCategory())) {
baseQuerySql.append(" LEFT JOIN ACT_RE_PROCDEF b ON a.PROC_DEF_ID_ = b.ID_ ")
.append(sqlConnectors(baseQuerySql))
.append(" b.CATEGORY_ = #{category}");
query.parameter("category", dto.getCategory());
}
if (StringUtils.isNotBlank(dto.getSearchKey())) {
if (StringUtils.hasText(dto.getSearchKey())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))
.append(" (a.BUSINESS_KEY_ LIKE #{searchKey}")
.append(" or")
.append(" a.NAME_ LIKE #{searchKey})");
query.parameter("searchKey", "%" + dto.getSearchKey() + "%");
}
if (StringUtils.isNotBlank(dto.getResult())) {
if (StringUtils.hasText(dto.getResult())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))
.append(" a.BUSINESS_STATUS_ = #{result}");
query.parameter("result", dto.getResult());
@ -826,7 +832,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
}
NativeHistoricProcessInstanceQuery countSqlQuery = query.sql(countSql(baseQuerySql));
if (StringUtils.isNotBlank(dto.getCategory())) {
if (StringUtils.hasText(dto.getCategory())) {
return new BpmPageResult(historicProcessInstanceConverter.toVos(instances, dto.getCategory()),
countSqlQuery.count());
} else {
@ -878,7 +884,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
public List<ProcessNodeDetailVO> getProcessInstanceNodeFilterForecast(String processInstanceId, String tenantId, List<String> nodeDefinitionKeys) {
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId);
if (StringUtils.isNotBlank(tenantId)) {
if (StringUtils.hasText(tenantId)) {
query.processInstanceTenantId(tenantId);
}
ProcessInstance instance = query.singleResult();

View File

@ -119,7 +119,11 @@ public class FormCoreServiceImpl implements FormCoreService {
params.put(FIELD_PROPERTY_READONLY, meta.getReadonly());
params.put(FIELD_PROPERTY_HIDDEN, meta.getHidden());
if (params.containsKey(FIELD_PROPERTY_DEFAULT_VALUE)) {
params.put(FIELD_PROPERTY_DEFAULT_VALUE, ExpressionUtil.parseString(String.valueOf(params.get(FIELD_PROPERTY_DEFAULT_VALUE)), new HashMap<>()));
String defaultValue = params.getOrDefault(FIELD_PROPERTY_DEFAULT_VALUE, "").toString();
if(!dto.getShowOriginDefaultValue()) {
defaultValue = ExpressionUtil.parseString(String.valueOf(params.get(FIELD_PROPERTY_DEFAULT_VALUE)), new HashMap<>());
}
params.put(FIELD_PROPERTY_DEFAULT_VALUE, defaultValue);
}
field.setParams(params);
});
@ -140,7 +144,7 @@ public class FormCoreServiceImpl implements FormCoreService {
public FormInstanceVO getFormInstance(FormDetailDTO dto) {
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
FormInstanceInfo formInstanceInfo = commandExecutor.execute(new GetFormInstanceAndPermissionCmd(bpmnFormRelationService,
bpmnProcessTaskForEsService, dto.getAssigner(), dto.getProcessInstanceId(), dto.getTaskId()));
bpmnProcessTaskForEsService, dto.getAssigner(), dto.getProcessInstanceId(), dto.getTaskId(), dto.getShowOriginDefaultValue()));
return formInstanceConverter.toVo(formInstanceInfo);
}
}

View File

@ -13,6 +13,7 @@ import org.mapstruct.Mapping;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@ -78,6 +79,9 @@ public interface FormInstanceConverter extends EntityConverter<FormInstanceVO, F
if (Objects.isNull(value)) {
return (List<String>) value;
}
if(value instanceof Collection){
return (List<String>) value;
}
List<String> values = new ArrayList<>();
if (value instanceof String) {
values.add((String) value);

View File

@ -14,7 +14,7 @@ import org.springframework.context.annotation.Configuration;
* @author wangli
* @since 2024/4/28 14:02
*/
@OnlyPodsEnvironment
//@OnlyPodsEnvironment
@Configuration
public class XxlJobConfiguration {
Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class);

View File

@ -118,6 +118,7 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
log.info("发起审核createProcessInstance===>>>参数:{}", JSONUtil.toJsonStr(dto));
// 填充头像
populateUsersAvatar(dto.getInitiator());
dto.setAsync(false);
return success(bpmnProcessInstanceService.createProcessInstance(dto));
}

View File

@ -467,7 +467,7 @@ public interface WorkflowManageService {
@InvokeMode(SYNC)
FormDefinitionVO getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);
@PostMapping("/api/form/instance/get")
@PostMapping("/api/form/instance/render")
@InvokeMode(SYNC)
FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto);