泛微OA-E9与第三方系统集成开发企业级实战记录(十五)

今天分享几个集成开发过程中会用到的几个常用自定义工具类。

1.发送Http请求的工具类
java 复制代码
package common.util;

import com.alibaba.fastjson.JSON;
import okhttp3.*;
import weaver.general.BaseBean;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * HTTP 工具类
 * 统一使用 OkHttp,单例、安全、简洁、无资源泄漏
 */
public class HTTPUtils {

    private static final BaseBean log = new BaseBean();

    // ===================== OkHttp 单例 =====================
    private static final OkHttpClient OK_HTTP_CLIENT;

    static {
        OK_HTTP_CLIENT = new OkHttpClient.Builder()
                .connectTimeout(300, TimeUnit.SECONDS)
                .readTimeout(300, TimeUnit.SECONDS)
                .writeTimeout(300, TimeUnit.SECONDS)
                .build();
    }

    // 私有构造,禁止实例化
    private HTTPUtil() {}

    // ===================== POST JSON(泛型版) =====================
    public static <T> T postJson(String url, Object request, Class<T> responseClass) throws Exception {
        // 1. 序列化参数
        String reqJson = JSON.toJSONString(request);
        log("=====发起HTTP-POST请求=====");
        log("url: " + url);
        log("request: " + reqJson);

        // 2. 构建请求
        RequestBody body = RequestBody.create(
                MediaType.parse("application/json;charset=UTF-8"),
                reqJson
        );

        Request okRequest = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        // 3. 执行请求
        try (Response response = OK_HTTP_CLIENT.newCall(okRequest).execute()) {
            log("status: " + response.code());

            if (!response.isSuccessful()) {
                throw new Exception("接口调用失败,状态码:" + response.code());
            }

            String respJson = response.body().string();
            log("response: " + respJson);
            log("=====HTTP-POST请求结束=====");

            // 4. 反序列化
            return JSON.parseObject(respJson, responseClass);
        }
    }

    // ===================== 兼容老方法:String 请求 =====================
    public static String postJson(String url, String requestJson) {
        log("=====发起HTTP-POST请求=====");
        log("url: " + url);
        log("request: " + requestJson);

        RequestBody body = RequestBody.create(
                MediaType.parse("application/json;charset=UTF-8"),
                requestJson
        );

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        try (Response response = OK_HTTP_CLIENT.newCall(request).execute()) {
            String result = response.body().string();
            log("status: " + response.code());
            log("response: " + result);
            log("=====HTTP-POST请求结束=====");
            return result;
        } catch (Exception e) {
            log("POST 请求异常:" + e.getMessage());
            return null;
        }
    }

    // ===================== GET 请求(泛型) =====================
    public static <T> T get(String url, Map<String, Object> params, Class<T> responseClass) throws Exception {
        // 拼接参数
        String finalUrl = buildGetUrl(url, params);

        log("=====发起HTTP-GET请求=====");
        log("url: " + finalUrl);
        log("request: " + params);

        Request request = new Request.Builder()
                .url(finalUrl)
                .get()
                .build();

        try (Response response = OK_HTTP_CLIENT.newCall(request).execute()) {
            log("status: " + response.code());

            if (!response.isSuccessful()) {
                throw new Exception("接口调用失败,状态码:" + response.code());
            }

            String respJson = response.body().string();
            log("response: " + respJson);
            log("=====HTTP-GET请求结束=====");

            return JSON.parseObject(respJson, responseClass);
        }
    }

    // ===================== 拼接 GET URL =====================
    private static String buildGetUrl(String url, Map<String, Object> params) {
        if (params == null || params.isEmpty()) {
            return url;
        }

        StringBuilder sb = new StringBuilder(url);
        if (!url.contains("?")) {
            sb.append("?");
        } else {
            sb.append("&");
        }

        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }

        // 删除最后一个 &
        if (sb.charAt(sb.length() - 1) == '&') {
            sb.deleteCharAt(sb.length() - 1);
        }

        return sb.toString();
    }

    // ===================== 简化日志 =====================
    private static void log(String msg) {
        log.writeLog("common.util.HTTPUtil." + msg);
    }
}

使用示例:

  • 发送Post请求(发送对象参数 → 返回对象)

UserReq req = new UserReq();

UserResp resp = HTTPUtil.postJson("http://xxx", req, UserResp.class);

Map<String,Object>=HTTPUtil.postJson("http://xxx", req, Map.class);

  • 发送Post请求(发送Json字符串参数 → 返回Json字符串)

String resp = HTTPUtil.postJson("http://xxx", "{...}");

  • 发送Get请求(发送对象参数 → 返回对象)

Map<String,Object> params = new HashMap<>();

UserResp resp = HTTPUtil.get("http://xxx", params, UserResp.class);

2.数据处理工具类
java 复制代码
package common.util;

import com.weaver.general.Util;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.soa.workflow.request.RequestInfo;

import java.io.UnsupportedEncodingException;
import java.util.*;

/**
 * 泛微数据处理工具类
 */
public class DataProcessingUtil {
    private static final BaseBean log = new BaseBean();

    private DataProcessUtil() {
    }

    // ------------------------------ 空判断 ------------------------------
    public static boolean isNull(String s) {
        return s == null || s.trim().isEmpty();
    }

    // ------------------------------ 长度校验 ------------------------------
    public static String verify(RequestInfo requestInfo, String tableName, String fields, String lengths, String encode) {
        List<Map<String, String>> dataList = query(tableName, requestInfo);
        String[] fieldArr = fields.split(",");
        String[] lengthArr = lengths.split(",");

        for (Map<String, String> data : dataList) {
            for (int i = 0; i < fieldArr.length; i++) {
                String field = fieldArr[i].trim();
                int maxLen = Integer.parseInt(lengthArr[i].trim());
                String value = Util.null2String(data.get(field));

                int realLen = getByteLength(value, encode);
                log.writeLog(field + " 值:" + value + ",限制长度:" + maxLen + ",实际长度:" + realLen);

                if (realLen > maxLen) {
                    String msg = "字段[" + field + "]长度超出限制!最大[" + maxLen + "]字节,当前[" + realLen + "]字节";
                    log.writeLog(msg);
                    return msg;
                }
            }
        }
        return "";
    }

    // ------------------------------ 工号转用户ID ------------------------------
    public static String getUseridForWorkcode(String workcode) {
        if (isNull(workcode)) return "";

        RecordSet rs = new RecordSet();
        List<String> userIds = new ArrayList<>();
        String[] codes = workcode.split(",");

        for (String code : codes) {
            code = code.trim();
            if (isNull(code)) continue;

            String sql = "SELECT id FROM HrmResource WHERE workcode = ?";
            rs.executeQuery(sql, code);

            if (rs.next()) {
                userIds.add(rs.getString("id"));
            }
        }

        return String.join(",", userIds);
    }

    // ------------------------------ 获取主表/明细表数据 ------------------------------
    public static List<Map<String, String>> query(String tableName, RequestInfo requestInfo) {
        if (tableName.contains("_dt")) {
            return getDetailTableDataMap(tableName, requestInfo);
        } else {
            List<Map<String, String>> list = new ArrayList<>();
            list.add(getMainTableDataMap(requestInfo));
            return list;
        }
    }

    // 主表数据
    public static Map<String, String> getMainTableDataMap(RequestInfo requestInfo) {
        String requestId = requestInfo.getRequestid();
        String workflowId = requestInfo.getWorkflowid();
        String tableName = getTableName(workflowId);

        RecordSet rs = new RecordSet();
        Map<String, String> dataMap = new HashMap<>();
        String sql = "SELECT * FROM " + tableName + " WHERE requestid = ?";
        rs.executeQuery(sql, requestId);

        if (rs.next()) {
            for (int i = 1; i <= rs.getColCounts(); i++) {
                String col = rs.getColumnName(i);
                dataMap.put(col, Util.null2String(rs.getString(col)));
            }
        }
        return dataMap;
    }

    // 明细表数据
    public static List<Map<String, String>> getDetailTableDataMap(String tableName, RequestInfo requestInfo) {
        List<Map<String, String>> list = new ArrayList<>();
        String mainTable = getTableName(requestInfo);
        String requestId = requestInfo.getRequestid();

        RecordSet rs = new RecordSet();
        String sql = "SELECT * FROM " + tableName + " WHERE mainid = (SELECT id FROM " + mainTable + " WHERE requestid = ?)";
        rs.executeQuery(sql, requestId);

        while (rs.next()) {
            Map<String, String> row = new HashMap<>();
            for (String col : rs.getColumnName()) {
                row.put(col, Util.null2String(rs.getString(col)));
            }
            list.add(row);
        }
        return list;
    }

    // ------------------------------ 获取表单表名 ------------------------------
    public static String getTableName(String workflowId) {
        RecordSet rs = new RecordSet();
        String sql = "SELECT formid FROM workflow_base WHERE id = ?";
        rs.executeQuery(sql, workflowId);

        if (rs.next()) {
            String formId = rs.getString("formid").replace("-", "");
            return "formtable_main_" + formId;
        }
        return "";
    }

    public static String getTableName(RequestInfo requestInfo) {
        return getTableName(requestInfo.getWorkflowid());
    }

    // ------------------------------ 获取人员部门 ------------------------------
    public static Map<String, String> getHrmData(String userId) {
        Map<String, String> map = new HashMap<>();
        RecordSet rs = new RecordSet();
        String sql = "SELECT departmentid FROM HrmResource WHERE id = ?";
        rs.executeQuery(sql, userId);

        if (rs.next()) {
            map.put("departmentid", rs.getString("departmentid"));
        }
        return map;
    }

    // ------------------------------ 递归获取上级部门(一/二/三级部门) ------------------------------
    public static Map<String, Department> getFSDepartment(String departmentId) {
        Map<String, Department> result = new HashMap<>();
        if (isNull(departmentId) || "0".equals(departmentId)) return result;

        List<Department> deptList = new ArrayList<>();
        RecordSet rs = new RecordSet();
        String currentId = departmentId;

        while (!"0".equals(currentId)) {
            String sql = "SELECT supdepid, id, departmentname FROM HrmDepartment WHERE id = ?";
            rs.executeQuery(sql, currentId);

            if (!rs.next()) break;

            String name = rs.getString("departmentname");
            String supId = rs.getString("supdepid");
            deptList.add(new Department(name, currentId));
            currentId = supId;
        }

        int size = deptList.size();
        if (size >= 1) result.put("fDepart", deptList.get(size - 1));
        if (size >= 2) result.put("sDepart", deptList.get(size - 2));
        if (size >= 3) result.put("tDepart", deptList.get(size - 3));

        while (result.size() < 3) {
            if (!result.containsKey("sDepart")) result.put("sDepart", result.get("fDepart"));
            if (!result.containsKey("tDepart")) result.put("tDepart", result.get("sDepart"));
        }

        return result;
    }

    // ------------------------------ 从矩阵获取三级部门负责人 ---------------------------
    public static Map<String, String> getTDepart(Map<String, Department> deptMap) {
        Department f = deptMap.get("fDepart");
        Department s = deptMap.get("sDepart");
        Department t = deptMap.get("tDepart");
        return getTDepart(f.getDepartmentid(), s.getDepartmentid(), t.getDepartmentid());
    }

    public static Map<String, String> getTDepart(String fId, String sId, String tId) {
        RecordSet rs = new RecordSet();
        Map<String, String> result = new HashMap<>();

        String fieldSql = "SELECT fieldname FROM MatrixFieldInfo WHERE displayname = '三级部门负责人' " +
                "AND matrixid = (SELECT id FROM MatrixInfo WHERE name = '公司矩阵')";//矩阵
        rs.executeQuery(fieldSql);
        String field = rs.next() ? rs.getString("fieldname") : "sjbmfzr";

        String userSql = "SELECT lastname, workcode FROM HrmResource WHERE id = " +
                "(SELECT " + field + " FROM Matrixtable_4 WHERE yjbm = ? AND ejbm = ? AND sjbm = ?)";
        rs.executeQuery(userSql, fId, sId, tId);

        if (rs.next()) {
            result.put("lastname", rs.getString("lastname"));
            result.put("workcode", rs.getString("workcode"));
        }
        return result;
    }

    // ------------------------------ 获取直属领导 ------------------------------
    public static Map<String, String> getDepart(String userId) {
        Map<String, String> result = new HashMap<>();
        RecordSet rs = new RecordSet();
        String sql = "SELECT lastname, workcode FROM HrmResource WHERE id = (SELECT managerid FROM HrmResource WHERE id = ?)";
        rs.executeQuery(sql, userId);

        if (rs.next()) {
            result.put("lastname", rs.getString("lastname"));
            result.put("workcode", rs.getString("workcode"));
        }
        return result;
    }

    // ------------------------------ 获取用户信息 ------------------------------
    public static Map<String, String> getUser(String userId) {
        Map<String, String> result = new HashMap<>();
        RecordSet rs = new RecordSet();
        String sql = "SELECT lastname, workcode FROM HrmResource WHERE id = ?";
        rs.executeQuery(sql, userId);

        if (rs.next()) {
            result.put("lastname", rs.getString("lastname"));
            result.put("workcode", rs.getString("workcode"));
        }
        return result;
    }

    // ------------------------------ 更新主表状态 ------------------------------
    public static String setStatus(String column, String status, RequestInfo requestInfo) {
        String table = getTableName(requestInfo);
        String reqId = requestInfo.getRequestid();

        RecordSet rs = new RecordSet();
        String sql = "UPDATE " + table + " SET " + column + " = ? WHERE requestid = ?";
        return rs.executeUpdate(sql, status, reqId) ? "1" : "0";
    }

    // ------------------------------ 类型转换工具 ------------------------------
    public static String getDoubleValue(String str, String defaultValue) {
        return isNull(str) ? defaultValue : str;
    }

    public static Double strToDouble(String str, String defaultValue) {
        try {
            return isNull(str) ? Double.valueOf(defaultValue) : Double.valueOf(str);
        } catch (Exception e) {
            return Double.valueOf(defaultValue);
        }
    }

    public static Integer strToInteger(String str, String defaultValue) {
        try {
            return isNull(str) ? (defaultValue == null ? null : Integer.valueOf(defaultValue)) : Integer.valueOf(str);
        } catch (Exception e) {
            return Integer.valueOf(defaultValue);
        }
    }

    public static Float strToFloat(String str, String defaultValue) {
        try {
            return isNull(str) ? Float.valueOf(defaultValue) : Float.valueOf(str);
        } catch (Exception e) {
            return Float.valueOf(defaultValue);
        }
    }

    // ------------------------------ 获取字节长度 ------------------------------
    private static int getByteLength(String str, String encode) {
        if (isNull(str)) return 0;
        String charset = isNull(encode) ? "UTF-8" : encode;
        try {
            return str.getBytes(charset).length;
        } catch (UnsupportedEncodingException e) {
            log.writeLog("获取字节长度失败:" + e.getMessage());
            return 0;
        }
    }

    // ------------------------------ 部门内部类 ------------------------------
    public static class Department {
        private final String departmentname;
        private final String departmentid;

        public Department(String departmentname, String departmentid) {
            this.departmentname = departmentname;
            this.departmentid = departmentid;
        }

        public String getDepartmentname() {
            return departmentname;
        }

        public String getDepartmentid() {
            return departmentid;
        }

        @Override
        public String toString() {
            return "Department{name='" + departmentname + "', id='" + departmentid + "'}";
        }
    }
}
相关推荐
吃口巧乐兹2 小时前
理解 Agent 中的 Slash Command:从概念到自定义命令实践
java·github
夕除3 小时前
shizhan--10
java·开发语言
吴声子夜歌3 小时前
JVM——并发容器实现原理
java·jvm·并发容器
xier_ran3 小时前
【infra之路】PagedAttention
java·开发语言
糖果店的幽灵3 小时前
Spring AI 从入门到精通-结构化输出
java·人工智能·spring
zzz_23683 小时前
【Spring】面试突击系列(六):Spring 工程实践与面试综合
java·spring·面试
摇滚侠4 小时前
JavaWeb 全套教程 乱码问题 85-88
java·开发语言
问心无愧05134 小时前
ctf show web入门102
android·java·前端·笔记
San813_LDD4 小时前
[量化]《虚函数调用时间复杂度完全解析:为什么是 O(1) 以及它的真实代价》
java·数据结构·算法