using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace WebService.SDK { public class FeedbackHelper { #region 方法 -> 收银机反馈记录接口 /// /// 收银机反馈记录接口 /// /// 数据库连接 /// 反馈类型: /// StateFeedback、BaseInfoFeedback /// 反馈信息Json数据字符串 /// public FeedbackResult Feedback(OracleHelper oracleHelper, string feedbackType, string jsonData) { switch (feedbackType.ToUpper()) { case "STATEFEEDBACK": //收银机状态反馈 return StateFeedback(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject< Model.StateFeedbackModel>(jsonData)) ? new FeedbackResult() { ResultCode = 100, ResultDesc = $"{feedbackType}记录成功" } : new FeedbackResult() { ResultCode = 305, ResultDesc = $"{feedbackType}记录失败" }; case "BASEINFOFEEDBACK": //收银机基础数据版本上报 return BaseInfoFeedback(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject< Model.BaseInfoFeedbackModel>(jsonData)) ? new FeedbackResult() { ResultCode = 100, ResultDesc = $"{feedbackType}记录成功" } : new FeedbackResult() { ResultCode = 305, ResultDesc = $"{feedbackType}记录失败" }; case "DATACOLLECTION": //十分钟实时交易统计上报 return DataCollectionFeedback(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject< Model.DataCollectionModel>(jsonData)) ? new FeedbackResult() { ResultCode = 100, ResultDesc = $"{feedbackType}记录成功" } : new FeedbackResult() { ResultCode = 305, ResultDesc = $"{feedbackType}记录失败" }; case "COMMODITYMACHINE": //收银指令结果上报 return CommodityMachineFeedback(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject< Model.CommodityMachineModel>(jsonData)) ? new FeedbackResult() { ResultCode = 100, ResultDesc = $"{feedbackType}记录成功" } : new FeedbackResult() { ResultCode = 305, ResultDesc = $"{feedbackType}记录失败" }; case "MACHINEINFOFEEDBACK": //收银机设备信息上报 return MachineInfoFeedback(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject< Model.MachineInfoModel>(jsonData)) ? new FeedbackResult() { ResultCode = 100, ResultDesc = $"{feedbackType}记录成功" } : new FeedbackResult() { ResultCode = 305, ResultDesc = $"{feedbackType}记录失败" }; default: return new FeedbackResult() { ResultCode = 305, ResultDesc = $"暂不支持{feedbackType}类型记录" }; } } #endregion #region 方法 -> 收银机反馈数据读取接口 /// /// 收银机反馈数据读取接口 /// /// 数据库连接 /// 读取类型: /// CommodityMachine:获取设备指令数据信息 /// DataVersion:获取数据版本及传输信息 /// 设备信息Json数据字符串 /// public string DataRead(OracleHelper oracleHelper, string readType, string jsonData) { switch (readType.ToUpper()) { case "COMMODITYMACHINE"://收银指令数据 return Newtonsoft.Json.JsonConvert.SerializeObject(GetCommodityMachine(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject(jsonData))); case "DATAVERSION"://收银基础数据版本 return Newtonsoft.Json.JsonConvert.SerializeObject(GetDataVersion(oracleHelper, Newtonsoft.Json.JsonConvert.DeserializeObject(jsonData))); default: return Newtonsoft.Json.JsonConvert.SerializeObject(new FeedbackResult() { ResultCode = 305, ResultDesc = $"暂不支持{readType}类型读取" }); } } #endregion #region 方法 -> 收银机状态反馈记录 /// /// 收银机状态反馈记录 /// /// 数据库连接 /// 状态反馈数据对象 /// private bool StateFeedback(OracleHelper oracleHelper, Model.StateFeedbackModel stateFeedback) { //判断必填字段是否为空 if (stateFeedback == null || //设备信息实体对象 string.IsNullOrWhiteSpace(stateFeedback.SERVERPARTCODE) || //设备服务区信息 string.IsNullOrWhiteSpace(stateFeedback.SHOPCODE) || //设备门店信息 string.IsNullOrWhiteSpace(stateFeedback.MACHINECODE) || //设备编码信息 string.IsNullOrWhiteSpace(stateFeedback.MACHINENAME) || //设备名称信息 string.IsNullOrWhiteSpace(stateFeedback.MACHINE_MACADDRESS)) //设备网卡信息 { return false; } //读取设备标识缓存记录,减少数据库查询次数 List _StateFeedbackList = (List)CacheHelper.Get("StateFeedback"); if (_StateFeedbackList == null) { _StateFeedbackList = new List(); } //判断设备是否第一次上报反馈信息,然后写入设备反馈信息到数据库中 //优先通过接口缓存的设备标识进行检测,当接口内不存在该设备的标识时,通过数据库查询进行检测 if (_StateFeedbackList.Contains(stateFeedback.SERVERPARTCODE + stateFeedback.SHOPCODE + stateFeedback.MACHINECODE + stateFeedback.MACHINENAME + stateFeedback.MACHINE_MACADDRESS) || oracleHelper.ExcuteSqlGetDataSet($@"SELECT 1 FROM HIGHWAY_EXCHANGE.T_STATEFEEDBACK WHERE SERVERPARTCODE = '{stateFeedback.SERVERPARTCODE}' AND SHOPCODE = '{stateFeedback.SHOPCODE}' AND MACHINECODE = '{stateFeedback.MACHINECODE}' AND MACHINENAME = '{stateFeedback.MACHINENAME}' AND MACHINE_MACADDRESS = '{stateFeedback.MACHINE_MACADDRESS}' " ).Tables[0].Rows.Count > 0) { //非首次上报设备心跳信息,更新已有数据 UpdateTableData(oracleHelper, new List() { { stateFeedback } }, "HIGHWAY_EXCHANGE.T_STATEFEEDBACK", new string[] { "SERVERPARTCODE", "SHOPCODE", "MACHINECODE", "MACHINENAME", "MACHINE_MACADDRESS" }, true); } else { //首次上报设备心跳信息,插入心跳数据 InsertTableData(oracleHelper, new List() { { stateFeedback } }, "HIGHWAY_EXCHANGE.T_STATEFEEDBACK"); } //更新接口缓存设备标识记录,写入设备信息 if (!_StateFeedbackList.Contains(stateFeedback.SERVERPARTCODE + stateFeedback.SHOPCODE + stateFeedback.MACHINECODE + stateFeedback.MACHINENAME + stateFeedback.MACHINE_MACADDRESS)) { _StateFeedbackList.Add(stateFeedback.SERVERPARTCODE + stateFeedback.SHOPCODE + stateFeedback.MACHINECODE + stateFeedback.MACHINENAME + stateFeedback.MACHINE_MACADDRESS); CacheHelper.Set("StateFeedback", _StateFeedbackList); } return true; } #endregion #region 方法 -> 收银机器信息上报 /// /// 收银机器信息上报 /// /// 数据库连接 /// 收银机器信息数据对象 /// private bool MachineInfoFeedback(OracleHelper oracleHelper, Model.MachineInfoModel machineInfo) { //检查非空字段,服务区编码、门店编码、设备网卡地址 if (machineInfo == null || string.IsNullOrWhiteSpace(machineInfo.SERVERPARTCODE) || string.IsNullOrWhiteSpace(machineInfo.SHOPCODE) || string.IsNullOrWhiteSpace(machineInfo.MACHINE_MACADDRESS)) { return false; } //从缓存中取出已保存过的机器信息 List _MachineInfoFeedbackList = (List)CacheHelper.Get("MachineInfoFeedback"); if (_MachineInfoFeedbackList == null) { _MachineInfoFeedbackList = new List(); } //判断机器信息是否已经上报过 if (!_MachineInfoFeedbackList.Contains(machineInfo.MACHINE_MACADDRESS) && oracleHelper.ExcuteSqlGetDataSet($@"SELECT 1 FROM HIGHWAY_EXCHANGE.T_MACHINEINFO WHERE MACHINE_MACADDRESS = '{machineInfo.MACHINE_MACADDRESS}'" ).Tables[0].Rows.Count == 0) { //未上报过的机器信息插入数据库 InsertTableData(oracleHelper, new List { { machineInfo } }, "HIGHWAY_EXCHANGE.T_MACHINEINFO", true, "MACHINEINFO_ID", "HIGHWAY_EXCHANGE.SEQ_MACHINEINFO.NEXTVAL"); } //保存机器信息至缓存中,用于上报去重判断 if (!_MachineInfoFeedbackList.Contains(machineInfo.MACHINE_MACADDRESS)) { _MachineInfoFeedbackList.Add(machineInfo.MACHINE_MACADDRESS); CacheHelper.Set("MachineInfoFeedback", _MachineInfoFeedbackList); } return true; } #endregion #region 方法 -> 收银机基础数据版本记录 /// /// 收银机基础数据版本记录 /// /// 数据库连接 /// 数据对象 /// private bool BaseInfoFeedback(OracleHelper oracleHelper, Model.BaseInfoFeedbackModel baseInfoFeedback) { //检查非空字段,数据表名和设备网卡标识 if (baseInfoFeedback == null || string.IsNullOrWhiteSpace(baseInfoFeedback.TABLE_NAME) || string.IsNullOrWhiteSpace(baseInfoFeedback.MACHINE_MACADDRESS)) { return false; } //从缓存中取出已上报的收银机版本记录数据 List _BaseInfoFeedbackList = (List)CacheHelper.Get("BaseInfoFeedback"); if (_BaseInfoFeedbackList == null) { _BaseInfoFeedbackList = new List(); } //判断是否首次上报版本记录 if (_BaseInfoFeedbackList.Contains(baseInfoFeedback.TABLE_NAME + baseInfoFeedback.MACHINE_MACADDRESS) || oracleHelper.ExcuteSqlGetDataSet($@"SELECT 1 FROM HIGHWAY_EXCHANGE.T_BASEINFOFEEDBACK WHERE TABLE_NAME = '{baseInfoFeedback.TABLE_NAME}' AND MACHINE_MACADDRESS = '{baseInfoFeedback.MACHINE_MACADDRESS}' " ).Tables[0].Rows.Count > 0) { //非首次上报,更新数据库已有记录 UpdateTableData(oracleHelper, new List { { baseInfoFeedback } }, "HIGHWAY_EXCHANGE.T_BASEINFOFEEDBACK", new string[] { "TABLE_NAME", "MACHINE_MACADDRESS" }, true); } else { //首次上报,插入记录到数据库 InsertTableData(oracleHelper, new List { { baseInfoFeedback } }, "HIGHWAY_EXCHANGE.T_BASEINFOFEEDBACK", true, "BASEINFOFEEDBACK_ID", "HIGHWAY_EXCHANGE.SEQ_BASEINFOFEEDBACK.NEXTVAL"); } //将上报记录写入缓存,用于后续判断 if (!_BaseInfoFeedbackList.Contains(baseInfoFeedback.TABLE_NAME + baseInfoFeedback.MACHINE_MACADDRESS)) { _BaseInfoFeedbackList.Add(baseInfoFeedback.TABLE_NAME + baseInfoFeedback.MACHINE_MACADDRESS); CacheHelper.Set("BaseInfoFeedback", _BaseInfoFeedbackList); } return true; } #endregion #region 方法 -> 实时交易统计记录 /// /// 实时交易统计记录 /// /// 数据库连接 /// 数据对象 /// private bool DataCollectionFeedback(OracleHelper oracleHelper, Model.DataCollectionModel dataCollectionModel) { //关键字段判空处理 if (dataCollectionModel == null || dataCollectionModel.DATACOLLECTION_DATE == null || string.IsNullOrWhiteSpace(dataCollectionModel.SERVERPARTCODE) || string.IsNullOrWhiteSpace(dataCollectionModel.SHOPCODE) || string.IsNullOrWhiteSpace(dataCollectionModel.MACADDRESS)) { return false; } try { //插入数据记录至数据库 InsertTableData(oracleHelper, new List { { dataCollectionModel } }, "HIGHWAY_EXCHANGE.T_DATACOLLECTION", true, "DATACOLLECTION_ID", "HIGHWAY_EXCHANGE.SEQ_DATACOLLECTION.NEXTVAL"); return true; } catch { return false; } } #endregion #region 方法 -> 指令运行结果记录 /// /// 指令运行结果记录 /// /// 数据库连接 /// 指令数据对象 /// private bool CommodityMachineFeedback(OracleHelper oracleHelper, Model.CommodityMachineModel commodityMachineModel) { try { List _CommodityMachineList = (List)CacheHelper.Get("CommodityMachine"); bool b_UpdateData = true; if (_CommodityMachineList != null) { var _CommodityMachine = _CommodityMachineList.Where(p => { return p.COMMODITYMACHINE_ID == commodityMachineModel.COMMODITYMACHINE_ID && p.HANDWAY == commodityMachineModel.HANDWAY && p.MACHINE_MACADDRESS == commodityMachineModel.MACHINE_MACADDRESS; }).FirstOrDefault(); //更新缓存记录 if (_CommodityMachine != null) { //上报的结果与上一次回传的一致时,不执行数据库更新操作 if (_CommodityMachine.UPLOAD_STATE == commodityMachineModel.UPLOAD_STATE && _CommodityMachine.REMARK_DESC == commodityMachineModel.REMARK_DESC) { b_UpdateData = false; } _CommodityMachine = commodityMachineModel; } } if (b_UpdateData) { //更新数据记录 UpdateTableData(oracleHelper, new List { commodityMachineModel }, "HIGHWAY_EXCHANGE.T_COMMODITYMACHINE", new string[] { "COMMODITYMACHINE_ID", "HANDWAY", "MACHINE_MACADDRESS" }, true, new string[] { "UPLOAD_STATE", "REMARK_DESC" }); } return true; } catch (Exception ex) { //LogHelper.WriteSendLog("指令执行上报异常:" + ex.Message); return false; } } #endregion #region 方法 -> 收银机指令数据读取 /// /// 收银机指令数据读取 /// /// 数据库连接 /// 设备信息对象 /// private FeedbackResult GetCommodityMachine( OracleHelper oracleHelper, Model.DeviceInfoModel deviceInfoModel) { try { List _CommodityMachineList = (List)CacheHelper.Get("CommodityMachine"); if (_CommodityMachineList == null) { _CommodityMachineList = Newtonsoft.Json.JsonConvert.DeserializeObject>( Newtonsoft.Json.JsonConvert.SerializeObject(oracleHelper.ExcuteSqlGetDataSet( $@"SELECT COMMODITYMACHINE_ID,SERVERPARTCODE,SHOPCODE, MACHINENAME,MACHINE_MACADDRESS,MACHINE_IP,MACHINE_STARTDATE, MACHINE_ENDDATE,HANDCONTENT,HANDWAY,FLAG,REPEAT_STATE, DOWNLOAD_STATE,UPLOAD_STATE,INTERVALS_TIME,REMARK_DESC FROM HIGHWAY_EXCHANGE.T_COMMODITYMACHINE WHERE NVL(UPLOAD_STATE,0) <> 3 ").Tables[0])); CacheHelper.Set("CommodityMachine", _CommodityMachineList, DateTimeOffset.Now.AddMinutes(5)); } return new FeedbackResult() { ResultCode = 100, ResultDesc = "读取成功", Data = _CommodityMachineList.FindAll(p => { return p.MACHINE_MACADDRESS == deviceInfoModel.DeviceMacaddress; }) }; } catch (Exception ex) { return new FeedbackResult() { ResultCode = 999, ResultDesc = $"系统异常:{ex.Message}" }; } } #endregion #region 方法 -> 获取收银数据版本信息 /// /// 获取收银数据版本信息 /// /// 数据库连接 /// 设备信息对象 /// private FeedbackResult GetDataVersion( OracleHelper oracleHelper, Model.DeviceInfoModel deviceInfoModel) { try { //从缓存读取数据版本记录 List _DataVersionList = (List)CacheHelper.Get("DataVersion"); if (_DataVersionList == null || _DataVersionList.Count == 0) { //缓存无数据时从数据库逐表读取版本记录 List _ServerDataVersionList = new List(); List list_Sql = DataVersionSqlByOracle(); foreach (string str_Select in list_Sql) { //获取各数据表信息版本记录 _ServerDataVersionList = _ServerDataVersionList.Concat(Newtonsoft.Json.JsonConvert.DeserializeObject>( Newtonsoft.Json.JsonConvert.SerializeObject(oracleHelper.ExcuteSqlGetDataSet(str_Select).Tables[0]))).ToList(); } _DataVersionList = new List(_ServerDataVersionList); //将数据版本记录保存到缓存中 CacheHelper.Set("DataVersion", _DataVersionList, DateTimeOffset.Now.AddSeconds(30)); } //返回所查询的收银机对应数据版本记录 return new FeedbackResult() { ResultCode = 100, ResultDesc = "读取成功", Data = _DataVersionList.FindAll(p => { return p.ServerPartCode == deviceInfoModel.ServerPartCode && p.ShopCode == deviceInfoModel.ShopCode && (p.MachineCode == null || p.MachineCode == deviceInfoModel.MachineCode); }) }; } catch (Exception ex) { return new FeedbackResult() { ResultCode = 999, ResultDesc = $"系统异常:{ex.Message}" }; } } #endregion #region 方法 -> 从数据库获取数据版本信息 /// /// 数据版本查询语句列表 /// /// private List DataVersionSqlByOracle() { return new List { //各门店商品版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE, NULL AS MachineCode,'COMMODITYEX' AS DataTableName, MAX(A.OPERATE_DATE) AS DataVersion,0 AS TransState FROM HIGHWAY_EXCHANGE.T_COMMODITYEX_EX A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.BUSINESSTYPE = B.BUSINESSTYPE AND B.SERVERPARTSHOP_STATE = 1 AND A.COMMODITY_STATE = 1 AND B.SHOPCODE IS NOT NULL AND A.OPERATE_DATE <= SYSDATE GROUP BY B.SERVERPART_CODE,B.SHOPCODE", //各门店收银工号版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE, NULL AS MachineCode,'SELLWORKER' AS DataTableName, MAX(A.DOWNLOADDATE) AS DataVersion,0 AS TransState FROM HIGHWAY_EXCHANGE.T_SELLWORKER_EX A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND B.SERVERPARTSHOP_STATE = 1 AND B.SHOPCODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE", //各门店会员数据版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE, NULL AS MachineCode,'MEMBERSHIP' AS DataTableName, MAX(A.OPERATE_DATE) AS DataVersion,0 AS TransState FROM HIGHWAY_EXCHANGE.T_MEMBERSHIP A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE B.SERVERPARTSHOP_STATE = 1 AND B.SHOPCODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE", //各门店促销活动数据版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE, NULL AS MachineCode,'SALESPROMOTE' AS DataTableName, MAX(A.SALESPROMOTE_DATE) AS DataVersion,0 AS TransState FROM HIGHWAY_EXCHANGE.T_SALESPROMOTE_EX A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND B.SHOPCODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE", //新系统各收银机日结数据版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE,A.MACHINECODE, (CASE WHEN A.ENDACCOUNT_TYPE = 1 THEN 'ENDACCOUNT_NEW' ELSE 'INSPECTION' END) AS DataTableName, MAX(A.ENDDATE) AS DataVersion,MIN(A.TRANSFER_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_ENDACCOUNT_NEW A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND A.ENDACCOUNT_TYPE IN (1,5,6) AND A.ENDDATE IS NOT NULL AND B.SHOPCODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE, A.MACHINECODE,A.ENDACCOUNT_TYPE", //旧系统各收银机日结数据版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE,A.MACHINECODE, (CASE WHEN A.FLAG = 1 THEN 'ENDACCOUNT_NEW' ELSE 'INSPECTION' END) AS DATATABLENAME, MAX(A.ENDACCOUNT_DATE) AS DATAVERSION,MIN(A.TRANSFER_STATE) AS TRANSSTATE FROM HIGHWAY_EXCHANGE.T_ENDACCOUNT A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND A.FLAG IN (1,5,6) AND A.ENDACCOUNT_DATE IS NOT NULL AND B.SHOPCODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE,A.MACHINECODE,A.FLAG", //新系统各收银机交班数据版本 @"SELECT B.SERVERPART_CODE AS SERVERPARTCODE,B.SHOPCODE, A.MACHINECODE,'PERSONSELL_NEW' AS DataTableName, MAX(A.ENDDATE) AS DataVersion,MIN(A.TRANSFER_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_PERSONSELL_NEW A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND A.ENDDATE IS NOT NULL AND B.SHOPCODE IS NOT NULL AND A.MACHINECODE IS NOT NULL GROUP BY B.SERVERPART_CODE,B.SHOPCODE,A.MACHINECODE", //新系统各收银机单品数据版本 @"SELECT A.SERVERPARTCODE,A.SHOPCODE, A.MACHINECODE,'TRANSFER_SALE' AS DataTableName, MAX(A.ENDDATE) AS DataVersion,MIN(C.TRANSFER_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_ENDACCOUNT_NEW A, HIGHWAY_EXCHANGE.T_COMMODITYSALE_NEW C, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.ENDACCOUNT_CODE = C.ENDACCOUNT_CODE AND A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND B.SHOPCODE IS NOT NULL AND A.MACHINECODE IS NOT NULL GROUP BY A.SERVERPARTCODE,A.SHOPCODE,A.MACHINECODE", //旧系统各收银机单品数据版本 @"SELECT A.SERVERPARTCODE,A.SHOPCODE, A.MACHINECODE,'TRANSFER_SALE' AS DataTableName, MAX(A.ENDDATE) AS DataVersion,MIN(A.TRANSFER_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_COMMODITYSALE A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND A.ENDDATE IS NOT NULL AND B.SHOPCODE IS NOT NULL AND A.MACHINECODE IS NOT NULL GROUP BY A.SERVERPARTCODE,A.SHOPCODE,A.MACHINECODE", //各收银机移动支付记录数据版本 @"SELECT A.SERVERPARTCODE,A.SHOPCODE, A.MACHINECODE,'MOBILE_PAY' AS DataTableName, MAX(A.MOBILEPAY_DATE) AS DataVersion,MIN(A.MOBILEPAY_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_MOBILE_PAY A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND B.SHOPCODE IS NOT NULL AND NVL(A.MOBILEPAY_RESULT,0) <> 9 GROUP BY A.SERVERPARTCODE,A.SHOPCODE,A.MACHINECODE", //各收银机会员钱包离线交易数据版本 @"SELECT A.SERVERPARTCODE,A.SHOPCODE, A.MACHINECODE,'RECHARGERECORD' AS DataTableName, MAX(A.RECODE_DATE) AS DataVersion,MIN(A.TRANSFER_STATE) AS TransState FROM HIGHWAY_EXCHANGE.T_RECHARGERECORD A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND B.SERVERPARTSHOP_STATE = 1 AND A.RECODE_TYPE IN (3000,3020,4000) AND B.SHOPCODE IS NOT NULL AND A.MACHINECODE IS NOT NULL GROUP BY A.SERVERPARTCODE,A.SHOPCODE,A.MACHINECODE" }; } #endregion #region 方法 -> 通用表数据添加 /// /// 通用表数据添加 /// Mr.Cai 2018-1-2 /// /// 数据库SQL执行帮助类 /// 实体类 /// 表名 /// 主键名 /// 主键自增SQL函数 /// private void InsertTableData(OracleHelper oracleHelper, T t, string tableName, string primaryKey, string nextval) { if (string.IsNullOrEmpty(tableName)) { throw new Exception("表名不可为空!"); } if (string.IsNullOrEmpty(primaryKey)) { throw new Exception("表名主键名不可为空!"); } if (string.IsNullOrEmpty(nextval)) { throw new Exception("序列不可为空!"); } try { var pros = typeof(T).GetProperties(); string names = string.Empty; string values = string.Empty; foreach (var item in pros) { //排除主键字段 if (item.Name.ToUpper() != primaryKey.ToUpper() && item.Name.ToUpper() != (primaryKey + "_Encrypt").ToUpper() && item.Name.ToUpper() != "KEYID") { object value = item.GetValue(t, null); if (IsType(item.PropertyType, "System.String") || item.PropertyType == typeof(System.String)) { if (value != null && !string.IsNullOrEmpty(value.ToString())) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + "'" + value.ToString().Replace("'", "''") + "'"; } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.Int16]") || IsType(item.PropertyType, "System.Nullable`1[System.Int32]") || IsType(item.PropertyType, "System.Nullable`1[System.Int64]") || IsType(item.PropertyType, "System.Nullable`1[System.Double]") || IsType(item.PropertyType, "System.Nullable`1[System.Decimal]") || IsType(item.PropertyType, "System.Nullable`1[System.Boolean]") || item.PropertyType == typeof(System.Int16) || item.PropertyType == typeof(System.Int32) || item.PropertyType == typeof(System.Int64) || item.PropertyType == typeof(System.Double) || item.PropertyType == typeof(System.Decimal) || item.PropertyType == typeof(System.Boolean)) { if (value != null) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + value; } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.DateTime]") || item.PropertyType == typeof(System.DateTime)) { if (value != null) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + string.Format("TO_DATE('{0}','YYYY/MM/DD HH24:MI:SS')", value); } else { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + string.Format("TO_DATE('{0}','YYYY/MM/DD HH24:MI:SS')", DateTime.Now.ToString()); } continue; } } } string _SqlString = string.Format("INSERT INTO {0}({1},{2}) VALUES({3},{4})", tableName, primaryKey, names, nextval, values); oracleHelper.ExcuteSql(_SqlString); } catch (Exception ex) { throw ex; } } #endregion #region 方法 -> 通用表数据添加(集合) /// /// 通用表数据添加(集合) /// Mr.Cai 2018-3-9 /// /// 数据库SQL执行帮助类 /// 实体类集合 /// 表名 /// 是否使用自增主键(序列) /// 主键名 /// 主键自增SQL函数 private void InsertTableData(OracleHelper oracleHelper, List listData, string tableName, bool isPrimaryKey = false, string primaryKey = "", string nextval = "") { if (listData == null) { throw new Exception("数据集合不可为空!"); } if (string.IsNullOrEmpty(tableName)) { throw new Exception("表名不可为空!"); } if (isPrimaryKey)//不插入原来主键,使用自增主键(序列),则判断必要条件 { if (string.IsNullOrEmpty(primaryKey)) { throw new Exception("表名主键名不可为空!"); } if (string.IsNullOrEmpty(nextval)) { throw new Exception("序列不可为空!"); } } try { List sqlStringList = new List(); string sqlString = string.Empty; foreach (T t in listData) { var pros = typeof(T).GetProperties(); string names = string.Empty; string values = string.Empty; foreach (var item in pros) { // isPrimaryKey = true 排除主键字段 if ((isPrimaryKey && item.Name.ToUpper() == primaryKey.ToUpper()) || item.Name.ToUpper().Contains((primaryKey + "_Encrypt").ToUpper()) || item.Name.ToUpper() == "KEYID") { continue; } object value = item.GetValue(t, null); if (IsType(item.PropertyType, "System.String") || item.PropertyType == typeof(System.String)) { if (value != null && !string.IsNullOrEmpty(value.ToString())) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + "'" + value.ToString().Replace("'", "''") + "'"; } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.Int16]") || IsType(item.PropertyType, "System.Nullable`1[System.Int32]") || IsType(item.PropertyType, "System.Nullable`1[System.Int64]") || IsType(item.PropertyType, "System.Nullable`1[System.Double]") || IsType(item.PropertyType, "System.Nullable`1[System.Decimal]") || IsType(item.PropertyType, "System.Nullable`1[System.Boolean]") || item.PropertyType == typeof(System.Int16) || item.PropertyType == typeof(System.Int32) || item.PropertyType == typeof(System.Int64) || item.PropertyType == typeof(System.Double) || item.PropertyType == typeof(System.Decimal) || item.PropertyType == typeof(System.Boolean)) { if (value != null) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + value; } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.DateTime]") || item.PropertyType == typeof(System.DateTime)) { if (value != null) { names += (string.IsNullOrEmpty(names) ? "" : ",") + item.Name; values += (string.IsNullOrEmpty(values) ? "" : ",") + string.Format("TO_DATE('{0}','YYYY/MM/DD HH24:MI:SS')", value); } continue; } } if (isPrimaryKey) { sqlStringList.Add(string.Format("INSERT INTO {0}({1},{2}) VALUES({3},{4})", tableName, primaryKey, names, nextval, values)); } else { sqlStringList.Add(string.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, names, values)); } } if (sqlStringList != null && sqlStringList.Count > 0) { oracleHelper.ExecuteSqlTran(sqlStringList); } else { throw new Exception("SQL语句不可为空!"); } } catch (Exception ex) { //LogHelper.WriteSendLog(ex.Message); throw ex; } } #endregion #region 方法 -> 通用表数据修改 /// /// 通用表数据修改 /// Mr.Cai 2018-3-15 /// /// 数据库SQL执行帮助类 /// 实体类集合 /// 表名 /// 条件名数组 /// 是否更新空值字段 private void UpdateTableData(OracleHelper oracleHelper, List listData, string tableName, string[] whereName, bool updateNull = false, string[] updateName = null) { if (listData == null) { throw new Exception("数据集合不可为空!"); } if (whereName == null) { throw new Exception("修改条件名不可为空!"); } if (string.IsNullOrEmpty(tableName)) { throw new Exception("表名不可为空!"); } try { string[] sqlString = new string[listData.Count]; int index = 0;//索引 foreach (T t in listData) { var pros = typeof(T).GetProperties(); string modifiedValues = string.Empty; string whereModified = string.Empty; foreach (var item in pros) { // isPrimaryKey = true 排除主键字段 if (item.Name.ToUpper().Contains(("_Encrypt").ToUpper()) || item.Name.ToUpper() == "KEYID") { continue; } object value = item.GetValue(t, null); if (IsType(item.PropertyType, "System.String") || item.PropertyType == typeof(System.String)) { if (value != null && !string.IsNullOrEmpty(value.ToString())) { if (updateName == null || updateName.Contains(item.Name.ToUpper())) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = " + "'" + value.ToString().Replace("'", "''") + "'"; } for (int i = 0; i < whereName.Length; i++) { if (whereName[i].ToUpper().Equals(item.Name.ToUpper())) { whereModified += (string.IsNullOrEmpty(whereModified) ? "" : " AND ") + item.Name + " = " + "'" + value + "'"; } } } else { if (updateNull && (updateName == null || updateName.Contains(item.Name.ToUpper()))) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = " + "NULL"; } } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.Int16]") || IsType(item.PropertyType, "System.Nullable`1[System.Int32]") || IsType(item.PropertyType, "System.Nullable`1[System.Int64]") || IsType(item.PropertyType, "System.Nullable`1[System.Double]") || IsType(item.PropertyType, "System.Nullable`1[System.Decimal]") || IsType(item.PropertyType, "System.Nullable`1[System.Boolean]") || item.PropertyType == typeof(System.Int16) || item.PropertyType == typeof(System.Int32) || item.PropertyType == typeof(System.Int64) || item.PropertyType == typeof(System.Double) || item.PropertyType == typeof(System.Decimal) || item.PropertyType == typeof(System.Boolean)) { if (value != null) { if (updateName == null || updateName.Contains(item.Name.ToUpper())) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = " + value; } for (int i = 0; i < whereName.Length; i++) { if (whereName[i].ToUpper().Equals(item.Name.ToUpper())) { whereModified += (string.IsNullOrEmpty(whereModified) ? "" : " AND ") + item.Name + " = " + value; } } } else { if (updateNull && (updateName == null || updateName.Contains(item.Name.ToUpper()))) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = NULL"; } } continue; } if (IsType(item.PropertyType, "System.Nullable`1[System.DateTime]") || item.PropertyType == typeof(System.DateTime)) { if (value != null) { if (updateName == null || updateName.Contains(item.Name.ToUpper())) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = " + string.Format("TO_DATE('{0}','YYYY/MM/DD HH24:MI:SS')", value); } for (int i = 0; i < whereName.Length; i++) { if (whereName[i].ToUpper().Equals(item.Name.ToUpper())) { whereModified += (string.IsNullOrEmpty(whereModified) ? "" : " AND ") + item.Name + " = " + string.Format("TO_DATE('{0}','YYYY/MM/DD HH24:MI:SS')", value); } } } else { if (updateNull && (updateName == null || updateName.Contains(item.Name.ToUpper()))) { modifiedValues += (string.IsNullOrEmpty(modifiedValues) ? "" : ",") + item.Name + " = NULL"; } } continue; } } sqlString[index] += string.Format("UPDATE {0} SET {1} WHERE {2}", tableName, modifiedValues, whereModified); index++; } oracleHelper.ExecuteSqlTran(sqlString); } catch (Exception ex) { throw ex; } } #endregion #region 方法 -> 类型匹配 /// /// 类型匹配 /// /// 类型 /// 类型名称 /// private bool IsType(Type type, string typeName) { if (type.ToString() == typeName) return true; if (type.ToString() == "System.Object") return false; return IsType(type.BaseType, typeName); } #endregion } public class FeedbackResult { public int ResultCode { get; set; } public string ResultDesc { get; set; } public List Data { get; set; } } }