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