using System; using System.Collections.Generic; using System.Linq; using System.Web; using com.igetui.api.openservice; using System.Threading.Tasks; using System.Data; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using com.igetui.api.openservice.igetui.template; using com.igetui.api.openservice.igetui; using System.Collections.Concurrent; namespace WebAPI.Service { public static class GeTuiService { //http的域名 // private static String HOST = "http://sdk.open.api.igexin.com/apiex.htm"; //https的域名 private static String HOST = "https://api.getui.com/apiex.htm"; // 配置为DCLOUD 中的 unipush 个推 中对应的数据 private static String APPID = "X3I10VqaROAH8C7ElIc1L5"; private static String APPKEY = "V425beWn5K65BcOYKTcXx8"; private static String MASTERSECRET = "LOXAgRbXS98NxHKUXmlJQ"; // 推送服务实例 private static IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); private static Pub_Class.ClsXt_SystemParameter oSystemParameter = new Pub_Class.ClsXt_SystemParameter(); // 单条消息推送 public static void PubishSingle(int HInterID) { SQLHelper.ClsCN oCN = new SQLHelper.ClsCN(); DataSet ds = new DataSet(); try { JObject NameMsgKVP = new JObject(); ds = oCN.RunProcReturn($@" select CASE WHEN a.HBillStatus <= 1 THEN '创建' WHEN a.HBillStatus = 2 THEN '已审核' WHEN a.HBillStatus = 3 THEN '已关闭' WHEN a.HBillStatus = 4 THEN '已作废' WHEN a.HBillStatus = 9 THEN '已完成' ELSE '' END AS 单据状态, a.HBillNo AS 单据号, a.HBillType AS 单据类型, CONVERT(varchar(10), a.HDate, 120) AS 日期, a.HRemark AS 表头备注, a.HDeptID, a.HSendMan AS 发送人, a.HReceiveMan AS 接收人, a.HCopyMan AS 所有抄送人, a.HHasten AS 催促次数, a.HLevel AS 紧急程度, a.HContext AS 主题, a.HDescription AS 内容, a.HSendType AS 发送类型, a.HEvaluateStatusID, a.HCommDate AS 建议完成日期, a.HRelationInterID AS 关联单据内码, a.HRelationEntryID AS 关联单据子内码, a.HRelationBillType AS 关联单据类型, a.HRelationBillNo AS 关联单据号, a.HMaker AS 制单人, a.HMakeDate AS 制单日期, a.HChecker AS 审核人, a.HCheckDate AS 审核日期, a.HUpDater AS 修改人, a.HUpDateDate AS 修改日期, a.HCloseMan AS 关闭人, a.HCloseDate AS 关闭日期, a.HDeleteMan AS 作废人, a.HDeleteDate AS 作废日期, a.HBillType from OA_WorkLinkBillMain a where HInterID = {HInterID} select * from Gy_UserClientIdRelation ", "OA_WorkLinkBillMain"); 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 sReturn = ""; if (oSystemParameter.ShowBill(ref sReturn) == true) { if (oSystemParameter.omodel.WMS_CampanyName == "华舟") { // 获取接收人和抄送人数组 string HReceiveMan = ds.Tables[0].Rows[0]["接收人"].ToString(); string[] HCopyManList = ds.Tables[0].Rows[0]["所有抄送人"].ToString().Split(','); // 推送给接收人 和 抄送人 List clientIDList = new List(); if (userClientIDDictionary.ContainsKey(HReceiveMan)) { clientIDList.AddRange(userClientIDDictionary[HReceiveMan]); } foreach(string HCopyMan in HCopyManList) { // 接收人 和 抄送人相同时, 不重复发送 if(HCopyMan == HReceiveMan) { continue; } if (userClientIDDictionary.ContainsKey(HCopyMan)) { clientIDList.AddRange(userClientIDDictionary[HCopyMan]); } } 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 // 单独推送 { // 获取接收人和抄送人数组 string HReceiveMan = ds.Tables[0].Rows[0]["接收人"].ToString(); string[] HCopyManList = ds.Tables[0].Rows[0]["抄送人"].ToString().Split(','); // 推送给接收人 和 抄送人 List clientIDList = new List(); if (userClientIDDictionary.ContainsKey(HReceiveMan)) { clientIDList.AddRange(userClientIDDictionary[HReceiveMan]); } foreach (string HCopyMan in HCopyManList) { if (userClientIDDictionary.ContainsKey(HCopyMan)) { clientIDList.AddRange(userClientIDDictionary[HCopyMan]); } } foreach (string clientID in clientIDList) { pushSuccess = PushMessageToSingle(template, clientID); } } if(!pushSuccess) { // 个推 推送不成功(内网环境) 使用webSocket进行推送 // TODO: 使用 rabbitMQ 实现消息队列 // WebSocketServer.PushOne(HInterID); } } } catch (Exception ex) { LogService.Write(ex.ToString()); return; } } // 单推 使用通知消息模型 private static bool PushMessageToSingle(NotificationTemplate template, string ClientID) { IGtPush push = new IGtPush(HOST, APPKEY, MASTERSECRET); // 单推消息模型 SingleMessage message = new SingleMessage(); message.IsOffline = true; // 用户当前不在线时,是否离线存储,可选 message.OfflineExpireTime = 1000 * 3600 * 12; // 离线有效时间,单位为毫秒,可选 message.Data = template; //判断是否客户端是否wifi环境下推送,2为4G/3G/2G,1为在WIFI环境下,0为不限制环境 //message.PushNetWorkType = 1; com.igetui.api.openservice.igetui.Target target = new com.igetui.api.openservice.igetui.Target(); target.appId = APPID; target.clientId = ClientID; //target.alias = ALIAS; try { String pushResult = push.pushMessageToSingle(message, target); LogService.Write("-----------------------------------------------"); LogService.Write("-----------------------------------------------"); LogService.Write("----------------服务端返回结果:" + pushResult); return true; } catch (RequestException e) { String requestId = e.RequestId; //发送失败后的重发 String pushResult = push.pushMessageToSingle(message, target, requestId); LogService.Write("-----------------------------------------------"); LogService.Write("-----------------------------------------------"); LogService.Write("----------------服务端返回结果:" + pushResult); return false; } } //透传模板动作内容 public static TransmissionTemplate TransmissionTemplateDemo() { TransmissionTemplate template = new TransmissionTemplate(); template.AppId = APPID; template.AppKey = APPKEY; //应用启动类型,1:强制应用启动 2:等待应用启动 template.TransmissionType = 1; //透传内容 template.TransmissionContent = "透传内容"; //设置通知定时展示时间,结束时间与开始时间相差需大于6分钟,消息推送后,客户端将在指定时间差内展示消息(误差6分钟) // String begin = "2015-03-06 14:36:10"; // String end = "2015-03-06 14:46:20"; // template.setDuration(begin, end); return template; } //通知透传模板动作内容 public static NotificationTemplate GetNotificationTemplate(string title, string content, string pagePath, string HItemID) { NotificationTemplate template = new NotificationTemplate(); template.AppId = APPID; template.AppKey = APPKEY; //通知栏标题 template.Title = title; //通知栏内容 template.Text = content; //通知栏显示本地图片 template.Logo = "@/static/logo.png"; //通知栏显示网络图标 template.LogoURL = ""; //应用启动类型,1:强制应用启动 2:等待应用启动 template.TransmissionType = 1; //透传内容 template.TransmissionContent = ""; //接收到消息是否响铃,true:响铃 false:不响铃 template.IsRing = true; //接收到消息是否震动,true:震动 false:不震动 template.IsVibrate = true; //接收到消息是否可清除,true:可清除 false:不可清除 template.IsClearable = true; var customData = new Dictionary { {"pagePath", pagePath}, {"itemId", HItemID} }; template.TransmissionContent = JsonConvert.SerializeObject(customData); // 序列化为 JSON 字符串 template.TransmissionType = 1; // 1=点击通知后触发客户端回调(透传内容给客户端) //设置通知定时展示时间,结束时间与开始时间相差需大于6分钟,消息推送后,客户端将在指定时间差内展示消息(误差6分钟) // String begin = "2015-03-06 14:36:10"; // String end = "2015-03-06 14:46:20"; // template.setDuration(begin, end); return template; } } }