Commit 1958764d authored by liudong1993's avatar liudong1993

1

parent c28354a7
...@@ -28,5 +28,252 @@ namespace Mall.Model.Extend.User ...@@ -28,5 +28,252 @@ namespace Mall.Model.Extend.User
/// 日期 /// 日期
/// </summary> /// </summary>
public string DateStr { get; set; } public string DateStr { get; set; }
/// <summary>
/// 月份
/// </summary>
public string DateMonth { get { return this.Date.ToString("yyyy-MM"); } }
/// <summary>
/// 获取其年份
/// </summary>
public int DateYear { get { return this.Date.Year; } }
}
/// <summary>
/// 月度统计
/// </summary>
public class User_Statistics_Query
{
/// <summary>
/// 日期(yyyy-MM)
/// </summary>
public string Date { get; set; }
/// <summary>
/// 付款人数
/// </summary>
public int PeopleNum { get; set; }
/// <summary>
/// 订单数量
/// </summary>
public int OrderNum { get; set; }
/// <summary>
/// 付款金额
/// </summary>
public decimal PayMoney { get; set; }
/// <summary>
/// 购买数量
/// </summary>
public int BuyNum { get; set; }
/// <summary>
/// 累计付款人数
/// </summary>
public int TotalPayPeople { get; set; }
/// <summary>
/// 付款人数
/// </summary>
public decimal MAvgPeopleNum { get; set; }
/// <summary>
/// 订单数量
/// </summary>
public decimal MAvgOrderNum { get; set; }
/// <summary>
/// 付款金额
/// </summary>
public decimal MAvgPayMoney { get; set; }
/// <summary>
/// 购买数量
/// </summary>
public decimal MAvgBuyNum { get; set; }
/// <summary>
/// 平均每人购买单数
/// </summary>
public decimal PAvgOrderNum { get; set; }
/// <summary>
/// 平均每人购买件数
/// </summary>
public decimal PAvgBuyNum { get; set; }
/// <summary>
/// 平均每单单价
/// </summary>
public decimal PAvgUnitPrice { get; set; }
/// <summary>
/// 平均每人购买单价
/// </summary>
public decimal PAvgBuyPrice { get; set; }
/// <summary>
/// 平均会员数量
/// </summary>
public decimal PAvgMemberNum { get; set; }
/// <summary>
/// 平均付款累计人数
/// </summary>
public decimal PAvgPaymentNum { get; set; }
/// <summary>
/// 平均會員下訂單轉換率
/// </summary>
public decimal PAvgMOrderRate { get; set; }
/// <summary>
/// 平均复购人数
/// </summary>
public decimal PAvgReBuyNum { get; set; }
/// <summary>
/// 平均复购率
/// </summary>
public decimal PAvgReBuyRate { get; set; }
/// <summary>
/// 平均新人下单
/// </summary>
public decimal PAvgNewPeopleNum { get; set; }
/// <summary>
/// 平均利润率
/// </summary>
public decimal PAvgProfitRate { get; set; }
/// <summary>
/// 今日普象新增
/// </summary>
public int PXNum { get; set; }
/// <summary>
/// 今日VIP新增
/// </summary>
public int VipNum { get; set; }
/// <summary>
/// 今日银象新增
/// </summary>
public int YXNum { get; set; }
/// <summary>
/// 今日金象新增
/// </summary>
public int JXNum { get; set; }
/// <summary>
/// 总会员数量
/// </summary>
public int TotalMNum { get; set; }
/// <summary>
/// 利润
/// </summary>
public decimal Profit { get; set; }
}
/// <summary>
/// 月度概率
/// </summary>
public class User_Statistics_Rate_Query
{
/// <summary>
/// 日期(yyyy-MM)
/// </summary>
public string Date { get; set; }
/// <summary>
/// 付款人数
/// </summary>
public decimal MAvgPeopleNum { get; set; }
/// <summary>
/// 订单数量
/// </summary>
public decimal MAvgOrderNum { get; set; }
/// <summary>
/// 付款金额
/// </summary>
public decimal MAvgPayMoney { get; set; }
/// <summary>
/// 购买数量
/// </summary>
public decimal MAvgBuyNum { get; set; }
/// <summary>
/// 平均每人购买单数
/// </summary>
public decimal PAvgOrderNum { get; set; }
/// <summary>
/// 平均每人购买件数
/// </summary>
public decimal PAvgBuyNum { get; set; }
/// <summary>
/// 平均每单单价
/// </summary>
public decimal PAvgUnitPrice { get; set; }
/// <summary>
/// 平均每人购买单价
/// </summary>
public decimal PAvgBuyPrice { get; set; }
/// <summary>
/// 平均會員下訂單轉換率
/// </summary>
public decimal PAvgMOrderRate { get; set; }
/// <summary>
/// 平均利润率
/// </summary>
public decimal PAvgProfitRate { get; set; }
/// <summary>
/// 今日普象新增
/// </summary>
public decimal PAvgPXNum { get; set; }
/// <summary>
/// 今日VIP新增
/// </summary>
public decimal PAvgVipNum { get; set; }
/// <summary>
/// 今日银象新增
/// </summary>
public decimal PAvgYXNum { get; set; }
/// <summary>
/// 今日金象新增
/// </summary>
public decimal PAvgJXNum { get; set; }
/// <summary>
/// 总会员数量
/// </summary>
public decimal PAvgTotalMNum { get; set; }
/// <summary>
/// 利润
/// </summary>
public decimal PAvgProfit { get; set; }
} }
} }
...@@ -4,6 +4,7 @@ using Mall.Model.Extend.User; ...@@ -4,6 +4,7 @@ using Mall.Model.Extend.User;
using Mall.Model.Query; using Mall.Model.Query;
using Mall.Repository.Product; using Mall.Repository.Product;
using Mall.Repository.User; using Mall.Repository.User;
using Newtonsoft.Json.Linq;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -514,6 +515,7 @@ namespace Mall.Module.MarketingCenter ...@@ -514,6 +515,7 @@ namespace Mall.Module.MarketingCenter
string prvSTime = Convert.ToDateTime(StartTime).AddMonths(-1).ToString("yyyy-MM-dd"); string prvSTime = Convert.ToDateTime(StartTime).AddMonths(-1).ToString("yyyy-MM-dd");
string prvETime = Convert.ToDateTime(prvSTime).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd"); string prvETime = Convert.ToDateTime(prvSTime).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
var prvlist = user_StatisticsRepository.GetList(new RB_User_Statistics_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, StartTime = prvSTime, EndTime = prvETime }); var prvlist = user_StatisticsRepository.GetList(new RB_User_Statistics_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, StartTime = prvSTime, EndTime = prvETime });
List<object> RList = new List<object>();
#region 首先 查询上期平均值 #region 首先 查询上期平均值
int PreDay = Convert.ToDateTime(prvETime).Day - 20; int PreDay = Convert.ToDateTime(prvETime).Day - 20;
#region 上月 #region 上月
...@@ -539,9 +541,33 @@ namespace Mall.Module.MarketingCenter ...@@ -539,9 +541,33 @@ namespace Mall.Module.MarketingCenter
decimal presProfitRate = Math.Round(Convert.ToDecimal(prvlist.Where(x => x.Date.Day > 20).Sum(x => x.ProfitRate)) / PreDay, 2, MidpointRounding.AwayFromZero); decimal presProfitRate = Math.Round(Convert.ToDecimal(prvlist.Where(x => x.Date.Day > 20).Sum(x => x.ProfitRate)) / PreDay, 2, MidpointRounding.AwayFromZero);
#endregion #endregion
RList.Add(new
{
Date = "上期平均",
PeopleNum = presPeopleNum,
OrderNum = presOrderNum,
PayMoney = presPayMoney,
BuyNum = presBuyNum,
AvgOrderNum = presAvgOrderNum,
AvgBuyNum = presAvgBuyNum,
AvgUnitPrice = presAvgUnitPrice,
AvgBuyPrice = presAvgBuyPrice,
MemberNum = presMemberNum,
PaymentNum = presPaymentNum,
MOrderRate = presMOrderRate,
ReBuyNum = presReBuyNum,
ReBuyRate = presReBuyRate,
NewPeopleNum = presNewPeopleNum,
PXNum = presPXNum,
VipNum = presVipNum,
YXNum = presYXNum,
JXNum = presJXNum,
Profit = presProfit,
ProfitRate = presProfitRate
});
#endregion #endregion
List<object> RList = new List<object>();
//根据日期遍历 //根据日期遍历
int MaxDay = Convert.ToDateTime(EndTime).Day; int MaxDay = Convert.ToDateTime(EndTime).Day;
string SDate = StartTime; string SDate = StartTime;
...@@ -591,10 +617,6 @@ namespace Mall.Module.MarketingCenter ...@@ -591,10 +617,6 @@ namespace Mall.Module.MarketingCenter
#endregion #endregion
while (true) while (true)
{ {
if (SDate == EndTime)
{
break;
}
#region 正常组装 #region 正常组装
var smodel = list.Where(x => x.Date == Convert.ToDateTime(SDate)).FirstOrDefault(); var smodel = list.Where(x => x.Date == Convert.ToDateTime(SDate)).FirstOrDefault();
RList.Add(new RList.Add(new
...@@ -967,6 +989,10 @@ namespace Mall.Module.MarketingCenter ...@@ -967,6 +989,10 @@ namespace Mall.Module.MarketingCenter
#endregion #endregion
} }
if (SDate == EndTime)
{
break;
}
SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd"); SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd");
} }
...@@ -1194,10 +1220,6 @@ namespace Mall.Module.MarketingCenter ...@@ -1194,10 +1220,6 @@ namespace Mall.Module.MarketingCenter
#endregion #endregion
while (true) while (true)
{ {
if (SDate == EndTime)
{
break;
}
#region 正常组装 #region 正常组装
var smodel = list.Where(x => x.Date == Convert.ToDateTime(SDate)).FirstOrDefault(); var smodel = list.Where(x => x.Date == Convert.ToDateTime(SDate)).FirstOrDefault();
ExcelDataSource datarow1 = new ExcelDataSource() ExcelDataSource datarow1 = new ExcelDataSource()
...@@ -1655,6 +1677,10 @@ namespace Mall.Module.MarketingCenter ...@@ -1655,6 +1677,10 @@ namespace Mall.Module.MarketingCenter
#endregion #endregion
} }
if (SDate == EndTime)
{
break;
}
SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd"); SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd");
} }
...@@ -1809,9 +1835,881 @@ namespace Mall.Module.MarketingCenter ...@@ -1809,9 +1835,881 @@ namespace Mall.Module.MarketingCenter
return DataList; return DataList;
} }
/// <summary>
/// 获取每月统计
/// </summary>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="tenantId"></param>
/// <param name="mallBaseId"></param>
/// <returns></returns>
public object GetDSMoreMonthStatistics(string startTime, string endTime, int tenantId, int mallBaseId) public object GetDSMoreMonthStatistics(string startTime, string endTime, int tenantId, int mallBaseId)
{ {
throw new NotImplementedException(); string StartDate = Convert.ToDateTime(startTime + "-01").AddMonths(-1).ToString("yyyy-MM-dd");// 默认查询提前一个月 用于做对比
string EndDate = Convert.ToDateTime(endTime).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
var list = user_StatisticsRepository.GetList(new RB_User_Statistics_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, StartTime = StartDate, EndTime = EndDate });
List<User_Statistics_Query> MonthSList = new List<User_Statistics_Query>();//月统计数据
//根据月份遍历
string SMonth = Convert.ToDateTime(StartDate).ToString("yyyy-MM");
int TotalMonthNum = 0;
while (true) {
TotalMonthNum++;
User_Statistics_Query mmodel = new User_Statistics_Query() { Date = SMonth };
//查询当月数据
var mlist = list.Where(x => x.DateMonth == SMonth).ToList();
mmodel.PeopleNum = mlist.Sum(x => x.PeopleNum);
mmodel.OrderNum = mlist.Sum(x => x.OrderNum);
mmodel.PayMoney = mlist.Sum(x => x.PayMoney);
mmodel.BuyNum = mlist.Sum(x => x.BuyNum);
mmodel.TotalPayPeople = mlist.Any() ? mlist.Max(x => x.PaymentNum) : 0;
mmodel.Profit = mlist.Sum(x => x.Profit);
var disList = distributor_InfoRepository.GetMemberDistributorNumberForCutOff(new RB_Distributor_Info_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, AuditStatus = Common.Enum.User.DistributorAuditStatusEnum.Audited }, Convert.ToDateTime(SMonth + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd"));
int TotalPXNum = disList.Where(x => x.FXGradeId == 1).FirstOrDefault()?.SortNum ?? 0;
int TotalVIPNum = disList.Where(x => x.FXGradeId == 2).FirstOrDefault()?.SortNum ?? 0;
int TotalYXNum = disList.Where(x => x.FXGradeId == 3).FirstOrDefault()?.SortNum ?? 0;
int TotalJXNum = disList.Where(x => x.FXGradeId == 4).FirstOrDefault()?.SortNum ?? 0;
mmodel.PXNum = TotalPXNum;
mmodel.VipNum = TotalVIPNum;
mmodel.YXNum = TotalYXNum;
mmodel.JXNum = TotalJXNum;
mmodel.TotalMNum = TotalPXNum + TotalVIPNum + TotalYXNum + TotalJXNum;
#region 求月平均
#region 月平均参数
decimal yPeopleNum = 0;
decimal yOrderNum = 0;
decimal yPayMoney = 0;
decimal yBuyNum = 0;
decimal yAvgOrderNum = 0;
decimal yAvgBuyNum = 0;
decimal yAvgUnitPrice = 0;
decimal yAvgBuyPrice = 0;
decimal yMemberNum = 0;
decimal yPaymentNum = 0;
decimal yMOrderRate = 0;
decimal yReBuyNum = 0;
decimal yReBuyRate = 0;
decimal yNewPeopleNum = 0;
decimal yPXNum = 0;
decimal yVipNum = 0;
decimal yYXNum = 0;
decimal yJXNum = 0;
decimal yProfit = 0;
decimal yProfitRate = 0;
#endregion
string SDate = SMonth + "-01";
string EDate = Convert.ToDateTime(SMonth + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
int MaxDay = Convert.ToDateTime(EDate).Day;
while (true)
{
if (Convert.ToDateTime(SDate).Day == 10)
{
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.OrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PayMoney)) / 10, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.BuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgOrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgUnitPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgBuyPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.MemberNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PaymentNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.MOrderRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ReBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ReBuyRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.NewPeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.VipNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.YXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.JXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.Profit)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ProfitRate)) / 10, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
else if (Convert.ToDateTime(SDate).Day == 20)
{
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.OrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PayMoney)) / 10, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.BuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgOrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgUnitPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgBuyPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.MemberNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PaymentNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.MOrderRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ReBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ReBuyRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.NewPeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.VipNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.YXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.JXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.Profit)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ProfitRate)) / 10, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
else if (Convert.ToDateTime(SDate).Day == MaxDay)
{
int NowDay = MaxDay - 20;
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PeopleNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.OrderNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PayMoney)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.BuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgOrderNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgBuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgUnitPrice)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgBuyPrice)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.MemberNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PaymentNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.MOrderRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ReBuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ReBuyRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.NewPeopleNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.VipNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.YXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.JXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.Profit)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ProfitRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
if (SDate == EDate)
{
break;
}
SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd");
}
#region 月平均赋值
mmodel.MAvgPeopleNum = Math.Round(yPeopleNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgOrderNum = Math.Round(yOrderNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgPayMoney = Math.Round(yPayMoney / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgBuyNum = Math.Round(yBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgOrderNum = Math.Round(yAvgOrderNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgBuyNum = Math.Round(yAvgBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgUnitPrice = Math.Round(yAvgUnitPrice / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgBuyPrice = Math.Round(yAvgBuyPrice / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgMemberNum = Math.Round(yMemberNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgPaymentNum = Math.Round(yPaymentNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgMOrderRate = Math.Round(yMOrderRate / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgReBuyNum = Math.Round(yReBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgReBuyRate = Math.Round(yReBuyRate / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgNewPeopleNum = Math.Round(yNewPeopleNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgProfitRate = Math.Round(yProfitRate / 3, 2, MidpointRounding.AwayFromZero);
#endregion
#endregion
MonthSList.Add(mmodel);
if (SMonth == endTime) {
break;
}
SMonth = Convert.ToDateTime(SMonth + "-01").AddMonths(1).ToString("yyyy-MM");
}
if (MonthSList.Any())
{
string ContrastMonth = Convert.ToDateTime(StartDate).ToString("yyyy-MM");
var MonthSList2 = MonthSList.Where(x => x.Date != ContrastMonth).ToList();
TotalMonthNum--;
//计算平均/总计 平均需排除掉对比月数据
User_Statistics_Query MTotalModel = new User_Statistics_Query()
{
Date = "平均/总计",
PeopleNum = MonthSList2.Sum(x => x.PeopleNum),
OrderNum = MonthSList2.Sum(x => x.OrderNum),
PayMoney = MonthSList2.Sum(x => x.PayMoney),
BuyNum = MonthSList2.Sum(x => x.BuyNum),
Profit = MonthSList2.Sum(x => x.Profit),
PXNum = MonthSList2.Sum(x => x.PXNum),
VipNum = MonthSList2.Sum(x => x.VipNum),
YXNum = MonthSList2.Sum(x => x.YXNum),
JXNum = MonthSList2.Sum(x => x.JXNum),
TotalMNum = MonthSList2.Sum(x => x.TotalMNum),
MAvgPeopleNum = Math.Round(MonthSList2.Sum(x => x.MAvgPeopleNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgOrderNum = Math.Round(MonthSList2.Sum(x => x.MAvgOrderNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgPayMoney = Math.Round(MonthSList2.Sum(x => x.MAvgPayMoney) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgBuyNum = Math.Round(MonthSList2.Sum(x => x.MAvgBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgOrderNum = Math.Round(MonthSList2.Sum(x => x.PAvgOrderNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgBuyNum = Math.Round(MonthSList2.Sum(x => x.PAvgBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgUnitPrice = Math.Round(MonthSList2.Sum(x => x.PAvgUnitPrice) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgBuyPrice = Math.Round(MonthSList2.Sum(x => x.PAvgBuyPrice) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgMemberNum = Math.Round(MonthSList2.Sum(x => x.PAvgMemberNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgPaymentNum = Math.Round(MonthSList2.Sum(x => x.PAvgPaymentNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgMOrderRate = Math.Round(MonthSList2.Sum(x => x.PAvgMOrderRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgReBuyNum = Math.Round(MonthSList2.Sum(x => x.PAvgReBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgReBuyRate = Math.Round(MonthSList2.Sum(x => x.PAvgReBuyRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgNewPeopleNum = Math.Round(MonthSList2.Sum(x => x.PAvgNewPeopleNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgProfitRate = Math.Round(MonthSList2.Sum(x => x.PAvgProfitRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero)
};
MonthSList.Add(MTotalModel);
}
#region 计算比率
List<User_Statistics_Rate_Query> ReRateList = new List<User_Statistics_Rate_Query>();//概率数据
string SRateMonth = startTime;
//这个要从查询第一个月开始
while (true) {
//求当月的所有比例 (当月-上月)/上月
var NowMmodel = MonthSList.Where(x => x.Date == SRateMonth).FirstOrDefault();
var PreMmodel = MonthSList.Where(x => x.Date == Convert.ToDateTime(SRateMonth + "-01").AddMonths(-1).ToString("yyyy-MM")).FirstOrDefault();
User_Statistics_Rate_Query smodel = new User_Statistics_Rate_Query() { Date = SRateMonth };
smodel.MAvgPeopleNum = Math.Round(PreMmodel.MAvgPeopleNum > 0 ? (NowMmodel.MAvgPeopleNum - PreMmodel.MAvgPeopleNum) / PreMmodel.MAvgPeopleNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgOrderNum = Math.Round(PreMmodel.MAvgOrderNum > 0 ? (NowMmodel.MAvgOrderNum - PreMmodel.MAvgOrderNum) / PreMmodel.MAvgOrderNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgPayMoney = Math.Round(PreMmodel.MAvgPayMoney > 0 ? (NowMmodel.MAvgPayMoney - PreMmodel.MAvgPayMoney) / PreMmodel.MAvgPayMoney : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgBuyNum = Math.Round(PreMmodel.MAvgBuyNum > 0 ? (NowMmodel.MAvgBuyNum - PreMmodel.MAvgBuyNum) / PreMmodel.MAvgBuyNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgOrderNum = Math.Round(PreMmodel.PAvgOrderNum > 0 ? (NowMmodel.PAvgOrderNum - PreMmodel.PAvgOrderNum) / PreMmodel.PAvgOrderNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgBuyNum = Math.Round(PreMmodel.PAvgBuyNum > 0 ? (NowMmodel.PAvgBuyNum - PreMmodel.PAvgBuyNum) / PreMmodel.PAvgBuyNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgUnitPrice = Math.Round(PreMmodel.PAvgUnitPrice > 0 ? (NowMmodel.PAvgUnitPrice - PreMmodel.PAvgUnitPrice) / PreMmodel.PAvgUnitPrice : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgBuyPrice = Math.Round(PreMmodel.PAvgBuyPrice > 0 ? (NowMmodel.PAvgBuyPrice - PreMmodel.PAvgBuyPrice) / PreMmodel.PAvgBuyPrice : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgMOrderRate = Math.Round(PreMmodel.PAvgMOrderRate > 0 ? (NowMmodel.PAvgMOrderRate - PreMmodel.PAvgMOrderRate) / PreMmodel.PAvgMOrderRate : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgProfitRate = Math.Round(PreMmodel.PAvgProfitRate > 0 ? (NowMmodel.PAvgProfitRate - PreMmodel.PAvgProfitRate) / PreMmodel.PAvgProfitRate : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgProfit = Math.Round(PreMmodel.Profit > 0 ? (NowMmodel.Profit - PreMmodel.Profit) / PreMmodel.Profit : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgPXNum = Math.Round(PreMmodel.PXNum > 0 ? Convert.ToDecimal(NowMmodel.PXNum - PreMmodel.PXNum) / PreMmodel.PXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgVipNum = Math.Round(PreMmodel.VipNum > 0 ? Convert.ToDecimal(NowMmodel.VipNum - PreMmodel.VipNum) / PreMmodel.VipNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgYXNum = Math.Round(PreMmodel.YXNum > 0 ? Convert.ToDecimal(NowMmodel.YXNum - PreMmodel.YXNum) / PreMmodel.YXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgJXNum = Math.Round(PreMmodel.JXNum > 0 ? Convert.ToDecimal(NowMmodel.JXNum - PreMmodel.JXNum) / PreMmodel.JXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgTotalMNum = Math.Round(PreMmodel.TotalMNum > 0 ? Convert.ToDecimal(NowMmodel.TotalMNum - PreMmodel.TotalMNum) / PreMmodel.TotalMNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
ReRateList.Add(smodel);
if (SRateMonth == endTime)
{
break;
}
SRateMonth = Convert.ToDateTime(SRateMonth + "-01").AddMonths(1).ToString("yyyy-MM");
}
if (ReRateList.Any())
{
User_Statistics_Rate_Query savgmodel = new User_Statistics_Rate_Query() { Date = "平均" };
savgmodel.MAvgPeopleNum = Math.Round(ReRateList.Sum(x => x.MAvgPeopleNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgOrderNum = Math.Round(ReRateList.Sum(x => x.MAvgOrderNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgPayMoney = Math.Round(ReRateList.Sum(x => x.MAvgPayMoney) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgBuyNum = Math.Round(ReRateList.Sum(x => x.MAvgBuyNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgOrderNum = Math.Round(ReRateList.Sum(x => x.PAvgOrderNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgBuyNum = Math.Round(ReRateList.Sum(x => x.PAvgBuyNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgUnitPrice = Math.Round(ReRateList.Sum(x => x.PAvgUnitPrice) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgBuyPrice = Math.Round(ReRateList.Sum(x => x.PAvgBuyPrice) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgMOrderRate = Math.Round(ReRateList.Sum(x => x.PAvgMOrderRate) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgProfitRate = Math.Round(ReRateList.Sum(x => x.PAvgProfitRate) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgProfit = Math.Round(ReRateList.Sum(x => x.PAvgProfit) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgPXNum = Math.Round(ReRateList.Sum(x => x.PAvgPXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgVipNum = Math.Round(ReRateList.Sum(x => x.PAvgVipNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgYXNum = Math.Round(ReRateList.Sum(x => x.PAvgYXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgJXNum = Math.Round(ReRateList.Sum(x => x.PAvgJXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgTotalMNum = Math.Round(ReRateList.Sum(x => x.PAvgTotalMNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
ReRateList.Add(savgmodel);
}
#endregion
return new
{
DataList = MonthSList,
RateList = ReRateList.Select(x => new
{
x.Date,
x.MAvgPeopleNum,
x.MAvgOrderNum,
x.MAvgPayMoney,
x.MAvgBuyNum,
x.PAvgOrderNum,
x.PAvgBuyNum,
x.PAvgUnitPrice,
x.PAvgBuyPrice,
x.PAvgMOrderRate,
x.PAvgProfitRate,
x.PAvgProfit,
x.PAvgPXNum,
x.PAvgVipNum,
x.PAvgYXNum,
x.PAvgJXNum,
x.PAvgTotalMNum
})
};
}
/// <summary>
/// 每月统计excel导出
/// </summary>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="tenantId"></param>
/// <param name="mallBaseId"></param>
/// <returns></returns>
public List<ExcelDataSource> GetDSMoreMonthStatisticsToExcel(string startTime, string endTime, int tenantId, int mallBaseId)
{
string StartDate = Convert.ToDateTime(startTime + "-01").AddMonths(-1).ToString("yyyy-MM-dd");// 默认查询提前一个月 用于做对比
string EndDate = Convert.ToDateTime(endTime).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
var list = user_StatisticsRepository.GetList(new RB_User_Statistics_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, StartTime = StartDate, EndTime = EndDate });
List<User_Statistics_Query> MonthSList = new List<User_Statistics_Query>();//月统计数据
//根据月份遍历
string SMonth = Convert.ToDateTime(StartDate).ToString("yyyy-MM");
int TotalMonthNum = 0;
while (true)
{
TotalMonthNum++;
User_Statistics_Query mmodel = new User_Statistics_Query() { Date = SMonth };
//查询当月数据
var mlist = list.Where(x => x.DateMonth == SMonth).ToList();
mmodel.PeopleNum = mlist.Sum(x => x.PeopleNum);
mmodel.OrderNum = mlist.Sum(x => x.OrderNum);
mmodel.PayMoney = mlist.Sum(x => x.PayMoney);
mmodel.BuyNum = mlist.Sum(x => x.BuyNum);
mmodel.TotalPayPeople = mlist.Any() ? mlist.Max(x => x.PaymentNum) : 0;
mmodel.Profit = mlist.Sum(x => x.Profit);
var disList = distributor_InfoRepository.GetMemberDistributorNumberForCutOff(new RB_Distributor_Info_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, AuditStatus = Common.Enum.User.DistributorAuditStatusEnum.Audited }, Convert.ToDateTime(SMonth + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd"));
int TotalPXNum = disList.Where(x => x.FXGradeId == 1).FirstOrDefault()?.SortNum ?? 0;
int TotalVIPNum = disList.Where(x => x.FXGradeId == 2).FirstOrDefault()?.SortNum ?? 0;
int TotalYXNum = disList.Where(x => x.FXGradeId == 3).FirstOrDefault()?.SortNum ?? 0;
int TotalJXNum = disList.Where(x => x.FXGradeId == 4).FirstOrDefault()?.SortNum ?? 0;
mmodel.PXNum = TotalPXNum;
mmodel.VipNum = TotalVIPNum;
mmodel.YXNum = TotalYXNum;
mmodel.JXNum = TotalJXNum;
mmodel.TotalMNum = TotalPXNum + TotalVIPNum + TotalYXNum + TotalJXNum;
#region 求月平均
#region 月平均参数
decimal yPeopleNum = 0;
decimal yOrderNum = 0;
decimal yPayMoney = 0;
decimal yBuyNum = 0;
decimal yAvgOrderNum = 0;
decimal yAvgBuyNum = 0;
decimal yAvgUnitPrice = 0;
decimal yAvgBuyPrice = 0;
decimal yMemberNum = 0;
decimal yPaymentNum = 0;
decimal yMOrderRate = 0;
decimal yReBuyNum = 0;
decimal yReBuyRate = 0;
decimal yNewPeopleNum = 0;
decimal yPXNum = 0;
decimal yVipNum = 0;
decimal yYXNum = 0;
decimal yJXNum = 0;
decimal yProfit = 0;
decimal yProfitRate = 0;
#endregion
string SDate = SMonth + "-01";
string EDate = Convert.ToDateTime(SMonth + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
int MaxDay = Convert.ToDateTime(EDate).Day;
while (true)
{
if (Convert.ToDateTime(SDate).Day == 10)
{
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.OrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PayMoney)) / 10, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.BuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgOrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgUnitPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.AvgBuyPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.MemberNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PaymentNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.MOrderRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ReBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ReBuyRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.NewPeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.PXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.VipNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.YXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.JXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.Profit)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day <= 10).Sum(x => x.ProfitRate)) / 10, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
else if (Convert.ToDateTime(SDate).Day == 20)
{
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.OrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PayMoney)) / 10, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.BuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgOrderNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgUnitPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.AvgBuyPrice)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.MemberNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PaymentNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.MOrderRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ReBuyNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ReBuyRate)) / 10, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.NewPeopleNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.PXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.VipNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.YXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.JXNum)) / 10, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.Profit)) / 10, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 10 && x.Date.Day <= 20).Sum(x => x.ProfitRate)) / 10, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
else if (Convert.ToDateTime(SDate).Day == MaxDay)
{
int NowDay = MaxDay - 20;
#region 本月
decimal PeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PeopleNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal OrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.OrderNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PayMoney = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PayMoney)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal BuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.BuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgOrderNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgOrderNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgBuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgUnitPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgUnitPrice)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal AvgBuyPrice = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.AvgBuyPrice)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal MemberNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.MemberNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PaymentNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PaymentNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal MOrderRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.MOrderRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ReBuyNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ReBuyNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ReBuyRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ReBuyRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal NewPeopleNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.NewPeopleNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal PXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.PXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal VipNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.VipNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal YXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.YXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal JXNum = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.JXNum)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal Profit = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.Profit)) / NowDay, 2, MidpointRounding.AwayFromZero);
decimal ProfitRate = Math.Round(Convert.ToDecimal(mlist.Where(x => x.Date.Day > 20).Sum(x => x.ProfitRate)) / NowDay, 2, MidpointRounding.AwayFromZero);
#endregion
#region 月平均
yPeopleNum += PeopleNum;
yOrderNum += OrderNum;
yPayMoney += PayMoney;
yBuyNum += BuyNum;
yAvgOrderNum += AvgOrderNum;
yAvgBuyNum += AvgBuyNum;
yAvgUnitPrice += AvgUnitPrice;
yAvgBuyPrice += AvgBuyPrice;
yMemberNum += MemberNum;
yPaymentNum += PaymentNum;
yMOrderRate += MOrderRate;
yReBuyNum += ReBuyNum;
yReBuyRate += ReBuyRate;
yNewPeopleNum += NewPeopleNum;
yPXNum += PXNum;
yVipNum += VipNum;
yYXNum += YXNum;
yJXNum += JXNum;
yProfit += Profit;
yProfitRate += ProfitRate;
#endregion
}
if (SDate == EDate)
{
break;
}
SDate = Convert.ToDateTime(SDate).AddDays(1).ToString("yyyy-MM-dd");
}
#region 月平均赋值
mmodel.MAvgPeopleNum = Math.Round(yPeopleNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgOrderNum = Math.Round(yOrderNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgPayMoney = Math.Round(yPayMoney / 3, 2, MidpointRounding.AwayFromZero);
mmodel.MAvgBuyNum = Math.Round(yBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgOrderNum = Math.Round(yAvgOrderNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgBuyNum = Math.Round(yAvgBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgUnitPrice = Math.Round(yAvgUnitPrice / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgBuyPrice = Math.Round(yAvgBuyPrice / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgMemberNum = Math.Round(yMemberNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgPaymentNum = Math.Round(yPaymentNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgMOrderRate = Math.Round(yMOrderRate / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgReBuyNum = Math.Round(yReBuyNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgReBuyRate = Math.Round(yReBuyRate / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgNewPeopleNum = Math.Round(yNewPeopleNum / 3, 2, MidpointRounding.AwayFromZero);
mmodel.PAvgProfitRate = Math.Round(yProfitRate / 3, 2, MidpointRounding.AwayFromZero);
#endregion
#endregion
MonthSList.Add(mmodel);
if (SMonth == endTime)
{
break;
}
SMonth = Convert.ToDateTime(SMonth + "-01").AddMonths(1).ToString("yyyy-MM");
}
if (MonthSList.Any())
{
string ContrastMonth = Convert.ToDateTime(StartDate).ToString("yyyy-MM");
var MonthSList2 = MonthSList.Where(x => x.Date != ContrastMonth).ToList();
TotalMonthNum--;
//计算平均/总计 平均需排除掉对比月数据
User_Statistics_Query MTotalModel = new User_Statistics_Query()
{
Date = "平均/总计",
PeopleNum = MonthSList2.Sum(x => x.PeopleNum),
OrderNum = MonthSList2.Sum(x => x.OrderNum),
PayMoney = MonthSList2.Sum(x => x.PayMoney),
BuyNum = MonthSList2.Sum(x => x.BuyNum),
Profit = MonthSList2.Sum(x => x.Profit),
PXNum = MonthSList2.Sum(x => x.PXNum),
VipNum = MonthSList2.Sum(x => x.VipNum),
YXNum = MonthSList2.Sum(x => x.YXNum),
JXNum = MonthSList2.Sum(x => x.JXNum),
TotalMNum = MonthSList2.Sum(x => x.TotalMNum),
MAvgPeopleNum = Math.Round(MonthSList2.Sum(x => x.MAvgPeopleNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgOrderNum = Math.Round(MonthSList2.Sum(x => x.MAvgOrderNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgPayMoney = Math.Round(MonthSList2.Sum(x => x.MAvgPayMoney) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
MAvgBuyNum = Math.Round(MonthSList2.Sum(x => x.MAvgBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgOrderNum = Math.Round(MonthSList2.Sum(x => x.PAvgOrderNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgBuyNum = Math.Round(MonthSList2.Sum(x => x.PAvgBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgUnitPrice = Math.Round(MonthSList2.Sum(x => x.PAvgUnitPrice) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgBuyPrice = Math.Round(MonthSList2.Sum(x => x.PAvgBuyPrice) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgMemberNum = Math.Round(MonthSList2.Sum(x => x.PAvgMemberNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgPaymentNum = Math.Round(MonthSList2.Sum(x => x.PAvgPaymentNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgMOrderRate = Math.Round(MonthSList2.Sum(x => x.PAvgMOrderRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgReBuyNum = Math.Round(MonthSList2.Sum(x => x.PAvgReBuyNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgReBuyRate = Math.Round(MonthSList2.Sum(x => x.PAvgReBuyRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgNewPeopleNum = Math.Round(MonthSList2.Sum(x => x.PAvgNewPeopleNum) / TotalMonthNum, 2, MidpointRounding.AwayFromZero),
PAvgProfitRate = Math.Round(MonthSList2.Sum(x => x.PAvgProfitRate) / TotalMonthNum, 2, MidpointRounding.AwayFromZero)
};
MonthSList.Add(MTotalModel);
}
#region 计算比率
List<User_Statistics_Rate_Query> ReRateList = new List<User_Statistics_Rate_Query>();//概率数据
string SRateMonth = startTime;
//这个要从下一个月开始
while (true)
{
//求当月的所有比例 (当月-上月)/上月
var NowMmodel = MonthSList.Where(x => x.Date == SRateMonth).FirstOrDefault();
var PreMmodel = MonthSList.Where(x => x.Date == Convert.ToDateTime(SRateMonth + "-01").AddMonths(-1).ToString("yyyy-MM")).FirstOrDefault();
User_Statistics_Rate_Query smodel = new User_Statistics_Rate_Query() { Date = SRateMonth };
smodel.MAvgPeopleNum = Math.Round(PreMmodel.MAvgPeopleNum > 0 ? (NowMmodel.MAvgPeopleNum - PreMmodel.MAvgPeopleNum) / PreMmodel.MAvgPeopleNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgOrderNum = Math.Round(PreMmodel.MAvgOrderNum > 0 ? (NowMmodel.MAvgOrderNum - PreMmodel.MAvgOrderNum) / PreMmodel.MAvgOrderNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgPayMoney = Math.Round(PreMmodel.MAvgPayMoney > 0 ? (NowMmodel.MAvgPayMoney - PreMmodel.MAvgPayMoney) / PreMmodel.MAvgPayMoney : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.MAvgBuyNum = Math.Round(PreMmodel.MAvgBuyNum > 0 ? (NowMmodel.MAvgBuyNum - PreMmodel.MAvgBuyNum) / PreMmodel.MAvgBuyNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgOrderNum = Math.Round(PreMmodel.PAvgOrderNum > 0 ? (NowMmodel.PAvgOrderNum - PreMmodel.PAvgOrderNum) / PreMmodel.PAvgOrderNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgBuyNum = Math.Round(PreMmodel.PAvgBuyNum > 0 ? (NowMmodel.PAvgBuyNum - PreMmodel.PAvgBuyNum) / PreMmodel.PAvgBuyNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgUnitPrice = Math.Round(PreMmodel.PAvgUnitPrice > 0 ? (NowMmodel.PAvgUnitPrice - PreMmodel.PAvgUnitPrice) / PreMmodel.PAvgUnitPrice : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgBuyPrice = Math.Round(PreMmodel.PAvgBuyPrice > 0 ? (NowMmodel.PAvgBuyPrice - PreMmodel.PAvgBuyPrice) / PreMmodel.PAvgBuyPrice : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgMOrderRate = Math.Round(PreMmodel.PAvgMOrderRate > 0 ? (NowMmodel.PAvgMOrderRate - PreMmodel.PAvgMOrderRate) / PreMmodel.PAvgMOrderRate : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgProfitRate = Math.Round(PreMmodel.PAvgProfitRate > 0 ? (NowMmodel.PAvgProfitRate - PreMmodel.PAvgProfitRate) / PreMmodel.PAvgProfitRate : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgProfit = Math.Round(PreMmodel.Profit > 0 ? (NowMmodel.Profit - PreMmodel.Profit) / PreMmodel.Profit : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgPXNum = Math.Round(PreMmodel.PXNum > 0 ? Convert.ToDecimal(NowMmodel.PXNum - PreMmodel.PXNum) / PreMmodel.PXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgVipNum = Math.Round(PreMmodel.VipNum > 0 ? Convert.ToDecimal(NowMmodel.VipNum - PreMmodel.VipNum) / PreMmodel.VipNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgYXNum = Math.Round(PreMmodel.YXNum > 0 ? Convert.ToDecimal(NowMmodel.YXNum - PreMmodel.YXNum) / PreMmodel.YXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgJXNum = Math.Round(PreMmodel.JXNum > 0 ? Convert.ToDecimal(NowMmodel.JXNum - PreMmodel.JXNum) / PreMmodel.JXNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
smodel.PAvgTotalMNum = Math.Round(PreMmodel.TotalMNum > 0 ? Convert.ToDecimal(NowMmodel.TotalMNum - PreMmodel.TotalMNum) / PreMmodel.TotalMNum : 1, 4, MidpointRounding.AwayFromZero) * 100;
ReRateList.Add(smodel);
if (SRateMonth == endTime)
{
break;
}
SRateMonth = Convert.ToDateTime(SRateMonth + "-01").AddMonths(1).ToString("yyyy-MM");
}
if (ReRateList.Any())
{
User_Statistics_Rate_Query savgmodel = new User_Statistics_Rate_Query() { Date = "平均" };
savgmodel.MAvgPeopleNum = Math.Round(ReRateList.Sum(x => x.MAvgPeopleNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgOrderNum = Math.Round(ReRateList.Sum(x => x.MAvgOrderNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgPayMoney = Math.Round(ReRateList.Sum(x => x.MAvgPayMoney) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.MAvgBuyNum = Math.Round(ReRateList.Sum(x => x.MAvgBuyNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgOrderNum = Math.Round(ReRateList.Sum(x => x.PAvgOrderNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgBuyNum = Math.Round(ReRateList.Sum(x => x.PAvgBuyNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgUnitPrice = Math.Round(ReRateList.Sum(x => x.PAvgUnitPrice) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgBuyPrice = Math.Round(ReRateList.Sum(x => x.PAvgBuyPrice) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgMOrderRate = Math.Round(ReRateList.Sum(x => x.PAvgMOrderRate) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgProfitRate = Math.Round(ReRateList.Sum(x => x.PAvgProfitRate) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgProfit = Math.Round(ReRateList.Sum(x => x.PAvgProfit) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgPXNum = Math.Round(ReRateList.Sum(x => x.PAvgPXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgVipNum = Math.Round(ReRateList.Sum(x => x.PAvgVipNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgYXNum = Math.Round(ReRateList.Sum(x => x.PAvgYXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgJXNum = Math.Round(ReRateList.Sum(x => x.PAvgJXNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
savgmodel.PAvgTotalMNum = Math.Round(ReRateList.Sum(x => x.PAvgTotalMNum) / (TotalMonthNum - 1), 2, MidpointRounding.AwayFromZero);
ReRateList.Add(savgmodel);
}
#endregion
#region 组装excel数据
List<ExcelDataSource> DataList = new List<ExcelDataSource>();
//第一部分数据
foreach (var item in MonthSList) {
ExcelDataSource datarow = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: item.Date == "平均/总计" ? "平均" : item.Date){ },
new ExcelColumn(value: item.MAvgPeopleNum.ToString("#0.00")){ },
new ExcelColumn(value: item.MAvgOrderNum.ToString("#0.00")){ },
new ExcelColumn(value: item.MAvgPayMoney.ToString("#0.00")){ },
new ExcelColumn(value: item.MAvgBuyNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgOrderNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgBuyNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgUnitPrice.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgBuyPrice.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgMemberNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgPaymentNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgMOrderRate.ToString("#0.00")+"%"){ },
new ExcelColumn(value: item.PAvgReBuyNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgReBuyRate.ToString("#0.00")+"%"){ },
new ExcelColumn(value: item.PAvgNewPeopleNum.ToString("#0.00")){ },
new ExcelColumn(value: item.PAvgProfitRate.ToString("#0.00")+"%"){ },
},
ColumnHight = 30
};
DataList.Add(datarow);
}
//增加行空白
DataList.Add(new ExcelDataSource() { ExcelRows = new List<ExcelColumn>(23) { new ExcelColumn(value: "") { Colspan = 16 } } });
#region 增加统计标题
ExcelDataSource header2 = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: "月小計") { },
new ExcelColumn(value: "付款人數累計") { },
new ExcelColumn(value: "付款單數累計") { },
new ExcelColumn(value: "付款金額累計") { },
new ExcelColumn(value: "購買件數累計") { },
new ExcelColumn(value: "付款人數") { },
new ExcelColumn(value: "毛利") { },
new ExcelColumn(value: "普象") { },
new ExcelColumn(value: "VIP") { },
new ExcelColumn(value: "銀象") { },
new ExcelColumn(value: "金象") { },
new ExcelColumn(value: "會員總數") { }
},
ColumnHight = 30
};
DataList.Add(header2);
#endregion
//第二部分数据
foreach (var item in MonthSList)
{
ExcelDataSource datarow = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: item.Date == "平均/总计" ? "總計" : item.Date){ },
new ExcelColumn(value: item.PeopleNum.ToString()){ },
new ExcelColumn(value: item.OrderNum.ToString()){ },
new ExcelColumn(value: item.PayMoney.ToString("#0.00")){ },
new ExcelColumn(value: item.BuyNum.ToString()){ },
new ExcelColumn(value: item.TotalPayPeople.ToString()){ },
new ExcelColumn(value: item.Profit.ToString("#0.00")){ },
new ExcelColumn(value: item.PXNum.ToString()){ },
new ExcelColumn(value: item.VipNum.ToString()){ },
new ExcelColumn(value: item.YXNum.ToString()){ },
new ExcelColumn(value: item.JXNum.ToString()){ },
new ExcelColumn(value: item.TotalMNum.ToString()){ }
},
ColumnHight = 30
};
DataList.Add(datarow);
}
//增加行空白
DataList.Add(new ExcelDataSource() { ExcelRows = new List<ExcelColumn>(23) { new ExcelColumn(value: "") { Colspan = 16 } } });
//增加行空白
DataList.Add(new ExcelDataSource() { ExcelRows = new List<ExcelColumn>(23) { new ExcelColumn(value: "") { Colspan = 16 } } });
#region 第三部分
//先组装标题
ExcelDataSource header3 = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: "") { },
},
ColumnHight = 30
};
foreach (var item in ReRateList) {
header3.ExcelRows.Add(new ExcelColumn(value: item.Date) { });
}
DataList.Add(header3);
//组装数据
List<string> RateRowList = new List<string>() {
"MAvgPeopleNum|平均付款人數成長率",
"MAvgOrderNum|平均付款單數成長率",
"MAvgPayMoney|平均付款金額成長率",
"MAvgBuyNum|平均付款件數成長率",
"PAvgOrderNum|平均每人購買單數成長率",
"PAvgBuyNum|平均每人購買件數成長率",
"PAvgUnitPrice|平均每單單價成長率",
"PAvgBuyPrice|平均每人購買單價成長率",
"PAvgProfitRate|毛利率成長率",
"PAvgProfit|毛利成長率",
"PAvgMOrderRate|會員下訂單成長率",
"PAvgPXNum|普象會員成長率",
"PAvgVipNum|VIP會員成長率",
"PAvgYXNum|銀象會員成長率",
"PAvgJXNum|金象會員成長率",
"PAvgTotalMNum|會員總成長率"
};
foreach (var item in RateRowList) {
var fileNameArr = item.Split('|');
ExcelDataSource datarow2 = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: fileNameArr[1]) { },
},
ColumnHight = 30
};
foreach (var qitem in ReRateList) {
JObject parms = JObject.Parse(JsonHelper.Serialize(qitem));
string mvalue = parms.GetStringValue(fileNameArr[0]);
datarow2.ExcelRows.Add(new ExcelColumn(value: mvalue + "%") { });
}
DataList.Add(datarow2);
}
#endregion
#endregion
return DataList;
}
/// <summary>
/// 获取年度统计
/// </summary>
/// <param name="startYear"></param>
/// <param name="endYear"></param>
/// <param name="tenantId"></param>
/// <param name="mallBaseId"></param>
/// <returns></returns>
public object GetDSYearStartistics(int startYear, int endYear, int tenantId, int mallBaseId)
{
string StartDate = startYear + "-01-01";
string EndDate = Convert.ToDateTime(endYear + "-01-01").AddYears(1).AddDays(-1).ToString("yyyy-MM-dd");
var list = user_StatisticsRepository.GetList(new RB_User_Statistics_Extend() { TenantId = tenantId, MallBaseId = mallBaseId, StartTime = StartDate, EndTime = EndDate });
List<User_Statistics_Query> YearSList = new List<User_Statistics_Query>();//月统计数据
int SYear = startYear;
while (true) {
var ylist = list.Where(x => x.DateYear == SYear).ToList();
User_Statistics_Query ymodel = new User_Statistics_Query() { Date = SYear.ToString() };
ymodel.PeopleNum = ylist.Sum(x => x.PeopleNum);
if (startYear == endYear) {
break;
}
SYear = Convert.ToDateTime(SYear + "-01-01").AddYears(1).Year;
}
return "";
} }
#endregion #endregion
......
...@@ -1526,6 +1526,113 @@ namespace Mall.WebApi.Controllers.AppletWeChat ...@@ -1526,6 +1526,113 @@ namespace Mall.WebApi.Controllers.AppletWeChat
return ApiResult.Success("", Robj); return ApiResult.Success("", Robj);
} }
/// <summary>
/// 每月统计导出excel
/// </summary>
/// <param name="requestMsg"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public FileContentResult GetDSMoreMonthStatisticsToExcel(object requestMsg)
{
var requestParm = JsonConvert.DeserializeObject<RequestParm>(requestMsg.ToString());
JObject parms = JObject.Parse(requestParm.msg.ToString());
string StartTime = parms.GetStringValue("StartTime");//开始时间 月
string EndTime = parms.GetStringValue("EndTime");//结束时间 月
string ExcelName = "电商多月统计" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
List<ExcelDataSource> slist = new List<ExcelDataSource>();
if (string.IsNullOrEmpty(StartTime))
{
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
if (string.IsNullOrEmpty(EndTime))
{
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
try
{
StartTime = Convert.ToDateTime(StartTime).ToString("yyyy-MM");
EndTime = Convert.ToDateTime(EndTime).ToString("yyyy-MM");
}
catch (Exception)
{
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
if (Convert.ToDateTime(StartTime) > Convert.ToDateTime(EndTime))
{
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
ExcelDataSource header = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(23) {
new ExcelColumn(value: "月份") { CellWidth = 25, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均付款人數") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均付款單數") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均付款金額") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均付款件數") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均每人購買單數") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均每人購買件數") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均每單單價") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均每人購買單價") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均會員累計數") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均付款累計人數") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均會員下單轉換率") { CellWidth = 20, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均復夠人數") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均復夠率") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "平均新人下單") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "毛利率") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER }
},
ColumnHight = 30
};
slist.Add(header);
try
{
List<ExcelDataSource> Rlist = statisticsModule.GetDSMoreMonthStatisticsToExcel(StartTime, EndTime, requestParm.TenantId, requestParm.MallBaseId);
slist.AddRange(Rlist);
var byteData = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData, "application/octet-stream", ExcelName);
}
catch (Exception ex)
{
LogHelper.Write(ex, string.Format("GetFileFromWebApi_requestData: {0}", JsonHelper.Serialize(requestMsg.ToString())));
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
}
/// <summary>
/// 年度统计
/// </summary>
/// <param name="requestMsg"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public ApiResult GetDSYearStartistics(object requestMsg) {
var requestParm = JsonConvert.DeserializeObject<RequestParm>(requestMsg.ToString());
JObject parms = JObject.Parse(requestParm.msg.ToString());
int StartYear = parms.GetInt("StartYear",0);//开始时间 年
int EndYear = parms.GetInt("EndYear",0);//结束时间 年
if (StartYear <= 0 || EndYear <= 0)
{
return ApiResult.ParamIsNull();
}
if (StartYear < 2019 || StartYear > EndYear)
{
return ApiResult.ParamIsNull("参数有误");
}
var Robj = statisticsModule.GetDSYearStartistics(StartYear, EndYear, requestParm.TenantId, requestParm.MallBaseId);
return ApiResult.Success("", Robj);
}
#endregion #endregion
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment