259 lines
13 KiB
C#
259 lines
13 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 微信推送相关业务逻辑
|
||
/// </summary>
|
||
public class WeChatPush
|
||
{
|
||
#region 方法 -> 微信公众号推送
|
||
/// <summary>
|
||
/// 微信公众号推送
|
||
/// </summary>
|
||
/// <param name="_Transaction">事务管理器</param>
|
||
/// <param name="bayonetModel">卡口流水model</param>
|
||
/// <returns></returns>
|
||
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<MSPB.RTWECHATPUSH> RTWECHATPUSHList = new List<MSPB.RTWECHATPUSH>();
|
||
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
|
||
/// <summary>
|
||
/// 获取通道参数access_token
|
||
/// </summary>
|
||
/// <param name="RefreshTime">AccessToken刷新间隔</param>
|
||
/// <param name="_WECHAT_APPID">微信公众号APPID</param>
|
||
/// <param name="_WECHAT_APPSECRET">微信公众号APPSECRET</param>
|
||
/// <returns></returns>
|
||
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 方法 -> 查询服务区内码和服务区名称
|
||
/// <summary>
|
||
/// 查询服务区内码和服务区名称
|
||
/// </summary>
|
||
/// <param name="dtServerpart">服务区数据源</param>
|
||
/// <param name="ServerpartId">服务区内码</param>
|
||
/// <param name="ServerpartName">服务区名称</param>
|
||
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中某个字符串的值
|
||
/// <summary>
|
||
/// 合并Datatable中某个字符串的值
|
||
/// </summary>
|
||
/// <param name="dataTable">数据源</param>
|
||
/// <param name="FieldName">字段名称</param>
|
||
/// <param name="SeparateStr">分隔符,默认为,</param>
|
||
/// <param name="SortStr">排序字段</param>
|
||
/// <returns></returns>
|
||
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
|
||
}
|
||
}
|