2025-03-28 09:49:56 +08:00

557 lines
41 KiB
C#

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);
/// <summary>
/// 客单区段统计
/// </summary>
/// <param name="localOracle">数据库连接类</param>
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<Model.SALESANALYSIS> _SalesAnalysisList =
(List<Model.SALESANALYSIS>)DataTableHelper.DataTableToIList<Model.SALESANALYSIS>(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<Model.SALESANALYSIS> _InsertList = new List<Model.SALESANALYSIS>();
foreach (Model.SALESANALYSIS _SALESANALYSIS in _SalesAnalysisList)
{
if (_SalesAnalysisTable.Select($" SALESANALYSIS_CODE = '{_SALESANALYSIS.SALESANALYSIS_CODE}' ").Count() == 0)
{
_InsertList.Add(_SALESANALYSIS);
}
}
if (_InsertList.Count > 0)
{
OperationDataHelper<Model.SALESANALYSIS>.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);
}
}
/// <summary>
/// 客单时段区段统计
/// </summary>
/// <param name="localOracle">数据库连接</param>
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<Model.SALESINTERVALANALYSIS> _SalesIntervalAnalysisList =
(List<Model.SALESINTERVALANALYSIS>)DataTableHelper.DataTableToIList<Model.SALESINTERVALANALYSIS>(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<Model.SALESINTERVALANALYSIS> _InsertList = new List<Model.SALESINTERVALANALYSIS>();
foreach (Model.SALESINTERVALANALYSIS _SALESINTERVALANALYSIS in _SalesIntervalAnalysisList)
{
if (_SalesAnalysisTable.Select($" SALESINTERVALANALYSIS_CODE = '{_SALESINTERVALANALYSIS.SALESINTERVALANALYSIS_CODE}' ").Count() == 0)
{
_InsertList.Add(_SALESINTERVALANALYSIS);
}
}
if (_InsertList.Count > 0)
{
OperationDataHelper<Model.SALESINTERVALANALYSIS>.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);
}
}
/// <summary>
/// 客群区段统计
/// </summary>
/// <param name="localOracle">数据库连接</param>
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<Model.CUSTOMERANALYSIS> _CustomerAnalysisList =
(List<Model.CUSTOMERANALYSIS>)DataTableHelper.DataTableToIList<Model.CUSTOMERANALYSIS>(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<Model.CUSTOMERANALYSIS> _InsertList = new List<Model.CUSTOMERANALYSIS>();
foreach (Model.CUSTOMERANALYSIS _CUSTOMERANALYSIS in _CustomerAnalysisList)
{
if (_SalesAnalysisTable.Select($" CUSTOMERANALYSIS_CODE = '{_CUSTOMERANALYSIS.CUSTOMERANALYSIS_CODE}' ").Count() == 0)
{
_InsertList.Add(_CUSTOMERANALYSIS);
}
}
if (_InsertList.Count > 0)
{
OperationDataHelper<Model.CUSTOMERANALYSIS>.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);
}
}
/// <summary>
/// 爆款/推荐单品统计
/// </summary>
/// <param name="localOracle"></param>
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<Model.COMMODITYANALYSIS> _CommodityAnalysisList =
(List<Model.COMMODITYANALYSIS>)DataTableHelper.DataTableToIList<Model.COMMODITYANALYSIS>(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<Model.COMMODITYANALYSIS> _InsertList = new List<Model.COMMODITYANALYSIS>();
foreach (Model.COMMODITYANALYSIS _COMMODITYANALYSIS in _CommodityAnalysisList)
{
if (_SalesAnalysisTable.Select($" COMMODITYANALYSIS_CODE = '{_COMMODITYANALYSIS.COMMODITYANALYSIS_CODE}' ").Count() == 0)
{
_InsertList.Add(_COMMODITYANALYSIS);
}
}
if (_InsertList.Count > 0)
{
OperationDataHelper<Model.COMMODITYANALYSIS>.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);
}
}
}
}