|
@@ -0,0 +1,1266 @@
|
|
|
|
+package nckd.jimin.jyyy.bd.plugin.msg.ecology;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import kd.bos.context.RequestContext;
|
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
|
+import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
|
+import kd.bos.dataentity.resource.ResManager;
|
|
|
|
+import kd.bos.exception.ErrorCode;
|
|
|
|
+import kd.bos.exception.KDException;
|
|
|
|
+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.sdk.util.KHttpClientUtils;
|
|
|
|
+import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
|
+import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
|
+import kd.bos.util.StringUtils;
|
|
|
|
+import kd.bos.workflow.engine.WfConfigurationUtil;
|
|
|
|
+import kd.bos.workflow.engine.msg.MessageServiceUtil;
|
|
|
|
+import kd.bos.workflow.engine.msg.ctx.MessageContext;
|
|
|
|
+import kd.bos.workflow.engine.msg.info.MessageInfo;
|
|
|
|
+import kd.bos.workflow.engine.msg.info.ToDoInfo;
|
|
|
|
+import kd.bos.workflow.exception.WFErrorCode;
|
|
|
|
+import kd.bos.workflow.exception.WFMessageServiceException;
|
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
|
|
+import javax.net.ssl.HttpsURLConnection;
|
|
|
|
+import javax.net.ssl.SSLContext;
|
|
|
|
+import javax.net.ssl.SSLSocketFactory;
|
|
|
|
+import javax.net.ssl.TrustManager;
|
|
|
|
+import java.io.*;
|
|
|
|
+import java.net.HttpURLConnection;
|
|
|
|
+import java.net.URL;
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.UUID;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 消息待办实现工具类
|
|
|
|
+ * @author wanghaiwu_kd
|
|
|
|
+ * @date 2025/04/16
|
|
|
|
+ */
|
|
|
|
+public final class FanweiCommonUtil {
|
|
|
|
+ private static Log logger = LogFactory.getLog(FanweiCommonUtil.class);
|
|
|
|
+ private static String KEY_ENTITY_LOG = "nckd_ecology";
|
|
|
|
+ //
|
|
|
|
+ private static String param_url = "";
|
|
|
|
+ private static String param_msgurl = "";
|
|
|
|
+ //注册企业id
|
|
|
|
+ private static String param_cropid = "";
|
|
|
|
+ private static String param_responsetype = "";
|
|
|
|
+ private static String param_state = "";
|
|
|
|
+ private static String param_appkey = "";
|
|
|
|
+ private static String param_appsecret = "";
|
|
|
|
+ private static String param_granttype = "";
|
|
|
|
+ private static String param_secretkey = "";
|
|
|
|
+ private static String param_syscode = "";
|
|
|
|
+ private static String param_getcode = "";
|
|
|
|
+ private static String param_gettoken = "";
|
|
|
|
+ private static String param_sendflow = "";
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取公共参数中的泛微相关参数配置
|
|
|
|
+ */
|
|
|
|
+ private static void setParmamValue(){
|
|
|
|
+ String selectField = "nckd_entryentity.nckd_key, nckd_entryentity.nckd_value";
|
|
|
|
+
|
|
|
|
+ QFilter qFilter = new QFilter("number", QCP.equals, "fanwei");
|
|
|
|
+ DynamicObject commonParam = BusinessDataServiceHelper.loadSingle("nckd_commonparams", selectField, qFilter.toArray());
|
|
|
|
+ if (ObjectUtils.isEmpty(commonParam)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DynamicObjectCollection entryentity = commonParam.getDynamicObjectCollection("nckd_entryentity");
|
|
|
|
+ Map<String, String> mapentity = entryentity.stream().collect(Collectors.toMap(k -> k.getString("nckd_key"), v -> v.getString("nckd_value")));
|
|
|
|
+ if(mapentity != null ){
|
|
|
|
+ param_url = mapentity.get("url");
|
|
|
|
+ param_msgurl = mapentity.get("msgurl");
|
|
|
|
+ param_cropid = mapentity.get("corpid");
|
|
|
|
+ param_responsetype = mapentity.get("response_type");
|
|
|
|
+ param_state = mapentity.get("state");
|
|
|
|
+ param_appkey = mapentity.get("app_key");
|
|
|
|
+ param_appsecret = mapentity.get("app_secret");
|
|
|
|
+ param_granttype = mapentity.get("grant_type");
|
|
|
|
+ param_secretkey = mapentity.get("secret_key");
|
|
|
|
+ param_syscode = mapentity.get("syscode");
|
|
|
|
+ param_getcode = mapentity.get("getcode");
|
|
|
|
+
|
|
|
|
+ param_gettoken = mapentity.get("gettoken");
|
|
|
|
+ param_sendflow = mapentity.get("sendflow");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 创建待办
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ */
|
|
|
|
+ public static void createUserToDo(MessageContext ctx, ToDoInfo info, Map<String, String> params) {
|
|
|
|
+ if (WfConfigurationUtil.isEnabled("fanwei")) {
|
|
|
|
+ setParmamValue();
|
|
|
|
+ if(StringUtils.isEmpty(param_sendflow)){
|
|
|
|
+ logger.info("泛微createToDo is fail :未配置泛微参数sendflow!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ JSONObject fanweiBodyData = buildToDoBodyData(ctx, info, params);
|
|
|
|
+
|
|
|
|
+ logger.info("待办发送消息:" + fanweiBodyData.toString());
|
|
|
|
+
|
|
|
|
+ String receiverLong = fanweiBodyData.getString("receiverLong");
|
|
|
|
+ String title = fanweiBodyData.getString("requestname");
|
|
|
|
+ String oaId = fanweiBodyData.getString("flowid");
|
|
|
|
+ String uuid = saveLogData(receiverLong, title, oaId, info.getContent(), fanweiBodyData.toString(), "1", param_sendflow);
|
|
|
|
+
|
|
|
|
+ logger.info("泛微推送数据日志保存成功");
|
|
|
|
+
|
|
|
|
+ String token = getFanWeiToken();
|
|
|
|
+ String url = "";
|
|
|
|
+ String result = "";
|
|
|
|
+
|
|
|
|
+ Map<String, String> header = new HashMap<>();
|
|
|
|
+ header.put("Content-Type", "application/json; charset=UTF-8");
|
|
|
|
+
|
|
|
|
+ //获取token
|
|
|
|
+ try {
|
|
|
|
+ url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
|
|
|
|
+ logger.info("泛微发送消息接口地址:" + url);
|
|
|
|
+
|
|
|
|
+ result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("创建泛微待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject msgObj = JSONObject.parseObject(result);
|
|
|
|
+ if(msgObj.get("message") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回message为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject message = msgObj.getJSONObject("message");
|
|
|
|
+
|
|
|
|
+ if(message.get("errcode") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回errorcode为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String sendStatus = "fail";
|
|
|
|
+ String code = message.getString("errcode");
|
|
|
|
+ if(!"200".equals(code)) {
|
|
|
|
+ String errCode = message.getString("errcode") == null ? "" : message.getString("errcode");
|
|
|
|
+ String errMsg = message.getString("errmsg") == null ? "" : message.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ sendStatus = "success";
|
|
|
|
+
|
|
|
|
+ updateLogData(uuid, result, sendStatus);
|
|
|
|
+
|
|
|
|
+ logger.info("泛微门户消息发送成功,发送消息:{}, 结果:{}", fanweiBodyData.toJSONString(), result);
|
|
|
|
+ } catch (Exception var15) {
|
|
|
|
+ logger.info(var15.getMessage());
|
|
|
|
+ String message = ResManager.loadKDString("泛微创建待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(var15, error, new Object[]{var15.getMessage()});
|
|
|
|
+ } finally {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 处理待办
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ */
|
|
|
|
+ public static void dealUserToDo(MessageContext ctx, ToDoInfo info, Map<String, String> params) {
|
|
|
|
+ if (WfConfigurationUtil.isEnabled("fanwei")) {
|
|
|
|
+ setParmamValue();
|
|
|
|
+ if(StringUtils.isEmpty(param_sendflow)){
|
|
|
|
+ logger.info("泛微dealToDo is fail :未配置泛微参数sendflow!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JSONObject fanweiBodyData = buildToDoBodyData(ctx, info, params);
|
|
|
|
+
|
|
|
|
+ logger.info("待办发送消息:" + fanweiBodyData.toString());
|
|
|
|
+
|
|
|
|
+ String receiverLong = fanweiBodyData.getString("receiverLong");
|
|
|
|
+ String title = fanweiBodyData.getString("requestname");
|
|
|
|
+ String oaId = fanweiBodyData.getString("flowid");
|
|
|
|
+ String uuid = saveLogData(receiverLong, title, oaId, info.getContent(), fanweiBodyData.toString(), "5", param_sendflow);
|
|
|
|
+ logger.info("泛微推送数据日志保存成功");
|
|
|
|
+
|
|
|
|
+ String token = getFanWeiToken();
|
|
|
|
+ String url = "";
|
|
|
|
+ String result = "";
|
|
|
|
+
|
|
|
|
+ Map<String, String> header = new HashMap<>();
|
|
|
|
+ header.put("Content-Type", "application/json; charset=UTF-8");
|
|
|
|
+
|
|
|
|
+ //获取token
|
|
|
|
+ try {
|
|
|
|
+ url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
|
|
|
|
+ logger.info("泛微发送消息接口地址:" + url);
|
|
|
|
+
|
|
|
|
+ result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("创建泛微待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject msgObj = JSONObject.parseObject(result);
|
|
|
|
+ if(msgObj.get("message") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回message为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject message = msgObj.getJSONObject("message");
|
|
|
|
+ if(message.get("errcode") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回errorcode为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String sendStatus = "fail";
|
|
|
|
+ String code = message.getString("errcode");
|
|
|
|
+ if(!"200".equals(code)) {
|
|
|
|
+ String errCode = message.getString("errcode") == null ? "" : message.getString("errcode");
|
|
|
|
+ String errMsg = message.getString("errmsg") == null ? "" : message.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ sendStatus = "success";
|
|
|
|
+
|
|
|
|
+ updateLogData(uuid, result, sendStatus);
|
|
|
|
+
|
|
|
|
+ logger.info("泛微门户消息发送成功,发送消息:{}, 结果:{}", fanweiBodyData.toJSONString(), result);
|
|
|
|
+ } catch (Exception var15) {
|
|
|
|
+ logger.info(var15.getMessage());
|
|
|
|
+ String message = ResManager.loadKDString("泛微处理待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(var15, error, new Object[]{var15.getMessage()});
|
|
|
|
+ } finally {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 撤销待办、转交、加签等
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ */
|
|
|
|
+ public static void deleteUserToDo(MessageContext ctx, ToDoInfo info, Map<String, String> params) {
|
|
|
|
+ if (WfConfigurationUtil.isEnabled("fanwei")) {
|
|
|
|
+ setParmamValue();
|
|
|
|
+ if(StringUtils.isEmpty(param_sendflow)){
|
|
|
|
+ logger.info("泛微dealToDo is fail :未配置泛微参数sendflow!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JSONObject fanweiBodyData = buildToDoBodyData(ctx, info, params);
|
|
|
|
+
|
|
|
|
+ logger.info("待办发送消息:" + fanweiBodyData.toString());
|
|
|
|
+
|
|
|
|
+ String receiverLong = fanweiBodyData.getString("receiverLong");
|
|
|
|
+ String title = fanweiBodyData.getString("requestname");
|
|
|
|
+ String oaId = fanweiBodyData.getString("flowid");
|
|
|
|
+ String uuid = saveLogData(receiverLong, title, oaId, info.getContent(), fanweiBodyData.toString(), "5", param_sendflow);
|
|
|
|
+ logger.info("泛微推送数据日志保存成功");
|
|
|
|
+
|
|
|
|
+ String token = getFanWeiToken();
|
|
|
|
+ String url = "";
|
|
|
|
+ String result = "";
|
|
|
|
+
|
|
|
|
+ Map<String, String> header = new HashMap<>();
|
|
|
|
+ header.put("Content-Type", "application/json; charset=UTF-8");
|
|
|
|
+
|
|
|
|
+ //获取token
|
|
|
|
+ try {
|
|
|
|
+ url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
|
|
|
|
+ logger.info("泛微发送消息接口地址:" + url);
|
|
|
|
+
|
|
|
|
+ result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("创建泛微待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject msgObj = JSONObject.parseObject(result);
|
|
|
|
+ if(msgObj.get("message") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回message为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject message = msgObj.getJSONObject("message");
|
|
|
|
+ if(message.get("errcode") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回errorcode为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String sendStatus = "fail";
|
|
|
|
+ String code = message.getString("errcode");
|
|
|
|
+ if(!"200".equals(code)) {
|
|
|
|
+ String errCode = message.getString("errcode") == null ? "" : message.getString("errcode");
|
|
|
|
+ String errMsg = message.getString("errmsg") == null ? "" : message.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ sendStatus = "success";
|
|
|
|
+
|
|
|
|
+ updateLogData(uuid, result, sendStatus);
|
|
|
|
+
|
|
|
|
+ logger.info("泛微门户消息发送成功,发送消息:{}, 结果:{}", fanweiBodyData.toJSONString(), result);
|
|
|
|
+ } catch (Exception var15) {
|
|
|
|
+ logger.info(var15.getMessage());
|
|
|
|
+ String message = ResManager.loadKDString("泛微处理待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(var15, error, new Object[]{var15.getMessage()});
|
|
|
|
+ } finally {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发送消息
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ */
|
|
|
|
+ public static void sendMessage(MessageContext ctx, MessageInfo info, Map<String, String> params) {
|
|
|
|
+ if (WfConfigurationUtil.isEnabled("fanwei")) {
|
|
|
|
+ setParmamValue();
|
|
|
|
+ if(StringUtils.isEmpty(param_sendflow)){
|
|
|
|
+ logger.info("泛微createToDo is fail :未配置泛微服务器地址!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ //发送传阅消息
|
|
|
|
+ if("circulation".equals(info.getTplScene())) {
|
|
|
|
+ sendFlowMessage(ctx, info, params);
|
|
|
|
+ } else {
|
|
|
|
+ sendCustomMessage(ctx, info, params);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发送传阅消息
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ */
|
|
|
|
+ private static void sendFlowMessage(MessageContext ctx, MessageInfo info, Map<String, String> params){
|
|
|
|
+ if (WfConfigurationUtil.isEnabled("fanwei")) {
|
|
|
|
+ setParmamValue();
|
|
|
|
+ if (StringUtils.isEmpty(param_sendflow)) {
|
|
|
|
+ logger.info("泛微dealToDo is fail :未配置泛微参数sendflow!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JSONObject fanweiBodyData = buildMessageBodyData(ctx, info, params);
|
|
|
|
+
|
|
|
|
+ logger.info("发送传阅消息到泛微:" + fanweiBodyData.toString());
|
|
|
|
+
|
|
|
|
+ String receiverLong = fanweiBodyData.getString("receiverLong");
|
|
|
|
+ String title = fanweiBodyData.getString("requestname");
|
|
|
|
+ String oaId = fanweiBodyData.getString("flowid");
|
|
|
|
+ String uuid = saveLogData(receiverLong, title, oaId, info.getContent(), fanweiBodyData.toString(), "2", param_sendflow);
|
|
|
|
+ logger.info("泛微推送数据日志保存成功");
|
|
|
|
+
|
|
|
|
+ String token = getFanWeiToken();
|
|
|
|
+ String url = "";
|
|
|
|
+ String result = "";
|
|
|
|
+
|
|
|
|
+ Map<String, String> header = new HashMap<>();
|
|
|
|
+ header.put("Content-Type", "application/json; charset=UTF-8");
|
|
|
|
+
|
|
|
|
+ //获取token
|
|
|
|
+ try {
|
|
|
|
+ url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
|
|
|
|
+ logger.info("泛微发送消息接口地址:" + url);
|
|
|
|
+
|
|
|
|
+ result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("创建泛微待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject msgObj = JSONObject.parseObject(result);
|
|
|
|
+ if(msgObj.get("message") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回message为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject message = msgObj.getJSONObject("message");
|
|
|
|
+ if(message.get("errcode") == null){
|
|
|
|
+ logger.info("创建泛微待办异常: 接口返回errorcode为空");
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String sendStatus = "fail";
|
|
|
|
+ String code = message.getString("errcode");
|
|
|
|
+ if(!"200".equals(code)) {
|
|
|
|
+ String errCode = message.getString("errcode") == null ? "" : message.getString("errcode");
|
|
|
|
+ String errMsg = message.getString("errmsg") == null ? "" : message.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("创建泛微待办异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ sendStatus = "success";
|
|
|
|
+
|
|
|
|
+ updateLogData(uuid, result, sendStatus);
|
|
|
|
+
|
|
|
|
+ logger.info("泛微门户消息发送成功,发送消息:{}, 结果:{}", fanweiBodyData.toJSONString(), result);
|
|
|
|
+ } catch (Exception var15) {
|
|
|
|
+ logger.info(var15.getMessage());
|
|
|
|
+ String message = ResManager.loadKDString("泛微创建待办失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(var15, error, new Object[]{var15.getMessage()});
|
|
|
|
+ } finally {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发送消息
|
|
|
|
+ */
|
|
|
|
+ private static void sendCustomMessage(MessageContext ctx, MessageInfo info, Map<String, String> params){
|
|
|
|
+// try {
|
|
|
|
+// Map<String,String> fanweiBodyData = buildCustomMessageBodyData(ctx, info, params);
|
|
|
|
+//
|
|
|
|
+// logger.info("发送传阅消息到泛微:" + fanweiBodyData.toString());
|
|
|
|
+//
|
|
|
|
+// String receiverLong = fanweiBodyData.get("createrLong");
|
|
|
|
+// String title = fanweiBodyData.get("title");
|
|
|
|
+// String context = fanweiBodyData.get("context");
|
|
|
|
+// String oaId = fanweiBodyData.get("targetId");
|
|
|
|
+// String uuid = saveLogData(receiverLong, title, oaId, context, fanweiBodyData.toString(), "3", param_msgurl);
|
|
|
|
+// logger.info("泛微推送数据日志保存成功");
|
|
|
|
+//
|
|
|
|
+// String url = param_msgurl + "/api/ec/dev/message/sendCustomMessageSingle";
|
|
|
|
+// Map<String, String> heads = getHttpHeads();
|
|
|
|
+//
|
|
|
|
+// String data = doPostByHttpClient(url, fanweiBodyData, heads);
|
|
|
|
+//
|
|
|
|
+// if (data != null && data.contains("消息发送至OA异常")) {
|
|
|
|
+// updateLogData(uuid, data, "fail");
|
|
|
|
+// return;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// JSONObject result = JSONObject.parseObject(data);
|
|
|
|
+// if (result == null) {
|
|
|
|
+// throw new KDException(WFErrorCode.httpRequestWrongResponse(), new Object[]{result != null ? result.toJSONString() : "result is null!"});
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// //失败
|
|
|
|
+// if("true".equals(result.getString("status"))){
|
|
|
|
+// logger.info("泛微createToDo is ok , url is:" + info.getContentUrl() + ",mobileurl:" + info.getMobContentUrl());
|
|
|
|
+// } else {
|
|
|
|
+// logger.info("泛微createToDo is fail :" + result.getString("message"));
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// updateLogData(uuid, result.toJSONString(), "success");
|
|
|
|
+//
|
|
|
|
+// logger.info("泛微门户消息发送成功,发送消息:{}, 结果:{}", fanweiBodyData.toString(), result.toJSONString());
|
|
|
|
+// } catch (Exception var15) {
|
|
|
|
+// logger.info(var15.getMessage());
|
|
|
|
+// String message = ResManager.loadKDString("泛微发送消息失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+// ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+// throw new WFMessageServiceException(var15, error, new Object[]{var15.getMessage()});
|
|
|
|
+// } finally {
|
|
|
|
+// }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 组装消息发送
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Map<String,String> buildCustomMessageBodyData(MessageContext ctx, MessageInfo info, Map<String, String> params) {
|
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
|
+
|
|
|
|
+// DynamicObject msgInfo = BusinessDataServiceHelper.loadSingleFromCache(info.getId(), "wf_msg_message");
|
|
|
|
+//
|
|
|
|
+// //发送人员
|
|
|
|
+// Long createUserId = 0L;
|
|
|
|
+//// if(taskInfo != null){
|
|
|
|
+//// createUserId = taskInfo.getLong("starterid");
|
|
|
|
+//// }
|
|
|
|
+// if(ctx != null){
|
|
|
|
+// createUserId = ctx.getStartUserId();
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// DynamicObject createUser = BusinessDataServiceHelper.loadSingleFromCache(createUserId, "bos_user");
|
|
|
|
+// String creator = createUser == null ? "admin" : createUser.getString("number");
|
|
|
|
+//
|
|
|
|
+// Long userId = Long.valueOf(params.get("userId"));
|
|
|
|
+// //接收人员
|
|
|
|
+// DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(userId, "bos_user");
|
|
|
|
+// String personNo = user.getString("number");
|
|
|
|
+// String personNoLong = user.getString("name") + "(" + user.getString("number") + ")";
|
|
|
|
+// String title = info.getTitle() == null ? "" : info.getTitle();
|
|
|
|
+// String content = info.getContent() == null ? "" : info.getContent();
|
|
|
|
+//
|
|
|
|
+// String linkUrl = info.getContentUrl();
|
|
|
|
+// String linkMobileUrl = info.getMobContentUrl();
|
|
|
|
+//
|
|
|
|
+// if(msgInfo != null) {
|
|
|
|
+// if(StringUtils.isNotEmpty(msgInfo.getString("contenturl"))){
|
|
|
|
+// linkUrl = msgInfo.getString("contenturl");
|
|
|
|
+// }
|
|
|
|
+// if(StringUtils.isNotEmpty(msgInfo.getString("contenturl"))){
|
|
|
|
+// linkMobileUrl = msgInfo.getString("mobcontenturl");
|
|
|
|
+// }
|
|
|
|
+// if(StringUtils.isNotEmpty(linkMobileUrl)){
|
|
|
|
+// linkMobileUrl = linkUrl;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// logger.info("消息pcurl:" + linkUrl + ", moburl" + linkMobileUrl);
|
|
|
|
+//
|
|
|
|
+// String targetId = FANWEI_MSGCODE + "|KD-" + info.getChannelMsgId().toString() + "-" + personNo;
|
|
|
|
+//
|
|
|
|
+// if(StringUtils.isNotEmpty(linkMobileUrl)){
|
|
|
|
+// //移动端需要走外网,将地址替换成外网地址
|
|
|
|
+// String curUrl = "";//ParamsUtil.getCommonParamsField("nckd_url");
|
|
|
|
+// String mobileUrl = "";//ParamsUtil.getCommonParamsField("nckd_mobileurl");
|
|
|
|
+//
|
|
|
|
+// linkUrl = linkUrl.replace(mobileUrl, curUrl);
|
|
|
|
+// linkMobileUrl = linkMobileUrl.replace(curUrl, mobileUrl);
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// try {
|
|
|
|
+// linkUrl = URLEncoder.encode(linkUrl, "utf-8");
|
|
|
|
+// linkMobileUrl = URLEncoder.encode(linkMobileUrl, "utf-8");
|
|
|
|
+// } catch (UnsupportedEncodingException e) {
|
|
|
|
+// throw new RuntimeException(e);
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// map.put("code", FANWEI_MSGCODE); // 消息来源,新建消息来源获取code 请查看文档第四大点补充
|
|
|
|
+// map.put("workCodeList", personNo);
|
|
|
|
+// map.put("creater", creator);
|
|
|
|
+// map.put("createrLong", personNoLong);
|
|
|
|
+// map.put("title", title);
|
|
|
|
+// map.put("context", content);
|
|
|
|
+// map.put("linkUrl", linkUrl);
|
|
|
|
+// map.put("linkMobileUrl", linkMobileUrl);
|
|
|
|
+// map.put("targetId", targetId); //消息来源code +“|”+业务id 消息需要打上已处理标记
|
|
|
|
+//// map.put("bizState","0"); //0 表示消息初始状态是待处理 消息需要打上已处理标记
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 组装传阅消息
|
|
|
|
+ * @param ctx
|
|
|
|
+ * @param info
|
|
|
|
+ * @param params
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static JSONObject buildMessageBodyData(MessageContext ctx, MessageInfo info, Map<String, String> params) {
|
|
|
|
+ JSONObject bodyData = new JSONObject();
|
|
|
|
+ Long userId = Long.valueOf(params.get("userId"));
|
|
|
|
+ String isremark = params.get("isremark").toString();
|
|
|
|
+ String viewtype = params.get("viewtype").toString();
|
|
|
|
+ String content = info.getContent() == null ? "" : info.getContent();
|
|
|
|
+
|
|
|
|
+ //发送人员
|
|
|
|
+ Long createUserId = 0L;
|
|
|
|
+ if(info != null && info.getSenderId() != null){
|
|
|
|
+ createUserId = info.getSenderId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DynamicObject createUser = BusinessDataServiceHelper.loadSingleFromCache(createUserId, "bos_user");
|
|
|
|
+ String creator = createUser == null ? "" : createUser.getString("number");
|
|
|
|
+
|
|
|
|
+ String requestname = info.getTitle() + ", 发送人:" + creator + ", " + content;
|
|
|
|
+ String nodename = info.getOperation() == null ? "circulation" : info.getOperation();
|
|
|
|
+ String workflowname = "财务系统审批流";
|
|
|
|
+ String workflowcode = "nobill";
|
|
|
|
+
|
|
|
|
+ if(info.getParams() != null){
|
|
|
|
+ Map<String, Object> config = info.getParams();
|
|
|
|
+ if(config != null) {
|
|
|
|
+ if(config.get("messageContext") != null){
|
|
|
|
+ JSONObject messageContext = JSONObject.parseObject(config.get("messageContext").toString());
|
|
|
|
+ if(messageContext.get("taskId") != null){
|
|
|
|
+ DynamicObject taskInfo = BusinessDataServiceHelper.loadSingleFromCache(Long.valueOf(messageContext.getString("taskId")), "wf_task");
|
|
|
|
+ if(taskInfo != null){
|
|
|
|
+ nodename = taskInfo.getString("name");
|
|
|
|
+
|
|
|
|
+ if(taskInfo.getLong("processdefinitionid") > 0){
|
|
|
|
+ QFilter qFilter = new QFilter("id", QCP.equals, taskInfo.getLong("processdefinitionid"));
|
|
|
|
+ DynamicObject processdef = BusinessDataServiceHelper.loadSingle("wf_processdefinition", qFilter.toArray());
|
|
|
|
+ if(processdef != null){
|
|
|
|
+ workflowcode = processdef.getString("key");
|
|
|
|
+ workflowname = processdef.getString("name");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if("财务系统审批流".equals(workflowname) && taskInfo.getString("entityname") != null){
|
|
|
|
+ workflowcode = taskInfo.getString("entityname");
|
|
|
|
+ workflowname = taskInfo.getString("entityname") + "审批流程";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //接收人员
|
|
|
|
+ DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(userId, "bos_user");
|
|
|
|
+ String personNo = user.getString("number");
|
|
|
|
+ String receiverLong = user.getString("name") + "(" + user.getString("number") + ")";
|
|
|
|
+
|
|
|
|
+ //创建时间
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ String createTime = sdf.format(new Date());
|
|
|
|
+ String curTimestamp = String.valueOf(System.currentTimeMillis());
|
|
|
|
+ String flowid = "KD-" + info.getChannelMsgId().toString() + "-" + personNo;
|
|
|
|
+
|
|
|
|
+ String pcUrl = info.getContentUrl() == null ? "" : info.getContentUrl();
|
|
|
|
+ String mobUrl = info.getMobContentUrl() == null ? pcUrl : info.getMobContentUrl();
|
|
|
|
+
|
|
|
|
+ String contextUrl = System.getProperty("domain.contextUrl");
|
|
|
|
+ pcUrl = pcUrl.replace("http://127.0.0.1:8080", "").replace(contextUrl, "");
|
|
|
|
+ mobUrl = mobUrl.replace("http://127.0.0.1:8080", "").replace(contextUrl, "");
|
|
|
|
+
|
|
|
|
+ logger.info("消息pcurl:" + pcUrl + ", moburl:" + mobUrl);
|
|
|
|
+
|
|
|
|
+ //移动端需要走外网,将地址替换成外网地址
|
|
|
|
+ String curUrl = "";//ParamsUtil.getCommonParamsField("nckd_url");
|
|
|
|
+ String mobileUrl = "";//ParamsUtil.getCommonParamsField("nckd_mobileurl");
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isNotEmpty(pcUrl)){
|
|
|
|
+ pcUrl = pcUrl.replace(mobileUrl, curUrl);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isNotEmpty(mobUrl)){
|
|
|
|
+ mobUrl = mobUrl.replace(curUrl, mobileUrl);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if("".equals(pcUrl)||pcUrl==null){
|
|
|
|
+ pcUrl = System.getProperty("domain.contextUrl")+"/index.html?formId=wf_msg_center";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ pcUrl = URLEncoder.encode(pcUrl, "utf-8");
|
|
|
|
+ mobUrl = URLEncoder.encode(mobUrl, "utf-8");
|
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //异构系统标识
|
|
|
|
+ bodyData.put("syscode", param_syscode);
|
|
|
|
+ //流程实例id
|
|
|
|
+ bodyData.put("flowid", flowid);
|
|
|
|
+ //标题
|
|
|
|
+ bodyData.put("requestname", requestname);
|
|
|
|
+ //流程类型编码
|
|
|
|
+ bodyData.put("workflowcode", workflowcode);
|
|
|
|
+ //流程类型名称
|
|
|
|
+ bodyData.put("workflowname", workflowname);
|
|
|
|
+ //接收人所属节点
|
|
|
|
+ bodyData.put("receivenodename", "");
|
|
|
|
+ //节点名称
|
|
|
|
+ bodyData.put("nodename", nodename);
|
|
|
|
+ //PC地址
|
|
|
|
+ bodyData.put("pcurl", pcUrl);
|
|
|
|
+ //APP地址
|
|
|
|
+ bodyData.put("appurl", mobUrl);
|
|
|
|
+ //创建人
|
|
|
|
+ bodyData.put("creator", creator);
|
|
|
|
+ //创建时间
|
|
|
|
+ bodyData.put("createdatetime", createTime);
|
|
|
|
+ //接收人
|
|
|
|
+ bodyData.put("receiver", personNo);
|
|
|
|
+
|
|
|
|
+ //测试人员
|
|
|
|
+ bodyData.put("receiver", "18296674436");
|
|
|
|
+
|
|
|
|
+ //接收时间
|
|
|
|
+ bodyData.put("receivedatetime", createTime);
|
|
|
|
+ //流程处理状态:0:待办,2:已办,4:办结,8:抄送(待阅)
|
|
|
|
+ bodyData.put("isremark", isremark);
|
|
|
|
+ //流程查看状态:0:未读,1:已读
|
|
|
|
+ bodyData.put("viewtype", viewtype);
|
|
|
|
+ //接收时间戳
|
|
|
|
+ bodyData.put("receivets", curTimestamp);
|
|
|
|
+ //接收人+编码,保存日志使用,oa接口不需要此字段。
|
|
|
|
+ bodyData.put("receiverLong", receiverLong);
|
|
|
|
+
|
|
|
|
+ return bodyData;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 组装待办
|
|
|
|
+ * @param todoInfo
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static JSONObject buildToDoBodyData(MessageContext ctx, ToDoInfo todoInfo, Map<String, String> params) {
|
|
|
|
+
|
|
|
|
+ DynamicObject taskInfo = BusinessDataServiceHelper.loadSingleFromCache(todoInfo.getTaskId() ,"wf_task");
|
|
|
|
+
|
|
|
|
+ //add by wnaghaiwu_kd 2024/04/28
|
|
|
|
+ //如果任务中找不到,就找历史任务
|
|
|
|
+ if(taskInfo == null){
|
|
|
|
+ taskInfo = BusinessDataServiceHelper.loadSingleFromCache(todoInfo.getTaskId() ,"wf_hitaskinst");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject bodyData = new JSONObject();
|
|
|
|
+ Long userId = Long.valueOf(params.get("userId"));
|
|
|
|
+ String isremark = params.get("isremark").toString();
|
|
|
|
+ String viewtype = params.get("viewtype").toString();
|
|
|
|
+
|
|
|
|
+ //发送人员
|
|
|
|
+ Long createUserId = 0L;
|
|
|
|
+ if(taskInfo != null){
|
|
|
|
+ createUserId = taskInfo.getLong("starterid");
|
|
|
|
+ }
|
|
|
|
+ if(createUserId.compareTo(0L) == 0){
|
|
|
|
+ createUserId = ctx.getStartUserId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DynamicObject createUser = BusinessDataServiceHelper.loadSingleFromCache(createUserId, "bos_user");
|
|
|
|
+ String creator = createUser == null ? "" : createUser.getString("number");
|
|
|
|
+
|
|
|
|
+ String title = todoInfo.getTitle();
|
|
|
|
+ if(todoInfo.getParams() != null && todoInfo.getParams().get("subject") != null){
|
|
|
|
+ JSONObject subject = JSONObject.parseObject(todoInfo.getParams().get("subject").toString());
|
|
|
|
+ title = subject.getString("zh_CN");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(title) && taskInfo != null){
|
|
|
|
+ title = "请处理" + taskInfo.getString("startname")
|
|
|
|
+ + "提交的" + taskInfo.getString("entityname") + taskInfo.getString("billno");
|
|
|
|
+ }
|
|
|
|
+ String requestname = title;
|
|
|
|
+ String nodename = todoInfo.getCategory();
|
|
|
|
+ String workflowname = "财务系统审批流";
|
|
|
|
+ String workflowcode = "nobill";
|
|
|
|
+
|
|
|
|
+ if(taskInfo != null){
|
|
|
|
+ nodename = taskInfo.getString("name");
|
|
|
|
+
|
|
|
|
+ if(taskInfo.getLong("processdefinitionid") > 0) {
|
|
|
|
+ QFilter qFilter = new QFilter("id", QCP.equals, taskInfo.getLong("processdefinitionid"));
|
|
|
|
+ DynamicObject processdef = BusinessDataServiceHelper.loadSingle("wf_processdefinition", qFilter.toArray());
|
|
|
|
+ if (processdef != null) {
|
|
|
|
+ workflowcode = processdef.getString("key");
|
|
|
|
+ workflowname = processdef.getString("name");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if("财务系统审批流".equals(workflowname) && taskInfo.getString("entityname") != null){
|
|
|
|
+ workflowcode = taskInfo.getString("entityname");
|
|
|
|
+ workflowname = taskInfo.getString("entityname") + "审批流程";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //接收人员
|
|
|
|
+ DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(userId, "bos_user");
|
|
|
|
+ String personNo = user.getString("number");
|
|
|
|
+ String receiverLong = user.getString("name") + "(" + user.getString("number") + ")";
|
|
|
|
+
|
|
|
|
+ //创建时间
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ String createTime = sdf.format(new Date());
|
|
|
|
+ String curTimestamp = String.valueOf(System.currentTimeMillis());
|
|
|
|
+ String flowid = "KD-" + todoInfo.getTaskId().toString() + "-" + personNo;
|
|
|
|
+
|
|
|
|
+ //add by wanghaiw_kd 2024/04/28
|
|
|
|
+ //如果获取的任务对象为空,则获取flowid相同的待办消息中的发送参数,修改状态、接收时间,做为待办处理的发送参数
|
|
|
|
+ if(taskInfo == null){
|
|
|
|
+ QFilter qFilter = new QFilter("nckd_oaid", QCP.equals, flowid);
|
|
|
|
+ qFilter.and(new QFilter("nckd_logtype", QCP.equals, "1"));
|
|
|
|
+
|
|
|
|
+ DynamicObject ecologyLog = BusinessDataServiceHelper.loadSingle("nckd_ecology", qFilter.toArray());
|
|
|
|
+
|
|
|
|
+ if(ecologyLog != null && StringUtils.isEmpty(ecologyLog.getString("nckd_senddata_tag"))){
|
|
|
|
+ JSONObject fanweiBodyData = JSONObject.parseObject(ecologyLog.getString("nckd_senddata_tag"));
|
|
|
|
+
|
|
|
|
+ //流程处理状态:0:待办,2:已办,4:办结,8:抄送(待阅)
|
|
|
|
+ fanweiBodyData.put("isremark", "2");
|
|
|
|
+ //流程查看状态:0:未读,1:已读
|
|
|
|
+ fanweiBodyData.put("viewtype", "1");
|
|
|
|
+ //接收时间
|
|
|
|
+ fanweiBodyData.put("receivedatetime", createTime);
|
|
|
|
+ //接收时间戳
|
|
|
|
+ fanweiBodyData.put("receivets", curTimestamp);
|
|
|
|
+
|
|
|
|
+ return fanweiBodyData;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String url = MessageServiceUtil.buildWebPageUrlForMyApplyed(ctx.getProcessInstanceId());
|
|
|
|
+ logger.info("消息url:" + url);
|
|
|
|
+
|
|
|
|
+ String pcUrl = "";
|
|
|
|
+ String mobUrl = "";
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isNotEmpty(url)){
|
|
|
|
+ String contextUrl = System.getProperty("domain.contextUrl");
|
|
|
|
+ url = url.replace("http://127.0.0.1:8080", "").replace(contextUrl, "");
|
|
|
|
+ pcUrl = url;
|
|
|
|
+ mobUrl = url;
|
|
|
|
+
|
|
|
|
+ //移动端需要走外网,将地址替换成外网地址
|
|
|
|
+ String curUrl = "";//ParamsUtil.getCommonParamsField("nckd_url");
|
|
|
|
+ String mobileUrl = "";//ParamsUtil.getCommonParamsField("nckd_mobileurl");
|
|
|
|
+ pcUrl = pcUrl.replace(mobileUrl, curUrl);
|
|
|
|
+ mobUrl = mobUrl.replace(curUrl, mobileUrl);
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ pcUrl = URLEncoder.encode(pcUrl, "utf-8");
|
|
|
|
+ mobUrl = URLEncoder.encode(mobUrl, "utf-8");
|
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //异构系统标识
|
|
|
|
+ bodyData.put("syscode", param_syscode);
|
|
|
|
+ //流程实例id
|
|
|
|
+ bodyData.put("flowid", flowid);
|
|
|
|
+ //标题
|
|
|
|
+ bodyData.put("requestname", requestname);
|
|
|
|
+ //流程类型编码
|
|
|
|
+ bodyData.put("workflowcode", workflowcode);
|
|
|
|
+ //流程类型名称
|
|
|
|
+ bodyData.put("workflowname", workflowname);
|
|
|
|
+ //接收人所属节点
|
|
|
|
+ bodyData.put("receivenodename", "");
|
|
|
|
+ //节点名称
|
|
|
|
+ bodyData.put("nodename", nodename);
|
|
|
|
+ //PC地址
|
|
|
|
+ bodyData.put("pcurl", pcUrl);
|
|
|
|
+ //APP地址
|
|
|
|
+ bodyData.put("appurl", mobUrl);
|
|
|
|
+ //创建人
|
|
|
|
+ bodyData.put("creator", creator);
|
|
|
|
+ //创建时间
|
|
|
|
+ bodyData.put("createdatetime", createTime);
|
|
|
|
+ //接收人
|
|
|
|
+ bodyData.put("receiver", personNo);
|
|
|
|
+
|
|
|
|
+ //测试人员
|
|
|
|
+ bodyData.put("receiver", "18296674436");
|
|
|
|
+
|
|
|
|
+ //接收时间
|
|
|
|
+ bodyData.put("receivedatetime", createTime);
|
|
|
|
+ //流程处理状态:0:待办,2:已办,4:办结,8:抄送(待阅)
|
|
|
|
+ bodyData.put("isremark", isremark);
|
|
|
|
+ //流程查看状态:0:未读,1:已读
|
|
|
|
+ bodyData.put("viewtype", viewtype);
|
|
|
|
+ //接收时间戳
|
|
|
|
+ bodyData.put("receivets", curTimestamp);
|
|
|
|
+ //接收人+编码,保存日志使用,oa接口不需要此字段。
|
|
|
|
+ bodyData.put("receiverLong", receiverLong);
|
|
|
|
+
|
|
|
|
+ return bodyData;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取泛微OA的accesstoken
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static String getFanWeiToken() {
|
|
|
|
+ String token = "";
|
|
|
|
+
|
|
|
|
+ String result = "";
|
|
|
|
+ String url = "";
|
|
|
|
+ try {
|
|
|
|
+ url = param_getcode + "?corpid=" + param_cropid + "&response_type=" + param_responsetype + "&state=" + param_state;
|
|
|
|
+
|
|
|
|
+ logger.info("获取泛微code接口地址:" + url);
|
|
|
|
+ //获取code
|
|
|
|
+ result = KHttpClientUtils.get(url);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("获取泛微code失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ throw new WFMessageServiceException("获取泛微code异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject codeObj = JSONObject.parseObject(result);
|
|
|
|
+ String errcode = codeObj.getString("errcode");
|
|
|
|
+
|
|
|
|
+ if(!"0".equals(errcode)) {
|
|
|
|
+ String errCode = codeObj.getString("errcode") == null ? "" : codeObj.getString("errcode");
|
|
|
|
+ String errMsg = codeObj.getString("errmsg") == null ? "" : codeObj.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("获取泛微code异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ String code = codeObj.getString("code");
|
|
|
|
+
|
|
|
|
+ Map<String, String> header = new HashMap<>();
|
|
|
|
+ header.put("Content-Type", "application/json; charset=UTF-8");
|
|
|
|
+
|
|
|
|
+ Map<String, Object> params = new HashMap<>();
|
|
|
|
+// Map<String, Object> body = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ params.put("app_key", param_appkey);
|
|
|
|
+ params.put("app_secret", param_appsecret);
|
|
|
|
+ params.put("grant_type", param_granttype);
|
|
|
|
+ params.put("code", code);
|
|
|
|
+
|
|
|
|
+ //获取token
|
|
|
|
+ try {
|
|
|
|
+ url = param_gettoken;
|
|
|
|
+ logger.info("获取泛微token接口地址:" + url);
|
|
|
|
+
|
|
|
|
+ result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(params));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.info(e.getMessage());
|
|
|
|
+
|
|
|
|
+ String message = ResManager.loadKDString("获取泛微token失败,原因:%s", "WFErrorCode_10001", "bos-wf-engine", new Object[0]);
|
|
|
|
+ ErrorCode error = new ErrorCode("bos.wf.rpa.", message);
|
|
|
|
+ throw new WFMessageServiceException(e, error, new Object[]{e.getMessage()});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isEmpty(result)){
|
|
|
|
+ throw new WFMessageServiceException("获取泛微token异常: 接口返回为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONObject tokenObj = JSONObject.parseObject(result);
|
|
|
|
+ errcode = tokenObj.getString("errcode");
|
|
|
|
+
|
|
|
|
+ if(!"0".equals(errcode)) {
|
|
|
|
+ String errCode = codeObj.getString("errcode") == null ? "" : codeObj.getString("errcode");
|
|
|
|
+ String errMsg = codeObj.getString("errmsg") == null ? "" : codeObj.getString("errmsg");
|
|
|
|
+
|
|
|
|
+ throw new WFMessageServiceException("获取泛微code异常: " + errMsg + "(" + errCode + ")");
|
|
|
|
+ }
|
|
|
|
+ token = tokenObj.getString("accessToken");
|
|
|
|
+
|
|
|
|
+ return token;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 保存日志
|
|
|
|
+ * @param userid
|
|
|
|
+ * @param title
|
|
|
|
+ * @param msgContent
|
|
|
|
+ * @param sendData
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static String saveLogData(String userid, String title, String oaId, String msgContent, String sendData, String logType, String url) {
|
|
|
|
+ try {
|
|
|
|
+ logger.info("记录新增泛微推送数据日志");
|
|
|
|
+
|
|
|
|
+ msgContent = msgContent == null ? "" : msgContent;
|
|
|
|
+ sendData = sendData == null ? "" : sendData;
|
|
|
|
+
|
|
|
|
+ String uuid = UUID.randomUUID().toString().replace("-", "");
|
|
|
|
+
|
|
|
|
+ uuid = uuid == null ? "uuid" + String.valueOf(System.currentTimeMillis()) : uuid;
|
|
|
|
+ DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject(KEY_ENTITY_LOG);
|
|
|
|
+
|
|
|
|
+ dynamicObject.set("enable", "1");
|
|
|
|
+ dynamicObject.set("status", "C");
|
|
|
|
+ dynamicObject.set("number", uuid);
|
|
|
|
+ dynamicObject.set("nckd_logtype", logType);
|
|
|
|
+ dynamicObject.set("nckd_sendurl", url);
|
|
|
|
+ dynamicObject.set("nckd_receiver", userid);
|
|
|
|
+ dynamicObject.set("nckd_title", title);
|
|
|
|
+ dynamicObject.set("nckd_oaid", oaId);
|
|
|
|
+
|
|
|
|
+ dynamicObject.set("nckd_sendtime", new Date());
|
|
|
|
+ if (sendData.length() < 200) {
|
|
|
|
+ dynamicObject.set("nckd_senddata", sendData);
|
|
|
|
+ } else {
|
|
|
|
+ dynamicObject.set("nckd_senddata", sendData.substring(0, 200) + "...");
|
|
|
|
+ }
|
|
|
|
+ dynamicObject.set("nckd_senddata_tag", sendData);
|
|
|
|
+
|
|
|
|
+ if (msgContent.length() < 200) {
|
|
|
|
+ dynamicObject.set("nckd_msgcontent", msgContent);
|
|
|
|
+ } else {
|
|
|
|
+ dynamicObject.set("nckd_msgcontent", msgContent.substring(0, 200) + "...");
|
|
|
|
+ }
|
|
|
|
+ dynamicObject.set("nckd_msgcontent_tag", msgContent);
|
|
|
|
+
|
|
|
|
+ SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
|
|
|
|
+ logger.info("记录新增泛微推送数据日志成功:{}", uuid);
|
|
|
|
+ return uuid;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.info("记录新增泛微推送数据日志异常:" + e.getMessage());
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新日志
|
|
|
|
+ * @param uuid
|
|
|
|
+ * @param response
|
|
|
|
+ */
|
|
|
|
+ private static void updateLogData(String uuid, String response, String sendStatus) {
|
|
|
|
+ try {
|
|
|
|
+ logger.info("记录更新泛微推送结果数据日志");
|
|
|
|
+ response = response == null ? "" : response;
|
|
|
|
+
|
|
|
|
+ QFilter qFilterCas = new QFilter("number", QCP.equals, uuid);
|
|
|
|
+ DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load(KEY_ENTITY_LOG, "id", new QFilter[]{qFilterCas});
|
|
|
|
+ if (dynamicObjects != null && dynamicObjects.length > 0) {
|
|
|
|
+ String id = dynamicObjects[0].getPkValue().toString();
|
|
|
|
+ DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, KEY_ENTITY_LOG);
|
|
|
|
+ if (response.length() < 200) {
|
|
|
|
+ dynamicObject.set("nckd_resultdata", response);
|
|
|
|
+ } else {
|
|
|
|
+ dynamicObject.set("nckd_resultdata", response.substring(0, 200) + "...");
|
|
|
|
+ }
|
|
|
|
+ dynamicObject.set("nckd_resultdata_tag", response);
|
|
|
|
+ dynamicObject.set("nckd_sendstatus", sendStatus);
|
|
|
|
+
|
|
|
|
+ SaveServiceHelper.update(dynamicObject);
|
|
|
|
+
|
|
|
|
+ logger.info("记录更新泛微推送结果数据日志成功");
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.info("记录更新泛微推送结果数据日志异常:" + e.getMessage());
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ * @param url
|
|
|
|
+ * @param bodyData
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static JSONObject doPostByHttpClient(String url, JSONObject bodyData) {
|
|
|
|
+ try {
|
|
|
|
+ Map<String, String> headers = new HashMap();
|
|
|
|
+ headers.put("Content-Type", "application/json; charset=utf-8");
|
|
|
|
+ headers.put("Accept", "application/json");
|
|
|
|
+ logger.info(String.format("url[%s],data[%s]", url, bodyData.toJSONString()));
|
|
|
|
+ System.out.println(String.format("url[%s],data[%s]", url, bodyData.toJSONString()));
|
|
|
|
+
|
|
|
|
+ String responseEntify = HttpUtils.postjson(url, headers, bodyData.toJSONString());
|
|
|
|
+ JSONObject result = (JSONObject)JSONObject.parse(responseEntify);
|
|
|
|
+ return result;
|
|
|
|
+ } catch (IOException var5) {
|
|
|
|
+ throw new KDException(var5, WFErrorCode.httpRequestException(), new Object[]{var5.getMessage()});
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发送普通消息到泛微OA
|
|
|
|
+ * @param path
|
|
|
|
+ * @param params
|
|
|
|
+ * @param data
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static String doPostByHttpClient(String path, Map<String, String> params, Map<String, String> data) {
|
|
|
|
+ if(path.toLowerCase().startsWith("https")){
|
|
|
|
+ return doPostByHttps(path, params, data);
|
|
|
|
+ }
|
|
|
|
+ return doPostByHttp(path, params, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * http服务
|
|
|
|
+ * @param path
|
|
|
|
+ * @param params
|
|
|
|
+ * @param data
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static String doPostByHttp(String path, Map<String, String> params, Map<String, String> data) {
|
|
|
|
+ String errMsg = "";
|
|
|
|
+ try {
|
|
|
|
+ String str = "";
|
|
|
|
+ URL url = new URL(path);
|
|
|
|
+ //打开和url之间的连接
|
|
|
|
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
|
|
|
+ // 请求参数 编码为 utf-8
|
|
|
|
+ //请求方式
|
|
|
|
+ conn.setRequestMethod("POST");
|
|
|
|
+ //设置通用的请求属性
|
|
|
|
+ conn.setRequestProperty("accept", "*/*");
|
|
|
|
+ conn.setRequestProperty("connection", "Keep-Alive");
|
|
|
|
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
|
|
|
|
+ if (data != null) {
|
|
|
|
+ for (Map.Entry<String, String> entry : data.entrySet()) {
|
|
|
|
+ conn.setRequestProperty(entry.getKey(), entry.getValue());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
|
|
|
|
+ //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
|
|
|
|
+ //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
|
|
|
|
+ conn.setDoOutput(true);
|
|
|
|
+ conn.setDoInput(true);
|
|
|
|
+ OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
|
|
|
|
+ if (params != null) {
|
|
|
|
+ out.write(mapToStr(params));
|
|
|
|
+ }
|
|
|
|
+ //缓冲数据
|
|
|
|
+ out.flush();
|
|
|
|
+ out.close();
|
|
|
|
+ //获取URLConnection对象对应的输入流
|
|
|
|
+ InputStream is = conn.getInputStream();
|
|
|
|
+ //构造一个字符流缓存
|
|
|
|
+ BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
|
|
|
|
+ String result = "";
|
|
|
|
+ while ((str = br.readLine()) != null) {
|
|
|
|
+ result = str;
|
|
|
|
+ }
|
|
|
|
+ //关闭流
|
|
|
|
+ is.close();
|
|
|
|
+ //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
|
|
|
|
+ //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
|
|
|
|
+ conn.disconnect();
|
|
|
|
+ return result;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ errMsg = "消息发送至OA异常:" + e;
|
|
|
|
+ logger.warn("消息发送至OA异常:", e);
|
|
|
|
+ //e.printStackTrace();
|
|
|
|
+// return errMsg;
|
|
|
|
+ }
|
|
|
|
+ return errMsg;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * htts服务
|
|
|
|
+ * @param path
|
|
|
|
+ * @param params
|
|
|
|
+ * @param data
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static String doPostByHttps(String path, Map<String, String> params, Map<String, String> data) {
|
|
|
|
+ String errMsg = "";
|
|
|
|
+ try {
|
|
|
|
+ String str = "";
|
|
|
|
+ TrustManager[] tm = { new MyX509TrustManager() };
|
|
|
|
+ SSLContext sslContext = SSLContext.getInstance("TLS");
|
|
|
|
+ sslContext.init(null, tm, new java.security.SecureRandom());
|
|
|
|
+ // 从上述SSLContext对象中得到SSLSocketFactory对象
|
|
|
|
+ SSLSocketFactory ssf = sslContext.getSocketFactory();
|
|
|
|
+ HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
|
|
|
|
+ // 打开和URL之间的连接
|
|
|
|
+ URL realUrl = new URL(path);
|
|
|
|
+ HttpsURLConnection conn = (HttpsURLConnection) realUrl.openConnection();
|
|
|
|
+ // 避免只要域名提交
|
|
|
|
+ conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
|
|
|
|
+ // 请求参数 编码为 utf-8
|
|
|
|
+ //请求方式
|
|
|
|
+ conn.setRequestMethod("POST");
|
|
|
|
+ //设置通用的请求属性
|
|
|
|
+ conn.setRequestProperty("accept", "*/*");
|
|
|
|
+ conn.setRequestProperty("connection", "Keep-Alive");
|
|
|
|
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
|
|
|
|
+ if (data != null) {
|
|
|
|
+ for (Map.Entry<String, String> entry : data.entrySet()) {
|
|
|
|
+ conn.setRequestProperty(entry.getKey(), entry.getValue());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
|
|
|
|
+ //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
|
|
|
|
+ //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
|
|
|
|
+ conn.setDoOutput(true);
|
|
|
|
+ conn.setDoInput(true);
|
|
|
|
+ OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
|
|
|
|
+ if (params != null) {
|
|
|
|
+ out.write(mapToStr(params));
|
|
|
|
+ }
|
|
|
|
+ //缓冲数据
|
|
|
|
+ out.flush();
|
|
|
|
+ out.close();
|
|
|
|
+ //获取URLConnection对象对应的输入流
|
|
|
|
+ InputStream is = conn.getInputStream();
|
|
|
|
+ //构造一个字符流缓存
|
|
|
|
+ BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
|
|
|
|
+ String result = "";
|
|
|
|
+ while ((str = br.readLine()) != null) {
|
|
|
|
+ result = str;
|
|
|
|
+ }
|
|
|
|
+ //关闭流
|
|
|
|
+ is.close();
|
|
|
|
+ //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
|
|
|
|
+ //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
|
|
|
|
+ conn.disconnect();
|
|
|
|
+ return result;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ errMsg = "消息发送至OA异常:" + e;
|
|
|
|
+ logger.warn("消息发送至OA异常:", e);
|
|
|
|
+ //e.printStackTrace();
|
|
|
|
+// return errMsg;
|
|
|
|
+ }
|
|
|
|
+ return errMsg;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 将Map转换成字符串参数,用于POST GET 请求
|
|
|
|
+ * @param map
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static String mapToStr(Map<String, String> map) {
|
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
|
+ if (map != null) {
|
|
|
|
+ for (Map.Entry<String, String> entry : map.entrySet()) {
|
|
|
|
+ stringBuilder.append(entry.getKey());
|
|
|
|
+ if (entry.getValue() != null) {
|
|
|
|
+ stringBuilder.append("=").append(entry.getValue());
|
|
|
|
+ }
|
|
|
|
+ stringBuilder.append("&");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (stringBuilder.length() > 0) {
|
|
|
|
+ return stringBuilder.substring(0, stringBuilder.length() - 1);
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+}
|