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;
}
}
}