2025-03-28 09:49:56 +08:00

259 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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