using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Web;
using SuperMap.RealEstate.Web.UI.WebControls;
using ServiceModel = SuperMap.RealEstate.ServiceModel;
using HWSB = SuperMap.RealEstate.HighWay.Storage.Business;
using MSPB = SuperMap.RealEstate.MobileServicePlatform.Business;
using ESCM = EShang.Common.Model;
using Newtonsoft.Json.Linq;
using HZQR.Common;
using RedisHelp;
namespace OpenApi.Method
{
///
/// 微信推送相关业务逻辑
///
public class WeChatPush
{
#region 方法 -> 微信公众号推送
///
/// 微信公众号推送
///
/// 事务管理器
/// 卡口流水model
///
public static string WeChat_SendMessage(ServiceModel.Transaction _Transaction, ESCM.BAYONETModel bayonetModel)
{
JObject info = new JObject();
string PushModuleName = "";
try
{
//获取微信公众号信息
MSPB.WECHATPUBLICSIGN _WECHATPUBLICSIGN = new MSPB.WECHATPUBLICSIGN(_Transaction);
_WECHATPUBLICSIGN.WECHATPUBLICSIGN_ID = 3;
if (_WECHATPUBLICSIGN.Select())
{
TextBoxEx RefreshTime = new TextBoxEx();
TextBoxEx AcessToken = new TextBoxEx();
//微信公众号名称
string _WECHATPUBLICSIGN_NAME = _WECHATPUBLICSIGN.WECHATPUBLICSIGN_NAME;
//微信公众号id
string _WECHATPUBLICSIGN_ID = _WECHATPUBLICSIGN.KeyID;
//微信公众号APPID
string _WECHAT_APPID = _WECHATPUBLICSIGN.WECHAT_APPID;
//微信公众号APPSECRET
string _WECHAT_APPSECRET = _WECHATPUBLICSIGN.WECHAT_APPSECRET;
//获取微信接口AcessToken
AcessToken.Text = GetAccessToken(RefreshTime, _WECHAT_APPID, _WECHAT_APPSECRET);
//获取稽核消息模板配置信息
MSPB.PUSHMODULE _PushModule = new MSPB.PUSHMODULE(_Transaction);
_PushModule.AddSearchParameter("WECHATPUBLICSIGN_ID", _WECHATPUBLICSIGN_ID);
_PushModule.AddSearchParameter("PUSHMODULE_NUM", "SafetyWarning");
if (_PushModule.Search())
{
PushModuleName = _PushModule.PUSHMODULE_NAME;
string ServerpartId = "", ServerpartName = bayonetModel.SERVERPART_NAME, RTWECHATPUSH_ID = "";
DataTable dtServerpart = new HWSB.SERVERPART(_Transaction).FillDataTable("WHERE PROVINCE_CODE = 3544");
DataRow drServerpart = GetServerpartId(dtServerpart, ref ServerpartId, ref ServerpartName);
if (drServerpart == null)
{
info["Result_Code"] = 100;
info["Result_Desc"] = PushModuleName + "推送错误:服务区不存在!";
return info.ToString();
}
//生成推送消息数据
MSPB.GROUPPUSHDETAIL _GROUPPUSHDETAIL = new MSPB.GROUPPUSHDETAIL(_Transaction);
_GROUPPUSHDETAIL.PUSH_TITLE = "有涉疫重点区车辆进入,请注意管理安全!";
_GROUPPUSHDETAIL.PUSH_FIRSTCONTENT = "涉疫重点区车辆入区";
_GROUPPUSHDETAIL.PUSH_SECONDCONTENT = DateTime.Now.ToString();
_GROUPPUSHDETAIL.PUSH_THIRDCONTENT = bayonetModel.SERVERPART_NAME + bayonetModel.SERVERPART_REGION + "区";
_GROUPPUSHDETAIL.PUSH_FOURTHCONTENT = bayonetModel.LICENSE_PLATE + "【" + bayonetModel.VEHICLE_TYPE + "】";
List RTWECHATPUSHList = new List();
string sql = string.Format(@"
SELECT
RTWECHATPUSH_ID
FROM
MOBILESERVICE_PLATFORM.T_RTWECHATPUSH A
WHERE
WECHATPUBLICSIGN_ID = {0} AND RTWECHATPUSH_STATE = 1 AND
EXISTS (SELECT 1 FROM T_RTWECAHTPUSHDTAIL B
WHERE A.RTWECHATPUSH_ID = B.RTWECHATPUSH_ID AND
RTWECAHTPUSHDTAIL_STATE = 1 AND PUSH_MODULE LIKE '%{1}%' AND
B.PROVINCE_CODE = 340000 AND ',' || NVL(B.SERVERPART_IDS,{2}) || ',' LIKE '%,{2},%')",
_WECHATPUBLICSIGN_ID, _PushModule.PUSHMODULE_CODE, ServerpartId);
DataTable dt = new MSPB.RTWECHATPUSH(_Transaction).ExecuteDataTable(sql);
//添加区域推送人员
if (drServerpart["SPREGIONTYPE_ID"].ToString() != "")
{
HWSB.SERVERPART _SERVERPART = new HWSB.SERVERPART(_Transaction);
_SERVERPART.AddSearchParameter("SPREGIONTYPE_ID", drServerpart["SPREGIONTYPE_ID"]);
_SERVERPART.AddSearchParameter("STATISTICS_TYPE", 1010);
if (_SERVERPART.Search())
{
sql = string.Format(@"
SELECT
RTWECHATPUSH_ID
FROM
MOBILESERVICE_PLATFORM.T_RTWECHATPUSH A
WHERE
WECHATPUBLICSIGN_ID = {0} AND RTWECHATPUSH_STATE = 1 AND
EXISTS (SELECT 1 FROM T_RTWECAHTPUSHDTAIL B
WHERE A.RTWECHATPUSH_ID = B.RTWECHATPUSH_ID AND GROUP_TYPE = 1020 AND
RTWECAHTPUSHDTAIL_STATE = 1 AND PUSH_MODULE LIKE '%{1}%' AND
B.PROVINCE_CODE = 340000 AND ',' || B.SERVERPART_IDS || ',' LIKE '%,{2},%')",
_WECHATPUBLICSIGN_ID, _PushModule.PUSHMODULE_CODE, _SERVERPART.KeyID);
dt.Merge(new MSPB.RTWECHATPUSH(_Transaction).ExecuteDataTable(sql));
}
}
if (dt.Rows.Count > 0)
{
RTWECHATPUSH_ID = JoinStrFromDataTable(dt, "RTWECHATPUSH_ID");
RTWECHATPUSHList = new MSPB.RTWECHATPUSH(_Transaction).FillCollection(string.Format(
"WHERE RTWECHATPUSH_ID IN ({0})", RTWECHATPUSH_ID));
}
if (RTWECHATPUSHList.Count > 0)
{
//给拥有权限的微信用户推送稽核信息提醒
foreach (MSPB.RTWECHATPUSH _RTWECHATPUSH in RTWECHATPUSHList)
{
LogUtil.WriteLog(null, PushModuleName + "推送人员:" + _RTWECHATPUSH.USER_NAME +
"【" + _RTWECHATPUSH.MOBILEPHONE_NUMBER + "】",
DateTime.Now.ToString("yyyyMMdd") + "_SafetyWarning");
//定义推送跳转页面地址
string JumpUrl = string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["BayonetUrl_AH"]) ? "" :
(ConfigurationManager.AppSettings["BayonetUrl_AH"] + "?id=" + bayonetModel.BAYONET_ID +
"&name=" + HttpUtility.UrlEncode(_RTWECHATPUSH.USER_NAME) +
"&phone=" + HttpUtility.UrlEncode(_RTWECHATPUSH.MOBILEPHONE_NUMBER));
//已传入推送小程序
MSPB.CommonHelper.StartToSend(_PushModule.PUSHMODULE_CODE, AcessToken, _RTWECHATPUSH,
_GROUPPUSHDETAIL, 4, RefreshTime, _WECHAT_APPID, _WECHAT_APPSECRET, JumpUrl);
//添加推送日志
MSPB.CommonHelper.AddPushLog(_Transaction, PushModuleName + "消息推送",
_RTWECHATPUSH.WECHAT_OPENID, _RTWECHATPUSH.USER_NAME, _RTWECHATPUSH.MOBILEPHONE_NUMBER, 1,
_GROUPPUSHDETAIL.PUSH_THIRDCONTENT + " " + _GROUPPUSHDETAIL.PUSH_FOURTHCONTENT, _WECHAT_APPID, "");
_Transaction.Commit();
}
}
}
}
info["Result_Code"] = 100;
info["Result_Desc"] = "推送完成!";
}
catch (Exception ex)
{
LogUtil.WriteLog(null, PushModuleName + "推送错误:" + ex.Message,
DateTime.Now.ToString("yyyyMMdd") + "_SafetyWarning");
info["Result_Code"] = 100;
info["Result_Desc"] = PushModuleName + "推送错误:" + ex.Message;
}
return info.ToString();
}
#endregion
#region 方法 -> 获取通道参数access_token
///
/// 获取通道参数access_token
///
/// AccessToken刷新间隔
/// 微信公众号APPID
/// 微信公众号APPSECRET
///
public static string GetAccessToken(TextBoxEx RefreshTime, string _WECHAT_APPID, string _WECHAT_APPSECRET)
{
string Access_Token = "";
try
{
RedisHelper redisHelper = new RedisHelper(7);
//判断对应键值在缓存中是否存在,若存在直接从缓存取数据
if (redisHelper.KeyExists("AccessTokenWithAPPID" + _WECHAT_APPID))
{
Access_Token = redisHelper.StringGet("AccessTokenWithAPPID" + _WECHAT_APPID);//从缓存中取出AccessToken
if (!string.IsNullOrEmpty(Access_Token))
{
return Access_Token;
}
}
//若以上没从缓存中取到有效数据,则调用微信接口获取AccessToken
Access_Token = MSPB.CommonHelper.GetAccess(RefreshTime, _WECHAT_APPID, _WECHAT_APPSECRET);
//将token存入缓存中
redisHelper.StringSet("AccessTokenWithAPPID" + _WECHAT_APPID, Access_Token);
return Access_Token;
}
catch (Exception ex)
{
ex = ex ?? ex.InnerException;
SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "GetAccessToken", "");
return Access_Token;
}
}
#endregion
#region 方法 -> 查询服务区内码和服务区名称
///
/// 查询服务区内码和服务区名称
///
/// 服务区数据源
/// 服务区内码
/// 服务区名称
public static DataRow GetServerpartId(DataTable dtServerpart, ref string ServerpartId, ref string ServerpartName)
{
DataRow drServerpart = null;
if (dtServerpart.Select("SERVERPART_NAME = '" + ServerpartName + "服务区'").Length > 0)
{
drServerpart = dtServerpart.Select("SERVERPART_NAME = '" + ServerpartName + "服务区'")[0];
ServerpartId = drServerpart["SERVERPART_ID"].ToString();
ServerpartName = drServerpart["SERVERPART_NAME"].ToString();
}
else if (dtServerpart.Select("SERVERPART_NAME like '" + ServerpartName + "%'").Length > 0)
{
drServerpart = dtServerpart.Select("SERVERPART_NAME like '" + ServerpartName + "%'")[0];
ServerpartId = drServerpart["SERVERPART_ID"].ToString();
ServerpartName = drServerpart["SERVERPART_NAME"].ToString();
}
return drServerpart;
}
#endregion
#region 方法 -> 合并Datatable中某个字符串的值
///
/// 合并Datatable中某个字符串的值
///
/// 数据源
/// 字段名称
/// 分隔符,默认为,
/// 排序字段
///
public static string JoinStrFromDataTable(DataTable dataTable, string FieldName,
string SeparateStr = ",", string SortStr = "")
{
string JoinStr = "";
foreach (DataRow dataRow in dataTable.Select("", SortStr))
{
JoinStr += (JoinStr == "" ? "" : SeparateStr) + dataRow[FieldName];
}
return JoinStr;
}
#endregion
}
}