# 业务工具类

# 工具类列表

名称 作用
DictCache 数据字典缓存类
ConfigCache 系统配置
ResourceCache 资源管理
RoleCache 角色管理
ScopeDataCache 数据权限管理
TenantUtil 租户上下文
ThreadLocalParamUtil 用户上下文
InterfacesCache 第三方接口配置缓存类
InterfaceUtil 第三方接口调用

# 数据字典-DictCache

# getDictValue

/**
 *@Description: 获取字典项名称
 * @param code: 字典编码
 * @param key: 字典项编码
 * @return: java.lang.String 具体字典项名称例如:"男"
 **/
public String getDictValue(String code ,String key);

# getDictKey

/**
 *@Description: 通过字典项的名称找字典项的key
 * @param code: 字典编码
 * @param name: 字典项名称
 * @return: java.lang.String 具体字典项值例如:"1" 
 **/
public String getDictKey(String code,String name);

# getOptionsByCode

    /**
 *@Description: 根据字典查询字典项内容
 * @param code: 编码
 * @return: java.util.Map<java.lang.String,java.lang.String> 
 **/
public Map<String, String> getOptionsByCode(String code);

返回值格式参考返回值-map对象

# getOptionsListByCode

/**
*@Description: 根据字典查询字典项内容
* @param code: 编码
* @return: cn.hutool.json.JSONArray
 **/
public JSONArray getOptionsListByCode(String code);

返回值格式参考返回值-list对象

# 查询字典返回map对象

{
 "1": "男",
 "2": "女",
 "3": "其他"
}

# 查询字典返回list对象

[{
 "label": "男",
 "value": "1"
},
 "label": "女",
 "value": "2"
}]

# 系统配置-ConfigCache

# getValueByCode

/**
*@Description: 根据配置编码查询配置值
* @param code: 编码
* @return: java.lang.String 具体系统项值 例如:"true"
 **/
public String getValueByCode(String code);

# getValueById

/**
*@Description: 根据配置id查询配置值
* @param id: 主键id
* @return: java.lang.String 具体系统项值 例如:"true"
 **/
public String getValueById(String id);

# 资源管理-ResourceCache

# getResourceByCode

/**
* 根据资源编码查询资源对象
* @param code 资源编码
* @return Resource 资源实体对象(Resource)
*/
public Resource getResourceByCode(String code);

# getResourceById

/**
 * 根据资源主键id查询资源对象
 * @param id 资源id
 * @return Resource 资源实体对象(Resource)
 */
public Resource getResourceById(String id);

# 角色管理-RoleCache

# getRoleByCode

/**
 * 根据角色编码查询角色对象
 * @param code 编码
 * @return 角色实体对象(Role)
 */
public Role getRoleByCode(String code);

# getRoleById

/**
 * 根据角色主键id查询角色对象
 * @param roleId id
 * @return 角色实体对象(Role)
 */
public Role getRoleById(String roleId);

# 数据权限管理-ScopeDataCache

# getScopeDataByCode

/**
 * 根据数据权限编码查询数据权限对象
 * @param code 编码
 * @return 数据权限实体对象(ScopeData)
 */
public ScopeData getScopeDataByCode(String code);

# getScopeDataById

/**
 * 根据数据权限主键id查询数据权限对象
 * @param id 主键id
 * @return 数据权限实体对象(ScopeData)
 */
public ScopeData getScopeDataById(String id);

# listScopeDataIdByRoleId

/**
 * 根据角色id获取数据权限id集合
 * @param roleId 角色id
 * @return List<String> roleId(角色id)
 */
public List<String> listScopeDataIdByRoleId(String roleId) 

# 租户上下文-TenantUtil

获取当前登录用户租户id可以通过如下方式。

# isEnableTenant

/**
 * 判断是否启用多租户
 **/
public static boolean isEnableTenant() 

# getTenantId

/**
 * 获取当前租户Id
 **/
public static String getTenantId();

# 用户上下文-ThreadLocalParamUtil

获取当前登录用户信息可以通过如下方式。

# 获取当前登录用户

/**
 * 获取用户登录名
 **/
public static String getAccountCode();


/**
 * 获取账号id
 * @return
 */
public static String getAccountId();


/**
 * 获取岗位id 多个以逗号分开 不支持简版
 * @return
 */
public static String getPostId();

/**
 * 获取岗位code 多个以逗号分开 不支持简版
 * @return
 */
public static String getPostCode();


/**
 * 获取当前登录用户
 **/
public static BaseUser getLoginUser()

/**
 * 获取登录用户的租户Id
 **/
public static String getTenantId()


/**
 * 获取岗位编码 不支持简版
 * @return
 */
public static String getPostCode()

/**
 * 获取业务单元ID 不支持简版
 * @return
 */
public static String getBuId() 

/**
 * 获取业务单元编码 不支持简版
 * @return
 */
public static String getBuCode() 

/**
 * 获取部门ID 
 * @return
 */
public static String getDeptId()

/**
 * 获取所有部门ID
 * @return
 */
public static String getAllDeptId() 
/**
 * 获取部门编码
 * @return
 */
public static String getDeptCode() 

/**
 * 获取所有部门编码
 * @return
 */
public static String getAllDeptCode() 

/**
 * 获取机构ID
 * @return
 */
public static String getOrgId() 

/**
 * 获取所有机构ID
 * @return
 */
public static String getAllOrgId() 

/**
 * 获取机构编码
 * @return
 */
public static String getOrgCode() 

/**
 * 获取所有机构编码
 * @return
 */
public static String getAllOrgCode() 

/**
 *  获取人员唯一标识
 * @Description
 * @return String
 */
public static String getPaPersonId()

# 判断是否为超管




/**
 * 是否为管理员用户
 *
 * @return boolean
 */
public static boolean isAdmin() ;

/**
 * 是否为管理员用户
 *
 * @return boolean
 */
public static boolean isAdmin(String loginName)

# 取当前登录用户的角色

BaseUser user = SecurityUtils.getLoginUser();
String postId = user.getPostId();
// 精简版、专业版获取方式
List<HosPermRole> roles = hosPostRoleService.getActivedRoleMsgByPostId(AccountUtil.getPostId());
// 简版获取方式
List<HosPermRole> hosPermRoleList = AccountRoleCache.me().getRoleByAccountId(AccountUtil.getAccountId());

# 第三方接口配置缓存-InterfacesCache

# getByCode

/**
 * 获取接口配置对象
 * @param code 接口编码
 * @return Interfaces 接口配置对象
 **/
public Interfaces getByCode(String code);
/**
 * 接口配置对象类
 **/
public class Interfaces extends BaseEntity {

    @ApiModelProperty(value = "接口编码")
    private String code;

    @ApiModelProperty(value = "接口名称")
    private String name;

    @ApiModelProperty(value = "接口来源,所属分类。取字典编码")
    private String category;

    @ApiModelProperty(value = "接口类型。restful、soap")
    private String type;

    @ApiModelProperty(value = "接口方式。post、get")
    private String way;

    @ApiModelProperty(value = "协议。http、https")
    private String protocol;

    @ApiModelProperty(value = "api前缀。例如 192.168.100.3:8081")
    private String prefix;

    @ApiModelProperty(value = "接口地址")
    private String url;

    @ApiModelProperty(value = "方法名。接口类型为soap时,需要设置方法名")
    private String methodName;

    @ApiModelProperty(value = "命名空间")
    private String nameSpace;

    @ApiModelProperty(value = "SOAP标头参数结构")
    private String soapHeader;

    @ApiModelProperty(value = "结果数据节点")
    private String returnNode;

    @ApiModelProperty(value = "query参数")
    private String queryParams;

    @ApiModelProperty(value = "请求头参数")
    private String headerParams;

    @ApiModelProperty(value = "请求体body参数")
    private String bodyParams;

    @ApiModelProperty(value = "form-url参数")
    private String urlParams;

    @ApiModelProperty(value = "返回参数")
    private String returnParams;

    @ApiModelProperty(value = "假数据")
    private String fakeData;

    @ApiModelProperty(value = "超时响应时长。单位:秒")
    private Integer timeouts;

    @ApiModelProperty(value = "是否启用")
    private Boolean actived;

    @ApiModelProperty(value = "创建人主键" )
    private String createBy;

    @ApiModelProperty(value = "更新人主键")
    private String updateBy;

    @ApiModelProperty(value = "是否已删除")
    private Integer isDeleted;

}

# 第三方接口调用工具类-InterfaceUtil

提供第三方接口调用工具类,需结合第三方接口配置使用,详情参考第三方接口配置

# restful类接口调用

/**
 * rest执行方法
 * @param interfaceCode 接口编码
 * @param params param参数    自定或解析接口配置中的params结构来设定数据
 * @param body body参数   自定或解析接口配置中的body结构来设定数据
 * @param headers header参数   自定或解析接口配置中的header结构来设定数据
 * @return 接口返回值
 */
public static String executeRest(String interfaceCode, Map<String, ?> params, String body, Map<String, ?> headers);

/**
 * rest get方式params参数请求
 * @param interfaceCode 接口编码
 * @param params param参数
 * @return 接口返回值
 */
public static String executeRestByParams(String interfaceCode, Map<String, ?> params);

/**
 * rest 带header的get方式params参数请求
 * @param interfaceCode 接口编码
 * @param params param参数
 * @param headers header参数
 * @return 接口返回值
 */
public static String executeRestByParams(String interfaceCode, Map<String, ?> params, Map<String, ?> headers);

/**
 * rest post方式json字符串body参数请求
 * @param interfaceCode 接口编码
 * @param body body参数
 * @return 接口返回值
 */
public static String executeRestByBody(String interfaceCode, String body);

/**
 * rest 带header的post方式json字符串body参数请求
 * @param interfaceCode 接口编码
 * @param body body参数
 * @param headers header参数
 * @return 接口返回值
 */
public static String executeRestByBody(String interfaceCode, String body,  Map<String, ?> headers);

# soap类接口调用

/**
 * soap方式调用。自拼接入参调用。
 * @param interfaceCode 接口编码
 * @param xmlSoapHeaderStr 手动拼接SOAPheader参数
 * @param xmlBodyStr 手动拼接body参数
 * @return soap接口返回值
 */
public static String executeSoap(String interfaceCode, String xmlSoapHeaderStr, String xmlBodyStr, Map<String, ?> headers);

/**
 * soap方式调用。自拼接入参调用。
 * @param interfaceCode 接口编码
 * @param xmlSoapHeaderStr 手动拼接SOAPheader参数
 * @param xmlBodyStr 手动拼接body参数
 * @return soap接口返回值转json字符串。不能转则为原值返回。
 */
public static String executeSoapReturnJson(String interfaceCode, String xmlSoapHeaderStr, String xmlBodyStr, Map<String, ?> headers);

/**
 * @param interfaceCode 接口编码
 * @param soapXml 完整入参
 * @return soap接口返回值
 */
public static String executeSoap(String interfaceCode, String soapXml, Map<String, ?> headers);

/**
 * @param interfaceCode 接口编码
 * @param soapXml 完整入参
 * @return soap接口返回值转json字符串。不能转则为原值返回。
 */
public static String executeSoapReturnJson(String interfaceCode, String soapXml, Map<String, ?> headers);

/**
 * 参数包装
 * @param xmlHeaderStr   header参数
 * @param xmlBodyStr    请求参数
 * @param method     方法名
 * @param namespace     命名空间
 * @return 返回值
 */
public static String splicingMessage(String xmlHeaderStr, String xmlBodyStr, String method, String namespace);

/**
* @param res 结果string
* @return 将soap返回结果转换为json字符串,如果数据不能转换则返回原值
*/
public static String xml2JsonStr(String res);
  

提示

接口配置提供接口的基本信息,如编码、地址、方法、应用系统等。同时提供出入参的配置,包含参数结构及各参数的信息。 如无需使用,请忽略以下提示信息。反之在使用时,每一类的参数信息均为json数组格式,开发人员可按其信息进行解析使用。结合以上接口调用工具类使用即可。

以下为参数结构信息的介绍:

Interfaces接口配置对象中用到的参数字段如下
    请求头参数(headerParams)、请求体参数(bodyParams)、params参数(queryParams)、form-url参数(urlParams)、返回参数(returnParams)
结构示例及说明:
    示例
        [{"paramKey":"root","name":"root","type":"","paramType":"Object","paramValue":"","id":1,"children":[]}]
    参数说明:
        paramKey:字段key(当key为root、type为空时表示该参数结构存在上下级关系,且root节点为参数结构的根节点,无需关注,解析使用其子节点即可。)
        name:字段名称。
        type:字段值类型。内置:fixed(固定值)、dynamic(动态值)、custom(自定义)
        paramType:参数值类型(String、Object、Int、Array等)除Array和Object之外类型的节点下无子节点。
        paramValue:值。当type为dynamic时,可根据value值获取相应的动态参数值。可详见【动态参数管理】的使用介绍。
        id:节点id。无实际意义。
        children:子级节点。为空数组时表示已无子节点。

# 调用示例

调用方式主要分为restful和soap(针对于webservice)。以下为用户登录安全组soap接口调用示例

基础配置

接口信息1

入参配置(可比对webservice的xml结构对比)

接口信息2

接口信息3

接口信息4

接口信息5

接口信息6

请求参数中
请求头: 即header配置。soap接口一般还需要配置SOAPAction(操作方法地址,可见截图)。
SOAP标头: 即报文内请求头。如果接口需要做调用身份校验的须在此配置用户名和密码(可见截图示例)。
请求体: 即请求入参结构。配置后可解析使用。


// 根据接口编码获取接口配置
HosSysInterfaces inObj = interfacesService.getByCode(code);
// 请求体是单独的表,需要转换为主表的json格式
getParams(interfaces);
// 取请求体入参配置
String bodyData = inObj.getBodyParams();
JSONArray bodyArr = new JSONArray(bodyData);

// 取请求头入参配置
String headData = inObj.getHeaderParams();
JSONArray heArr = new JSONArray(headData);

// soapHeader
String soapHeadStr = "";
String soapHeadData = inObj.getSoapHeader();
JSONArray soaHeArr = new JSONArray(soapHeadData);

// 请求头参数解析处理
Map<String, String> headers = this.getHeadersData(heArr);

// SOAP标头参数解析处理
soapHeadStr = this.recursionHeaderXml(soaHeArr);

// 请求体参数解析处理
String bodyStr = this.recursionBodyXml(bodyArr);

// 调用接口,返回xml。 如需直接返回xml转json可调用executeSoapReturnJson方法,详见工具类方法说明
String interData = InterfaceUtil.executeSoap(code, soapHeadStr, bodyStr, headers);


/**
 * 获取新的param数据
 *
 * @param interfaceObj
 */
public void getParams(Object interfaceObj) {
    String code = (String) ReflectUtil.getFieldValue(interfaceObj, "code");
    if (!CommonUtils.isEmpty(code)) {
        String queryParams = paramService.getParamsStr(code, ApiParamType.QUERY.getCode());
        ReflectUtil.setFieldValue(interfaceObj, "queryParams", queryParams);
        String headerParams = paramService.getParamsStr(code, ApiParamType.HEADER.getCode());
        ReflectUtil.setFieldValue(interfaceObj, "headerParams", headerParams);
        String bodyParams = paramService.getParamsStr(code, ApiParamType.BODY.getCode());
        ReflectUtil.setFieldValue(interfaceObj, "bodyParams", bodyParams);
        String urlParams = paramService.getParamsStr(code, ApiParamType.URL.getCode());
        ReflectUtil.setFieldValue(interfaceObj, "urlParams", urlParams);
        String returnParams = resultService.getParamsStr(code);
        ReflectUtil.setFieldValue(interfaceObj, "returnParams", returnParams);
    }
}

// 请求头header参数解析赋值
public Map<String, String> getHeadersData(JSONArray heArr) {
    Map<String, String> headers = new HashMap<>();
    for (Object pObj : heArr) {
        JSONObject parObj = new JSONObject(pObj);
        if (CommonUtils.isNotNull(parObj)) {
            if (CommonUtils.isNotNull(parObj.getStr("paramKey")) && CommonUtils.isNotEmpty(parObj.getStr("paramKey"))) {
                String value = parObj.getStr("paramValue");
                //动态参数取值
                if (CommonUtils.equals(parObj.getStr("type"), "dynamic") && CommonUtils.isNotEmpty(value)) {
                    value = dynamicParamsUtil.getValueByCode(value);
                }
                headers.put(parObj.getStr("paramKey"), value);
            }
        }
    }
    return headers;
}
// soap标头参数解析赋值
public String recursionHeaderXml(JSONArray ja) {
    StringBuilder ret = new StringBuilder();
    for (int i = 0; i < ja.size(); ++i) {
        JSONObject jo = ja.getJSONObject(i);
        String key = jo.getStr("paramKey");
        String type = jo.getStr("type");
        String value = jo.getStr("paramValue");
        String id = jo.getStr("id");
        JSONArray children = jo.getJSONArray("children");
        if (!CommonUtils.equals("root", key) && StringUtil.isNotBlank(type)) {
            ret.append("<").append(key);
            // 安全校验节点拼接
            if (CommonUtils.equals("Security", key)) {
                ret.append(" xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"");
            }
            ret.append(">");
        }
        if (CommonUtils.isNotEmpty(children)) {
            // 子级数据递归解析
            ret.append(recursionHeaderXml(children));
        } else if (!CommonUtils.equals("fixed", type) && !CommonUtils.equals("custom", type)) {
            if (CommonUtils.equals("dynamic", type)) {
                // 如果用到了动态参数 可使用动态参数工具类dynamicParamsUtil获取当前人的相关信息值
                String dynamicValue = dynamicParamsUtil.getValueByCode(value);
                ret.append(dynamicValue);
            }
        } else {
            // 固定值处理
            ret.append(value);
            // 自定业务处理
            ...
        }
        if (!CommonUtils.equals("root", key) && StringUtil.isNotBlank(type)) {
            ret.append("</").append(key).append(">\n");
        }
    }
    return ret.toString();
}
// 请求体参数解析赋值
public String recursionBodyXml(JSONArray ja) {
    StringBuilder ret = new StringBuilder();
    for (int i = 0; i < ja.size(); ++i) {
        JSONObject jo = ja.getJSONObject(i);
        String key = jo.getStr("paramKey");
        String type = jo.getStr("type");
        String value = jo.getStr("paramValue");
        String id = jo.getStr("id");
        JSONArray children = jo.getJSONArray("children");
        if (CommonUtils.isNotEmpty(children)) {
            if (!CommonUtils.equals("root", key) && StringUtil.isNotBlank(type)) {
                ret.append("<").append(key).append(">");
            }
            ret.append(recursionBodyXml(children));
            if (!CommonUtils.equals("root", key) && StringUtil.isNotBlank(type)) {
                ret.append("</").append(key).append(">\n");
            }
        } else {
            String newValue = value;
            if (!CommonUtils.equals("fixed", type) && !CommonUtils.equals("custom", type)) {
                if (CommonUtils.equals("dynamic", type)) {
                    newValue = dynamicParamsUtil.getValueByCode(value);
                }
            }
            // 自定业务处理,入参值传递示例
            ...
        }
    }
    return ret.toString();
}