393 lines
19 KiB
Java
393 lines
19 KiB
Java
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<String, String> 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<DynamicObject> approversLists, String oaToken,String billNo){
|
||
|
||
// String oaUrl = System.getProperty("oaurl");
|
||
String thirdUrl = oaUrl + "/seeyon/rest/thirdpartyUserMapper/binding";
|
||
|
||
Map<String, String> 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<String, Object> thirdPartyMap){
|
||
|
||
// String oaUrl = System.getProperty("oaurl");
|
||
String pendingsUrl = oaUrl + "/seeyon/rest/thirdpartyPending/receive/pendings";
|
||
|
||
Map<String, String> 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<DynamicObject> approversLists = (List<DynamicObject>)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<String, Object> updateStateMap){
|
||
|
||
// String oaUrl = System.getProperty("oaurl");
|
||
String pendingsUrl = oaUrl + "/seeyon/rest/thirdpartyPending/updatePendingState";
|
||
|
||
Map<String, String> 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<String, Object> thirdPartyMap){
|
||
|
||
// String oaUrl = System.getProperty("oaurl");
|
||
String messagesUrl = oaUrl + "/seeyon/rest/thirdpartyMessage/receive/messageList";
|
||
|
||
Map<String, String> 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<DynamicObject> approversLists = (List<DynamicObject>)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);
|
||
}
|
||
}
|
||
}
|
||
}
|