using System;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.DirectoryServices;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.ComponentModel;
namespace WebService.SDK
{
public class CommonHelper
{
#region 方法 -> 数据枚举
public enum ResCode
{
成功 = 100,
订单待支付 = 101,
审核中商品有效 = 102,
审核中商品无效 = 103,
审核中业态有误 = 104,
单据已接收 = 105,
单据已入库 = 106,
请求参数错误 = 201,
安全验证不通过 = 202,
会员已经注销 = 203,
登录失败, 用户名或密码错误 = 204,
用户不存在 = 205,
本门店数据未下发 = 206,
余额不足 = 300,
转入退款 = 301,
未支付 = 302,
已关闭 = 303,
已撤销 = 304,
支付失败 = 305,
系统异常 = 999
}
public enum ResCode_Check
{
成功 = 100,
等待生成 = 101,
门店不存在 = 201,
门店存在调拨退货业务 = 300,
门店正在盘存 = 301,
有未校验的结账信息 = 302,
有未扣除库存的单品信息 = 303,
结账信息未上传 = 304,
系统异常 = 999
}
///
/// 移动支付提供商
///
public enum MobilePayOperators
{
///
/// 测试渠道
///
[Description("测试渠道")]
ceshi = 1000,
///
/// 富友
///
[Description("富友")]
fuiou = 1001,
///
/// 众码付
///
[Description("众码付")]
zhongmapay = 1002,
///
/// 威付通
///
[Description("威付通")]
swiftpass = 1003,
///
/// 付付
///
[Description("付付")]
ffdzpay = 1004,
///
/// 客无忧
///
[Description("客无忧")]
kwypay = 1005,
///
/// 通联支付
///
[Description("通联支付")]
allinpay = 1006,
///
/// 银联支付
///
[Description("银联支付")]
unionpay = 1007,
///
/// 联动优势
///
[Description("联动优势")]
irichpay = 1008,
///
/// 建设银行
///
[Description("建设银行")]
ccbpay = 1009,
///
/// 贵州农信
///
[Description("贵州农信")]
gznxpay = 1010,
///
/// 工商银行
///
[Description("工商银行")]
icbcpay = 1011,
///
/// 重庆嗨客
///
[Description("重庆嗨客")]
uphicoo = 1012
}
///
/// 合作商户
///
public enum Coop_Merchant
{
///
/// 海鼎
///
[Description("海鼎")]
heading = 1001
}
#endregion
#region 方法 -> 获取订单状态
public static string GetResult_Code(string trade_state)
{
switch (trade_state)
{
case "SUCCESS":
return "100";
case "REFUND":
return "100";
case "USERPAYING":
return "101";
case "NOTPAY":
return "302";
case "CLOSED":
return "303";
case "REVOKED":
return "304";
case "PAYERROR":
return "305";
default:
return "参数错误";
}
}
public static string get_reqmsg(string resstring)
{
switch (resstring)
{
case "0":
return "未支付";
case "1":
return "SUCCESS";
case "2":
return "支付失败";
case "3":
return "已退款";
default:
return "参数错误";
}
}
public static string get_refundreqmsg(string resstring)
{
switch (resstring)
{
case "1":
return "创建订单";
case "2":
return "下单成功";
case "3":
return "下单失败";
case "4":
return "支付成功";
case "5":
return "支付失败";
case "6":
return "退款";
default:
return "参数错误";
}
}
public static string GetPayType(string PayType)
{
switch (PayType.ToUpper())
{
case "ALIPAY":
return "支付宝";
case "WECHAT":
return "微信";
case "JDPAY":
return "京东";
case "QQPAY":
return "QQ钱包";
case "UNIONPAY":
return "银联";
case "BESTPAY":
return "翼支付";
default:
return "";
}
}
#endregion
#region 方法 -> 检查IP地址格式
///
/// 检查IP地址格式
///
///
///
public static bool IsIP(string ip)
{
return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
#endregion
#region 方法 -> DataTable相关
///
/// 获取列名
///
///
///
public static string SqlColumns(DataTable Table)
{
string _Columnsstr = "";
foreach (DataColumn col in Table.Columns)
{
_Columnsstr += (_Columnsstr == "" ? col.ColumnName : "," + col.ColumnName);
}
return _Columnsstr;
}
///
/// 获取行值
///
///
///
///
public static string SqlValues(DataTable Table, DataRow Row)
{
string _valuesstr = "";
for (int i = 0; i < Table.Columns.Count; i++)
{
if (Table.Columns[i].DataType.ToString() == "System.Decimal")
{
_valuesstr += _valuesstr == "" ? (Row[Table.Columns[i]].ToString() == "" ? "NULL" : Row[Table.Columns[i]].ToString()) : "," +
(Row[Table.Columns[i]].ToString() == "" ? "NULL" : Row[Table.Columns[i]].ToString());
}
else if (Table.Columns[i].DataType.ToString() == "System.DateTime")
{
_valuesstr += _valuesstr == "" ? (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "TO_DATE('" + Row[Table.Columns[i]].ToString() +
"','YYYY/MM/DD HH24:MI:SS')") : "," + (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "TO_DATE('" +
Row[Table.Columns[i]].ToString() + "','YYYY/MM/DD HH24:MI:SS')");
}
else
{
try
{
DateTime.Parse(Row[Table.Columns[i]].ToString());
_valuesstr += _valuesstr == "" ? (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "TO_DATE('" + Row[Table.Columns[i]].ToString() +
"','YYYY/MM/DD HH24:MI:SS')") : "," + (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "TO_DATE('" +
Row[Table.Columns[i]].ToString() + "','YYYY/MM/DD HH24:MI:SS')");
}
catch
{
_valuesstr += _valuesstr == "" ? (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "'" + Row[Table.Columns[i]].ToString()) + "'" :
"," + (Row[Table.Columns[i]].ToString() == "" ? "NULL" : "'" + Row[Table.Columns[i]].ToString() + "'");
}
}
}
return _valuesstr;
}
///
/// 转换DataTable字段类型
///
///
///
public static DataTable ConvertOraclTableToDoNetTable(DataTable table)
{
DataTable dt = new DataTable();
foreach (DataColumn dc in table.Columns)
{
DataColumn column = new DataColumn();
column.DataType = GetDataType(dc.DataType);
column.ColumnName = dc.ColumnName;
column.Caption = dc.Caption;
dt.Columns.Add(column);
}
dt.TableName = table.TableName;
dt.Merge(table, false, MissingSchemaAction.Ignore);
return dt;
}
///
/// 字段类型
///
///
///
public static Type GetDataType(Type dataType)
{
switch (dataType.ToString())
{
case "System.Double":
return System.Type.GetType("System.Decimal");
case "System.Int32":
return System.Type.GetType("System.Decimal");
case "System.Int16":
return System.Type.GetType("System.Decimal");
case "System.Int64":
return System.Type.GetType("System.Decimal");
default:
return dataType;
}
}
#endregion
#region 方法 -> 发送消息
public static void StartToSend(string AppID, string AppSecret, string SendType, string access_token,
DataTable RTWECHATPUSHList, string PUSHMODULE, DataTable _DataTable = null, string Order_Type = "")
{
string result = "", postDataStr = "", ErrorString = "", url = "", NowTime = DateTime.Now.ToString();
try
{
if (_DataTable.Rows.Count > 0)
{
foreach (DataRow _RTWECHATPUSH in RTWECHATPUSHList.Rows)
{
switch (SendType)
{
case "Checkout_Success":
postDataStr = GetJsonString(SendType, _RTWECHATPUSH["WECHAT_OPENID"].ToString(),
"http://cloud.eshangtech.com:8000/chengKe/index.html?TICKET_CODE=" +
_DataTable.Rows[0]["TICKET_CODE"].ToString(),
_RTWECHATPUSH, PUSHMODULE, _DataTable, _DataTable.Rows[0], Order_Type);
break;
case "NewOrder":
postDataStr = GetJsonString(SendType, _RTWECHATPUSH["WECHAT_OPENID"].ToString(),
"http://cloud.eshangtech.com:8000/chengKe_vip/index.html?TICKET_CODE=" +
_DataTable.Rows[0]["PURCHASE_DESC"].ToString(),
_RTWECHATPUSH, PUSHMODULE, _DataTable, _DataTable.Rows[0], Order_Type);
break;
}
try
{
url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
result = HttpPost(url, postDataStr);
}
catch (Exception ex)
{
LogHelper.WriteReceiveLog(ex.Message);
}
JObject _JObject = (JObject)JsonConvert.DeserializeObject(result);
if (_JObject["errcode"].ToString() != "0")
{
string _Message = "";
_Message = "错误代码:" + _JObject["errcode"].ToString() +
",错误原因:" + _JObject["errmsg"].ToString();
LogHelper.WriteSendLog(_Message);
if (_JObject["errcode"].ToString() == "40001")
{
GetAccess(AppID, AppSecret);
try
{
url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
result = HttpPost(url, postDataStr);
}
catch (Exception ex)
{
LogHelper.WriteReceiveLog(ex.Message);
}
_JObject = (JObject)JsonConvert.DeserializeObject(result);
if (_JObject["errcode"].ToString() != "0")
{
ErrorString += (ErrorString == "" ? "" : ",") + _RTWECHATPUSH["USER_NAME"].ToString();
_Message = "错误代码:" + _JObject["errcode"].ToString() +
",错误原因:" + _JObject["errmsg"].ToString();
LogHelper.WriteReceiveLog(_Message);
}
else
{
break;
}
}
else
{
ErrorString += (ErrorString == "" ? "" : ",") + _RTWECHATPUSH["USER_NAME"].ToString();
}
}
}
switch (SendType)
{
case "Checkout_Success":
if (ErrorString == "" && _DataTable.Rows.Count > 0)
{
LogHelper.WriteSendLog("订单付款成功通知发送成功!");
LogHelper.DeleteFiles("日志_Send*.log");
}
else if (ErrorString != "")
{
LogHelper.WriteSendLog("以下用户:" + ErrorString + "订单付款成功通知发送失败!");
}
break;
case "NewOrder":
if (ErrorString == "" && _DataTable.Rows.Count > 0)
{
LogHelper.WriteSendLog("新订单通知发送成功!");
LogHelper.DeleteFiles("日志_Send*.log");
}
else if (ErrorString != "")
{
LogHelper.WriteSendLog("以下用户:" + ErrorString + "新订单通知发送失败!");
}
break;
}
}
}
catch (Exception ex)
{
LogHelper.WriteSendLog(ex.Message);
}
}
#endregion
#region 方法 -> Get方式获取参数
public static string HttpPost(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(postDataStr);
writer.Flush();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
if (encoding == null || encoding.Length < 1)
{
encoding = "UTF-8"; //默认编码
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
string retString = reader.ReadToEnd();
return retString;
}
#endregion
#region 方法 -> 获取通道秘钥
public static string GetAccess(string AppID, string AppSecret)
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
AppID + "&secret=" + AppSecret;
//根据url创建HttpWebRequest对象
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Method = "get";
//读取服务器返回信息
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
//using作为语句,用于定义一个范围,在此范围的末尾将释放对象
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
//ReadToEnd适用于小文件的读取,一次性的返回整个文件
JObject _JObject = (JObject)JsonConvert.DeserializeObject(sr.ReadToEnd());
try
{
string access_token = _JObject["access_token"].ToString(),
LastTime = _JObject["expires_in"].ToString();
return access_token;
}
catch (Exception ex)
{
LogHelper.WriteReceiveLog(ex.Message);
string Message = "错误代码:" + _JObject["errcode"].ToString() + ",错误原因:" + _JObject["errmsg"].ToString();
LogHelper.WriteReceiveLog(Message);
return "";
}
finally
{
sr.Close();
}
}
}
#endregion
#region 方法 -> 获取json数据
public static string GetJsonString(string SendType, string openid, string url,
DataRow RTWECHATPUSH, string PUSHMODULE, DataTable _DataTable, DataRow _DataRow, string Order_Type = "")
{
string result = "", data = "", dataString = "";
switch (SendType)
{
#region 付款成功通知
case "Checkout_Success":
//首行内容
data += "\"first\": {\"value\":\"" + (string.IsNullOrEmpty(RTWECHATPUSH["PUSH_TITLE"].ToString()) ?
(RTWECHATPUSH["USER_NAME"].ToString() == "" ? "" : RTWECHATPUSH["USER_NAME"].ToString() + ",您已下单成功!\\n") :
RTWECHATPUSH["PUSH_TITLE"].ToString() + "\\n") + "\",\"color\":\"#fc6e4b\"},";
//固定内容
data += "\"keyword1\": {\"value\":\"" + _DataRow["TICKET_CODE"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword2\": {\"value\":\"" + _DataRow["CONSUMPTIONRECORD_DATE"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword3\": {\"value\":\"" + _DataRow["CONSUME_PRICE"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword4\": {\"value\":\"" + Order_Type + "\",\"color\":\"#173177\"},";
if (string.IsNullOrEmpty(RTWECHATPUSH["PUSH_LASTCONTENT"].ToString()))
{
dataString = "\\n您的商品正在为你火速配货并马不停蹄地向你赶来,请耐心等待...";
}
else
{
dataString = "\\n" + RTWECHATPUSH["PUSH_LASTCONTENT"].ToString();
}
data += "\"remark\": {\"value\":\"" + dataString + "\",\"color\":\"#fc6e4b\"}";
result += "{\"touser\":\"" + openid + "\",\"template_id\":\"" + PUSHMODULE +
"\",\"url\":\"" + url + "\",\"data\":{";
break;
#endregion
#region 新订单通知
case "NewOrder":
//首行内容
data += "\"first\": {\"value\":\"" + (string.IsNullOrEmpty(RTWECHATPUSH["PUSH_TITLE"].ToString()) ?
(RTWECHATPUSH["USER_NAME"].ToString() == "" ? "" : RTWECHATPUSH["USER_NAME"].ToString() +
",您的店铺有新订单产生!\\n") : RTWECHATPUSH["PUSH_TITLE"].ToString() + "\\n") + "\",\"color\":\"#fc6e4b\"},";
//固定内容
data += "\"keyword1\": {\"value\":\"" + _DataRow["SERVERPARTSHOP_NAME"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword2\": {\"value\":\"" + (_DataTable.Rows.Count == 1 ? _DataRow["COMMODITY_NAME"].ToString() :
_DataRow["COMMODITY_NAME"].ToString() + "等共" + _DataRow["RECORD_COUNT"].ToString() + "种商品") +
"\",\"color\":\"#173177\"},";
data += "\"keyword3\": {\"value\":\"" + _DataRow["RESERVE_DATE"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword4\": {\"value\":\"" + _DataRow["PURCHASE_TOTALPRICE"].ToString() + "\",\"color\":\"#173177\"},";
data += "\"keyword5\": {\"value\":\"已付款\",\"color\":\"#173177\"},";
if (string.IsNullOrEmpty(RTWECHATPUSH["PUSH_LASTCONTENT"].ToString()))
{
dataString = "\\n呼叫~呼叫~有新的订单到~需要尽快配送...";
}
else
{
dataString = "\\n" + RTWECHATPUSH["PUSH_LASTCONTENT"].ToString();
}
data += "\"remark\": {\"value\":\"" + dataString + "\",\"color\":\"#fc6e4b\"}";
result += "{\"touser\":\"" + openid + "\",\"template_id\":\"" + PUSHMODULE +
"\",\"url\":\"" + url + "\",\"data\":{";
break;
#endregion
}
return result + data + "}}";
}
#endregion
#region 对象 -> 通用对象
///
/// 通用对象
///
/// 返回结果
/// 参数1
/// 参数2
/// 参数3
/// 参数4
/// 参数5
/// 备注信息
public class ResultObject
{
public string ResultCode
{
get;
set;
}
public string FirstParameter
{
get;
set;
}
public string SecondParameter
{
get;
set;
}
public string ThirdParameter
{
get;
set;
}
public string FourthParameter
{
get;
set;
}
public string FifthParameter
{
get;
set;
}
public string ResultDesc
{
get;
set;
}
}
#endregion
#region 方法 -> 存储文件
public static void SaveTextFile(string LogName, string LogData, int Type = 0)
{
//LogData = DateTime.Now.ToLongTimeString() + ":" + LogData;
if (string.IsNullOrEmpty(LogName))
{
LogName = "日志_Send" + System.DateTime.Now.Year.ToString() + "-" + System.DateTime.Now.Month.ToString() +
"-" + System.DateTime.Now.Day.ToString() + ".log";
}
string filename = Type == 1 ? LogName : System.AppDomain.CurrentDomain.BaseDirectory + "\\" + LogName;
FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);
fs.Seek(0, SeekOrigin.End);
if (!string.IsNullOrEmpty(LogData))
{
byte[] _data = new UTF8Encoding().GetBytes(LogData + "\r\n");
fs.Write(_data, 0, _data.Length);
}
fs.Flush();
fs.Close();
}
#endregion
#region 方法 -> 获取指定端口的站点名称及物理路径
///
/// 获取指定端口的站点名称及物理路径
///
/// 站点端口
///
public static Hashtable GetWebPathAndWebName(string PortNum)
{
Hashtable ht = new Hashtable();
Regex regex = new Regex(PortNum);
string tmpStr;
DirectoryEntry rootIISEntry = new DirectoryEntry("IIS://localhost/w3svc");
foreach (DirectoryEntry entry in rootIISEntry.Children)
{
if (entry.SchemaClassName == "IIsWebServer")
{
if (entry.Properties["ServerBindings"].Value != null)
{
tmpStr = entry.Properties["ServerBindings"].Value.ToString();
if (regex.Match(tmpStr).Success)
{
ht.Add("name", entry.Properties["ServerComment"].Value.ToString());
ht.Add("path", GetWebsitePhysicalPath(entry));
break;
}
}
}
}
return ht;
}
#endregion
#region 方法 -> 获取网站的物理路径
///
/// 得到网站的物理路径
///
/// 网站节点
///
public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)
{
string physicalPath = "";
foreach (DirectoryEntry childEntry in rootEntry.Children)
{
if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))
{
if (childEntry.Properties["Path"].Value != null)
{
physicalPath = childEntry.Properties["Path"].Value.ToString();
}
else
{
physicalPath = "";
}
}
}
return physicalPath;
}
#endregion
#region 方法 -> HttpUrlPost
///
/// 通过POST方式进行HTTP请求
///
/// 发送的数据
/// 请求地址
///
public static string HttpUrlPost(string str, string RequestUrl)
{
string res = HttpUrlPost(str, RequestUrl, "application/x-www-form-urlencoded");
return res;
}
///
/// 通过POST方式进行HTTP请求
///
/// 发送的数据
/// 请求地址
/// HTTP标头类型
///
public static string HttpUrlPost(string str, string RequestUrl, string ContentType)
{
string res = HttpUrlPost(str, RequestUrl, ContentType, 0);
return res;
}
///
/// 通过POST方式进行HTTP请求
///
/// 发送的数据
/// 请求地址
/// HTTP标头类型
/// 超时时间
///
public static string HttpUrlPost(string str, string RequestUrl, string ContentType, int timeout)
{
string res = HttpUrlPost(str, RequestUrl, ContentType, timeout, Encoding.UTF8);
return res;
}
///
/// 通过POST方式进行HTTP请求
///
/// 发送的数据
/// 请求地址
/// HTTP标头类型
/// 超时时间
/// 字符编码类型
///
public static string HttpUrlPost(string str, string RequestUrl, string ContentType, int timeout, Encoding encoding)
{
string res = HttpUrlPost(str, RequestUrl, ContentType, timeout, encoding, true);
return res;
}
///
/// 通过POST方式进行HTTP请求
///
/// 发送的数据
/// 请求地址
/// HTTP标头类型
/// 超时时间
/// 字符编码类型
/// 是否使用Expect:100-Continue
/// 调用Java服务接口报500错误时,请传false
///
public static string HttpUrlPost(string str, string RequestUrl, string ContentType, int timeout, Encoding encoding, bool expect100Continue)
{
try
{
System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
byte[] postBytes = encoding.GetBytes(str);
// 设置提交的相关参数
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
| SecurityProtocolType.Tls
| (SecurityProtocolType)0x300 //Tls11
| (SecurityProtocolType)0xC00; //Tls12
System.Net.HttpWebRequest request = System.Net.WebRequest.Create(RequestUrl) as System.Net.HttpWebRequest;
if (timeout > 0)
{
request.Timeout = timeout * 1000;
}
request.ServicePoint.Expect100Continue = expect100Continue;
request.Method = "POST";
request.KeepAlive = false;
request.ContentType = ContentType;
request.CookieContainer = cookieContainer;
request.ContentLength = postBytes.Length;
using (System.IO.Stream reqStream = request.GetRequestStream())
{
//LogHelper.WriteSendLog("==开始写数据==");
reqStream.Write(postBytes, 0, postBytes.Length);
//LogHelper.WriteSendLog("==写入完成==");
}
using (System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
{
//在这里对接收到的页面内容进行处理
//直到request.GetResponse()程序才开始向目标网页发送post请求
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, encoding);
string val = reader.ReadToEnd();
return val;
}
}
catch (WebException ex)
{
//var pageContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
//LogHelper.WriteSendLog($"交易请求失败:[{RequestUrl}]{ex.Message}");
return ex.Message;
}
}
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
#endregion
#region 方法 -> 签名算法、时间字符串转换
public static string GetMD5(string s)
{
MD5 _MD5 = new MD5CryptoServiceProvider();
byte[] t = _MD5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes(s));
StringBuilder sb = new StringBuilder(32);
for (int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
///
/// 参数签名
///
/// 待签名参数集
/// 签名密钥
///
public static string ParamSign(Dictionary signParm, string MD5code, string MD5Key)
{
var list = signParm.OrderBy(s => s.Key);
string str = "";
foreach (var ss in list)
{
if (!string.IsNullOrEmpty(ss.Value))
{
str += ss.Key + "=" + ss.Value + "&";
}
}
str = str.Trim('&');
if (!string.IsNullOrEmpty(MD5code))
{
str += "&code=" + MD5code;
}
if (!string.IsNullOrEmpty(MD5Key))
{
str += "&key=" + MD5Key;
}
str = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str))).Replace("-", "").ToUpper();
return str;
}
public static string paramsToString(Dictionary dic)
{
string str = String.Empty;
foreach (var e in dic)
{
str += e.Key + "=" + e.Value + "&";
}
str = str.TrimEnd('&');
return str;
}
///
/// 将DateTime类型转换为long类型
///
/// 时间
///
public static long ConvertDataTimeLong(DateTime dt)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
TimeSpan toNow = dt.Subtract(dtStart);
long timeStamp = toNow.Ticks;
timeStamp = long.Parse(timeStamp.ToString().Substring(0, timeStamp.ToString().Length - 7));
return timeStamp;
}
///
/// 将Long类型转换为DateTime类型
///
/// long
/// s
public static DateTime ConvertLongDateTime(long d)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(d + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
DateTime dtResult = dtStart.Add(toNow);
return dtResult;
}
#endregion
#region 方法 -> 获取线上订单
public static string GetSaleBill(OracleHelper OracleHelper, string ServerpartCode, string ShopCode, string SaleBillID, string ProvinceCode)
{
DataTable SaleBill_List = null, SaleDetail_List = null;
DataSet _DataSet = new DataSet();
try
{
if (!string.IsNullOrEmpty(ServerpartCode) && !string.IsNullOrEmpty(ShopCode))
{
string _SqlString = @"SELECT SALEBILL_ID,SALEBILL_CODE,MEMBERSHIP_ID,SALEBILL_TYPE,
TABLE_NUMBER,TAKE_TYPE,PROVINCE_CODE,SERVERPART_ID,SERVERPART_CODE,SERVERPART_NAME,
SERVERPARTSHOP_ID,SHOPCODE,SHOPNAME,ORDER_PERSON,ORDER_PERSONTEL,ORDER_DATE,
RESERVATION_DATE,RECORD_COUNT,TOTAL_COUNT,ORDER_AMOUNT,SALEBILL_STATE,SALEBILL_DESC
FROM MOBILESERVICE_PLATFORM.T_SALEBILL WHERE PROVINCE_CODE = " + ProvinceCode +
" AND SERVERPART_CODE = '" + ServerpartCode + "' AND SHOPCODE = '" + ShopCode +
"' AND SALEBILL_STATE = 1010" + (SaleBillID == "0" ? "" : " AND SALEBILL_ID > " + SaleBillID);
SaleBill_List = OracleHelper.ExcuteSqlGetDataSet(_SqlString, "T_SALEBILL").Tables[0];
_DataSet.Tables.Add(SaleBill_List.Copy());
string sqlwhere = "SELECT SALEBILL_ID FROM MOBILESERVICE_PLATFORM.T_SALEBILL WHERE PROVINCE_CODE = " +
ProvinceCode + " AND SERVERPART_CODE = '" + ServerpartCode + "' AND SHOPCODE = '" + ShopCode +
"' AND SALEBILL_STATE = 1010" + (SaleBillID == "0" ? "" : " AND SALEBILL_ID > " + SaleBillID);
string _SqlStr = string.Format("SELECT * FROM MOBILESERVICE_PLATFORM.T_SALEDETAIL WHERE SALEBILL_ID IN ({0})", sqlwhere);
SaleDetail_List = OracleHelper.ExcuteSqlGetDataSet(_SqlStr, "T_SALEDETAIL").Tables[0];
_DataSet.Tables.Add(SaleDetail_List.Copy());
}
}
catch (Exception ex)
{
LogHelper.WriteSendLog(ex.ToString());
}
return JSonHelper.DataSetToJsons(_DataSet);
}
#endregion
#region 方法 -> 获取主订单信息
public static string GetSaleBillInfo(OracleHelper OracleHelper, string ServerpartCode, string ShopCode,
string SaleBillID, string ProvinceCode)
{
DataTable SaleBill_List = null;
try
{
string _SqlString = @"SELECT SALEBILL_ID,SALEBILL_CODE,MEMBERSHIP_ID,SALEBILL_TYPE,
TABLE_NUMBER,TAKE_TYPE,PROVINCE_CODE,SERVERPART_ID,SERVERPART_CODE,SERVERPART_NAME,
SERVERPARTSHOP_ID,SHOPCODE,SHOPNAME,ORDER_PERSON,ORDER_PERSONTEL,ORDER_DATE,
RECORD_COUNT,TOTAL_COUNT,ORDER_AMOUNT,SALEBILL_STATE,SALEBILL_DESC
FROM MOBILESERVICE_PLATFORM.T_SALEBILL WHERE PROVINCE_CODE = " + ProvinceCode +
" AND SERVERPART_CODE = '" + ServerpartCode + "' AND SHOPCODE = '" + ShopCode +
"' AND SALEBILL_ID IN (" + SaleBillID + ")";
SaleBill_List = OracleHelper.ExcuteSqlGetDataSet(_SqlString, "T_SALEBILL").Tables[0];
}
catch (Exception ex)
{
LogHelper.WriteSendLog(ex.ToString());
}
return JSonHelper.DataTableToJson(SaleBill_List);
}
#endregion
#region 方法 -> 更新线上主订单状态
public static string UpdateSaleBill(OracleHelper OracleHelper, string SaleBillId, string SaleBillState)
{
string _Result = "", _updatesql = "";
List _ListSQL = new List();
if (!string.IsNullOrEmpty(SaleBillId) && !string.IsNullOrEmpty(SaleBillState))
{
_updatesql = "UPDATE MOBILESERVICE_PLATFORM.T_SALEBILL SET SALEBILL_STATE = " + SaleBillState +
" WHERE SALEBILL_ID IN (" + SaleBillId + ")";
_ListSQL.Add(_updatesql);
try
{
OracleHelper.ExecuteSqlTran(_ListSQL);
_Result = "9";
}
catch (Exception ex)
{
_Result = "订单更新失败";
LogHelper.WriteSendLog(ex.Message);
}
}
else
{
_Result = "0";
}
return _Result;
}
#endregion
#region 方法 -> 更新线上详细订单状态
public static string UpdateSaleDetail(OracleHelper OracleHelper, string SaleDetailId, string SaleBillState)
{
string _Result = "", _updatesql = "";
List _ListSQL = new List();
if (!string.IsNullOrEmpty(SaleDetailId) && !string.IsNullOrEmpty(SaleBillState))
{
_updatesql = "UPDATE MOBILESERVICE_PLATFORM.T_SALEDETAIL SET SALEBILL_STATE = " + SaleBillState +
" WHERE SALEDETAIL_ID IN (" + SaleDetailId + ")";
_ListSQL.Add(_updatesql);
try
{
OracleHelper.ExecuteSqlTran(_ListSQL);
_Result = "9";
}
catch (Exception ex)
{
_Result = "订单更新失败";
LogHelper.WriteSendLog(ex.Message);
}
}
else
{
_Result = "0";
}
return _Result;
}
#endregion
#region 方法 -> 检测表是否存在
public static void TableExists(OracleHelper _OracleHelper, string UserName, string TableName, string CreateTableSql)
{
//是否存在表
DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet("SELECT 1 FROM DBA_TABLES WHERE OWNER = '" +
UserName + "' AND TABLE_NAME = '" + TableName + "'").Tables[0];
if (_DataTable.Rows.Count == 0)
{
_OracleHelper.ExcuteSql(CreateTableSql);
}
}
public static void SequenceExists(OracleHelper _OracleHelper, string UserName, string SequenceName)
{
//是否存在序列
DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet("SELECT 1 FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER = '" +
UserName + "' AND SEQUENCE_NAME = '" + SequenceName + "'").Tables[0];
if (_DataTable.Rows.Count == 0)
{
_OracleHelper.ExcuteSql("CREATE SEQUENCE " + UserName + "." + SequenceName +
" INCREMENT BY 1 START WITH 1 NOMAXVALUE NOMINVALUE NOCYCLE CACHE 2 NOORDER");
}
}
#endregion
#region 方法 -> 概率抽奖算法
///
/// 获取抽奖结果
///
/// 各等级中奖概率组
/// 默认中奖等级
/// 返回中奖等级
public static int GetLevel(float[] prob, int defaultLevel = 0)
{
int result = defaultLevel;
int n = (int)(prob.Sum() * 1000); //计算概率总和,放大1000倍
Random _Random = new Random(Guid.NewGuid().GetHashCode());
float x = (float)_Random.Next(0, n) / 1000; //随机生成0~概率总和的数字
for (int i = 0; i < prob.Count(); i++)
{
float pre = prob.Take(i).Sum(); //区间下界
float next = prob.Take(i + 1).Sum(); //区间上界
if (x >= pre && x < next) //如果在该区间范围内,就返回结果退出循环
{
result = i;
break;
}
}
return result;
}
///
/// 获取中奖金额[单位:分]
///
/// 奖金金额区间组[单位:分]
/// 例:int[4]{ 1, 50, 200, 800 }
/// 各等级中奖概率组
/// 例:float[3] { 0.330f, 0.660f, 0.010f }
/// 默认中奖等级
///
public static int GetBonusAmount(int[] bonusInterval, float[] prob, int defaultLevel = 0)
{
Random _Random = new Random(Guid.NewGuid().GetHashCode());
int _BonusLevel = GetLevel(prob, defaultLevel); //获取中奖等级
int target = (bonusInterval[_BonusLevel + 1] - bonusInterval[_BonusLevel] + 1) * 10; //获取中奖等级区间金额
return _Random.Next(target) / 10 + bonusInterval[_BonusLevel]; //返回实际中奖金额
}
///
/// 获取随机数组
///
///
///
///
///
public static int[] getRandomNum(int num, int minValue, int maxValue)
{
Random ra = new Random(Guid.NewGuid().GetHashCode());
int[] arrNum = new int[num];
int tmp = 0;
for (int i = 0; i <= num - 1; i++)
{
tmp = ra.Next(minValue, maxValue); //随机取数
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //取出值赋到数组中
}
return arrNum;
}
public static int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
int n = 0;
while (n <= arrNum.Length - 1)
{
if (arrNum[n] == tmp) //利用循环判断是否有重复
{
tmp = ra.Next(minValue, maxValue); //重新随机获取。
getNum(arrNum, tmp, minValue, maxValue, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
}
#endregion
#region 方法 -> 电子码校验
///
/// 电子码校验
///
/// 待校验数字电子码
/// 最小长度
///
public static bool ECodeCheck(string memberECode, int minLength = 20)
{
try
{
decimal.Parse(memberECode);
}
catch
{
return false;
}
//判断扫入的电子码
if (memberECode.Length >= minLength)
{
decimal num1 = 0;
decimal num2 = 0;
for (int i = 0; i < memberECode.Length; i++)
{
if (((memberECode.Length - (i + 1)) % 2) == 0)
{
num1 = num1 + decimal.Parse(memberECode.Substring(memberECode.Length - (i + 1), 1));
}
else
{
num2 = num2 + (decimal.Parse(memberECode.Substring(memberECode.Length - (i + 1), 1)) * 2);
if (decimal.Parse(memberECode.Substring(memberECode.Length - (i + 1), 1)) >= 5)
{
num2 = num2 - 9;
}
}
}
if (((num1 + num2) % 10) == 0) { return true; }
}
return CicoECode(memberECode, minLength);
}
///
/// 实业饭卡电子码
///
/// 待校验数字电子码
/// 最小长度
///
public static bool CicoECode(string memberECode, int minLength = 20)
{
try
{
decimal.Parse(memberECode);
}
catch
{
return false;
}
//判断扫入的电子码
if (memberECode.Length >= minLength)
{
decimal num1 = 0;
decimal num2 = 0;
for (int i = 0; i < memberECode.Length; i++)
{
if (((memberECode.Length - i) % 2) == 0)
{
num1 = num1 + decimal.Parse(memberECode.Substring((memberECode.Length - (i + 1)), 1));
}
else
{
num2 = num2 + (decimal.Parse(memberECode.Substring(memberECode.Length - (i + 1), 1)) * 2);
if (decimal.Parse(memberECode.Substring(memberECode.Length - (i + 1), 1)) >= 5)
{
num2 = num2 - 9;
}
}
}
if (((num1 + num2) % 10) == 0) { return true; }
}
return false;
}
#endregion
}
}