using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; namespace SocketTransfer.SDK { public class ScanUpdateHelper { /// /// 扫码上传 /// /// 数据类型(1001:日结;1002:稽核;2001:交班;3001:单品;4001;移动支付) /// /// public static void UpLoad(int dataType, OracleHelper oracleHelper, string updateURL = "http://183.129.232.107:8010") { int UploadSuccess = 0; bool isReplaceColumnName = false; try { DataTable _DataTable = null; try { _DataTable = oracleHelper.ExcuteSqlGetDataSet( @"SELECT SERVERPARTCODE,SHOPCODE FROM HIGHWAY_EXCHANGE.T_SHOPMESSAGE WHERE VALID = 1").Tables[0]; } catch { _DataTable = oracleHelper.ExcuteSqlGetDataSet( @"SELECT SERVERPART_CODE AS SERVERPARTCODE,SHOPCODE FROM HIGHWAY_EXCHANGE.T_SHOPMESSAGE WHERE VALID = 1").Tables[0]; isReplaceColumnName = true; } for (int i = 0; i < _DataTable.Rows.Count; i++) { if (UploadData(dataType, _DataTable.Rows[i]["SERVERPARTCODE"].ToString(), _DataTable.Rows[i]["SHOPCODE"].ToString(), oracleHelper, updateURL, isReplaceColumnName)) { UploadSuccess++; } } } catch (Exception ex) { LogHelper.WriteSendLog("自动扫码上传失败:(" + dataType + ")" + ex.Message, "日志_ScanUpdate" + DateTime.Now.ToString("yyyyMMdd")); } } /// /// 执行上传 /// /// 数据类型(1001:日结;1002:稽核;2001:交班;3001:单品;4001;移动支付) /// 开始时间 /// 结束时间 /// 服务区编号 /// 门店编号 /// private static bool UploadData(int dataType, string ServerCode, string ShopCode, OracleHelper oracleHelper, string updateURL, bool isReplaceColumnName = false) { DataTable _QRcodeTable = null; int _Length = 0, _RowCount = 0, _RecordCount = 0, _ScanIndex = 0, _ScanCount = 0; string _EndAccountData = "", _PersonsellData = ""; string _strCheckCode = ""; try { if (dataType == 3001) { _QRcodeTable = SaleQrCode(ServerCode, ShopCode, oracleHelper, out _strCheckCode); } else { _QRcodeTable = EndAccountQrCode(ServerCode, ShopCode, isReplaceColumnName, oracleHelper, out _strCheckCode); } if (_QRcodeTable.Rows.Count > 0) { for (int n = 0; n < _QRcodeTable.Rows.Count; n++) { string text = ""; if (dataType == 3001) { _EndAccountData = HttpUtility.UrlEncode(_QRcodeTable.Rows[n]["salestr"].ToString()); _Length = _QRcodeTable.Rows[n]["salestr"].ToString().Length; _RowCount = Convert.ToInt16(_QRcodeTable.Rows[n]["salerow"]); _ScanIndex = n + 1; _ScanCount = _QRcodeTable.Rows.Count; int t = 0; for (int x = 0; x < _QRcodeTable.Rows.Count; x++) { if (Convert.ToDateTime(_QRcodeTable.Rows[x]["enddate"]) == Convert.ToDateTime(_QRcodeTable.Rows[n]["enddate"])) { t++; } } _RecordCount = t; text = "CommoditySale" + "_New=" + _EndAccountData + "&Length=" + _Length + "&RowCount=" + _RowCount + "&RecordCount=" + _RecordCount + "&CheckCode=" + _QRcodeTable.Rows[n]["checkMD5"].ToString() + "&ScanIndex=" + _ScanIndex + "&ScanCount=" + _ScanCount; } else { _EndAccountData = HttpUtility.UrlEncode(_QRcodeTable.Rows[n]["endaccountstr"].ToString()); _PersonsellData = HttpUtility.UrlEncode(_QRcodeTable.Rows[n]["personsellstr"].ToString()); _Length = _QRcodeTable.Rows[n]["endaccountstr"].ToString().Length + _QRcodeTable.Rows[n]["personsellstr"].ToString().Length; _RowCount = n + 1; _ScanIndex = n + 1; _ScanCount = _QRcodeTable.Rows.Count; _RecordCount = _QRcodeTable.Rows.Count; text = "EndAccount" + "=" + _EndAccountData + (_PersonsellData == "" ? "" : "&Personsell=" + _PersonsellData) + "&Length=" + _Length + "&RowCount=" + _RowCount + "&RecordCount=" + _RecordCount + "&CheckCode=" + _QRcodeTable.Rows[n]["checkMD5"].ToString() + "&ScanIndex=" + _RowCount + "&ScanCount=" + _RecordCount; } string retString = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(updateURL + "/MobileServicePlatform/Handler/handler_ajax.ashx"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; byte[] byteArray = Encoding.UTF8.GetBytes("action_type=ScanCodeUpdate&action_data=" + HttpUtility.UrlEncode(text) + "&action_record=1"); request.ContentLength = byteArray.Length; using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } using (WebResponse response = request.GetResponse()) { Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); retString = responseFromServer; } if (retString == _strCheckCode) { return true; } } } else { return true; } } catch (Exception ex) { LogHelper.WriteSendLog("自动扫码上传失败:(" + dataType + ")" + ex.Message, "日志_ScanUpdate" + DateTime.Now.ToString("yyyyMMdd") + ".log"); } return false; } #region 方法 --> 生成本次单品集合数据二维码字符串列表 /// /// 生成单品集合数据 /// private static DataTable SaleQrCode(string ServerCode, string ShopCode, OracleHelper oracleHelper, out string checkCode) { string _strSalestart = ""; //string _strSaleend = ""; string strtmp = ""; string saletmp = ""; int m = 0; checkCode = ""; DataTable _DataTable = new DataTable(); _DataTable.Columns.Add("id", typeof(decimal)); _DataTable.Columns.Add("startdate", typeof(DateTime)); _DataTable.Columns.Add("enddate", typeof(DateTime)); _DataTable.Columns.Add("salestr", typeof(string)); _DataTable.Columns.Add("salerow", typeof(int)); _DataTable.Columns.Add("checkMD5", typeof(string)); ////获取未上传单品记录(交班时间) DataTable _TransferSaleTable = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT TRANSFER_ID, SERVERPARTCODE, SHOPCODE,STARTDATE,ENDDATE FROM HIGHWAY_EXCHANGE.T_TRANSFER_SALE A WHERE SERVERPARTCODE = '{ServerCode}' AND SHOPCODE = '{ShopCode}' AND ENDDATE > TRUNC(SYSDATE) - 1 AND NVL(TRANSFER_STATE,0) < 9 ORDER BY TRANSFER_ID ASC").Tables[0]; DataTable _TempTable = _TransferSaleTable.DefaultView.ToTable(true, new string[] { "serverpartcode", "shopcode", "startdate", "enddate" }); for (int i = 0; i < _TempTable.Rows.Count; i++) { m = 0; _strSalestart = _TempTable.Rows[i]["serverpartcode"].ToString() + "|" + _TempTable.Rows[i]["shopcode"].ToString() + "|" + Convert.ToDateTime(_TempTable.Rows[i]["startdate"]).ToString("yyyyMMddHHmmss") + "|" + Convert.ToDateTime(_TempTable.Rows[i]["enddate"]).ToString("yyyyMMddHHmmss"); //根据交班时间获取单品记录 DataTable _SaleTable = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT B.COMMODITY_SYMBOL,A.TOTAL_COUNT,A.TOTAL_AMOUNT FROM HIGHWAY_EXCHANGE.T_COMMODITYSALE_NEW A, HIGHWAY_EXCHANGE.T_COMMODITYEX B WHERE A.COMMODITY_CODE = B.COMMODITY_CODE AND A.CREATE_DATE BETWEEN TO_DATE('{_TempTable.Rows[i]["enddate"].ToString()}','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('{_TempTable.Rows[i]["enddate"].ToString()}','YYYY/MM/DD HH24:MI:SS') AND B.SERVERPARTCODE = '{ServerCode}' ORDER BY COMMODITYSALE_ID").Tables[0]; DataTable dataTable = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT B.COMMODITY_SYMBOL, A.TOTALCOUNT AS TOTAL_COUNT, A.TOTALSELLAMOUNT AS TOTAL_AMOUNT FROM HIGHWAY_EXCHANGE.T_COMMODITYSALE A, HIGHWAY_EXCHANGE.T_COMMODITYEX B WHERE A.STARTDATE = TO_DATE('{_TransferSaleTable.Rows[i]["startdate"].ToString()}','YYYY/MM/DD HH24:MI:SS') AND A.ENDDATE = TO_DATE('{_TransferSaleTable.Rows[i]["enddate"].ToString()}','YYYY/MM/DD HH24:MI:SS') AND A.SERVERPARTCODE = '{ServerCode}' AND SHOPCODE = '{ShopCode}' AND A.COMMODITY_CODE = B.COMMODITY_CODE ORDER BY COMMODITYSALE_ID").Tables[0]; _SaleTable = ConvertOraclTableToDoNetTable(_SaleTable); dataTable = ConvertOraclTableToDoNetTable(dataTable); _SaleTable.Merge(dataTable); for (int n = 0; n < _SaleTable.Rows.Count; n++) { saletmp = _SaleTable.Rows[n]["commodity_symbol"].ToString() + "^" + _SaleTable.Rows[n]["total_count"].ToString().Replace(".00", "") + "^" + _SaleTable.Rows[n]["total_amount"].ToString().Replace(".00", ""); if ((strtmp.Length + saletmp.Length) > 300) { m++; DataRow _row = _DataTable.NewRow(); _row["id"] = m; _row["startdate"] = _TempTable.Rows[i]["startdate"]; _row["enddate"] = _TempTable.Rows[i]["enddate"]; _row["salestr"] = strtmp; _row["salerow"] = m; _DataTable.Rows.Add(_row); strtmp = ""; } strtmp += (strtmp == "" ? _strSalestart + "|" : ",") + saletmp; if (n == (_SaleTable.Rows.Count - 1)) { m++; DataRow _row = _DataTable.NewRow(); _row["id"] = m; _row["startdate"] = _TempTable.Rows[i]["startdate"]; _row["enddate"] = _TempTable.Rows[i]["enddate"]; _row["salestr"] = strtmp; _row["salerow"] = m; _DataTable.Rows.Add(_row); strtmp = ""; } } if (_DataTable.Rows.Count > 0) { string MD5 = "", strMD5 = ""; for (int j = 0; j < _DataTable.Rows.Count; j++) { strMD5 += (strMD5 == "" ? "" : ",") + _DataTable.Rows[j]["salestr"].ToString(); } MD5 = CreateMD5(strMD5); for (int j = 0; j < _DataTable.Rows.Count; j++) { _DataTable.Rows[j]["checkMD5"] = MD5; } checkCode = MD5; } } return _DataTable; } #endregion #region 方法 --> 生成本次结账及收银交班数据二维码字符串列表 /// /// 生成结账数据 /// private static DataTable EndAccountQrCode(string ServerCode, string ShopCode, bool isReplaceColumnName, OracleHelper oracleHelper, out string checkCode) { string _strEndAccount = ""; string _strPersonSell = ""; string _strTemp = ""; checkCode = ""; DataTable _DataTable = new DataTable("list"); _DataTable.Columns.Add("id", typeof(decimal)); _DataTable.Columns.Add("startdate", typeof(DateTime)); _DataTable.Columns.Add("enddate", typeof(DateTime)); _DataTable.Columns.Add("endaccountstr", typeof(string)); _DataTable.Columns.Add("personsellstr", typeof(string)); _DataTable.Columns.Add("flag", typeof(string)); _DataTable.Columns.Add("checkMD5", typeof(string)); DataTable dt = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT ENDACCOUNT_ID,STARTDATE,ENDDATE,SERVERPARTCODE, SHOPCODE,MACHINECODE,ENDPERSON_CODE,TICKET_COUNT, TOTAL_COUNT,TOTAL_AMOUNT,TOTAL_OFFAMOUNT,CASHPAY, BANKPAY,-1 AS TICKETBILL,MEMBERPAY,COUPONPAY,-1 AS OTHERPAY, CONTRIBUTION_AMOUNT,ENDACCOUNT_TYPE,PAYMENT_DETAILS,ENDACCOUNT_CODE FROM HIGHWAY_EXCHANGE.T_ENDACCOUNT_NEW WHERE SERVERPARTCODE = '{ServerCode}' AND SHOPCODE = '{ShopCode}' AND ENDDATE > TRUNC(SYSDATE) - 1 AND NVL(TRANSFER_STATE,0) < 9 ORDER BY ENDDATE ASC").Tables[0]; DataTable dataTable = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT A.ENDACCOUNT_ID,A.ENDACCOUNT_STARTDATE AS STARTDATE, A.ENDACCOUNT_DATE AS ENDDATE,{(isReplaceColumnName ? "A.SERVERPART_CODE" : "A.SERVERPARTCODE")} AS SERVERPARTCODE, A.SHOPCODE,A.MACHINECODE,A.ENDPERSONCODE AS ENDPERSON_CODE, A.TICKETCOUNT AS TICKET_COUNT,A.TOTALCOUNT AS TOTAL_COUNT, A.TOTALSELLAMOUNT AS TOTAL_AMOUNT,A.TOTALOFFAMOUNT AS TOTAL_OFFAMOUNT, A.CASH AS CASHPAY, A.CREDITCARD AS BANKPAY,A.TICKETBILL,A.VIPPERSON AS MEMBERPAY, A.COSTBILL AS COUPONPAY,A.OTHERPAY,A.CASHPAY AS CONTRIBUTION_AMOUNT, A.FLAG AS ENDACCOUNT_TYPE,'' AS PAYMENT_DETAILS,'' AS ENDACCOUNT_CODE FROM T_ENDACCOUNT A WHERE {(isReplaceColumnName ? "A.SERVERPART_CODE" : "A.SERVERPARTCODE")} = '{ServerCode}' AND A.SHOPCODE = '{ShopCode}' AND A.ENDACCOUNT_DATE > TRUNC(SYSDATE) AND NVL(A.TRANSFER_STATE,0) < 9 ORDER BY A.ENDACCOUNT_DATE ASC").Tables[0]; dt = ConvertOraclTableToDoNetTable(dt); dataTable = ConvertOraclTableToDoNetTable(dataTable); dt.Merge(dataTable); foreach (DataRow row in dt.Rows) { #region _strEndAccount = ""; _strPersonSell = ""; for (int i = 0; i < dt.Columns.Count; i++) { if (dt.Columns[i].ColumnName != "TICKETBILL" && dt.Columns[i].ColumnName != "OTHERPAY" && dt.Columns[i].ColumnName != "PAYMENT_DETAILS" && dt.Columns[i].ColumnName != "ENDACCOUNT_CODE") { _strEndAccount += (_strEndAccount == "" ? "" : "|") + (dt.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(row[i]).ToString("yyyyMMddHHmmss") : row[i].ToString().Replace(".00", "")); } else { string[] MovePay = row["PAYMENT_DETAILS"].ToString().Split(','); Dictionary _MobilePayList = new Dictionary(StringComparer.OrdinalIgnoreCase); for (int k = 0; k < MovePay.Length; k++) { if (MovePay[k].Split(':').Length > 1) { _MobilePayList.Add(MovePay[k].Split(':')[0], MovePay[k].Split(':')[1]); } } switch (dt.Columns[i].ColumnName) { case "TICKETBILL": if (row["TICKETBILL"].ToString() == "-1") { if (_MobilePayList.ContainsKey("WECHATPAY")) { _strEndAccount += "|" + _MobilePayList["WECHATPAY"].Replace(".00", ""); } else { _strEndAccount += "|0"; } } else { _strEndAccount += (_strEndAccount == "" ? "" : "|") + (dt.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(row[i]).ToString("yyyyMMddHHmmss") : row[i].ToString().Replace(".00", "")); } break; case "OTHERPAY": if (row["OTHERPAY"].ToString() == "-1") { if (_MobilePayList.ContainsKey("ALIPAY")) { _strEndAccount += "|" + _MobilePayList["ALIPAY"].Replace(".00", ""); } else { _strEndAccount += "|0"; } } else { _strEndAccount += (_strEndAccount == "" ? "" : "|") + (dt.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(row[i]).ToString("yyyyMMddHHmmss") : row[i].ToString().Replace(".00", "")); } break; case "ENDACCOUNT_CODE": case "PAYMENT_DETAILS": break; } } } #endregion #region DataTable person = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT PERSONSELL_ID,SERVERPARTCODE,SHOPCODE,MACHINECODE, STARTDATE,ENDDATE,SELLWORKER_CODE,TICKET_COUNT,TOTAL_COUNT, TOTAL_AMOUNT,TOTAL_OFFAMOUNT,CASHPAY,-1 AS TICKETBILL,BANKPAY, MEMBERPAY,COUPONPAY,-1 AS OTHERPAY,CONTRIBUTION_AMOUNT, SELLWORKER_CODE AS ENDPERSONCODE,PAYMENT_DETAILS FROM HIGHWAY_EXCHANGE.T_PERSONSELL_NEW WHERE SERVERPARTCODE = '{ServerCode}' AND SHOPCODE = '{ShopCode}' AND ENDACCOUNT_CODE = '{row["ENDACCOUNT_CODE"].ToString()}' ORDER BY PERSONSELL_ID ASC").Tables[0]; DataTable _Table = oracleHelper.ExcuteSqlGetDataSet( $@"SELECT PERSONSELL_ID,SERVERPARTCODE,SHOPCODE,MACHINECODE, STARTDATE,ENDDATE,CASHWORKER_CODE AS SELLWORKER_CODE, TICKETCOUNT AS TICKET_COUNT,TOTALCOUNT AS TOTAL_COUNT, TOTALSELLAMOUNT AS TOTAL_AMOUNT,TOTALOFFAMOUNT AS TOTAL_OFFAMOUNT, CASH AS CASHPAY,TICKETBILL,CREDITCARD AS BANKPAY,VIPPERSON AS MEMBERPAY, COSTBILL AS COUPONPAY,OTHERPAY,CASHPAY AS CONTRIBUTION_AMOUNT, ENDPERSONCODE,'' AS PAYMENT_DETAILS FROM HIGHWAY_EXCHANGE.T_PERSONSELL WHERE SERVERPARTCODE = '{ServerCode}' AND SHOPCODE = '{ShopCode}' AND STARTDATE >= TO_DATE('{row["STARTDATE"].ToString()}','YYYY/MM/DD HH24:MI:SS') AND ENDDATE <= TO_DATE('{row["ENDDATE"].ToString()}','YYYY/MM/DD HH24:MI:SS') ORDER BY PERSONSELL_ID ASC").Tables[0]; person = ConvertOraclTableToDoNetTable(person); _Table = ConvertOraclTableToDoNetTable(_Table); person.Merge(_Table); foreach (DataRow _DataRow in person.Rows) { _strTemp = ""; for (int i = 0; i < person.Columns.Count; i++) { if (person.Columns[i].ColumnName != "TICKETBILL" && person.Columns[i].ColumnName != "OTHERPAY" && person.Columns[i].ColumnName != "PAYMENT_DETAILS") { _strTemp += (_strTemp == "" ? "" : "|") + (person.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(_DataRow[i]).ToString("yyyyMMddHHmmss") : _DataRow[i].ToString().Replace(".00", "")); } else { string[] MovePay = row["PAYMENT_DETAILS"].ToString().Split(','); Dictionary _MobilePayList = new Dictionary(StringComparer.OrdinalIgnoreCase); for (int k = 0; k < MovePay.Length; k++) { if (MovePay[k].Split(':').Length > 1) { _MobilePayList.Add(MovePay[k].Split(':')[0], MovePay[k].Split(':')[1]); } } switch (person.Columns[i].ColumnName) { case "TICKETBILL": if (row["TICKETBILL"].ToString() == "-1") { if (_MobilePayList.ContainsKey("WECHATPAY")) { _strTemp += "|" + _MobilePayList["WECHATPAY"].Replace(".00", ""); } else { _strTemp += "|0"; } } else { _strTemp += (_strTemp == "" ? "" : "|") + (person.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(_DataRow[i]).ToString("yyyyMMddHHmmss") : _DataRow[i].ToString().Replace(".00", "")); } break; case "OTHERPAY": if (row["OTHERPAY"].ToString() == "-1") { if (_MobilePayList.ContainsKey("ALIPAY")) { _strTemp += "|" + _MobilePayList["ALIPAY"].Replace(".00", ""); } else { _strTemp += "|0"; } } else { _strTemp += (_strTemp == "" ? "" : "|") + (person.Columns[i].DataType.ToString() == "System.DateTime" ? Convert.ToDateTime(_DataRow[i]).ToString("yyyyMMddHHmmss") : _DataRow[i].ToString().Replace(".00", "")); } break; case "PAYMENT_DETAILS": break; } } } _strPersonSell += (_strPersonSell == "" ? "" : ",") + _strTemp; } #endregion DataRow _row = _DataTable.NewRow(); _row["id"] = row["endaccount_id"]; _row["startdate"] = row["startdate"]; _row["enddate"] = row["enddate"]; _row["endaccountstr"] = _strEndAccount; _row["personsellstr"] = _strPersonSell; _row["flag"] = row["endaccount_type"]; _DataTable.Rows.Add(_row); //} string MD5 = "", strMD5 = ""; for (int i = 0; i < _DataTable.Rows.Count; i++) { strMD5 += (strMD5 == "" ? "" : ",") + _DataTable.Rows[i]["endaccountstr"].ToString(); } MD5 = CreateMD5(strMD5); for (int i = 0; i < _DataTable.Rows.Count; i++) { _DataTable.Rows[i]["checkMD5"] = MD5; } checkCode = MD5; } return _DataTable; } #endregion #region 创建md5 16位大写加密 private static string CreateMD5(string text) { var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //换成utf8后对于中文加密也适用 byte[] output = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); string pass2md5 = BitConverter.ToString(output, 4, 8).Replace("-", ""); //pass2md5 = pass2md5.ToUpper(); return pass2md5; } #endregion /// /// 转换DataTable字段类型 /// /// /// private 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; } /// /// 字段类型 /// /// /// private 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; } } } }