Commit d37f82bc authored by 黄奎's avatar 黄奎

新增统计

parent 94b2c445
using Mall.Common.AOP;
using Mall.Common.Enum.Goods;
using System;
using System.Collections.Generic;
using System.Text;
......@@ -12,5 +13,146 @@ namespace Mall.Model.Extend.Statistics
[DB(ConnectionName = "DefaultConnection")]
public class MallIndexStatistics
{
/// <summary>
/// 用户数量
/// </summary>
public int UserTotalNum { get; set; }
/// <summary>
/// 商品数量
/// </summary>
public int GoodsTotalNum { get; set; }
/// <summary>
/// 总订单数量
/// </summary>
public int TotalOrderNum { get; set; }
/// <summary>
/// 代发货数量
/// </summary>
public int NoSendOrderNum { get; set; }
/// <summary>
/// 维权订单数量
/// </summary>
public int ActivistOrderNum { get; set; }
}
/// <summary>
/// 订单数量统计
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class OrderNum
{
/// <summary>
/// 订单状态 枚举
/// </summary>
public OrderStatusEnum? OrderStatus
{
get;
set;
}
/// <summary>
/// 订单数量
/// </summary>
public int OrderCount { get; set; }
}
/// <summary>
/// 销售情况统计
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class MallSalesStatistics
{
/// <summary>
/// 时间类型
/// </summary>
public string TimeStr { get; set; }
/// <summary>
/// 支付订单数
/// </summary>
public int OrderCount { get; set; }
/// <summary>
/// 支付金额
/// </summary>
public decimal Income { get; set; }
/// <summary>
/// 用户数量
/// </summary>
public int UserCount { get; set; }
/// <summary>
/// 购买商品件数
/// </summary>
public int GoodCount { get; set; }
}
/// <summary>
/// 商品购买力TOP排行
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class MallSalesGoodsTop
{
/// <summary>
/// 排名
/// </summary>
public int Num { get; set; }
/// <summary>
/// 商品名称
/// </summary>
public string GoodsName { get; set; }
/// <summary>
/// 销售额
/// </summary>
public decimal Income { get; set; }
/// <summary>
/// 销量
/// </summary>
public int SaleCount { get; set; }
}
/// <summary>
/// 用户购买力TOP排行
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class MallSalesUserTop
{
/// <summary>
/// 排名
/// </summary>
public int Num { get; set; }
/// <summary>
/// 用户头像
/// </summary>
public string Photo { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 支付金额
/// </summary>
public decimal Income { get; set; }
/// <summary>
/// 支付件数
/// </summary>
public int SaleCount { get; set; }
}
}
using System;
using Mall.Common.Enum.User;
using System;
using System.Collections.Generic;
using System.Text;
......@@ -9,5 +10,49 @@ namespace Mall.Model.Query
/// </summary>
public class StatisticsQuery
{
/// <summary>
/// 商户号Id
/// </summary>
public int TenantId
{
get;
set;
}
/// <summary>
/// 小程序Id
/// </summary>
public int MallBaseId
{
get;
set;
}
/// <summary>
/// 来源 1微信 2支付宝【见枚举】
/// </summary>
public UserSourceEnum? Source
{
get;
set;
}
/// <summary>
/// 开始时间
/// </summary>
public string StartDate { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string EndDate { get; set; }
/// <summary>
/// 销售查询【1-昨日,7-七日】
/// </summary>
public int SalesTimeType { get; set; }
}
}
......@@ -11,6 +11,8 @@ using Newtonsoft.Json;
using Mall.Common.Plugin;
using NPOI.SS.Formula.Functions;
using Mall.Repository.User;
using Mall.Model.Extend.Statistics;
using Mall.Model.Query;
namespace Mall.Module.User
{
......@@ -62,6 +64,11 @@ namespace Mall.Module.User
/// </summary>
private readonly UserCommonModule userCommonModule = new UserCommonModule();
/// <summary>
/// 首页统计
/// </summary>
private readonly MallStatisticsRepository mallStatisticsRepository = new MallStatisticsRepository();
#region 轮播图管理
/// <summary>
......@@ -1890,5 +1897,93 @@ namespace Mall.Module.User
}
}
#endregion
#region 首页统计
/// <summary>
/// 订单数量、商品、用户统计
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public MallIndexStatistics MallIndexStatisticsModule(StatisticsQuery query)
{
return mallStatisticsRepository.MallIndexStatisticsRepository(query);
}
/// <summary>
/// 销售情况统计
/// </summary>
/// <param name="query"></param>
public object MallIndexSalesStatisticsModule(StatisticsQuery query)
{
var list = mallStatisticsRepository.MallIndexSalesStatisticsRepository(query);
List<object> resultList = new List<object>();
List<MallSalesStatistics> subList = new List<MallSalesStatistics>();
if (query.SalesTimeType == 1)
{
for (var i = 0; i <= 23; i++)
{
var subModel = list?.Where(qitem => qitem.TimeStr == i.ToString())?.FirstOrDefault();
subList.Add(new MallSalesStatistics()
{
TimeStr = i.ToString(),
GoodCount = subModel?.GoodCount ?? 0,
Income = subModel?.Income ?? 0,
OrderCount = subModel?.OrderCount ?? 0,
UserCount = subModel?.UserCount ?? 0,
});
}
}
else
{
var startDate = DateTime.Now.AddDays(-7);
for (var i = 0; i <= 7; i++)
{
var subModel = list?.Where(qitem => qitem.TimeStr == startDate.AddDays(i).ToString("yyyy-MM-dd"))?.FirstOrDefault();
subList.Add(new MallSalesStatistics()
{
TimeStr = startDate.AddDays(i).ToString("yyyy-MM-dd"),
GoodCount = subModel?.GoodCount ?? 0,
Income = subModel?.Income ?? 0,
OrderCount = subModel?.OrderCount ?? 0,
UserCount = subModel?.UserCount ?? 0,
});
}
}
var obj = new
{
//支付订单数
OrderCount = list?.Sum(qitem=>qitem.OrderCount)??0,
//支付金额
Income = list?.Sum(qitem => qitem.Income) ?? 0,
//支付人数
UserCount = list?.Sum(qitem => qitem.UserCount) ?? 0,
//支付件数
GoodCount = list?.Sum(qitem => qitem.GoodCount) ?? 0,
subList,
};
return obj;
}
/// <summary>
/// 商品购买力TOP排行
/// </summary>
/// <param name="query"></param>
public List<MallSalesGoodsTop> MallIndesSalesIncomeStatisticsModule(StatisticsQuery query)
{
return mallStatisticsRepository.MallIndesSalesIncomeStatisticsRepository(query);
}
/// <summary>
/// 用户购买力TOP排行
/// </summary>
/// <param name="query"></param>
public List<MallSalesUserTop> MallIndesSalesUserStatisticsModule(StatisticsQuery query)
{
return mallStatisticsRepository.MallIndesSalesUserStatisticsRepository(query);
}
#endregion
}
}
......@@ -6,6 +6,7 @@ using Mall.Model.Extend.User;
using System.Linq;
using Mall.Model.Extend.Statistics;
using Mall.Model.Query;
using Mall.Model.Extend.Product;
namespace Mall.Repository.User
{
......@@ -14,20 +15,241 @@ namespace Mall.Repository.User
/// </summary>
public class MallStatisticsRepository : RepositoryBase<MallIndexStatistics>
{
/// <summary>
/// 用户统计
/// 订单数量、商品、用户统计
/// </summary>
public void MemberUserStatistics(StatisticsQuery query)
{
/// <param name="query">查询条件</param>
/// <returns></returns>
public MallIndexStatistics MallIndexStatisticsRepository(StatisticsQuery query)
{
MallIndexStatistics model = new MallIndexStatistics();
#region 用户统计
StringBuilder user = new StringBuilder();
user.AppendFormat(" SELECT COUNT(1) FROM rb_member_user WHERE 1=1 ");
user.AppendFormat(" AND {0}={1} ", nameof(RB_Member_User_Extend.TenantId), query.TenantId);
user.AppendFormat(" AND {0}={1} ", nameof(RB_Member_User_Extend.MallBaseId), query.MallBaseId);
if (query.Source > 0)
{
user.AppendFormat(" AND {0}={1} ", nameof(RB_Member_User_Extend.Source), (int)query.Source);
}
var userTotal = ExecuteScalar(user.ToString());
if (userTotal != null && Convert.ToInt32(userTotal)>0)
{
model.UserTotalNum = Convert.ToInt32(userTotal);
}
#endregion
#region 商品统计
StringBuilder good = new StringBuilder();
good.Append(" SELECT COUNT(1) FROM rb_goods WHERE 1=1 AND Status=0 ");
good.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Extend.TenantId), query.TenantId);
good.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Extend.MallBaseId), query.MallBaseId);
var goodTotal = ExecuteScalar(good.ToString());
if (goodTotal != null && Convert.ToInt32(goodTotal) > 0)
{
model.GoodsTotalNum = Convert.ToInt32(goodTotal);
}
#endregion
#region 订单数量统计
StringBuilder orderNum = new StringBuilder();
orderNum.AppendFormat("SELECT OrderStatus,COUNT(1) AS OrderCount FROM rb_goods_order WHERE OrderStatus <> 7 ");
orderNum.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Order_Extend.TenantId), query.TenantId);
orderNum.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Order_Extend.MallBaseId), query.MallBaseId);
//订单来源
if (query.Source > 0)
{
orderNum.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Order_Extend.OrderSource), (int)query.Source);
}
//开始时间
if (query.StartDate != null && !string.IsNullOrWhiteSpace(query.StartDate))
{
orderNum.AppendFormat(" AND {0}>='{1}' ", nameof(RB_Goods_Order_Extend.CreateDate), query.StartDate);
}
//结束时间
if (query.EndDate != null && !string.IsNullOrWhiteSpace(query.EndDate))
{
orderNum.AppendFormat(" AND {0}<='{1} 23:59:59' ", nameof(RB_Goods_Order_Extend.CreateDate), query.EndDate);
}
var orderCountList= Get<OrderNum>(orderNum.ToString()).ToList();
if (orderCountList != null && orderCountList.Count > 0)
{
model.TotalOrderNum = orderCountList.Sum(qitem => qitem.OrderCount);
model.NoSendOrderNum = orderCountList.Where(qitem => qitem.OrderStatus == Common.Enum.Goods.OrderStatusEnum.WaitSendGoods).FirstOrDefault()?.OrderCount ?? 0;
}
//维权订单【售后订单】
StringBuilder afterSales = new StringBuilder();
afterSales.AppendFormat(@"
SELECT COUNT(1)
FROM rb_goods_orderaftersale AS A LEFT JOIN rb_goods_order AS B ON A.OrderId=B.OrderId
WHERE 1=1 AND A.ReOrderStatus IN(2,3,4) ");
afterSales.AppendFormat(" AND A.{0}={1} ", nameof(RB_Goods_OrderAfterSale_Extend.TenantId), query.TenantId);
afterSales.AppendFormat(" AND A.{0}={1} ", nameof(RB_Goods_OrderAfterSale_Extend.MallBaseId), query.MallBaseId);
//订单来源
if (query.Source > 0)
{
afterSales.AppendFormat(" AND B.{0}={1} ", nameof(RB_Goods_OrderAfterSale_Extend.OrderSource), (int)query.Source);
}
//开始时间
if (query.StartDate != null && !string.IsNullOrWhiteSpace(query.StartDate))
{
afterSales.AppendFormat(" AND A.{0}>='{1}' ", nameof(RB_Goods_OrderAfterSale_Extend.CreateDate), query.StartDate);
}
//结束时间
if (query.EndDate != null && !string.IsNullOrWhiteSpace(query.EndDate))
{
afterSales.AppendFormat(" AND A.{0}<='{1} 23:59:59' ", nameof(RB_Goods_OrderAfterSale_Extend.CreateDate), query.EndDate);
}
var afterSalesObj = ExecuteScalar(afterSales.ToString());
if (afterSalesObj != null && Convert.ToInt32(afterSalesObj.ToString()) > 0)
{
model.ActivistOrderNum = Convert.ToInt32(afterSalesObj.ToString());
}
#endregion
return model;
}
/// <summary>
/// 订单统计
/// 销售情况统计
/// </summary>
public void OrderStatistics(StatisticsQuery query)
{
/// <param name="query"></param>
public List<MallSalesStatistics> MallIndexSalesStatisticsRepository(StatisticsQuery query)
{
StringBuilder builder = new StringBuilder();
string selectFileds = "";
string groupFileds = "";
if (query.SalesTimeType == 1)
{
selectFileds = " SUBSTR(DATE_FORMAT(CreateDate,'%Y%m%d%H'),9,2) AS TimeStr, ";
groupFileds = " GROUP BY DATE_FORMAT(CreateDate,'%Y%m%d%H') ";
}
else
{
selectFileds = " DATE_FORMAT(CreateDate,'%Y-%m-%d') AS TimeStr, ";
groupFileds = " GROUP BY DATE_FORMAT(CreateDate,'%Y%m%d') ";
}
builder.AppendFormat(@"
SELECT {0} COUNT(1) AS OrderCount,SUM(A.Income) AS Income,COUNT(DISTINCT A.UserId) AS UserCount,SUM(B.GoodCount) AS GoodCount
FROM rb_goods_order A LEFT JOIN (SELECT OrderId,COUNT(1) AS GoodCount FROM rb_goods_orderdetail GROUP BY OrderId) AS B ON A.OrderId=B.OrderId
WHERE 1=1 AND OrderStatus>=2 AND OrderStatus<=5
", selectFileds);
builder.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Order_Extend.TenantId), query.TenantId);
builder.AppendFormat(" AND {0}={1} ", nameof(RB_Goods_Order_Extend.MallBaseId), query.MallBaseId);
//订单来源
if (query.Source > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Goods_Order_Extend.OrderSource), (int)query.Source);
}
//开始时间
if (query.SalesTimeType==7)
{
builder.AppendFormat(" AND A.{0}>='{1}' ", nameof(RB_Goods_Order_Extend.CreateDate), DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"));
builder.AppendFormat(" AND A.{0}<='{1} 23:59:59' ", nameof(RB_Goods_Order_Extend.CreateDate), DateTime.Now.ToString("yyyy-MM-dd"));
}
else
{
builder.AppendFormat(" AND A.{0}>='{1}' AND A.{0}<='{1} 23:59:59' ", nameof(RB_Goods_Order_Extend.CreateDate), DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"));
}
builder.Append(groupFileds);
var list = Get<MallSalesStatistics>(builder.ToString()).ToList();
return list;
}
/// <summary>
/// 商品购买力TOP排行
/// </summary>
/// <param name="query"></param>
public List<MallSalesGoodsTop> MallIndesSalesIncomeStatisticsRepository(StatisticsQuery query)
{
string where = "";
where += string.Format(" AND B.{0}={1} ", nameof(RB_Goods_Order_Extend.TenantId), query.TenantId);
where += string.Format(" AND B.{0}={1} ", nameof(RB_Goods_Order_Extend.MallBaseId), query.MallBaseId);
//开始时间
if (query.StartDate != null && !string.IsNullOrWhiteSpace(query.StartDate))
{
where+=string.Format(" AND B.{0}>='{1}' ", nameof(RB_Goods_Order_Extend.CreateDate), query.StartDate);
}
//结束时间
if (query.EndDate != null && !string.IsNullOrWhiteSpace(query.EndDate))
{
where += string.Format(" AND B.{0}<='{1} 23:59:59' ", nameof(RB_Goods_Order_Extend.CreateDate), query.EndDate);
}
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.GoodsName,Count(1) SaleCount,SUM(A.Final_Price) AS Income
FROM rb_goods_orderdetail AS A LEFT JOIN rb_goods_order AS B ON A.OrderId=B.OrderId
WHERE 1=1 AND A.GoodsId>0 {0}
GROUP BY A.GoodsId,A.GoodsName
ORDER BY COunt(1) DESC
LIMIT 100
", where);
var list = Get<MallSalesGoodsTop>(builder.ToString()).ToList();
if (list != null && list.Count > 0)
{
int index = 1;
foreach (var item in list)
{
item.Num = index;
index++;
}
}
return list;
}
/// <summary>
/// 用户购买力TOP排行
/// </summary>
/// <param name="query"></param>
public List<MallSalesUserTop> MallIndesSalesUserStatisticsRepository(StatisticsQuery query)
{
string where = "";
where += string.Format(" AND B.{0}={1} ", nameof(RB_Goods_Order_Extend.TenantId), query.TenantId);
where += string.Format(" AND B.{0}={1} ", nameof(RB_Goods_Order_Extend.MallBaseId), query.MallBaseId);
//开始时间
if (query.StartDate != null && !string.IsNullOrWhiteSpace(query.StartDate))
{
where += string.Format(" AND B.{0}>='{1}' ", nameof(RB_Goods_Order_Extend.CreateDate), query.StartDate);
}
//结束时间
if (query.EndDate != null && !string.IsNullOrWhiteSpace(query.EndDate))
{
where += string.Format(" AND B.{0}<='{1} 23:59:59' ", nameof(RB_Goods_Order_Extend.CreateDate), query.EndDate);
}
//订单来源
if (query.Source > 0)
{
where += string.Format(" AND C.{0}={1} ", nameof(RB_Member_User_Extend.Source), (int)query.Source);
}
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT C.`Name` AS UserName,C.Photo,COUNT(1) SaleCount,SUM(A.Final_Price) AS Income
FROM rb_goods_orderdetail AS A LEFT JOIN rb_goods_order AS B ON A.OrderId=B.OrderId
LEFT JOIN rb_member_user AS C ON B.UserId=C.Id
WHERE 1=1 AND A.GoodsId>0 {0}
GROUP BY B.UserId,C.`Name`
ORDER BY COUNT(1) DESC
LIMIT 100
", where);
var list = Get<MallSalesUserTop>(builder.ToString()).ToList();
if (list != null && list.Count > 0)
{
int index = 1;
foreach (var item in list)
{
item.Num = index;
index++;
}
}
return list;
}
}
}
......@@ -21,6 +21,7 @@ using Mall.Common.Enum.MallBase;
using Mall.Model.Entity.User;
using Mall.Module.Product;
using Microsoft.AspNetCore.Authorization;
using Mall.Model.Query;
namespace Mall.WebApi.Controllers.User
{
......@@ -1357,5 +1358,61 @@ namespace Mall.WebApi.Controllers.User
return flag ? ApiResult.Success() : ApiResult.Failed();
}
#endregion
#region 商城首页统计
/// <summary>
/// 首页基础数据统计
/// </summary>
/// <returns></returns>
public ApiResult MallIndexStatistics()
{
var query = JsonConvert.DeserializeObject<StatisticsQuery>(RequestParm.msg.ToString());
query.MallBaseId = RequestParm.MallBaseId;
query.TenantId = RequestParm.TenantId;
var list = programModule.MallIndexStatisticsModule(query);
return ApiResult.Success(data: list);
}
/// <summary>
/// 销售情况统计
/// </summary>
/// <returns></returns>
public ApiResult MallIndexSalesStatistics()
{
var query = JsonConvert.DeserializeObject<StatisticsQuery>(RequestParm.msg.ToString());
query.MallBaseId = RequestParm.MallBaseId;
query.TenantId = RequestParm.TenantId;
var list = programModule.MallIndexSalesStatisticsModule(query);
return ApiResult.Success(data: list);
}
/// <summary>
/// 商品购买力TOP排行
/// </summary>
/// <returns></returns>
public ApiResult MallIndesSalesIncomeStatistics()
{
var query = JsonConvert.DeserializeObject<StatisticsQuery>(RequestParm.msg.ToString());
query.MallBaseId = RequestParm.MallBaseId;
query.TenantId = RequestParm.TenantId;
var list = programModule.MallIndesSalesIncomeStatisticsModule(query);
return ApiResult.Success(data: list);
}
/// <summary>
/// 用户购买力TOP排行
/// </summary>
/// <returns></returns>
public ApiResult MallIndesSalesUserStatistics()
{
var query = JsonConvert.DeserializeObject<StatisticsQuery>(RequestParm.msg.ToString());
query.MallBaseId = RequestParm.MallBaseId;
query.TenantId = RequestParm.TenantId;
var list = programModule.MallIndesSalesUserStatisticsModule(query);
return ApiResult.Success(data: list);
}
#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