package shkd.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.util.HttpClientUtils; import kd.bos.util.StringUtils; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import static shkd.repc.resm.opplugin.PushOASupplierOPPlugin.RESM_OFFICIAL_SUPPLIER; import static shkd.repc.resm.opplugin.PushOASupplierOPPlugin.assembleBody; /** * @author :weiyunlong * @date :Created 2024/9/11 16:02 * @description:致远OA集成工具类 */ public class OAUtils { private static final Log logger = LogFactory.getLog(OAUtils.class); public static final String oaUrl = System.getProperty("oaurl");//(测试环境外网地址)http://140.206.96.138:9091 // public static final String oaUrl = "http://172.31.254.240:9090";//本地(内网地址) //致远服务前获取token接口 public static String getOaToken(String billNo){ String userName = "JDtest"; String password = "235c78d7-03a6-4b32-8632-7b75a002276b"; String linkUrl = oaUrl +"/seeyon/rest/token"; //接口请求体 JSONObject linkBody = new JSONObject(); linkBody.put("userName", userName); linkBody.put("password", password); String token = ""; try { String linkPostjson = HttpClientUtils.postjson(linkUrl, null, linkBody.toJSONString()); logger.info("获取OaToken接口返回结果:\n{}", linkPostjson); if (StringUtils.isNotEmpty(linkPostjson)) { JSONObject jsonObject = JSONObject.parseObject(linkPostjson); token = jsonObject.getString("id"); DobeDWUtils.saveLog(billNo, "致远",linkBody.toJSONString(), linkPostjson, true,"调用致远服务前获取token接口"); } return token; } catch (Exception e) { logger.info(String.format("获取OaToken接口异常:%s", e.getMessage())); DobeDWUtils.saveLog(billNo, "致远",linkBody.toJSONString(), e.getMessage(), false,"调用致远服务前获取token接口"); throw new RuntimeException(e); } } /** * OA供应商同步接口 */ public static void pushOASupplier(String oaToken, DynamicObject dataEntity){ //ICS新增/更新OA客户租户接口 String customerUrl = OAUtils.oaUrl+"/seeyon/rest/ats/type/customer"; Map customerHeader = new HashMap<>(); customerHeader.put("Content-Type", "application/json"); customerHeader.put("token", oaToken); //组装请求体 // DynamicObject supplier = dataEntity.getDynamicObject("syssupplier");//系统供应商 // if (null != supplier) { JSONObject customerBody = assembleBody(OAUtils.l(dataEntity.getPkValue())); if (customerBody != null) { String customerPostjson = null; boolean isSuccess = false; // 新增变量来标记成功状态 try { customerPostjson = HttpClientUtils.postjson(customerUrl, customerHeader, customerBody.toJSONString()); JSONObject jsonObject = JSONObject.parseObject(customerPostjson); if (!jsonObject.isEmpty()) { isSuccess = "true".equals(jsonObject.getString("success")); if (isSuccess) { String id = jsonObject.getString("id"); // 获取正式供应商 QFilter q = new QFilter("id", QCP.equals, dataEntity.getPkValue()); DynamicObject officialSupplier = BusinessDataServiceHelper.loadSingle(RESM_OFFICIAL_SUPPLIER, new QFilter[]{q}); if (officialSupplier != null) { officialSupplier.set("qeug_oacode", id); SaveServiceHelper.save(new DynamicObject[]{officialSupplier}); } } } } catch (Exception ex) { DobeDWUtils.saveLog(dataEntity.getString("name"), "致远", customerBody.toJSONString(), customerPostjson, false, "调用ICS新增/更新OA客户租户接口"); throw new RuntimeException(ex); } finally { // 日志记录,放在 finally 中确保无论如何都会执行 DobeDWUtils.saveLog(dataEntity.getString("name"), "致远", customerBody.toJSONString(), customerPostjson, isSuccess, isSuccess ? "调用ICS更新OA客户租户接口" : "调用ICS新增OA客户租户接口"); } } // } } /** * OA接口绑定用户 * 代办接口之前需要先(用户的绑定 你通过定时任务 增量推就行,或者你们系统有人员进来推一次,这个人绑定成功了 就不需要再绑定,除非人员工号有变动) * 先调OA接口绑定用户(相当于校验金蝶用户的number在OA系统是否存在,不存则推送失败) * @param approversLists 金蝶系统的审批人集合 * @param oaToken 致远OA获取的token * @return */ public static String thirdpartyUser(List approversLists, String oaToken,String billNo){ // String oaUrl = System.getProperty("oaurl"); String thirdUrl = oaUrl + "/seeyon/rest/thirdpartyUserMapper/binding"; Map customerHeader = new HashMap<>(); customerHeader.put("Content-Type", "application/json"); customerHeader.put("token", oaToken); //组装请求体 JSONObject thirdBody = new JSONObject(); JSONArray thirdList = new JSONArray(); //接口不支持接收人字段为多人,但接口支持批量 so 多人审批,遍历审批人集合,调用OA调待办接口 for (DynamicObject approver : approversLists) { JSONObject jsonObject = new JSONObject(); jsonObject.put("registerCode", "3004");//系统注册编码:3004 jsonObject.put("thirdUserId",approver.getString("number"));//三方系统人员编码(通过人员编码匹配,需要和OA保持一致) // jsonObject.put("thirdUserId","jdtest");//todo 三方系统人员编码(通过人员编码匹配,需要和OA保持一致) jsonObject.put("thirdLoginName", approver.getString("name"));//三方系统人员登录名 // jsonObject.put("thirdLoginName", "金蝶测试");//todo 三方系统人员登录名 jsonObject.put("thirdName", approver.getString("name"));//三方系统人员姓名 // jsonObject.put("thirdName", "金蝶测试");//todo 三方系统人员姓名 jsonObject.put("thirdCode", approver.getString("number"));//三方系统人员编码 // jsonObject.put("thirdCode","jdtest");//todo 三方系统人员编码 thirdList.add(jsonObject); } thirdBody.put("userlist", thirdList); String thirdPostjson = null; try { // 发送POST请求并获取响应 thirdPostjson = HttpClientUtils.postjson(thirdUrl, customerHeader, thirdBody.toJSONString()); JSONObject jsonObject = JSONObject.parseObject(thirdPostjson); // 检查JSON对象是否为空 if (jsonObject != null && !jsonObject.isEmpty()) { Boolean result = jsonObject.getBoolean("success"); String logMessage = result ? "OA接口绑定用户成功!" : "OA接口绑定用户失败!"; logger.info(logMessage); // 记录日志 DobeDWUtils.saveLog(billNo, "致远", thirdBody.toJSONString(), thirdPostjson, result, "调用致远用户绑定接口"); // 若绑定用户失败,抛出异常 if (!result) { throw new RuntimeException("OA接口绑定用户失败" + thirdPostjson); } } } catch (Exception e) { // 记录异常信息 String errorMessage = String.format("接口异常:%s", e.getMessage()); logger.info(errorMessage); DobeDWUtils.saveLog(billNo, "致远", thirdBody.toJSONString(), e.getMessage(), false, "调用致远用户绑定接口"); throw new RuntimeException(e); } return thirdPostjson; } /** * 金蝶系统推送OA待办新增 * @param thirdPartyMap 流程参数 */ public static void thirdParty(HashMap thirdPartyMap){ // String oaUrl = System.getProperty("oaurl"); String pendingsUrl = oaUrl + "/seeyon/rest/thirdpartyPending/receive/pendings"; Map customerHeader = new HashMap<>(); customerHeader.put("Content-Type", "application/json"); customerHeader.put("token", String.valueOf(thirdPartyMap.get("oaToken"))); //组装请求体 JSONObject pendingsBody = new JSONObject(); JSONArray pendingList = new JSONArray(); //接口不支持接收人字段为多人,但接口支持批量 so 多人审批,遍历审批人集合,调用OA调待办接口 List approversLists = (List)thirdPartyMap.get("approversLists"); for (DynamicObject approver :approversLists ) { JSONObject jsonObject = new JSONObject(); jsonObject.put("taskId", String.valueOf(thirdPartyMap.get("taskId")));//第三方待办主键(保证唯一) jsonObject.put("registerCode", "3004");//系统注册编码 jsonObject.put("title", String.valueOf(thirdPartyMap.get("title")) );//待办标题 jsonObject.put("thirdSenderId", String.valueOf(thirdPartyMap.get("startNumber")));//第三方待办发起人主键 // jsonObject.put("thirdSenderId", "jdtest");//todo 第三方待办发起人主键 jsonObject.put("senderName", String.valueOf(thirdPartyMap.get("startName")) );//第三方待办发起人姓名 // jsonObject.put("senderName", "金蝶测试" );//todo 第三方待办发起人姓名 jsonObject.put("thirdReceiverId", approver.getString("number"));//第三方待办接收人主键(保证唯一) // jsonObject.put("thirdReceiverId", "jdtest");//todo 第三方待办接收人主键(保证唯一) jsonObject.put("creationDate", String.valueOf(thirdPartyMap.get("createDateStr")));//待办创建时间(格式:yyyy-MM-dd HH:mm:ss) jsonObject.put("state", "0");//状态:0:未办理;1:已办理 jsonObject.put("url", String.valueOf(thirdPartyMap.get("url")));//PC端穿透链接 jsonObject.put("h5url", "test");//移动端穿透链接 pendingList.add(jsonObject); } pendingsBody.put("pendingList", pendingList); String pendingPostjson = null; try { // 发送POST请求并获取响应 pendingPostjson = HttpClientUtils.postjson(pendingsUrl, customerHeader, pendingsBody.toJSONString()); JSONObject jsonObject = JSONObject.parseObject(pendingPostjson); // 检查JSON对象是否为空 if (jsonObject != null && !jsonObject.isEmpty()) { Boolean result = jsonObject.getBoolean("success"); String logMessage = result ? "金蝶系统推送OA待办新增成功!" : "金蝶系统推送OA待办新增失败!"; // 记录日志 logger.info(logMessage); DobeDWUtils.saveLog(String.valueOf(thirdPartyMap.get("billNo")), "致远", pendingsBody.toJSONString()+"\n"+String.valueOf(thirdPartyMap.get("url1")), pendingPostjson, result, "调用推送OA待办新增接口"); } logger.info("接口返回结果:\n{}", pendingPostjson); } catch (Exception e) { // 记录异常信息 String errorMessage = String.format("接口异常:%s", e.getMessage()); logger.info(errorMessage); DobeDWUtils.saveLog(String.valueOf(thirdPartyMap.get("billNo")), "致远", pendingsBody.toJSONString(), e.getMessage(), false, "调用推送OA待办新增接口"); throw new RuntimeException(e); } } /** * OA待办变更 * @param updateStateMap 流程参数 */ public static void updatePendingState (HashMap updateStateMap){ // String oaUrl = System.getProperty("oaurl"); String pendingsUrl = oaUrl + "/seeyon/rest/thirdpartyPending/updatePendingState"; Map customerHeader = new HashMap<>(); customerHeader.put("Content-Type", "application/json"); customerHeader.put("token", String.valueOf(updateStateMap.get("oaToken"))); //组装请求体 JSONObject pendingsBody = new JSONObject(); pendingsBody.put("registerCode","3004"); pendingsBody.put("taskId",String.valueOf(updateStateMap.get("taskId"))); pendingsBody.put("state",String.valueOf(updateStateMap.get("state"))); pendingsBody.put("subState",String.valueOf(updateStateMap.get("subState"))); String pendingPostjson = null; try { // 发送POST请求并获取响应 pendingPostjson = HttpClientUtils.postjson(pendingsUrl, customerHeader, pendingsBody.toJSONString()); JSONObject jsonObject = JSONObject.parseObject(pendingPostjson); // 检查JSON对象是否为空 if (jsonObject != null && !jsonObject.isEmpty()) { Boolean result = jsonObject.getBoolean("success"); String logMessage = result ? "金蝶系统推送OA待办变更成功!" : "金蝶系统推送OA待办变更失败!"; // 记录日志 logger.info(logMessage); DobeDWUtils.saveLog(String.valueOf(updateStateMap.get("billNo")), "致远", pendingsBody.toJSONString(), pendingPostjson, result, "调用推送OA待办变更接口"); } logger.info("接口返回结果:\n{}", pendingPostjson); } catch (Exception e) { // 记录异常信息 String errorMessage = String.format("接口异常:%s", e.getMessage()); logger.info(errorMessage); DobeDWUtils.saveLog(String.valueOf(updateStateMap.get("billNo")), "致远", pendingsBody.toJSONString(), e.getMessage(), false, "调用推送OA待办变更接口"); throw new RuntimeException(e); } } /** * 金蝶系统推送OA消息 * @param thirdPartyMap 流程参数 */ public static void thirdpartyMessage(HashMap thirdPartyMap){ // String oaUrl = System.getProperty("oaurl"); String messagesUrl = oaUrl + "/seeyon/rest/thirdpartyMessage/receive/messageList"; Map messageHeader = new HashMap<>(); messageHeader.put("Content-Type", "application/json"); messageHeader.put("token", String.valueOf(thirdPartyMap.get("oaToken"))); //组装请求体 JSONObject messageBody = new JSONObject(); JSONArray messageList = new JSONArray(); //接口不支持接收人字段为多人,但接口支持批量 so 多人审批,遍历审批人集合,调用OA调待办接口 List approversLists = (List)thirdPartyMap.get("approversLists"); for (DynamicObject approver :approversLists ) { JSONObject jsonObject = new JSONObject(); jsonObject.put("thirdpartyMessageId", String.valueOf(thirdPartyMap.get("taskId")));//第三方待办主键(保证唯一) jsonObject.put("thirdpartyRegisterCode", "3004");//系统注册编码 jsonObject.put("messageContent", String.valueOf(thirdPartyMap.get("content")) );//消息内容 jsonObject.put("thirdpartySenderId", String.valueOf(thirdPartyMap.get("startNumber")));//第三方待办发起人主键 // jsonObject.put("thirdpartySenderId", "jdtest");//todo 第三方待办发起人主键 jsonObject.put("thirdpartyReceiverId", approver.getString("number"));//第三方待办接收人主键(保证唯一) // jsonObject.put("thirdpartyReceiverId", "jdtest");//todo 第三方待办接收人主键(保证唯一) jsonObject.put("creation_date", String.valueOf(thirdPartyMap.get("createDateStr")));//待办创建时间(格式:yyyy-MM-dd HH:mm:ss) jsonObject.put("messageURL", String.valueOf(thirdPartyMap.get("url")));//PC端穿透链接 jsonObject.put("messageH5URL", "test");//移动端穿透链接 messageList.add(jsonObject); } messageBody.put("messages", messageList); String pendingPostjson = null; try { // 发送POST请求并获取响应 pendingPostjson = HttpClientUtils.postjson(messagesUrl, messageHeader, messageBody.toJSONString()); JSONObject jsonObject = JSONObject.parseObject(pendingPostjson); // 检查JSON对象是否为空 if (jsonObject != null && !jsonObject.isEmpty()) { Boolean result = jsonObject.getBoolean("success"); String logMessage = result ? "金蝶系统推送OA消息成功!" : "金蝶系统推送OA消息失败!"; // 记录日志 logger.info(logMessage); DobeDWUtils.saveLog(String.valueOf(thirdPartyMap.get("billNo")), "致远", messageBody.toJSONString()+"\n"+String.valueOf(thirdPartyMap.get("url1")), pendingPostjson, result, "调用推送OA消息接口"); } logger.info("接口返回结果:\n{}", pendingPostjson); } catch (Exception e) { // 记录异常信息 String errorMessage = String.format("接口异常:%s", e.getMessage()); logger.info(errorMessage); DobeDWUtils.saveLog(String.valueOf(thirdPartyMap.get("billNo")), "致远", messageBody.toJSONString(), e.getMessage(), false, "调用推送OA消息接口"); throw new RuntimeException(e); } } /** * model值转Long */ public static long l(Object value) { if (value == null) { return 0L; } else if (value instanceof Long) { return (Long)value; } else if (value instanceof Number) { return ((Number)value).longValue(); } else if (value instanceof Boolean) { return ((Boolean)value).booleanValue() ? 1L : 0L; } else if (value instanceof Date) { return ((Date)value).getTime(); } else { String s = value.toString().trim(); if (s.length() == 0) { return 0L; } else { return Long.parseLong(s); } } } }