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