using com.igetui.api.openservice; using com.igetui.api.openservice.igetui; using com.igetui.api.openservice.igetui.template; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; namespace MesMessage { public static class GeTuiService { // 个推接口地址(使用 HTTPS) private static readonly string HOST = "https://api.getui.com/apiex.htm"; private static readonly string APPID = "X3I10VqaROAH8C7ElIc1L5"; private static readonly string APPKEY = "V425beWn5K65BcOYKTcXx8"; private static readonly string MASTERSECRET = "LOXAgRbXS98NxHKUXmlJQ"; static DBHelper oCN = new DBHelper(); static DataSet ds = new DataSet(); // 注意:不再声明静态 IGtPush 字段,避免类型初始化异常 /// /// 单条消息推送(工作联系单) /// public static void PubishSingle(int HInterID) { try { JObject NameMsgKVP = new JObject(); ds = oCN.RunProcReturn($@" select * from h_v_OA_WorkLinkBillAllList where hmainid = {HInterID} select * from Gy_UserClientIdRelation ", "h_v_OA_WorkLinkBillAllList"); NotificationTemplate template = null; ConcurrentDictionary> userClientIDDictionary = new ConcurrentDictionary>(); // 将用户设备关联表 收集为 Map if (ds.Tables[1].Rows.Count > 0) { foreach (DataRow row in ds.Tables[1].Rows) { if (userClientIDDictionary.ContainsKey(row["HUserName"].ToString())) { userClientIDDictionary[row["HUserName"].ToString()].Add(row["HClientID"].ToString()); } else { userClientIDDictionary.TryAdd(row["HUserName"].ToString(), new List() { row["HClientID"].ToString() }); } } } if (ds.Tables[0].Rows.Count > 0) { string title = ds.Tables[0].Rows[0]["主题"].ToString(); string content = ds.Tables[0].Rows[0]["内容"].ToString(); template = GetNotificationTemplate(title, content, "/pages/ZLGL/OA_WorkLink/OA_WorkLinkBillQuery", "0"); // 跳转到工作联系单查询页面 bool pushSuccess = false; // 广播 if (ds.Tables[0].Rows[0]["发送类型"].ToString() == "公共") { string rule = GetSystemRule(); if (rule == "华舟") { // 推送给接收人 和 抄送人 foreach (DataRow row in ds.Tables[0].Rows) { List clientIDList = new List(); if (userClientIDDictionary.ContainsKey(row["接收人"].ToString())) { clientIDList = userClientIDDictionary[row["接收人"].ToString()]; } else if (userClientIDDictionary.ContainsKey(row["抄送接收人"].ToString())) { clientIDList = userClientIDDictionary[row["抄送接收人"].ToString()]; } foreach (string clientID in clientIDList) { pushSuccess = PushMessageToSingle(template, clientID); } } } else { // 遍历 全推送 foreach (DataRow row in ds.Tables[1].Rows) { pushSuccess = PushMessageToSingle(template, row["HClientID"].ToString()); } } } else // 单独推送 { // 推送给接收人 和 抄送人 foreach (DataRow row in ds.Tables[0].Rows) { List clientIDList = new List(); if (userClientIDDictionary.ContainsKey(row["接收人"].ToString())) { clientIDList = userClientIDDictionary[row["接收人"].ToString()]; } else if (userClientIDDictionary.ContainsKey(row["抄送接收人"].ToString())) { clientIDList = userClientIDDictionary[row["抄送接收人"].ToString()]; } foreach (string clientID in clientIDList) { pushSuccess = PushMessageToSingle(template, clientID); } } } if (!pushSuccess) { // 个推 推送不成功(内网环境) 使用webSocket进行推送 // TODO: 使用 rabbitMQ 实现消息队列 // WebSocketServer.PushOne(HInterID); } } } catch (Exception ex) { DBHelper.CustomWriteLog(ex.ToString(), DateTime.Now.ToString("yyyy-MM-dd")); return; } } /// /// 单推消息(通知模板) /// private static bool PushMessageToSingle(NotificationTemplate template, string clientId) { try { // 每次调用创建新实例,避免共享状态 IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); SingleMessage message = new SingleMessage { IsOffline = true, OfflineExpireTime = 1000 * 3600 * 12, // 12小时 Data = template }; Target target = new Target { appId = APPID, clientId = clientId }; string pushResult = push.pushMessageToSingle(message, target); DBHelper.CustomWriteLog($"个推推送结果: {pushResult}", DateTime.Now.ToString("yyyy-MM-dd")); return true; } catch (RequestException ex) { // 可尝试重发(使用原请求ID) DBHelper.CustomWriteLog($"推送异常,请求ID: {ex.RequestId}, 错误: {ex}", DateTime.Now.ToString("yyyy-MM-dd")); return false; } catch (Exception ex) { DBHelper.CustomWriteLog($"推送异常: {ex}", DateTime.Now.ToString("yyyy-MM-dd")); return false; } } /// /// 创建通知模板(携带透传数据) /// public static NotificationTemplate GetNotificationTemplate(string title, string content, string pagePath, string itemId) { var template = new NotificationTemplate { AppId = APPID, AppKey = APPKEY, Title = title, Text = content, Logo = "icon", // 应用内图标名称(根据实际修改) LogoURL = "", // 网络图标,可留空 IsRing = true, IsVibrate = true, IsClearable = true, TransmissionType = 1 // 1=点击通知触发客户端透传回调 }; // 透传内容:JSON 格式 var customData = new Dictionary { { "pagePath", pagePath }, { "itemId", itemId } }; template.TransmissionContent = JsonConvert.SerializeObject(customData); return template; } /// /// 获取系统参数 OA_AndengFlowRule_XT 的值 /// private static string GetSystemRule() { string sql = "select HValue from xt_SystemParameter where HKey='WMS_CampanyName'"; DataSet ds = oCN.RunProcReturn(sql, "xt_SystemParameter"); if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) return ds.Tables[0].Rows[0]["HValue"].ToString(); return null; } } }