泛微OA流程接口调用工具类

概述背景

oa的入参理念就是map类型的,这样能统一兼容,但是调用的时候挨个set 有规律的值,代码就有点冗余了,下面以创建流程为例子写个工具类

由于工作任务紧张并且没有牵扯到文件上传,所以没有兼容文件上传,后续工作需要再补充。获取token代码(也简单)不是我写的我也就不列了

基础类:

OA创建参数类: Create
OA明细实体: DetailData
OA明细记录实体(一个实体代表一条明细): WorkflowRequestTableRecord
OA其他参数:  OtherParams
OA明细信息实体: DetailInfo
OA属性实体: Field 
OA出参实体 : OaRes

工具类代码:

package org.dromara.mes.common.utils.oa;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.mes.common.config.OaConfig;
import org.dromara.mes.common.domain.flow.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.utils.oa
 * @className: OaFlowUtils
 * @author: zhangxuewei
 * @description: 泛微OA流程工具类
 * @date: 2024/8/9 17:06
 * @version: 1.0
 */
@Slf4j
public class OaFlowUtils<A, B> {

    /**
     * @param userId:     OA用户主键
     * @param workflowId: 流程主键
     * @param mainData:   主表的数据
     * @param details:    k-明细表名称 v-数据集合
     * @return String
     * @author zhangxuewei
     * @description 新建OA流程
     * @date 2024/8/10 10:02
     */
    public OaRes doCreateRequest(String userId, Integer workflowId, String title, A mainData, DetailInfo<B>... details) {
        log.info("已进入新建OA流程,workflowId={}...", workflowId);
        String path = OaConfig.getHost() + "/api/workflow/paService/doCreateRequest";
        Map<String, String> headers = new HashMap<>();
        headers.put("token", OaTokenUtils.getToken());
        headers.put("appid", OaConfig.getAppId());
        if (StringUtils.isNotEmpty(userId)) {
            RSA rsa = new RSA(null, OaConfig.getSpk());
            String u = rsa.encryptBase64(userId, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey);
            headers.put("userid", u);
        }
        Create oc = new Create();
        oc.setWorkflowId(workflowId);
        oc.setMainData(objToOaMainData(oc, mainData).toString());
        oc.setDetailData(objToOaDetailData(oc, details).toString());
        oc.setRequestName(title);
        Map<String, Object> body = BeanUtil.beanToMap(oc);
        HttpRequest request = HttpRequest.post(path).addHeaders(headers).form(body);
        log.info("header:{}", JSONUtil.parseObj(request.headers()));
        log.info("form:{}", JSONUtil.parseObj(request.form()));
        String response = request.execute().body();
        log.info("调用创建流程接口完毕,OA出参:{}", response);
        OaRes oaRes = JSONUtil.toBean(response, OaRes.class);
        return oaRes;
    }

    /**
     * @return JSONArray
     * @author zhangxuewei
     * @description 对象转OA的明细表对象数据
     * @date 2024/8/10 9:18
     */
    private JSONArray objToOaDetailData(Create oc, DetailInfo<B>... details) {
        if (details.length == 0)
            return new JSONArray();
        List<DetailData> detailDataList = new ArrayList<>();
        for (DetailInfo<B> detail : details) {
            DetailData detailData = new DetailData();
            List<WorkflowRequestTableRecord> requestTableRecords = new ArrayList<>();
            // 明细表名称
            detailData.setTableDBName(detail.getDetailTableName());
            if (ObjectUtils.isEmpty(detail.getDetailDatas()))
                throw new ServiceException("明细列表数据不能为空!");
            detail.getDetailDatas().forEach(item -> {
                WorkflowRequestTableRecord record = new WorkflowRequestTableRecord();
                List<Field> workflowRequestTableFields = objToOaFields(item);
                record.setWorkflowRequestTableFields(workflowRequestTableFields);
                requestTableRecords.add(record);
            });
            detailData.setWorkflowRequestTableRecords(requestTableRecords);
            detailDataList.add(detailData);
        }
        return JSONUtil.parseArray(detailDataList);
    }

    /**
     * @param obj:
     * @return JSONObject
     * @author zhangxuewei
     * @description 对象转OA的主表数据
     * @date 2024/8/10 9:18
     */
    private JSONArray objToOaMainData(Create oc, A obj) {
        List<Field> fields = objToOaFields(obj);
        return JSONUtil.parseArray(fields);
    }

    /**
     * @param obj:
     * @return JSONObject
     * @author zhangxuewei
     * @description 对象转OA属性对象
     * @date 2024/8/9 17:49
     */
    private static List<Field> objToOaFields(Object obj) {
        Map<String, Object> map = BeanUtil.beanToMap(obj);
        List<Field> fields = new ArrayList<>();
        map.forEach((k, v) -> {
            if (ObjectUtils.isNotEmpty(v)) {
                Field field = new Field(k, v);
                fields.add(field);
            }
        });
        return fields;
    }

}

调用样例:

public ...... {
    .....
	    // 主表数据
        InspectPushConcessionOaBo mainData = ...;
        // 明细信息
        List<InspectPushOaConcessionItemBo> inspectPushOaItemBos = ....;
        OaFlowUtils<InspectPushConcessionOaBo, InspectPushOaConcessionItemBo> oaFlowUtils = new OaFlowUtils();
		// 明细数据
        DetailInfo<InspectPushOaConcessionItemBo> detailInfo = new DetailInfo<>();
        detailInfo.setDetailDatas(inspectPushOaItemBos);
		// 明细表名称
        detailInfo.setDetailTableName(OaDetailTableNameAndFlowId.MaterialConcessionD1.getDetailTableName());
        // 标题
        String title = "材料让步接收-" + LoginHelper.getLoginUser().getNickname() + "-" + timeStr[0];
        // 开始调用
        OaRes oaRes = oaFlowUtils.doCreateRequest(hrmreSource.getId(), OaDetailTableNameAndFlowId.MaterialConcessionD1.getFlowId(), title, mainData, detailInfo);
    
}

 调用结果

基础类结构

package org.dromara.mes.common.domain.flow;

import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.util.List;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain
 * @className: Create
 * @author: zhangxuewei
 * @description: OA创建vo
 * @date: 2024/8/9 17:11
 * @version: 1.0
 */
@Data
public class Create {

    /**
     * 必填 主表数据 org.dromara.mes.common.domain.flow.MainData
     */
    private String mainData;

    /**
     * 必填 流程标题
     */
    private String requestName;

    /**
     * 必填 流程Id
     */
    private Integer workflowId;

    /**
     * 非必填 明细表数据 org.dromara.mes.common.domain.flow.DetailData
     */
    private String detailData;

    /**
     * 非必填 其他参数 org.dromara.mes.common.domain.flow.OtherParams
     */
//    private JSONObject otherParams;

    /**
     * 非必填 签字意见,默认值流程默认意见若未设置则为空
     */
//    private String remark;

    /**
     * 非必填 紧急程度
     */
//    private String requestLevel;

}
package org.dromara.mes.common.domain.flow;

import lombok.Data;

import java.util.List;

/**
 * @projectName: ruoyi
 * @package: com.ruoyi.bmp.oa.domain.dto
 * @className: DetailData
 * @author: zhangxuewei
 * @description: OA明细实体
 * @date: 2024/8/9 17:40
 * @version: 1.0
 */
@Data
public class DetailData {

    /**
     * 表名名称
     */
    private String tableDBName;

    /**
     * "deleteAll":"1"(删除该流程原有明细)
     */
    private String deleteAll;

    /**
     * "deleteKeys":"12,13"(删除该流程明细id=12,13d的明细行)
     */
    private String deleteKeys;

    /**
     * 明细列表
     */
    private List<WorkflowRequestTableRecord> workflowRequestTableRecords;

}
package org.dromara.mes.common.domain.flow;

import lombok.Data;

import java.util.List;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain.flow
 * @className: DetailInfo
 * @author: zhangxuewei
 * @description:
 * @date: 2024/8/10 10:08
 * @version: 1.0
 */
@Data
public class DetailInfo<B> {
    // 明细表名称
    String detailTableName;
    // 明细数据
    List<B> detailDatas;
}
package org.dromara.mes.common.domain.flow;

import lombok.Data;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain
 * @className: Field
 * @author: zhangxuewei
 * @description: oa属性实体
 * @date: 2024/8/9 16:55
 * @version: 1.0
 */
@Data
public class Field<T> {
    private String fieldName;
    private T fieldValue;

    public Field() {
    }

    public Field(String fieldName, T fieldValue) {
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }
}
package org.dromara.mes.common.domain.flow;

import lombok.Data;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain.flow
 * @className: OaRes
 * @author: zhangxuewei
 * @description: OA出参实体
 * @date: 2024/8/10 16:31
 * @version: 1.0
 */
@Data
public class OaRes {

    /**
     * 返回数据状态 SUCCESS:成功,PARAM_ERROR:参数错误,NO_PERMISSION:无权限,SYSTEM_INNER_ERROR:程序异常,USER_EXCEPTION:用户异常
     */
    private String code;

    /**
     * 接口状态为SUCCESS,则data中包含生成的requestid
     */
    private Data data;

    /**
     * 接口异常信息:例如状态为PARAM_ERROR 则返回错误参数信息
     */
    private String errMsg;

    @lombok.Data
    public static class Data {
        private Integer requestid;
    }
}
package org.dromara.mes.common.domain.flow;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.dromara.common.json.utils.JsonUtils;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain.flow
 * @className: OtherParams
 * @author: zhangxuewei
 * @description: 其他参数
 * @date: 2024/8/9 17:17
 * @version: 1.0
 */
@Data
public class OtherParams {

    /**
     * (api未描述)
     */
    private String messageType;

    /**
     * 新建流程是否默认提交到第二节点,可选值为[0 :不流转 1:流转 (默认)]
     */
    private String isnextflow;

    /**
     * "流程密级, 开启密级后生效, 默认公开"
     */
    private String requestSecLevel;

    /**
     * ”保密期限,流程密级为秘密或机密时,通过改参数上传保密期限,不上传时取分级保护出的保密期限“
     */
    private String requestSecValidity;


    /**
     * 新建流程失败是否默认删除流程,可选值为[0 :不删除 1:删除 (默认)]
     */
    private String delReqFlowFaild;

    /**
     * "是否验证用户创建流程权限,可选值为[0 :不验证 1:验证 (默认)]"
     */
    private String isVerifyPer;

}
package org.dromara.mes.common.domain.flow;

import lombok.Data;

import java.util.List;

/**
 * @projectName: wmes
 * @package: org.dromara.mes.common.domain
 * @className: WorkflowRequestTableRecord
 * @author: zhangxuewei
 * @description: OA明细实体(一个实体代表一条明细)
 * @date: 2024/8/9 16:57
 * @version: 1.0
 */
@Data
public class WorkflowRequestTableRecord {

    /**
     * 明细表recordOrder参数说明  0:代表新增,创建流程全部传0即可 传入其他行id,代表修改该id的明细(该id为数据库明细表的id值)
     */
    private Integer recordOrder = 0;

    /**
     * 一条明细上的所有属性
     */
    private List<Field> workflowRequestTableFields;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
泛微OA是一款广泛应用于企业管理的办公自动化系统,具有丰富的流程管理功能。通过泛微OA流程接口调用,可以实现不同系统之间的数据传递与共享。 首先,使用泛微OA流程接口调用需要开发者了解其接口文档和规范。接口文档提供了如何调用接口、传递参数、返回数据等相关信息,开发者可以根据接口文档进行接口调用。 其次,根据业务需求,开发者可以选择使用不同的接口进行调用泛微OA流程接口包括流程创建、流程审批、流程查询等功能。通过调用这些接口,可以实现对流程的创建、审批以及查询流程的状态和相关信息等功能。 在进行流程接口调用时,需要传递相应的参数。例如,创建流程需要传递流程名称、发起人、审批人、流程模板等参数;审批流程需要传递流程实例ID、审批人、审批意见等参数。这些参数需要按照接口文档中的要求进行传递。 在接口调用完成后,泛微OA会返回相应的结果。根据接口调用结果,开发者可以进行相应的处理。如果接口调用成功,则可以根据返回的数据进行下一步操作;如果接口调用失败,则需要根据返回的错误信息进行相应的处理或重试。 泛微OA流程接口调用可以使不同系统之间实现数据的无缝对接,提高了企业的办公效率和流程管理水平。开发者可以根据业务需求进行相应的接口开发与调用,实现企业流程的自动化与信息的共享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值