using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using Transmission.SDK; using Transmission.SDK.ThreadPool; namespace DataTransferClient { public class ConfigThread : IConfigInterface { #region 参数变量 protected string TransferTimes = ConfigurationManager.AppSettings["TransferTimes"]; /// /// 表名集合 /// private Hashtable tableNameList = null; //表名集合 /// /// 表注解集合 /// private Hashtable tableDescList = null; /// /// 查询表所有数据SQL集合 /// private Hashtable allDataSql = null; //查询表所有数据SQL集合 /// /// 表对应创建时间字段名 /// private Hashtable createDateName = null; //表对应创建时间字段名 /// /// 表对应主键值 /// private Hashtable tableDatas = null; //表对应主键值 /// /// 本地需要修改的状态字段名称 /// private Hashtable stateNames = null; //本地需要修改的状态字段名称 /// /// 线程上传、下发启动时间比例 /// private Hashtable timeList = null; //线程上传、下发启动时间比例 /// /// 上传批量传输最大数据量 /// private Hashtable maxDataQuantityList = null; //上传批量传输最大数据量 /// /// 服务区编码 /// private string serverpartcode = null; //SERVERPARTCODE 服务区编码 /// /// 是否使用替换字段名 /// private bool isReplaceColumnName = false; //是否使用替换字段名 /// /// 默认最大上传天数 /// private int endaccounttimes = 0; //ENDACCOUNTTIMES 默认最大上传天数 protected string _SALEDATE = ConfigurationManager.AppSettings["SALEDATE"];//流水节点 protected string _ServerPartCode = ConfigurationManager.AppSettings["SERVERPARTCODE"];//服务区编码 #endregion /// /// 需要传输的表及传输类型 /// 上传:TOP /// 下载:DOWN /// /// private Hashtable getTableNameList() { Hashtable _TableNameList = new Hashtable { #region 上传部分 //服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP", "TOP" }, //商品列表表 { "Platform_Data.T_CommodityType", "TOP"}, //商品信息表 { "Platform_Data.T_Commodity", "TOP"}, //日结营收表 { "Platform_Data.T_Revenue", "TOP"}, //现场稽核表 { "Platform_Data.T_Check", "TOP"}, //销售流水表 { "Platform_Data.T_Sales", "TOP"}, //销售流水明细表 { "Platform_Data.T_SalesDetail", "TOP"} #endregion }; return _TableNameList; } /// /// 传输表时间间隔比例 /// /// private Hashtable getTimeList() { Hashtable _TimeList = new Hashtable { #region 上传部分 //服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP", 0 }, //商品列表表 { "Platform_Data.T_CommodityType", 0}, //商品信息表 { "Platform_Data.T_Commodity", 0}, //日结营收表 { "Platform_Data.T_Revenue", 0}, //现场稽核表 { "Platform_Data.T_Check", 0 }, //销售流水表 { "Platform_Data.T_Sales", 0}, //销售流水明细表 { "Platform_Data.T_SalesDetail", 0}, #endregion }; return _TimeList; } /// /// 传输表数据读取方式 /// /// 数据格式:{接收端表名,发送端查询语句} /// private Hashtable getAllDataSql() { return new Hashtable() { #region 上传部分 #region 服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP", string.Format( @"SELECT A.SERVERPARTSHOP_ID,B.SPREGIONTYPE_NAME AS REGION_NAME, B.SERVERPART_NAME,A.SHOPNAME AS SERVERPARTSHOP_NAME, CASE WHEN A.BUSINESS_STATE = 1000 THEN '在营业' ELSE '已关闭' END AS BUSINESS_STATE, A.OPERATE_DATE AS CREATE_DATE,A.OPERATE_DATE AS TRANSFER_DATE FROM HIGHWAY_STORAGE.T_SERVERPARTSHOP A, HIGHWAY_STORAGE.T_SERVERPART B WHERE A.Serverpart_ID = B.Serverpart_ID AND TRUNC(A.OPERATE_DATE) {0}", TransferTimes == "1" ? "= TRUNC(SYSDATE) - 1" : "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) - 1") }, #endregion #region 商品类别表 { "Platform_Data.T_CommodityType", string.Format( @"SELECT A.COMMODITYTYPE_ID,A.COMMODITYTYPE_NAME, A.COMMODITYTYPE_PID,A.COMMODITYTYPE_CODE, CASE WHEN A.COMMODITYTYPE_VALID = 1 THEN '有效' ELSE '无效' END AS COMMODITYTYPE_STATE, A.OPERATE_DATE AS CREATE_DATE,A.OPERATE_DATE AS TRANSFER_DATE FROM HIGHWAY_STORAGE.T_COMMODITYTYPE A WHERE TRUNC(A.OPERATE_DATE) {0}", TransferTimes == "1" ? "= TRUNC(SYSDATE) - 1" : "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) - 1") }, #endregion #region 商品信息表 { "Platform_Data.T_Commodity", string.Format( @"SELECT SERVERPARTSHOP_ID,SERVERPART_NAME,SERVERPARTSHOP_NAME, COMMODITYTYPE_ID,COMMODITYTYPE_NAME,COMMODITY_NAME, COMMODITY_BARCODE,COMMODITY_UNIT,COMMODITY_RULE, COMMODITY_RETAILPRICE,COMMODITY_PURCHASEPRICE, COMMODITY_STATE,CREATE_DATE,TRANSFER_DATE FROM ( SELECT B.SERVERPARTSHOP_ID,C.SERVERPART_NAME,B.SHOPNAME AS SERVERPARTSHOP_NAME, D.COMMODITYTYPE_ID,D.COMMODITYTYPE_NAME,A.COMMODITY_NAME, A.COMMODITY_BARCODE,A.COMMODITY_UNIT,A.COMMODITY_RULE, A.COMMODITY_RETAILPRICE,A.COMMODITY_PURCHASEPRICE, CASE WHEN A.COMMODITY_STATE = 1 THEN '有效' ELSE '无效' END AS COMMODITY_STATE, A.ADDTIME AS CREATE_DATE,A.OPERATE_DATE AS TRANSFER_DATE, ROW_NUMBER()OVER(PARTITION BY B.SERVERPARTSHOP_ID,A.COMMODITY_BARCODE ORDER BY A.OPERATE_DATE DESC) AS COLNUM FROM HIGHWAY_STORAGE.T_COMMODITY A, HIGHWAY_STORAGE.T_SERVERPARTSHOP B, HIGHWAY_STORAGE.T_SERVERPART C, HIGHWAY_STORAGE.T_COMMODITYTYPE D WHERE A.SERVERPART_ID = C.SERVERPART_ID AND TO_CHAR(A.BUSINESSTYPE) = B.SHOPTRADE AND B.SERVERPART_ID = C.SERVERPART_ID AND A.COMMODITY_TYPE = TO_CHAR(D.COMMODITYTYPE_ID) AND TRUNC(A.OPERATE_DATE) {0} ) WHERE COLNUM = 1", TransferTimes == "1" ? "= TRUNC(SYSDATE) - 1" : "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) - 1") }, #endregion #region 日结营收表 { "Platform_Data.T_Revenue", string.Format( @"SELECT B.SERVERPARTSHOP_ID,A.SERVERPART_NAME,B.SHOPNAME AS SERVERPARTSHOP_NAME,A.ENDACCOUNT_DATE AS STATISTICS_DATE, CASE WHEN A.VALID = 0 THEN 0 ELSE A.CASHPAY END AS REVENUE_AMOUNT, A.TICKETCOUNT,A.TOTALCOUNT,A.TOTALSELLAMOUNT AS TOTALAMOUNT,A.TOTALOFFAMOUNT AS TOTALDISCOUNT, A.CASH AS CASHPAY,A.CREDITCARD AS BANKPAY,A.TICKETBILL AS WECHATPAY,A.OTHERPAY AS ALIPAY, NVL(A.COSTBILL,0) + NVL(A.VIPPERSON,0) AS OTHERPAY, A.CASHPAY_DOWNLORD AS CASHPAYMENT,A.DIFFERENT_PRICE AS DIFFERENTAMOUNT, A.DOWNLOAD_DATE AS CREATE_DATE,A.DESCRIPTION_DATE AS TRANSFER_DATE FROM HIGHWAY_SELLDATA.T_ENDACCOUNT A, HIGHWAY_STORAGE.T_SERVERPARTSHOP B WHERE A.SERVERPART_ID = B.SERVERPART_ID AND A.SHOPCODE = B.SHOPCODE AND TRUNC(A.DESCRIPTION_DATE) {0} UNION ALL SELECT B.SERVERPARTSHOP_ID,A.SERVERPART_NAME,B.SHOPNAME AS SERVERPARTSHOP_NAME,A.ENDACCOUNT_DATE AS STATISTICS_DATE, CASE WHEN A.VALID = 0 THEN 0 ELSE A.CASHPAY END AS REVENUE_AMOUNT, A.TICKETCOUNT,A.TOTALCOUNT,A.TOTALSELLAMOUNT AS TOTALAMOUNT,A.TOTALOFFAMOUNT AS TOTALDISCOUNT, A.CASH AS CASHPAY,A.CREDITCARD AS BANKPAY,A.TICKETBILL AS WECHATPAY,A.OTHERPAY AS ALIPAY, NVL(A.COSTBILL,0) + NVL(A.VIPPERSON,0) AS OTHERPAY, A.CASHPAY_DOWNLORD AS CASHPAYMENT,A.DIFFERENT_PRICE AS DIFFERENTAMOUNT, A.DOWNLOAD_DATE AS CREATE_DATE,A.DOWNLOAD_DATE AS TRANSFER_DATE FROM HIGHWAY_SELLDATA.T_ENDACCOUNT A, HIGHWAY_STORAGE.T_SERVERPARTSHOP B WHERE A.SERVERPART_ID = B.SERVERPART_ID AND A.SHOPCODE = B.SHOPCODE AND TRUNC(A.DOWNLOAD_DATE) {0} AND A.DESCRIPTION_DATE IS NULL", TransferTimes == "1" ? "= TRUNC(SYSDATE) - " + TransferTimes : "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE)") }, #endregion #region 现场稽核表 { "Platform_Data.T_Check", string.Format( @"SELECT B.ServerpartShop_ID,A.Serverpart_Name,B.SHOPNAME AS ServerpartShop_Name, A.CHECK_ENDDATE AS Check_Date,A.CASHPAY AS Check_Amount, A.DIFFERENT_PRICE AS Different_Amount, A.WORKER_NAME AS Check_Staff,A.DOWNLOAD_DATE AS Transfer_Date FROM HIGHWAY_SELLDATA.T_CHECKACCOUNT A, HIGHWAY_STORAGE.T_SERVERPARTSHOP B WHERE A.SERVERPART_ID = B.SERVERPART_ID AND A.SHOPCODE = B.SHOPCODE AND TRUNC(A.DOWNLOAD_DATE) {0}", TransferTimes == "1" ? "= TRUNC(SYSDATE) - 1" : "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) - 1") }, #endregion #region 销售流水表 { "Platform_Data.T_Sales",string.Format( @"SELECT SERVERPARTSHOP_ID,SERVERPART_NAME,SERVERPARTSHOP_NAME,MACHINECODE,SALES_CODE, SALES_TIME,SALESWORKER_NAME,TICKET_CODE,SALES_COUNT,SALES_AMOUNT,SALES_OFFAMOUNT, CASHPAY,BANKPAY,WECHATPAY,ALIPAY,OTHERPAY,SELLMASTER_CODE,SYSDATE AS TRANSFER_DATE FROM ( SELECT B.SERVERPARTSHOP_ID,A.SERVERPART_NAME,B.SHOPNAME AS SERVERPARTSHOP_NAME, A.MACHINECODE,A.SELLMASTER_CODE AS SALES_CODE,A.SELLMASTER_DATE AS SALES_TIME, A.SELLMASTER_CODE,A.SELLWORKER_NAME AS SALESWORKER_NAME,A.TICKET_CODE, A.SELLMASTER_COUNT AS SALES_COUNT,A.SELLMASTER_AMOUNT AS SALES_AMOUNT, A.SELLMASTER_OFFPRICE AS SALES_OFFAMOUNT,A.CASHPAY,A.BANKPAY, CASE WHEN PAYMENT_TYPE = 'WECHATPAY' THEN MOBILEPAY ELSE 0 END AS WECHATPAY, CASE WHEN PAYMENT_TYPE = 'ALIPAY' THEN MOBILEPAY ELSE 0 END AS ALIPAY, NVL(A.MEMBERPAY,0) + NVL(A.COUPONPAY,0) + NVL(INTERNALPAY,0) + NVL(OTHERPAY,0) AS OTHERPAY FROM HIGHWAY_EXCHANGE.T_SELLMASTER A, HIGHWAY_EXCHANGE.T_SHOPMESSAGE_EX B WHERE A.SERVERPARTCODE = B.SERVERPART_CODE AND A.SHOPCODE = B.SHOPCODE AND NVL(A.TRANSFER_STATE,0) = 0 AND A.SELLMASTER_DATE {0} {1} {2} ORDER BY A.SELLMASTER_DATE )", "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) + 1", !string.IsNullOrEmpty(_SALEDATE) ? " AND A.SELLMASTER_DATE >= TO_DATE('" + _SALEDATE + "','YYYY/MM/DD') + 1" : "", !string.IsNullOrEmpty(_ServerPartCode) ? " AND A.SERVERPARTCODE IN ('" + _ServerPartCode.Replace(",","','") + "')" : "") }, { "Platform_Data.T_SalesDetail",string.Format( @"SELECT SALESDETAIL_ID,SALES_CODE,SELLMASTER_CODE,LINENUM,COMMODITY_NAME,COMMODITY_BARCODE, SALESDETAIL_COUNT,SALESDETAIL_PRICE,SALESDETAIL_AMOUNT, SALESDETAIL_OFFAMOUNT,SALESDETAIL_LINENUM,SYSDATE AS TRANSFER_DATE FROM ( SELECT A.SELLDETAILS_ID AS SALESDETAIL_ID,A.SELLMASTER_CODE AS SALES_CODE, A.COMMODITY_NAME,A.COMMODITY_BARCODE,A.SELLDETAILS_COUNT AS SALESDETAIL_COUNT, A.SELLDETAILS_PRICE AS SALESDETAIL_PRICE,A.SELLDETAILS_AMOUNT AS SALESDETAIL_AMOUNT, A.SELLDETAILS_OFFPRICE AS SALESDETAIL_OFFAMOUNT,A.LINENUM AS SALESDETAIL_LINENUM, A.SELLMASTER_CODE,A.LINENUM FROM HIGHWAY_EXCHANGE.T_SELLDETAILS A WHERE NVL(A.TRANSFER_STATE,0) = 0 AND A.CREATE_DATE {0} ORDER BY A.CREATE_DATE )", "BETWEEN TRUNC(SYSDATE) - " + TransferTimes + " AND TRUNC(SYSDATE) + 1") }, #endregion #endregion }; } /// /// 初始化传输时间字段 /// /// 数据格式:{接收端表名,数据更新判断唯一字段} /// private Hashtable getCreateDateName() { Hashtable _CreateDateName = new Hashtable { #region 上传部分 //服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP","TRANSFER_DATE" }, //商品列表表 { "Platform_Data.T_CommodityType", "TRANSFER_DATE"}, //商品信息表 { "Platform_Data.T_Commodity", "TRANSFER_DATE"}, //日结营收表 { "Platform_Data.T_Revenue", "TRANSFER_DATE"}, //现场稽核表 { "Platform_Data.T_Check","TRANSFER_DATE" }, //销售流水表 { "Platform_Data.T_Sales", "TRANSFER_DATE"}, //销售流水明细表 { "Platform_Data.T_SalesDetail", "TRANSFER_DATE"}, #endregion }; return _CreateDateName; } /// /// 初始化数据唯一条件字段 /// /// 数据格式:{接收端表名,发送端表名,发送端主键值} /// private Hashtable getTableDatas() { return new Hashtable { #region 上传部分 -> 唯一条件标识上传状态 #region 服务区信息表 //服务区信息表 { "Platform_Data.T_SERVERPARTSHOP", new TopParameter("HIGHWAY_STORAGE.T_SERVERPARTSHOP", new Dictionary()) }, #endregion #region 商品类别表 //服务区门店表 { "Platform_Data.T_CommodityType", new TopParameter("HIGHWAY_STORAGE.T_COMMODITYTYPE", new Dictionary()) }, #endregion #region 商品信息表 //服务区门店表 { "Platform_Data.T_Commodity", new TopParameter("HIGHWAY_STORAGE.T_COMMODITY", new Dictionary()) }, #endregion #region 日结营收表 //用户账户表 { "Platform_Data.T_Revenue", new TopParameter("HIGHWAY_SELLDATA.T_ENDACCOUNT", new Dictionary()) }, #endregion #region 现场稽核表 //推送详情表 { "Platform_Data.T_Check", new TopParameter("HIGHWAY_SELLDATA.T_CHECKACCOUNT", new Dictionary()) }, #endregion #region 销售流水表 //销售流水表 { "Platform_Data.T_Sales", new TopParameter("HIGHWAY_EXCHANGE.T_SELLMASTER", new Dictionary { { "SELLMASTER_CODE", DataCheckHelper.ValueType.String } }) }, { "Platform_Data.T_SalesDetail", new TopParameter("HIGHWAY_EXCHANGE.T_SELLDETAILS", new Dictionary { { "SELLMASTER_CODE", DataCheckHelper.ValueType.String }, { "LINENUM", DataCheckHelper.ValueType.Int } }) }, #endregion #endregion }; } /// /// 定义表传输状态字段 /// /// 数据格式:{接收端表名,传输状态字段} /// private Hashtable getStateNames() { return new Hashtable { #region 上传部分 //服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP","" }, //商品列表表 { "Platform_Data.T_CommodityType", ""}, //商品信息表 { "Platform_Data.T_Commodity", ""}, //日结营收表 { "Platform_Data.T_Revenue", ""}, //现场稽核表 { "Platform_Data.T_Check","" }, //销售流水表 { "Platform_Data.T_Sales", "TRANSFER_STATE"}, //销售流水明细表 { "Platform_Data.T_SalesDetail", "TRANSFER_STATE"}, #endregion }; } /// /// 单次最大传输数量 /// /// 数据格式:{接收端表名,传输数量} /// private Hashtable getMaxDataQuantityList() { return new Hashtable { #region 上传部分 //服务区门店信息表 { "Platform_Data.T_SERVERPARTSHOP", 20 }, //商品列表表 { "Platform_Data.T_CommodityType", 20}, //商品信息表 { "Platform_Data.T_Commodity", 20}, //日结营收表 { "Platform_Data.T_Revenue", 20}, //现场稽核表 { "Platform_Data.T_Check", 20 }, //销售流水表 { "Platform_Data.T_Sales", 20}, //销售流水明细表 { "Platform_Data.T_SalesDetail", 20}, #endregion }; } #region 方法 -> 构造函数 /// /// 线程配置 /// public ConfigThread(string serverpartcode = null, bool isReplaceColumnName = false, int endaccounttimes = 0) { if (serverpartcode != null) { this.serverpartcode = serverpartcode; } if (endaccounttimes > 0) { this.endaccounttimes = endaccounttimes; } if (this.isReplaceColumnName != isReplaceColumnName) { this.isReplaceColumnName = isReplaceColumnName; } setTableNameList(); setCreateDateName(); setTableDatas(); setStateNames(); setTimeList(); setMaxDataQuantityList(); setAllDataSql();//最后加载 } /// /// 线程配置 /// /// 表名集合 /// 查询表所有数据SQL集合 /// 表对应创建时间字段名 /// 表对应主键值 /// 本地需要修改的状态名称 public ConfigThread(Hashtable tableNameList, Hashtable allDataSql, Hashtable createDateName, Hashtable tableDatas, Hashtable stateNames, Hashtable timeList, bool isReplaceColumnName = false, Hashtable maxDataQuantityList = null, string serverpartcode = null, int endaccounttimes = 0) { if (serverpartcode != null) { this.serverpartcode = serverpartcode; } if (endaccounttimes > 0) { this.endaccounttimes = endaccounttimes; } if (this.isReplaceColumnName != isReplaceColumnName) { this.isReplaceColumnName = isReplaceColumnName; } setTableNameList(tableNameList); setCreateDateName(createDateName); setTableDatas(tableDatas); setStateNames(stateNames); setTimeList(timeList); setMaxDataQuantityList(maxDataQuantityList); setAllDataSql(allDataSql);//最后加载 } #endregion #region 方法 -> 动态配置参数 /// /// 表名集合 /// /// public void setTableNameList(Hashtable tableNameList = null) { if (tableNameList == null) { this.tableNameList = getTableNameList(); } else { this.tableNameList = tableNameList; } } /// /// 查询表所有数据SQL集合 /// /// public void setAllDataSql(Hashtable allDataSql = null) { if (allDataSql == null) { this.allDataSql = getAllDataSql(); } else { this.allDataSql = allDataSql; } } /// /// 表对应创建时间字段名 /// /// public void setCreateDateName(Hashtable createDateName = null) { if (createDateName == null) { this.createDateName = getCreateDateName(); } else { this.createDateName = createDateName; } } /// /// 表对应主键值 /// /// public void setTableDatas(Hashtable tableDatas = null) { if (tableDatas == null) { this.tableDatas = getTableDatas(); } else { this.tableDatas = tableDatas; } } /// /// 本地需要修改的状态名称 /// /// public void setStateNames(Hashtable stateNames = null) { if (stateNames == null) { this.stateNames = getStateNames(); } else { this.stateNames = stateNames; } } /// /// 上传、下发启动间隔时间 /// /// public void setTimeList(Hashtable timeList = null) { if (timeList == null) { this.timeList = getTimeList(); } else { this.timeList = timeList; } } /// /// 上传批量传输最大数据量 /// /// public void setMaxDataQuantityList(Hashtable maxDataQuantityList = null) { if (maxDataQuantityList == null) { this.maxDataQuantityList = getMaxDataQuantityList(); } else { this.maxDataQuantityList = maxDataQuantityList; } } #endregion #region 方法 -> 接口参数 /// /// 接口参数 /// Important parameters of the interface, sacred and inviolable /// /// public Hashtable onTableNameList() { return tableNameList; } public Hashtable onAllDataSql() { return allDataSql; } public Hashtable onCreateDateName() { return createDateName; } public Hashtable onTableDatas() { return tableDatas; } public Hashtable onStateNames() { return stateNames; } public Hashtable onTimeList() { return timeList; } public Hashtable onMaxDataQuantityList() { return maxDataQuantityList; } public Hashtable onTableDescList() { return tableDescList; } #endregion } }