package com.api.meeting.cusvideo.util; import cn.hutool.core.codec.Base64; import cn.hutool.core.lang.UUID; import cn.hutool.http.ContentType; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.file.Prop; import weaver.general.BaseBean; import weaver.general.StaticObj; import weaver.general.Util; import weaver.hrm.resource.ResourceComInfo; import java.nio.charset.StandardCharsets; import java.util.*; /** * @Description: * @Author: lj * @CreateTime: 2023-06-05 15:51 * @Version: 1.0 */ public class YealinkVideoUtil { private static BaseBean logger = new BaseBean(); private static final String YEA_LINK_TOKEN_KEY = "YEA_LINK_TOKEN_KEY"; private static StaticObj cache = StaticObj.getInstance(); /** * 执行post请求 * * @param url * @param header * @param body * @return */ public static JSONObject doPost(String url, String token, Map header, JSONObject body) { try { logger.writeLog("^^^ YealinkVideoUtil.doPost : url = " + url); if (header == null) header = new HashMap<>(); if (!header.containsKey("Authorization")) header.put("Authorization", "Bearer " + token); if (!header.containsKey("timestamp")) header.put("timestamp", System.currentTimeMillis() + ""); if (!header.containsKey("nonce")) header.put("nonce", UUID.randomUUID().toString(true)); if (body == null) body = new JSONObject(); logger.writeLog("^^^ YealinkVideoUtil.doPost : url = " + url + " , header = " + JSONObject.toJSONString(header) + " , body = " + body.toJSONString() ); HttpResponse response = HttpRequest.post(url) .charset(StandardCharsets.UTF_8) .addHeaders(header) .body(body.toJSONString()) .execute() .charset(StandardCharsets.UTF_8); String result = response.body(); logger.writeLog("^^^ YealinkVideoUtil.doPost : url = " + url + " , result = " + result); JSONObject resultJson = JSONObject.parseObject(result); if (response.getStatus() != 200) { throw new RuntimeException("[" + resultJson.getString("code") + "]" + resultJson.getString("message")); } return resultJson; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.doPost : 接口[" + url + "]请求失败!!!", e); throw new RuntimeException(e.getMessage()); } } /** * 执行get请求 * * @param url * @param token */ public static JSONObject doGet(String url, String token, Map header, JSONObject body) { try { logger.writeLog("^^^ YealinkVideoUtil.doGet : url = " + url); if (header == null) header = new HashMap<>(); if (!header.containsKey("Authorization")) header.put("Authorization", "Bearer " + token); if (!header.containsKey("timestamp")) header.put("timestamp", System.currentTimeMillis() + ""); if (!header.containsKey("nonce")) header.put("nonce", UUID.randomUUID().toString(true)); if (body == null) body = new JSONObject(); logger.writeLog("^^^ YealinkVideoUtil.doGet : url = " + url + " , header = " + JSONObject.toJSONString(header) + " , body = " + body.toJSONString() ); HttpResponse response = HttpRequest.get(url) .charset(StandardCharsets.UTF_8) .addHeaders(header) .contentType(ContentType.JSON.getValue()) .form(body) .execute() .charset(StandardCharsets.UTF_8); String result = response.body(); logger.writeLog("^^^ YealinkVideoUtil.doGet : url = " + url + " , result = " + result); JSONObject resultJson = JSONObject.parseObject(result); if (response.getStatus() != 200) { throw new RuntimeException("[" + resultJson.getString("code") + "]" + resultJson.getString("message")); } return resultJson; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.doGet : 接口[" + url + "]请求失败!!!", e); throw new RuntimeException(e.getMessage()); } } /** * 执行put请求 * * @param url * @param token * @param header * @param body * @return */ public static JSONObject doPut(String url, String token, Map header, JSONObject body) { try { logger.writeLog("^^^ YealinkVideoUtil.doPut : url = " + url); if (header == null) header = new HashMap<>(); if (!header.containsKey("Authorization")) header.put("Authorization", "Bearer " + token); if (!header.containsKey("timestamp")) header.put("timestamp", System.currentTimeMillis() + ""); if (!header.containsKey("nonce")) header.put("nonce", UUID.randomUUID().toString(true)); if (body == null) body = new JSONObject(); logger.writeLog("^^^ YealinkVideoUtil.doPut : url = " + url + " , header = " + JSONObject.toJSONString(header) + " , body = " + body.toJSONString() ); HttpResponse response = HttpRequest.put(url) .charset(StandardCharsets.UTF_8) .addHeaders(header) .body(body.toJSONString()) .execute() .charset(StandardCharsets.UTF_8); String result = response.body(); logger.writeLog("^^^ YealinkVideoUtil.doPut : url = " + url + " , result = " + result); JSONObject resultJson = JSONObject.parseObject(result); if (response.getStatus() != 200) { throw new RuntimeException("[" + resultJson.getString("code") + "]" + resultJson.getString("message")); } return resultJson; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.doPut : 接口[" + url + "]请求失败!!!", e); throw new RuntimeException(e.getMessage()); } } /** * 执行delete方法 * * @param url * @param token * @param header * @param body * @return */ public static JSONObject doDelete(String url, String token, Map header, JSONObject body) { try { logger.writeLog("^^^ YealinkVideoUtil.doDelete : url = " + url); if (header == null) header = new HashMap<>(); if (!header.containsKey("Authorization")) header.put("Authorization", "Bearer " + token); if (!header.containsKey("timestamp")) header.put("timestamp", System.currentTimeMillis() + ""); if (!header.containsKey("nonce")) header.put("nonce", UUID.randomUUID().toString(true)); if (body == null) body = new JSONObject(); logger.writeLog("^^^ YealinkVideoUtil.doDelete : url = " + url + " , header = " + JSONObject.toJSONString(header) + " , body = " + body.toJSONString() ); List queryList = new ArrayList<>(); for (Object key : body.keySet()) { if (key != null) { queryList.add(key + "=" + body.getString((String) key)); } } if (queryList.size() > 0) { if (url.contains("?")) { url += "&"; } else { url += "?"; } url += StringUtils.join(queryList, "&"); } HttpResponse response = HttpRequest.delete(url) .charset(StandardCharsets.UTF_8) .addHeaders(header) .contentType(ContentType.JSON.getValue()) .execute() .charset(StandardCharsets.UTF_8); String result = response.body(); logger.writeLog("^^^ YealinkVideoUtil.doDelete : url = " + url + " , result = " + result); JSONObject resultJson = JSONObject.parseObject(result); if (response.getStatus() != 200) { throw new RuntimeException("[" + resultJson.getString("code") + "]" + resultJson.getString("message")); } return resultJson; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.doDelete : 接口[" + url + "]请求失败!!!", e); throw new RuntimeException(e.getMessage()); } } /** * 获取token * * @param appKey * @param appSecret * @return */ public static String getToken(String host, String appKey, String appSecret) { String token = ""; try { //1、从缓存中获取 Object object = cache.getObject(YEA_LINK_TOKEN_KEY); if (object != null) { JSONObject tokenObj = JSONObject.parseObject((String) object); if (tokenObj != null) { long expires_in = tokenObj.getLongValue("expires_in"); if (expires_in > System.currentTimeMillis()) { token = tokenObj.getString("access_token"); } else { cache.removeObject(YEA_LINK_TOKEN_KEY); } } } if (StringUtils.isBlank(token)) {//去获取token //请求头 Map header = new HashMap<>(); header.put("Authorization", "Basic " + Base64.encode(appKey + ":" + appSecret)); header.put("timestamp", System.currentTimeMillis() + ""); header.put("nonce", UUID.randomUUID().toString(true)); //请求体 JSONObject body = new JSONObject(); body.put("grant_type", "client_credentials"); //构建请求url String url = host + "/token"; //执行请求 logger.writeLog("^^^ YealinkVideoUtil.getToken : url = " + url); logger.writeLog("^^^ YealinkVideoUtil.getToken : header = " + JSONObject.toJSONString(header)); logger.writeLog("^^^ YealinkVideoUtil.getToken : body = " + body.toJSONString()); HttpResponse response = HttpRequest.post(url) .charset(StandardCharsets.UTF_8) .addHeaders(header) .body(body.toJSONString()) .execute() .charset(StandardCharsets.UTF_8); String result = response.body(); logger.writeLog("^^^ YealinkVideoUtil.getToken : url = " + url + " , result = " + result); JSONObject resultJson = JSONObject.parseObject(result); if (response.getStatus() != 200) { throw new RuntimeException("[" + resultJson.getString("code") + "]" + resultJson.getString("message")); } //设置过期时间 int expires_in = resultJson.getIntValue("expires_in"); resultJson.put("expires_in", System.currentTimeMillis() + expires_in * 1000L); //缓存token cache.putObject(YEA_LINK_TOKEN_KEY, resultJson.toJSONString()); token = resultJson.getString("access_token"); } return token; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.getToken : error !!!", e); throw new RuntimeException("Token获取失败:" + e.getMessage()); } } /** * 获取yealink的用户id * * @param host * @param token * @param userId * @return */ public static String getYeaLinkUserId(String host, String token, String userId) { String value = ""; String hrmYeaLinkCusFieldName = Util.null2String(Prop.getPropValue("qc2281950", "hrmYeaLinkCusFieldName")); String hrmYeaLinkIdCusFieldScope = Util.null2s(Prop.getPropValue("qc2281950", "hrmYeaLinkIdCusFieldScope"), "-1"); RecordSet rs = new RecordSet(); new BaseBean().writeLog("^^^ YealinkVideoUtil.getYeaLinkUserId : userId = " + userId + " , hrmYeaLinkCusFieldName = " + hrmYeaLinkCusFieldName + " , hrmYeaLinkIdCusFieldScope = " + hrmYeaLinkIdCusFieldScope); rs.executeQuery("select " + hrmYeaLinkCusFieldName + " from cus_fielddata " + "where scope='HrmCustomFieldByInfoType' and scopeid=? and id=?", hrmYeaLinkIdCusFieldScope, userId); if (rs.next()) { value = Util.null2String(rs.getString(1)); } if (StringUtils.isBlank(value)) { //如果为空,则这里需要去添加用户,以获得返回后的亿联用户ID value = addYeaLinkUser(userId, host, token); } return value; } /** * 添加yealink用户 * * @param userId * @param host * @param token * @return */ public static String addYeaLinkUser(String userId, String host, String token) { try { ResourceComInfo comInfo = new ResourceComInfo(); JSONObject body = new JSONObject(); body.put("name", comInfo.getLastname(userId)); body.put("extension", comInfo.getWorkcode(userId)); String mobile = comInfo.getMobile(userId); body.put("mobile", mobile); //判断手机号是否存在 if (StringUtils.isBlank(mobile)) { throw new RuntimeException("手机号[mobile]不能为空"); } //先查询亿联是否存在用户 String yeaLinkUserId = queryYeaLinkUserId(host, token, mobile); if (StringUtils.isBlank(yeaLinkUserId)) { String url = host + "/users"; JSONObject resultObj = doPost(url, token, null, body); //取出ID yeaLinkUserId = resultObj.getString("id"); } //更新到人力资源自定义表中 updateHrmYeaLinkUserId(userId, yeaLinkUserId); return yeaLinkUserId; } catch (Exception e) { logger.writeLog("^^^ YealinkVideoUtil.addYeaLinkUser : error !!!", e); throw new RuntimeException("添加亿联用户失败:" + e.getMessage()); } } /** * 根据手机号查询用户 * * @param mobile * @return */ private static String queryYeaLinkUserId(String host, String token, String mobile) { JSONObject body = new JSONObject(); body.put("mobile", mobile); body.put("limit", 1); String url = host + "/users"; JSONObject resultObj = doGet(url, token, null, body); //取出数据 JSONArray dataArr = resultObj.getJSONArray("data"); if (dataArr != null && dataArr.size() > 0) { JSONObject dataObj = dataArr.getJSONObject(0); String phone = Util.null2String(dataObj.getString("mobile")); if (mobile.equals(phone)) { return Util.null2String(dataObj.getString("id")); } } return null; } /** * 更新自定义字段值 * * @param yeaLinkUserId */ private static void updateHrmYeaLinkUserId(String userId, String yeaLinkUserId) { String hrmYeaLinkCusFieldName = Util.null2String(Prop.getPropValue("qc2281950", "hrmYeaLinkCusFieldName")); String hrmYeaLinkIdCusFieldScope = Util.null2s(Prop.getPropValue("qc2281950", "hrmYeaLinkIdCusFieldScope"), "-1"); RecordSet rs = new RecordSet(); new BaseBean().writeLog("^^^ YealinkVideoUtil.updateHrmYeaLinkUserId : userId = " + userId + " , hrmYeaLinkCusFieldName = " + hrmYeaLinkCusFieldName + " , hrmYeaLinkIdCusFieldScope = " + hrmYeaLinkIdCusFieldScope); String sql = "select * from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid=? and id=?"; rs.executeQuery(sql, hrmYeaLinkIdCusFieldScope, userId); if (rs.next()) {//存在记录做更新 sql = "update cus_fielddata set " + hrmYeaLinkCusFieldName + "=? where scope='HrmCustomFieldByInfoType' and scopeid=? and id=?"; List params = Arrays.asList(yeaLinkUserId, hrmYeaLinkIdCusFieldScope, userId); boolean flag = rs.executeUpdate(sql, params.toArray()); if (!flag) { logger.writeLog("^^^ YealinkVideoUtil.updateHrmYeaLinkUserId : execute update sql error , sql = " + sql + " , params = " + JSONObject.toJSONString(params)); } } else {//不存在记录做新增 sql = "insert into cus_fielddata (scope,scopeid,id," + hrmYeaLinkCusFieldName + ") " + "values ('HrmCustomFieldByInfoType',?,?,?)"; List params = Arrays.asList(hrmYeaLinkIdCusFieldScope, userId, yeaLinkUserId); boolean flag = rs.executeUpdate(sql, params.toArray()); if (!flag) { logger.writeLog("^^^ YealinkVideoUtil.updateHrmYeaLinkUserId : execute insert sql error , sql = " + sql + " , params = " + JSONObject.toJSONString(params)); } } } }