Java源码示例:org.hswebframework.utils.StringUtils

示例1
public static void main(String[] args) throws Exception {
    JSONObject jsonObject = new JSONObject();

    System.getProperties()
            .entrySet()
            .stream()
            .flatMap(e -> System.getenv().entrySet().stream())
            .filter(e -> String.valueOf(e.getKey()).startsWith("mqtt."))
            .forEach(e -> jsonObject.put(String.valueOf(e.getKey()).substring(5), e.getValue()));
    for (String arg : args) {
        String[] split = arg.split("[=]");
        jsonObject.put(split[0].startsWith("mqtt.") ? split[0].substring(5) : split[0], split.length == 2 ? split[1] : true);
    }
    String binds = jsonObject.getString("binds");
    if (!StringUtils.isNullOrEmpty(binds)) {
        jsonObject.put("binds", binds.split("[,]"));
    }
    MQTTSimulator simulator = jsonObject.toJavaObject(MQTTSimulator.class);
    simulator.clientMap = new ConcurrentHashMap<>(simulator.limit);
    System.out.println("使用配置:\n" + JSON.toJSONString(simulator, SerializerFeature.PrettyFormat));
    simulator.start();
}
 
示例2
@PostMapping("/decode")
@SaveAction
public Mono<String> decode(@RequestBody Mono<ProtocolDecodeRequest> entity) {
    return entity
        .<Object>flatMapMany(request -> {
            ProtocolSupportDefinition supportEntity = request.getEntity().toDeployDefinition();
            supportEntity.setId("_debug");
            return supportLoader.load(supportEntity)
                .flatMapMany(protocol -> request
                    .getRequest()
                    .doDecode(protocol, null));
        })
        .collectList()
        .map(JSON::toJSONString)
        .onErrorResume(err-> Mono.just(StringUtils.throwable2String(err)));
}
 
示例3
@PostMapping("/encode")
@SaveAction
public  Mono<String> encode(@RequestBody Mono<ProtocolEncodeRequest> entity) {
    return entity
        .flatMapMany(request -> {
            ProtocolSupportDefinition supportEntity = request.getEntity().toDeployDefinition();
            supportEntity.setId("_debug");
            return supportLoader.load(supportEntity)
                .flatMapMany(protocol -> request
                    .getRequest()
                    .doEncode(protocol, null));
        })
        .collectList()
        .map(JSON::toJSONString)
        .onErrorResume(err-> Mono.just(StringUtils.throwable2String(err)));
}
 
示例4
public static SerializableAccessLog of(AccessLoggerInfo info) {
    SerializableAccessLog accessLog = FastBeanCopier.copy(info, new SerializableAccessLog(), "parameters", "method", "target", "exception");
    accessLog.setMethod(info.getMethod().getName());
    accessLog.setTarget(info.getTarget().getName());
    accessLog.setException(info.getException() == null ? ""
            : StringUtils.throwable2String(info.getException()));
    Map<String, Object> newParameter = info.getParameters()
            .entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> {
                Object value = e.getValue();
                if (value instanceof FilePart) {
                    return ("file:") + ((FilePart) value).filename();
                }
                return JSON.toJSONString(value);
            }));

    accessLog.setParameters(newParameter);
    return accessLog;
}
 
示例5
public String converter(Object obj) {
        if (obj instanceof String) {
            return (String) obj;
        }
        String text;
        String callback = ThreadLocalUtils.getAndRemove("jsonp-callback");
        if (obj instanceof ResponseMessage) {
            ResponseMessage message = (ResponseMessage) obj;
//            if (dictSupportApi != null) {
//                message.setResult(dictSupportApi.wrap(message.getResult()));
//            }
            text = JSON.toJSONString(obj, parseFilter(message), features);
        } else {
//            if (dictSupportApi != null) {
//                obj = dictSupportApi.wrap(obj);
//            }
            text = JSON.toJSONString(obj, features);
        }
        if (!StringUtils.isNullOrEmpty(callback)) {
            text = new StringBuilder()
                    .append(callback)
                    .append("(").append(text).append(")")
                    .toString();
        }
        return text;
    }
 
示例6
@Override
public boolean handle(DataAccessConfig access, AuthorizingContext context) {
    ScriptDataAccessConfig dataAccess = ((ScriptDataAccessConfig) access);
    DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(dataAccess.getScriptLanguage());
    if (engine == null) {
        throw new UnsupportedOperationException(dataAccess.getScriptLanguage() + " {not_support}");
    }
    String scriptId = DigestUtils.md5Hex(dataAccess.getScript());
    try {
        if (!engine.compiled(scriptId)) {
            engine.compile(scriptId, dataAccess.getScript());
        }
        Object success = engine.execute(scriptId, context.getParamContext().getParams()).getIfSuccess();
        return StringUtils.isTrue(success);
    } catch (Exception e) {
        throw new BusinessException("{script_error}", e);
    }
}
 
示例7
protected String[] decodeClientAuthenticationHeader(String authenticationHeader) {
    if (StringUtils.isNullOrEmpty(authenticationHeader)) {
        return null;
    } else {
        String[] tokens = authenticationHeader.split(" ");
        if (tokens.length != 2) {
            return null;
        } else {
            String authType = tokens[0];
            if (!"basic".equalsIgnoreCase(authType)) {
                return ErrorType.OTHER.throwThis(GrantTokenException::new, "authentication " + authType + " not support!");
            } else {
                String encodedCreds = tokens[1];
                return decodeBase64EncodedCredentials(encodedCreds);
            }
        }
    }
}
 
示例8
private String createSetPropertyCode(TableMetaData tableMetaData) {
    StringBuilder builder = new StringBuilder();
    builder.append("public void setProperty(String property,Object value){\n");
    int index = 0;
    for (ColumnMetaData column : tableMetaData.getColumns()) {
        String propertyName = column.getAlias();
        Class type = column.getJavaType();
        if (index++ > 0) {
            builder.append("\nelse ");
        }
        builder.append("if(property.intern()==\"")
                .append(propertyName)
                .append("\"||property.intern()==\"")
                .append(column.getName()).append("\"){\n")
                .append("this.set")
                .append(StringUtils.toUpperCaseFirstOne(propertyName))
                .append("((").append(type.getName()).append(")")
                .append("org.hswebframework.web.bean.FastBeanCopier.DEFAULT_CONVERT.convert(value,")
                .append(type.getName())
                .append(".class,null));")
                .append("\n}");
    }
    builder.append("}");
    return builder.toString();
}
 
示例9
private String createGetPropertyCode(TableMetaData tableMetaData) {
    StringBuilder builder = new StringBuilder();
    int index = 0;
    builder.append("public Object getProperty(String property){\n");
    for (ColumnMetaData column : tableMetaData.getColumns()) {
        String propertyName = column.getAlias();
        if (index++ > 0) {
            builder.append("\nelse ");
        }
        builder.append("if(property.intern()==\"")
                .append(propertyName)
                .append("\"||property.intern()==\"")
                .append(column.getName())
                .append("\"){\n")
                .append("return this.get")
                .append(StringUtils.toUpperCaseFirstOne(propertyName))
                .append("();")
                .append("\n}");

    }
    builder.append("\nreturn null;\n}");
    return builder.toString();
}
 
示例10
@Override
public void claim(String taskId, String userId) {
    Task task = taskService.createTaskQuery().
            taskId(taskId)
            .taskCandidateUser(userId)
            .active()
            .singleResult();
    if (task == null) {
        throw new NotFoundException("无法签收此任务");
    }
    if (!StringUtils.isNullOrEmpty(task.getAssignee())) {
        throw new BusinessException("任务已签售");
    } else {
        taskService.claim(taskId, userId);
    }
}
 
示例11
public SerializableNotifierEvent toSerializable() {
    return SerializableNotifierEvent.builder()
        .success(success)
        .notifierId(notifierId)
        .notifyType(notifyType.getId())
        .provider(provider.getId())
        .templateId(templateId)
        .template(template)
        .context(context)
        .cause(cause != null ? StringUtils.throwable2String(cause) : "")
        .errorType(cause != null ? cause.getClass().getName() : null)
        .build();
}
 
示例12
public String converter(Object obj) {
        if (obj instanceof String) {
            return (String) obj;
        }

        String text;
        String callback = ThreadLocalUtils.getAndRemove("jsonp-callback");
        if (obj instanceof ResponseMessage) {
            ResponseMessage message = (ResponseMessage) obj;
//            if (dictSupportApi != null) {
//                message.setResult(dictSupportApi.wrap(message.getResult()));
//            }
            text = JSON.toJSONString(obj, FastJsonHttpMessageConverter.parseFilter(message), features);
        } else {
//            if (dictSupportApi != null) {
//                obj = dictSupportApi.wrap(obj);
//            }
            text = JSON.toJSONString(obj, features);
        }
        if (!StringUtils.isNullOrEmpty(callback)) {
            text = new StringBuilder()
                    .append(callback)
                    .append("(").append(text).append(")")
                    .toString();
        }
        return text;
    }
 
示例13
private QueryParamParser parse(Object obj) {
    if (obj instanceof Map) {
        ((Map) obj).forEach((k, v) -> {
            String key = String.valueOf(k);
            if ("pageIndex".equals(key)) {
                query.getParam().setPageIndex(StringUtils.toInt(v));
            }
            if ("pageSize".equals(key)) {
                query.getParam().setPageSize(StringUtils.toInt(v));
            }
            if (v != null) {
                if (v instanceof Entity || v instanceof Map) {
                    List<Term> terms = new QueryParamParser().parse(v).get().getTerms();
                    Term term = new Term();
                    term.setType(key.equalsIgnoreCase("or") ? Term.Type.or : Term.Type.and);
                    term.setTerms(terms);
                    query.getParam().getTerms().add(term);
                } else {
                    consumer.accept(String.valueOf(key), v);
                }
            }
        });
    } else {
        parse(FastBeanCopier.copy(obj, new LinkedHashMap<>()));
    }
    return this;
}
 
示例14
public HttpTokenRequest(HttpServletRequest request) {
    this.parameters = WebUtil.getParameters(request);
    this.headers = WebUtil.getHeaders(request);
    String clientId = parameters.get(OAuth2Constants.client_id);
    String clientSecret = parameters.get(OAuth2Constants.client_secret);
    String authorization = headers.get(OAuth2Constants.authorization);
    clientCredentials = getClientCredentials(clientId, clientSecret, authorization);

    this.scope = getParameter(OAuth2Constants.scope)
            .filter(scopeStr -> !StringUtils.isNullOrEmpty(scopeStr))
            .map(scopeStr -> new HashSet<>(Arrays.asList(scopeStr.split("[, \n]"))))
            .orElseGet(HashSet::new);
}
 
示例15
@Override
public List<DictionaryItemEntity> selectByDictId(String dictId) {
    if (StringUtils.isNullOrEmpty(dictId)) {
        return new java.util.ArrayList<>();
    }
    return createQuery()
            .where(DictionaryItemEntity.dictId, dictId)
            .orderByAsc(DictionaryItemEntity.sortIndex)
            .listNoPaging();
}
 
示例16
@Override
public ActivityImpl selectActivityImplByTask(String taskId) {
    if (StringUtils.isNullOrEmpty(taskId)) {
        return new ActivityImpl(null, null);
    }
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    ProcessDefinitionEntity entity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());
    List<ActivityImpl> activities = entity.getActivities();
    return activities
            .stream()
            .filter(activity -> "userTask".equals(activity.getProperty("type")) && activity.getProperty("name").equals(task.getName()))
            .findFirst()
            .orElseThrow(() -> new NotFoundException("获取节点信息失败"));
}
 
示例17
@Override
public Map<String, Object> getVariablesByProcInstId(String procInstId) {
    List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(procInstId).list();
    String executionId = "";
    for (Execution execution : executions) {
        if (StringUtils.isNullOrEmpty(execution.getParentId())) {
            executionId = execution.getId();
        }
    }
    return runtimeService.getVariables(executionId);
}
 
示例18
public String getName() {
    if (StringUtils.isNullOrEmpty(name)) {
        name = type.name().concat("_").concat(field);
    }
    return name;
}
 
示例19
public String getName() {
    if (StringUtils.isNullOrEmpty(name)) {
        name = type.name().concat("_").concat(field);
    }
    return name;
}
 
示例20
protected Class<Entity> getClass(String basePackage, String name) {
    if (!StringUtils.isNullOrEmpty(basePackage)) {
        name = basePackage.concat(".").concat(name);
    }
    return classForName(name);
}
 
示例21
protected String getDepKey(String groupId, String artifactId) {
    return StringUtils.concat(groupId, "/", artifactId);
}
 
示例22
private List<RDBColumnMetaData> createColumn(String prefix, String columnName, ResultMapping resultMapping) {
    List<RDBColumnMetaData> metaData = new ArrayList<>();
    if (resultMapping.getNestedQueryId() == null) {

        if (resultMapping.getNestedResultMapId() != null) {
            ResultMap nests = MybatisUtils.getResultMap(resultMapping.getNestedResultMapId());
            Set<ResultMapping> resultMappings = new HashSet<>(nests.getResultMappings());
            resultMappings.addAll(nests.getIdResultMappings());
            for (ResultMapping mapping : resultMappings) {
                metaData.addAll(createColumn(resultMapping.getProperty(),
                        org.springframework.util.StringUtils.hasText(resultMapping.getColumn())
                                ? resultMapping.getColumn()
                                : resultMapping.getProperty(),
                        mapping));
            }
            return metaData;
        }

        JDBCType jdbcType = JDBCType.VARCHAR;
        try {
            jdbcType = JDBCType.valueOf(resultMapping.getJdbcType().name());
        } catch (Exception e) {
            log.warn("can not parse jdbcType:{}", resultMapping.getJdbcType());
        }
        RDBColumnMetaData column = new RDBColumnMetaData();
        column.setJdbcType(jdbcType);
        column.setName(org.springframework.util.StringUtils.hasText(columnName)
                ? columnName.concat(".").concat(resultMapping.getColumn()) : resultMapping.getColumn());

        if (resultMapping.getTypeHandler() != null) {
            column.setProperty("typeHandler", resultMapping.getTypeHandler().getClass().getName());
        }
        if (!StringUtils.isNullOrEmpty(resultMapping.getProperty())) {
            column.setAlias(org.springframework.util.StringUtils.hasText(prefix)
                    ? prefix.concat(".").concat(resultMapping.getProperty()) : resultMapping.getProperty());

        }
        column.setJavaType(resultMapping.getJavaType());
        column.setProperty("resultMapping", resultMapping);
        metaData.add(column);
    }
    return metaData;
}
 
示例23
@Override
public Optional<Long> asLong() {
    return getNativeValue().map(StringUtils::toLong);
}
 
示例24
@Override
public Optional<Integer> asInt() {
    return getNativeValue().map(StringUtils::toInt);
}
 
示例25
@Override
public Optional<Double> asDouble() {
    return getNativeValue().map(StringUtils::toDouble);
}
 
示例26
protected String[] decodeBase64EncodedCredentials(String encodedCredentials) {
    String decodedCredentials = new String(Base64.getDecoder().decode(encodedCredentials));
    String[] credentials = decodedCredentials.split(":", 2);
    return credentials.length != 2 ? null : (!StringUtils.isNullOrEmpty(credentials[0]) && !StringUtils.isNullOrEmpty(credentials[1]) ? credentials : null);
}
 
示例27
@Override
public Validator createValidator(TableMetaData tableMetaData) {
    Proxy<MapBean> proxy = Proxy.create(MapBean.class);
    StringBuilder keySet = new StringBuilder("public java.util.Set keySet(){\n return new java.util.HashSet(java.util.Arrays.asList(new String[]{");
    int index = 0;
    for (ColumnMetaData column : tableMetaData.getColumns()) {
        String propertyName = column.getAlias();
        Class type = column.getJavaType();
        String typeName = type.getName();

        if (index++ > 0) {
            keySet.append(",");
        }

        keySet.append("\"")
                .append(propertyName)
                .append("\"");

        proxy.custom(ctClass -> {
            try {
                CtField ctField = CtField.make("private " + type.getName() + " " + propertyName + ";", ctClass);
                List<JSR303AnnotationInfo> jsr303 = createValidatorAnnotation(column.getValidator());
                //添加注解
                if (!CollectionUtils.isEmpty(jsr303)) {
                    ConstPool constPool = ctClass.getClassFile().getConstPool();
                    AnnotationsAttribute attributeInfo = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
                    for (JSR303AnnotationInfo jsr303AnnotationInfo : jsr303) {
                        Class<? extends java.lang.annotation.Annotation> jsr303Ann = jsr303AnnotationInfo.getAnnotation();
                        Annotation ann = new javassist.bytecode.annotation.Annotation(jsr303Ann.getName(), constPool);
                        if (!CollectionUtils.isEmpty(jsr303AnnotationInfo.getProperties())) {
                            jsr303AnnotationInfo.getProperties().forEach((key, value) -> {
                                MemberValue memberValue = createMemberValue(value, constPool);
                                if (memberValue != null) {
                                    ann.addMemberValue(key, memberValue);
                                }
                            });
                        }
                        attributeInfo.addAnnotation(ann);
                    }
                    ctField.getFieldInfo().addAttribute(attributeInfo);
                }
                ctClass.addField(ctField);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });

        proxy.addMethod("public void set" + StringUtils.toUpperCaseFirstOne(propertyName) + "(" + typeName + " " + propertyName + "){\n" +
                "this." + propertyName + "=" + propertyName + ";\n" +
                "\n};");

        proxy.addMethod("public " + typeName + " get" + StringUtils.toUpperCaseFirstOne(propertyName) + "(){\n" +
                "return this." + propertyName + ";\n" +
                "\n};");
    }

    keySet.append("}));\n}");

    proxy.addMethod(keySet.toString());
    proxy.addMethod(createSetPropertyCode(tableMetaData));
    proxy.addMethod(createGetPropertyCode(tableMetaData));

    //尝试一下能否创建实例
    MapBean mapBean = proxy.newInstance();
    Assert.notNull(mapBean, "创建验证器失败!");
    return new DynamicBeanValidator(proxy::newInstance);
}
 
示例28
/**
 * 通过文件ID下载已经上传的文件,支持断点下载
 * 如: http://host:port/file/download/aSk2a/file.zip 将下载 ID为aSk2a的文件.并命名为file.zip
 *
 * @param idOrMd5  要下载资源文件的id或者md5值
 * @param name     自定义文件名,该文件名不能存在非法字符.如果此参数为空(null).将使用文件上传时的文件名
 * @param response {@link javax.servlet.http.HttpServletResponse}
 * @param request  {@link javax.servlet.http.HttpServletRequest}
 * @return 下载结果, 在下载失败时, 将返回错误信息
 * @throws IOException                              读写文件错误
 * @throws org.hswebframework.web.NotFoundException 文件不存在
 */
@GetMapping(value = "/download/{id}")
@ApiOperation("下载文件")
@Authorize(action = "download", description = "下载文件")
public void downLoad(@ApiParam("文件的id或者md5") @PathVariable("id") String idOrMd5,
                     @ApiParam(value = "文件名,如果未指定,默认为上传时的文件名", required = false) @RequestParam(value = "name", required = false) String name,
                     @ApiParam(hidden = true) HttpServletResponse response, @ApiParam(hidden = true) HttpServletRequest request)
        throws IOException {
    FileInfoEntity fileInfo = fileInfoService.selectByIdOrMd5(idOrMd5);
    if (fileInfo == null || !DataStatus.STATUS_ENABLED.equals(fileInfo.getStatus())) {
        throw new NotFoundException("文件不存在");
    }
    String fileName = fileInfo.getName();

    String suffix = fileName.contains(".") ?
            fileName.substring(fileName.lastIndexOf("."), fileName.length()) :
            "";
    //获取contentType
    String contentType = fileInfo.getType() == null ?
            MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(fileName) :
            fileInfo.getType();
    //未自定义文件名,则使用上传时的文件名
    if (StringUtils.isNullOrEmpty(name)) {
        name = fileInfo.getName();
    }
    //如果未指定文件拓展名,则追加默认的文件拓展名
    if (!name.contains(".")) {
        name = name.concat(".").concat(suffix);
    }
    //关键字剔除
    name = fileNameKeyWordPattern.matcher(name).replaceAll("");
    int skip = 0;
    long fSize = fileInfo.getSize();
    //尝试判断是否为断点下载
    try {
        //获取要继续下载的位置
        String Range = request.getHeader("Range").replace("bytes=", "").replace("-", "");
        skip = StringUtils.toInt(Range);
    } catch (Exception ignore) {
    }
    response.setContentLength((int) fSize);//文件大小
    response.setContentType(contentType);
    response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(name, "utf-8"));
    //断点下载
    if (skip > 0) {
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
        String contentRange = "bytes " + skip + "-" + (fSize - 1) + "/" + fSize;
        response.setHeader("Content-Range", contentRange);
    }
    fileService.writeFile(idOrMd5, response.getOutputStream(), skip);
}
 
示例29
@Override
public ProcessInstance startProcessInstance(StartProcessRequest request) {
    request.tryValidate();
    ProcessInstance processInstance;
    logger.debug("start workflow :{}", request);
    try {
        identityService.setAuthenticatedUserId(request.getCreatorId());

        ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionId(request.getProcessDefineId())
                .singleResult();
        if (definition == null) {
            throw new NotFoundException("流程[" + request.getProcessDefineId() + "]不存在");
        }

        //创建业务ID
        String businessKey = IDGenerator.MD5.generate();

        //启动流程
        processInstance = runtimeService.startProcessInstanceById(
                request.getProcessDefineId()
                , businessKey
                , request.getVariables());

        //候选人设置
        Consumer<Task> candidateUserSetter = (task) -> {
            if (task == null) {
                return;
            }
            //指定了下一环节的办理人
            if (!StringUtils.isNullOrEmpty(request.getNextClaimUserId())) {
                taskService.addCandidateUser(task.getId(), request.getNextClaimUserId());
            } else {
                bpmTaskService.setCandidate(request.getCreatorId(), task);
            }
        };

        List<Task> tasks = bpmTaskService.selectTaskByProcessId(processInstance.getProcessDefinitionId());

        //当前节点
        String activityId = processInstance.getActivityId();
        if (activityId == null) {
            //所有task设置候选人
            tasks.forEach(candidateUserSetter);
        } else {
            candidateUserSetter.accept(taskService
                    .createTaskQuery()
                    .processInstanceId(processInstance.getProcessInstanceId())
                    .taskDefinitionKey(activityId)
                    .active()
                    .singleResult());
        }

        workFlowFormService.saveProcessForm(processInstance, SaveFormRequest
                .builder()
                .userId(request.getCreatorId())
                .userName(request.getCreatorName())
                .formData(request.getFormData())
                .build());

        ProcessHistoryEntity history = ProcessHistoryEntity.builder()
                .type("start")
                .typeText("启动流程")
                .businessKey(businessKey)
                .creatorId(request.getCreatorId())
                .creatorName(request.getCreatorName())
                .processInstanceId(processInstance.getProcessInstanceId())
                .processDefineId(processInstance.getProcessDefinitionId())
                .build();

        processHistoryService.insert(history);


    } finally {
        identityService.setAuthenticatedUserId(null);
    }
    return processInstance;
}
 
示例30
@Override
public void complete(CompleteTaskRequest request) {
    request.tryValidate();

    Task task = taskService.createTaskQuery()
            .taskId(request.getTaskId())
            .includeProcessVariables()
            .active()
            .singleResult();

    Objects.requireNonNull(task, "任务不存在");
    String assignee = task.getAssignee();
    Objects.requireNonNull(assignee, "任务未签收");
    if (!assignee.equals(request.getCompleteUserId())) {
        throw new BusinessException("只能完成自己的任务");
    }
    Map<String, Object> variable = new HashMap<>();
    variable.put("preTaskId", task.getId());
    Map<String, Object> transientVariables = new HashMap<>();

    if (null != request.getVariables()) {
        variable.putAll(request.getVariables());
        transientVariables.putAll(request.getVariables());
    }

    ProcessInstance instance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(task.getProcessInstanceId())
            .singleResult();

    //查询主表的数据作为变量
    Optional.of(workFlowFormService.<Map<String, Object>>selectProcessForm(instance.getProcessDefinitionId(),
            QueryParamEntity.of("processInstanceId", instance.getProcessInstanceId()).doPaging(0, 2)))
            .map(PagerResult::getData)
            .map(list -> {
                if (list.size() == 1) {
                    return list.get(0);
                }
                if (list.size() > 1) {
                    logger.warn("主表数据存在多条数据:processInstanceId={}", instance.getProcessInstanceId());
                }
                return null;
            })
            .ifPresent(transientVariables::putAll);


    //保存表单数据
    workFlowFormService.saveTaskForm(instance, task, SaveFormRequest.builder()
            .userName(request.getCompleteUserName())
            .userId(request.getCompleteUserId())
            .formData(request.getFormData())
            .build());

    if (null != request.getFormData()) {
        transientVariables.putAll(request.getFormData());
    }

    taskService.complete(task.getId(), null, transientVariables);

    //跳转
    if (!StringUtils.isNullOrEmpty(request.getNextActivityId())) {
        doJumpTask(task, request.getNextActivityId(), (t) -> {
        });
    }

    //下一步候选人
    List<Task> tasks = selectNowTask(task.getProcessInstanceId());
    for (Task next : tasks) {
        setVariablesLocal(next.getId(), variable);
        if (!StringUtils.isNullOrEmpty(request.getNextClaimUserId())) {
            taskService.addCandidateUser(next.getId(), request.getNextClaimUserId());
        } else {
            setCandidate(request.getCompleteUserId(), next);
        }
    }

    ProcessHistoryEntity history = ProcessHistoryEntity.builder()
            .businessKey(instance.getBusinessKey())
            .type("complete")
            .typeText("完成任务")
            .creatorId(request.getCompleteUserId())
            .creatorName(request.getCompleteUserName())
            .processDefineId(instance.getProcessDefinitionId())
            .processInstanceId(instance.getProcessInstanceId())
            .taskId(task.getId())
            .taskDefineKey(task.getTaskDefinitionKey())
            .taskName(task.getName())
            .build();

    processHistoryService.insert(history);
}