using System; using System.Collections.Generic; using System.Data; using System.Linq; using Transmission.SDK; namespace TransmissionClient { public class BigData { public event DelegateResult ResultEvent; public delegate void DelegateResult(DateTime triggerTime, string resultMessage); /// /// 客单区段统计 /// /// 数据库连接类 public void CreateSalesAnalysis(OracleHelper localOracle) { try { string _ServerPartName = ""; decimal _AnalysisAmount = 10; int _AnalysisAge = 10; int _AnalysisTime = 60; int _TotalCount = 0; int _InsrtCount = 0; ResultEvent(DateTime.Now, "正在启动昨日客单区段数据统计......"); DataTable _ConfigTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAMOUNT',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAMOUNT, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAGE',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAGE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISTIME',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISTIME FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B LEFT JOIN HIGHWAY_EXCHANGE.T_BUSINESSCONFIG C ON B.SERVERPARTCODE = C.SERVERPARTCODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND UPPER(C.CONFIGURATION_NAME) IN ('ANALYSISAMOUNT','ANALYSISAGE','ANALYSISTIME') WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.BUSINESSTYPE IS NOT NULL GROUP BY A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE ORDER BY B.SERVERPARTCODE").Tables[0]; if (_ConfigTable.Rows.Count > 0) { DataTable _SalesAnalysisTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SALESANALYSIS_CODE FROM HIGHWAY_EXCHANGE.T_SALESANALYSIS A WHERE TRUNC(A.SALESANALYSIS_DATE) = TRUNC(SYSDATE) - 1").Tables[0]; for (int i = 0; i < _ConfigTable.Rows.Count; i++) { //读取配置 string _ServerPartCode = _ConfigTable.Rows[i]["SERVERPARTCODE"].ToString(); string _BusinessType = _ConfigTable.Rows[i]["BUSINESSTYPE"].ToString(); decimal.TryParse(_ConfigTable.Rows[i]["ANALYSISAMOUNT"].ToString(), out _AnalysisAmount); if (_AnalysisAmount <= 0) { _AnalysisAmount = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISAGE"].ToString(), out _AnalysisAge); if (_AnalysisAge <= 0) { _AnalysisAge = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISTIME"].ToString(), out _AnalysisTime); if (_AnalysisTime <= 0 || _AnalysisTime > 60) { _AnalysisTime = 60; } if (_ConfigTable.Rows[i]["SERVERPART_NAME"].ToString() != _ServerPartName) { _ServerPartName = _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString(); ResultEvent(DateTime.Now, $"正在统计[{ _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString()}]昨日客单区段数据......"); } //开始统计 List _SalesAnalysisList = (List)DataTableHelper.DataTableToIList(localOracle.ExcuteSqlGetDataSet( $@"SELECT T.SERVERPARTCODE||T.SHOPCODE||TO_CHAR(TRUNC(T.SELLMASTER_DATE),'YYYYMMDDHH24MISS')||'1000'|| TO_CHAR(FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}) AS SALESANALYSIS_CODE, T.PROVINCE_CODE AS PROVINCE_ID,T.SERVERPART_ID AS SERVERPART_ID,T.SERVERPARTCODE AS SERVERPART_CODE, T.SERVERPART_NAME AS SERVERPART_NAME,T.BUSINESSTYPE AS BUSINESSTYPE,T.SERVERPARTSHOP_ID AS SERVERPARTSHOP_ID, T.SHOPCODE AS SHOPCODE,T.SHOPNAME AS SHOPNAME,TRUNC(T.SELLMASTER_DATE) AS SALESANALYSIS_DATE, 1000 AS SALESANALYSIS_TYPE,FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} AS SALEAMOUNT_START, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount} AS SALEAMOUNT_END, COUNT(T.SELLMASTER_DATE) AS TICKET_COUNT,SUM(T.SELLMASTER_COUNT) AS TOTAL_COUNT, SUM(T.SELLMASTER_AMOUNT) AS TOTAL_AMOUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN 1 ELSE NULL END) AS MALE_TICKET, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN T.SELLMASTER_COUNT ELSE NULL END) AS MALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN T.SELLMASTER_AMOUNT ELSE NULL END) AS MALE_AMOUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN 1 ELSE NULL END) AS FEMALE_TICKET, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN T.SELLMASTER_COUNT ELSE NULL END) AS FEMALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN T.SELLMASTER_AMOUNT ELSE NULL END) AS FEMALE_AMOUNT FROM (SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE, C.SELLMASTER_DATE,C.SELLMASTER_COUNT,C.SELLMASTER_AMOUNT,D.CUSTOMER_GENDER FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_SELLMASTER C LEFT JOIN HIGHWAY_EXCHANGE.T_CUSTOMERINFO D ON C.SELLMASTER_CODE = D.SELLMASTER_CODE WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SHOPCODE = C.SHOPCODE AND B.SERVERPARTCODE = C.SERVERPARTCODE AND TRUNC(C.SELLMASTER_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' UNION ALL SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE, C.SELLDATA_DATE AS SELLMASTER_DATE,SUM(C.SELLCOUNT) AS SELLMASTER_COUNT, SUM(C.FACTAMOUNT) AS SELLMASTER_AMOUNT,NULL AS CUSTOMER_GENDER FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_SELLDATA C WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SHOPCODE = C.SHOPCODE AND B.SERVERPARTCODE = C.SERVERPARTCODE AND TRUNC(C.SELLDATA_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' GROUP BY A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE,C.SELLDATA_DATE) T WHERE T.SELLMASTER_AMOUNT > 0 GROUP BY T.PROVINCE_CODE,T.SERVERPART_ID,T.SERVERPARTCODE,T.SERVERPART_NAME, T.BUSINESSTYPE,T.SERVERPARTSHOP_ID,T.SHOPCODE,T.SHOPNAME,TRUNC(T.SELLMASTER_DATE), FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount}, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}").Tables[0]); List _InsertList = new List(); foreach (Model.SALESANALYSIS _SALESANALYSIS in _SalesAnalysisList) { if (_SalesAnalysisTable.Select($" SALESANALYSIS_CODE = '{_SALESANALYSIS.SALESANALYSIS_CODE}' ").Count() == 0) { _InsertList.Add(_SALESANALYSIS); } } if (_InsertList.Count > 0) { OperationDataHelper.InsertTableData( localOracle, _InsertList, "HIGHWAY_EXCHANGE.T_SALESANALYSIS", true, "SALESANALYSIS_ID", "HIGHWAY_EXCHANGE.SEQ_SALESANALYSIS.NEXTVAL"); } _TotalCount += _SalesAnalysisList.Count; _InsrtCount += _InsertList.Count; } ResultEvent(DateTime.Now, $"昨日客单区段数据统计完成:总数:{_TotalCount};新增:{_InsrtCount}"); } } catch (Exception ex) { ResultEvent(DateTime.Now, "昨日客单区段数据统计失败:" + ex.Message); } } /// /// 客单时段区段统计 /// /// 数据库连接 public void CreateSalesIntervalAnalysis(OracleHelper localOracle) { try { string _ServerPartName = ""; decimal _AnalysisAmount = 10; int _AnalysisAge = 10; int _AnalysisTime = 60; int _TotalCount = 0; int _InsrtCount = 0; ResultEvent(DateTime.Now, "正在启动客单时段区段数据统计......"); DataTable _ConfigTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAMOUNT',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAMOUNT, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAGE',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAGE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISTIME',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISTIME FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B LEFT JOIN HIGHWAY_EXCHANGE.T_BUSINESSCONFIG C ON B.SERVERPARTCODE = C.SERVERPARTCODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND UPPER(C.CONFIGURATION_NAME) IN ('ANALYSISAMOUNT','ANALYSISAGE','ANALYSISTIME') WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.BUSINESSTYPE IS NOT NULL GROUP BY A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE ORDER BY B.SERVERPARTCODE").Tables[0]; if (_ConfigTable.Rows.Count > 0) { DataTable _SalesAnalysisTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SALESINTERVALANALYSIS_CODE FROM HIGHWAY_EXCHANGE.T_SALESINTERVALANALYSIS A WHERE TRUNC(A.DATE_END) = TRUNC(SYSDATE) - 1").Tables[0]; for (int i = 0; i < _ConfigTable.Rows.Count; i++) { //读取配置 string _ServerPartCode = _ConfigTable.Rows[i]["SERVERPARTCODE"].ToString(); string _BusinessType = _ConfigTable.Rows[i]["BUSINESSTYPE"].ToString(); decimal.TryParse(_ConfigTable.Rows[i]["ANALYSISAMOUNT"].ToString(), out _AnalysisAmount); if (_AnalysisAmount <= 0) { _AnalysisAmount = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISAGE"].ToString(), out _AnalysisAge); if (_AnalysisAge <= 0) { _AnalysisAge = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISTIME"].ToString(), out _AnalysisTime); if (_AnalysisTime <= 0 || _AnalysisTime > 60) { _AnalysisTime = 60; } if (_ConfigTable.Rows[i]["SERVERPART_NAME"].ToString() != _ServerPartName) { _ServerPartName = _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString(); ResultEvent(DateTime.Now, $"正在统计[{ _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString()}]客单时段区段数据......"); } List _SalesIntervalAnalysisList = (List)DataTableHelper.DataTableToIList(localOracle.ExcuteSqlGetDataSet( $@"SELECT T.SERVERPARTCODE||T.SHOPCODE||TO_CHAR(TO_DATE(TO_CHAR(T.SELLMASTER_DATE, 'YYYY/MM/DD HH24'),'YYYY/MM/DD HH24:MI:SS') + ((FLOOR(TO_CHAR(T.SELLMASTER_DATE, 'MI') / {_AnalysisTime} ) * {_AnalysisTime} + {_AnalysisTime}) * 60 - 1) /86400,'YYYYMMDDHH24MISS')||'1000'|| TO_CHAR(FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}) AS SALESINTERVALANALYSIS_CODE, T.PROVINCE_CODE AS PROVINCE_ID,T.SERVERPART_ID AS SERVERPART_ID,T.SERVERPARTCODE AS SERVERPART_CODE, T.SERVERPART_NAME AS SERVERPART_NAME,T.BUSINESSTYPE AS BUSINESSTYPE,T.SERVERPARTSHOP_ID AS SERVERPARTSHOP_ID, T.SHOPCODE AS SHOPCODE,T.SHOPNAME AS SHOPNAME,TO_DATE(TO_CHAR(T.SELLMASTER_DATE, 'YYYY/MM/DD HH24'),'YYYY/MM/DD HH24:MI:SS') + ((FLOOR(TO_CHAR(T.SELLMASTER_DATE, 'MI') / {_AnalysisTime} ) * {_AnalysisTime}) * 60) /86400 AS DATE_START, TO_DATE(TO_CHAR(T.SELLMASTER_DATE, 'YYYY/MM/DD HH24'),'YYYY/MM/DD HH24:MI:SS') + ((FLOOR(TO_CHAR(T.SELLMASTER_DATE, 'MI') / {_AnalysisTime} ) * {_AnalysisTime} + {_AnalysisTime}) * 60 - 1) /86400 AS DATE_END, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} AS AMOUNT_START, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount} AS AMOUNT_END, COUNT(T.SELLMASTER_DATE) AS TICKET_COUNT,SUM(T.SELLMASTER_COUNT) AS TOTAL_COUNT, SUM(T.SELLMASTER_AMOUNT) AS TOTAL_AMOUNT,FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} AS AGE_START, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge} AS AGE_END, SUM(CASE WHEN T.CUSTOMER_AGE IS NOT NULL THEN 1 ELSE NULL END) AS AGE_TICKET, SUM(CASE WHEN T.CUSTOMER_AGE IS NOT NULL THEN T.SELLMASTER_COUNT ELSE NULL END) AS AGE_COUNT, SUM(CASE WHEN T.CUSTOMER_AGE IS NOT NULL THEN T.SELLMASTER_AMOUNT ELSE NULL END) AS AGE_AMOUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN 1 ELSE NULL END) AS MALE_TICKET, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN T.SELLMASTER_COUNT ELSE NULL END) AS MALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN T.SELLMASTER_AMOUNT ELSE NULL END) AS MALE_AMOUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN 1 ELSE NULL END) AS FEMALE_TICKET, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN T.SELLMASTER_COUNT ELSE NULL END) AS FEMALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN T.SELLMASTER_AMOUNT ELSE NULL END) AS FEMALE_AMOUNT FROM (SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE, C.SELLMASTER_DATE,C.SELLMASTER_COUNT,C.SELLMASTER_AMOUNT,D.CUSTOMER_GENDER,D.CUSTOMER_AGE FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_SELLMASTER C LEFT JOIN HIGHWAY_EXCHANGE.T_CUSTOMERINFO D ON C.SELLMASTER_CODE = D.SELLMASTER_CODE WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SHOPCODE = C.SHOPCODE AND B.SERVERPARTCODE = C.SERVERPARTCODE AND TRUNC(C.SELLMASTER_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' UNION ALL SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE, C.SELLDATA_DATE AS SELLMASTER_DATE,SUM(C.SELLCOUNT) AS SELLMASTER_COUNT, SUM(C.FACTAMOUNT) AS SELLMASTER_AMOUNT,NULL AS CUSTOMER_GENDER,NULL AS CUSTOMER_AGE FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B,HIGHWAY_EXCHANGE.T_SELLDATA C WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SHOPCODE = C.SHOPCODE AND B.SERVERPARTCODE = C.SERVERPARTCODE AND TRUNC(C.SELLDATA_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' GROUP BY A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,C.MACHINECODE,C.SELLDATA_DATE) T WHERE T.SELLMASTER_AMOUNT > 0 GROUP BY T.PROVINCE_CODE,T.SERVERPART_ID,T.SERVERPARTCODE,T.SERVERPART_NAME, T.BUSINESSTYPE,T.SERVERPARTSHOP_ID,T.SHOPCODE,T.SHOPNAME, TO_DATE(TO_CHAR(T.SELLMASTER_DATE, 'YYYY/MM/DD HH24'),'YYYY/MM/DD HH24:MI:SS') + ((FLOOR(TO_CHAR(T.SELLMASTER_DATE, 'MI') / {_AnalysisTime} ) * {_AnalysisTime}) * 60) /86400, TO_DATE(TO_CHAR(T.SELLMASTER_DATE, 'YYYY/MM/DD HH24'),'YYYY/MM/DD HH24:MI:SS') + ((FLOOR(TO_CHAR(T.SELLMASTER_DATE, 'MI') / {_AnalysisTime} ) * {_AnalysisTime} + {_AnalysisTime}) * 60 - 1) /86400, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount}, FLOOR(T.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge}, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge}").Tables[0]); List _InsertList = new List(); foreach (Model.SALESINTERVALANALYSIS _SALESINTERVALANALYSIS in _SalesIntervalAnalysisList) { if (_SalesAnalysisTable.Select($" SALESINTERVALANALYSIS_CODE = '{_SALESINTERVALANALYSIS.SALESINTERVALANALYSIS_CODE}' ").Count() == 0) { _InsertList.Add(_SALESINTERVALANALYSIS); } } if (_InsertList.Count > 0) { OperationDataHelper.InsertTableData(localOracle, _InsertList, "HIGHWAY_EXCHANGE.T_SALESINTERVALANALYSIS", true, "SALESINTERVALANALYSIS_ID", "HIGHWAY_EXCHANGE.SEQ_SALESINTERVALANALYSIS.NEXTVAL"); } _TotalCount += _SalesIntervalAnalysisList.Count; _InsrtCount += _InsertList.Count; } ResultEvent(DateTime.Now, $"客单时段区段数据统计完成:总数:{_TotalCount};新增:{_InsrtCount}"); } } catch (Exception ex) { ResultEvent(DateTime.Now, "客单时段区段数据统计失败:" + ex.Message); } } /// /// 客群区段统计 /// /// 数据库连接 public void CreateCustomerAnalysis(OracleHelper localOracle) { try { string _ServerPartName = ""; decimal _AnalysisAmount = 10; int _AnalysisAge = 10; int _AnalysisTime = 60; int _TotalCount = 0; int _InsrtCount = 0; ResultEvent(DateTime.Now, "正在启动客群区段数据统计......"); DataTable _ConfigTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAMOUNT',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAMOUNT, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAGE',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAGE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISTIME',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISTIME FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B LEFT JOIN HIGHWAY_EXCHANGE.T_BUSINESSCONFIG C ON B.SERVERPARTCODE = C.SERVERPARTCODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND UPPER(C.CONFIGURATION_NAME) IN ('ANALYSISAMOUNT','ANALYSISAGE','ANALYSISTIME') WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.BUSINESSTYPE IS NOT NULL GROUP BY A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE ORDER BY B.SERVERPARTCODE").Tables[0]; if (_ConfigTable.Rows.Count > 0) { DataTable _SalesAnalysisTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.CUSTOMERANALYSIS_CODE FROM HIGHWAY_EXCHANGE.T_CUSTOMERANALYSIS A WHERE TRUNC(A.CUSTOMERANALYSIS_DATE) = TRUNC(SYSDATE) - 1").Tables[0]; for (int i = 0; i < _ConfigTable.Rows.Count; i++) { //读取配置 string _ServerPartCode = _ConfigTable.Rows[i]["SERVERPARTCODE"].ToString(); string _BusinessType = _ConfigTable.Rows[i]["BUSINESSTYPE"].ToString(); decimal.TryParse(_ConfigTable.Rows[i]["ANALYSISAMOUNT"].ToString(), out _AnalysisAmount); if (_AnalysisAmount <= 0) { _AnalysisAmount = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISAGE"].ToString(), out _AnalysisAge); if (_AnalysisAge <= 0) { _AnalysisAge = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISTIME"].ToString(), out _AnalysisTime); if (_AnalysisTime <= 0 || _AnalysisTime > 60) { _AnalysisTime = 60; } if (_ConfigTable.Rows[i]["SERVERPART_NAME"].ToString() != _ServerPartName) { _ServerPartName = _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString(); ResultEvent(DateTime.Now, $"正在统计[{ _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString()}]客群区段数据......"); } List _CustomerAnalysisList = (List)DataTableHelper.DataTableToIList(localOracle.ExcuteSqlGetDataSet( $@"SELECT B.SERVERPARTCODE||B.SHOPCODE||TO_CHAR(TRUNC(C.ACQUISITION_TIME),'YYYYMMDDHH24MISS')||'1000'|| TO_CHAR(FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge})|| TO_CHAR(FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}) AS CUSTOMERANALYSIS_CODE, A.PROVINCE_CODE AS PROVINCE_ID,A.SERVERPART_ID AS SERVERPART_ID, A.SERVERPARTCODE AS SERVERPART_CODE,A.SERVERPART_NAME AS SERVERPART_NAME, B.BUSINESSTYPE AS BUSINESSTYPE,B.SERVERPARTSHOP_ID AS SERVERPARTSHOP_ID, B.SHOPCODE AS SHOPCODE,B.SHOPNAME AS SHOPNAME, TRUNC(C.ACQUISITION_TIME) AS CUSTOMERANALYSIS_DATE, FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} AS AGE_START, FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge} AS AGE_END, FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} AS AMOUNT_START, FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount} AS AMOUNT_END, COUNT(D.SELLMASTER_DATE) AS TICKET_COUNT,SUM(D.SELLMASTER_COUNT) AS TOTAL_COUNT, SUM(D.SELLMASTER_AMOUNT) AS TOTAL_AMOUNT, SUM(CASE C.CUSTOMER_GENDER WHEN 1 THEN D.SELLMASTER_COUNT ELSE NULL END) AS MALE_COUNT, SUM(CASE C.CUSTOMER_GENDER WHEN 1 THEN D.SELLMASTER_AMOUNT ELSE NULL END) AS MALE_AMOUNT, SUM(CASE C.CUSTOMER_GENDER WHEN 2 THEN D.SELLMASTER_COUNT ELSE NULL END) AS FEMALE_COUNT, SUM(CASE C.CUSTOMER_GENDER WHEN 2 THEN D.SELLMASTER_AMOUNT ELSE NULL END) AS FEMALE_AMOUNT FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_CUSTOMERINFO C,HIGHWAY_EXCHANGE.T_SELLMASTER D WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SERVERPARTCODE = C.SERVERPARTCODE AND B.SHOPCODE = C.SHOPCODE AND C.SELLMASTER_CODE = D.SELLMASTER_CODE AND TRUNC(C.ACQUISITION_TIME) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' GROUP BY B.SERVERPARTCODE||B.SHOPCODE||TO_CHAR(TRUNC(C.ACQUISITION_TIME),'YYYYMMDDHH24MISS')||'1000'|| TO_CHAR(FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge})|| TO_CHAR(FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}), A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME,B.BUSINESSTYPE, B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,TRUNC(C.ACQUISITION_TIME), FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge}, FLOOR(C.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge}, FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount}, FLOOR(D.SELLMASTER_AMOUNT / {_AnalysisAmount}) * {_AnalysisAmount} + {_AnalysisAmount}").Tables[0]); List _InsertList = new List(); foreach (Model.CUSTOMERANALYSIS _CUSTOMERANALYSIS in _CustomerAnalysisList) { if (_SalesAnalysisTable.Select($" CUSTOMERANALYSIS_CODE = '{_CUSTOMERANALYSIS.CUSTOMERANALYSIS_CODE}' ").Count() == 0) { _InsertList.Add(_CUSTOMERANALYSIS); } } if (_InsertList.Count > 0) { OperationDataHelper.InsertTableData(localOracle, _InsertList, "HIGHWAY_EXCHANGE.T_CUSTOMERANALYSIS", true, "CUSTOMERANALYSIS_ID", "HIGHWAY_EXCHANGE.SEQ_CUSTOMERANALYSIS.NEXTVAL"); } _TotalCount += _CustomerAnalysisList.Count; _InsrtCount += _InsertList.Count; } ResultEvent(DateTime.Now, $"客群区段数据统计完成:总数:{_TotalCount};新增:{_InsrtCount}"); } } catch (Exception ex) { ResultEvent(DateTime.Now, "客群区段数据统计失败:" + ex.Message); } } /// /// 爆款/推荐单品统计 /// /// public void CreateCommodityAnalysis(OracleHelper localOracle) { try { string _ServerPartName = ""; decimal _AnalysisAmount = 10; int _AnalysisAge = 10; int _AnalysisTime = 60; int _TotalCount = 0; int _InsrtCount = 0; ResultEvent(DateTime.Now, "正在启动单品年龄段数据统计......"); DataTable _ConfigTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAMOUNT',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAMOUNT, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISAGE',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISAGE, MAX(DECODE(UPPER(C.CONFIGURATION_NAME),'ANALYSISTIME',C.CONFIGURATION_VALUES,NULL)) AS ANALYSISTIME FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B LEFT JOIN HIGHWAY_EXCHANGE.T_BUSINESSCONFIG C ON B.SERVERPARTCODE = C.SERVERPARTCODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND UPPER(C.CONFIGURATION_NAME) IN ('ANALYSISAMOUNT','ANALYSISAGE','ANALYSISTIME') WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.BUSINESSTYPE IS NOT NULL GROUP BY A.SERVERPART_NAME,B.SERVERPARTCODE,B.BUSINESSTYPE ORDER BY B.SERVERPARTCODE").Tables[0]; if (_ConfigTable.Rows.Count > 0) { DataTable _SalesAnalysisTable = localOracle.ExcuteSqlGetDataSet( @"SELECT A.COMMODITYANALYSIS_CODE FROM HIGHWAY_EXCHANGE.T_COMMODITYANALYSIS A WHERE TRUNC(A.COMMODITYANALYSIS_DATE) = TRUNC(SYSDATE) - 1").Tables[0]; for (int i = 0; i < _ConfigTable.Rows.Count; i++) { //读取配置 string _ServerPartCode = _ConfigTable.Rows[i]["SERVERPARTCODE"].ToString(); string _BusinessType = _ConfigTable.Rows[i]["BUSINESSTYPE"].ToString(); decimal.TryParse(_ConfigTable.Rows[i]["ANALYSISAMOUNT"].ToString(), out _AnalysisAmount); if (_AnalysisAmount <= 0) { _AnalysisAmount = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISAGE"].ToString(), out _AnalysisAge); if (_AnalysisAge <= 0) { _AnalysisAge = 10; } int.TryParse(_ConfigTable.Rows[i]["ANALYSISTIME"].ToString(), out _AnalysisTime); if (_AnalysisTime <= 0 || _AnalysisTime > 60) { _AnalysisTime = 60; } if (_ConfigTable.Rows[i]["SERVERPART_NAME"].ToString() != _ServerPartName) { _ServerPartName = _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString(); ResultEvent(DateTime.Now, $"正在统计[{ _ConfigTable.Rows[i]["SERVERPART_NAME"].ToString()}]单品年龄段数据......"); } List _CommodityAnalysisList = (List)DataTableHelper.DataTableToIList(localOracle.ExcuteSqlGetDataSet( $@"SELECT T.SERVERPARTCODE||T.SHOPCODE||TO_CHAR(TRUNC(T.SELLMASTER_DATE),'YYYYMMDDHH24MISS')||'1000'|| T.COMMODITY_CODE||TO_CHAR(FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge}) AS COMMODITYANALYSIS_CODE, T.PROVINCE_CODE AS PROVINCE_ID,T.SERVERPART_ID AS SERVERPART_ID,T.SERVERPARTCODE AS SERVERPART_CODE, T.SERVERPART_NAME AS SERVERPART_NAME,T.BUSINESSTYPE AS BUSINESSTYPE,T.SERVERPARTSHOP_ID AS SERVERPARTSHOP_ID, T.SHOPCODE AS SHOPCODE,T.SHOPNAME AS SHOPNAME,T.COMMODITY_CODE,T.COMMODITY_BARCODE, T.COMMODITY_NAME,TRUNC(T.SELLMASTER_DATE) AS COMMODITYANALYSIS_DATE, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} AS AGE_START, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge} AS AGE_END, COUNT(T.SELLMASTER_DATE) AS TICKET_COUNT,SUM(T.SELLDETAILS_COUNT) AS TOTAL_COUNT, SUM(T.SELLDETAILS_AMOUNT) AS TOTAL_AMOUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN T.SELLDETAILS_COUNT ELSE NULL END) AS MALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 1 THEN 1 ELSE NULL END) AS MALE_TICKET, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN T.SELLDETAILS_COUNT ELSE NULL END) AS FEMALE_COUNT, SUM(CASE T.CUSTOMER_GENDER WHEN 2 THEN 1 ELSE NULL END) AS FEMALE_TICKET FROM (SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME,B.BUSINESSTYPE, B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,D.SELLMASTER_DATE,C.COMMODITY_CODE, C.COMMODITY_BARCODE,C.COMMODITY_NAME,F.CUSTOMER_AGE,F.CUSTOMER_GENDER, SUM(E.SELLDETAILS_COUNT) AS SELLDETAILS_COUNT,SUM(E.SELLDETAILS_AMOUNT) AS SELLDETAILS_AMOUNT FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_COMMODITYANALYSISSET C,HIGHWAY_EXCHANGE.T_SELLMASTER D, HIGHWAY_EXCHANGE.T_SELLDETAILS E LEFT JOIN HIGHWAY_EXCHANGE.T_CUSTOMERINFO F ON E.SELLMASTER_CODE = F.SELLMASTER_CODE WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SERVERPARTCODE = D.SERVERPARTCODE AND B.SHOPCODE = D.SHOPCODE AND D.SELLMASTER_CODE = E.SELLMASTER_CODE AND B.SERVERPARTCODE = C.SERVERPART_CODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND C.COMMODITY_CODE = E.COMMODITY_CODE AND TRUNC(D.SELLMASTER_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' GROUP BY A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,D.SELLMASTER_DATE,C.COMMODITY_CODE, C.COMMODITY_BARCODE,C.COMMODITY_NAME,F.CUSTOMER_AGE,F.CUSTOMER_GENDER UNION ALL SELECT A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME,B.BUSINESSTYPE, B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,G.SELLDATA_DATE AS SELLMASTER_DATE, C.COMMODITY_CODE,C.COMMODITY_BARCODE,C.COMMODITY_NAME,NULL AS CUSTOMER_AGE, NULL AS CUSTOMER_GENDER,SUM(G.SELLCOUNT) AS SELLDETAILS_COUNT,SUM(G.FACTAMOUNT) AS SELLDETAILS_AMOUNT FROM HIGHWAY_EXCHANGE.T_SYSCODE A,HIGHWAY_EXCHANGE.T_SHOPMESSAGE B, HIGHWAY_EXCHANGE.T_COMMODITYANALYSISSET C,HIGHWAY_EXCHANGE.T_SELLDATA G WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND B.SERVERPARTCODE = G.SERVERPARTCODE AND B.SHOPCODE = G.SHOPCODE AND B.SERVERPARTCODE = C.SERVERPART_CODE AND B.BUSINESSTYPE = C.BUSINESSTYPE AND C.COMMODITY_CODE = G.COMMODITY_CODE AND TRUNC(G.SELLDATA_DATE) = TRUNC(SYSDATE) - 1 AND B.SERVERPARTCODE = '{_ServerPartCode}' AND B.BUSINESSTYPE = '{_BusinessType}' GROUP BY A.PROVINCE_CODE,A.SERVERPART_ID,A.SERVERPARTCODE,A.SERVERPART_NAME, B.BUSINESSTYPE,B.SERVERPARTSHOP_ID,B.SHOPCODE,B.SHOPNAME,G.SELLDATA_DATE, C.COMMODITY_CODE,C.COMMODITY_BARCODE,C.COMMODITY_NAME) T WHERE SELLDETAILS_AMOUNT > 0 GROUP BY T.SERVERPARTCODE||T.SHOPCODE||TO_CHAR(TRUNC(T.SELLMASTER_DATE),'YYYYMMDDHH24MISS')||'1000'|| T.COMMODITY_CODE||TO_CHAR(FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge}) , T.PROVINCE_CODE,T.SERVERPART_ID,T.SERVERPARTCODE,T.SERVERPART_NAME,T.BUSINESSTYPE, T.SERVERPARTSHOP_ID,T.SHOPCODE,T.SHOPNAME,T.COMMODITY_CODE,T.COMMODITY_BARCODE, T.COMMODITY_NAME,TRUNC(T.SELLMASTER_DATE),FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge}, FLOOR(T.CUSTOMER_AGE / {_AnalysisAge}) * {_AnalysisAge} + {_AnalysisAge}").Tables[0]); List _InsertList = new List(); foreach (Model.COMMODITYANALYSIS _COMMODITYANALYSIS in _CommodityAnalysisList) { if (_SalesAnalysisTable.Select($" COMMODITYANALYSIS_CODE = '{_COMMODITYANALYSIS.COMMODITYANALYSIS_CODE}' ").Count() == 0) { _InsertList.Add(_COMMODITYANALYSIS); } } if (_InsertList.Count > 0) { OperationDataHelper.InsertTableData(localOracle, _InsertList, "HIGHWAY_EXCHANGE.T_COMMODITYANALYSIS", true, "COMMODITYANALYSIS_ID", "HIGHWAY_EXCHANGE.SEQ_COMMODITYANALYSIS.NEXTVAL"); } _TotalCount += _CommodityAnalysisList.Count; _InsrtCount += _InsertList.Count; } ResultEvent(DateTime.Now, $"单品年龄段数据统计完成:总数:{_TotalCount};新增:{_InsrtCount}"); } } catch (Exception ex) { ResultEvent(DateTime.Now, "单品年龄段数据统计失败:" + ex.Message); } } } }