当前位置: 首页 > news >正文

泛微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.Datapublic 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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot的Web开发
  • 护眼大路灯哪个牌子好?公认五款最好护眼大路灯分享
  • C++ 特性之vector详解 + 联合opencv使用
  • 数据库方式实现实时排行榜
  • http参数污染利用php小特性绕过贷齐乐waf
  • Dom 元素转换 Image 图片 (截图)
  • 探索PHP的心脏:流行CMS系统全解析
  • KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序
  • html复习
  • 大语言模型面试宝典:30+ 必考问题与答案,助你一臂之力
  • 关于100个linux常用的命令
  • 2-63 基于matlab的GMPHD滤波器算法
  • 互联网摸鱼日报(2024-08-13)
  • Java Nacos与Gateway的使用
  • 【一文搞懂】Rewind AI是什么?Rewind AI能干嘛?全网最全指南!
  • 10个最佳ES6特性 ES7与ES8的特性
  • export和import的用法总结
  • leetcode讲解--894. All Possible Full Binary Trees
  • tensorflow学习笔记3——MNIST应用篇
  • Vultr 教程目录
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 微信小程序:实现悬浮返回和分享按钮
  • #include<初见C语言之指针(5)>
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (¥1011)-(一千零一拾一元整)输出
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C++17) optional的使用
  • (C语言)字符分类函数
  • (solr系列:一)使用tomcat部署solr服务
  • (八)Flask之app.route装饰器函数的参数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (简单) HDU 2612 Find a way,BFS。
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)RocketMQ初步认识
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)甲方乙方——赵民谈找工作
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) UML中文FAQ (OO) (UML)
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net framework profiles /.net framework 配置
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Remoting学习笔记(三)信道
  • .NET Standard 的管理策略