/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2021/1/31 21:45:10 * Description: 暂无 ***********************************************************************/ using CoreCms.Net.Configuration; using CoreCms.Net.Filter; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Model.FromBody; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Model.ViewModels.Echarts; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Web.Admin.Infrastructure; using SqlSugar; namespace CoreCms.Net.Web.Admin.Controllers.Content { /// /// 报表统计 /// [Description("报表统计")] [Route("api/[controller]/[action]")] [ApiController] [RequiredErrorForAdmin] [Authorize(Permissions.Name)] public class CoreCmsReportsController : ControllerBase { private readonly ICoreCmsReportsServices _reportsServices; /// /// 构造函数 /// /// public CoreCmsReportsController(ICoreCmsReportsServices reportsServices) { _reportsServices = reportsServices; } #region 订单销量统计 // POST: Api/CoreCmsReports/GetOrder /// /// 订单销量统计 /// /// [HttpPost] [Description("订单销量统计")] public AdminUiCallBack GetOrder([FromBody] FMReports entity) { var jm = new AdminUiCallBack(); var dataRes = ReportsHelper.GetDate(entity.date, entity.section); if (!dataRes.status) { jm.msg = dataRes.msg; return jm; } var echartsOption = new EchartsOption(); echartsOption.title.text = "订单统计"; var legend = new List() { "全部", "待付款", "已付款" }; echartsOption.legend.data = legend; var getDate = dataRes.data as ReportsBackForGetDate; var xData = ReportsHelper.GetXdata(getDate); if (!xData.status) { jm.msg = dataRes.msg; return jm; } echartsOption.xAxis.data = xData.data as List; var whereSql = string.Empty; var data = new List(); var data1 = new List(); var data2 = new List(); var data3 = new List(); foreach (var item in legend) { switch (item) { case "全部": whereSql = string.Empty; whereSql += " and createTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and createTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; data = _reportsServices.GetOrderMark(getDate.num, whereSql, getDate.section, getDate.start, "createTime"); data1 = data; break; case "待付款": whereSql = string.Empty; whereSql += " and createTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and createTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and payStatus=1 "; data = _reportsServices.GetOrderMark(getDate.num, whereSql, getDate.section, getDate.start, "createTime"); data2 = data; break; case "已付款": whereSql = string.Empty; whereSql += " and paymentTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and paymentTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and payStatus>1 "; data = _reportsServices.GetOrderMark(getDate.num, whereSql, getDate.section, getDate.start, "paymentTime"); data3 = data; break; } if (data != null && data.Any()) { var vals = data.Select(p => p.val).ToList(); echartsOption.series.Add(new SeriesItem() { name = item, type = "line", data = vals.ConvertAll(x => x.ToString(CultureInfo.InvariantCulture)) }); } else { echartsOption.series.Add(new SeriesItem() { name = item, type = "line", data = new List() }); } } //组装数据列表用于table里使用 var tableData = new List(); for (int i = 0; i < getDate.num; i++) { var item = new OrderTableItem(); if (echartsOption.xAxis.data != null) item.x = echartsOption.xAxis.data[i]; item.order_all_val = data1[i].val.ToString(CultureInfo.InvariantCulture); item.order_all_num = data1[i].num; item.order_nopay_val = data2[i].val.ToString(CultureInfo.InvariantCulture); item.order_nopay_num = data2[i].num; item.order_payed_val = data3[i].val.ToString(CultureInfo.InvariantCulture); item.order_payed_num = data3[i].num; tableData.Add(item); } jm.code = 0; jm.data = new { option = echartsOption, table = tableData }; return jm; } #endregion #region 财务收款单 // POST: Api/CoreCmsReports/GetPayments /// /// 财务收款单 /// /// [HttpPost] [Description("财务收款单")] public AdminUiCallBack GetPayments([FromBody] FMReports entity) { var jm = new AdminUiCallBack(); var dataRes = ReportsHelper.GetDate(entity.date, entity.section); if (!dataRes.status) { jm.msg = dataRes.msg; return jm; } var echartsOption = new EchartsOption(); echartsOption.title.text = "财务统计"; var legend = new List() { "收款单", "订单收款", "订单退款", "充值", "提现" }; echartsOption.legend.data = legend; var getDate = dataRes.data as ReportsBackForGetDate; var xData = ReportsHelper.GetXdata(getDate); if (!xData.status) { jm.msg = dataRes.msg; return jm; } echartsOption.xAxis.data = xData.data as List; var whereSql = string.Empty; var data = new List(); var data1 = new List(); var data2 = new List(); var data3 = new List(); var data4 = new List(); var data5 = new List(); foreach (var item in legend) { switch (item) { case "收款单": whereSql = string.Empty; whereSql += " and updateTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and updateTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and status = 2 "; data = _reportsServices.GetPaymentsMark(getDate.num, whereSql, getDate.section, getDate.start, "updateTime"); data1 = data; break; case "订单收款": whereSql = string.Empty; whereSql += " and updateTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and updateTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and status = 2 "; whereSql += " and type = " + (int)GlobalEnumVars.BillPaymentsType.Common + " "; data = _reportsServices.GetPaymentsMark(getDate.num, whereSql, getDate.section, getDate.start, "updateTime"); data2 = data; break; case "订单退款": whereSql = string.Empty; whereSql += " and updateTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and updateTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and status = 2 "; whereSql += " and type = " + (int)GlobalEnumVars.BillPaymentsType.Common + " "; data = _reportsServices.GetRefundMark(getDate.num, whereSql, getDate.section, getDate.start, "updateTime"); data3 = data; break; case "充值": whereSql = string.Empty; whereSql += " and updateTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and updateTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and status = 2 "; whereSql += " and type = " + (int)GlobalEnumVars.BillPaymentsType.Recharge + " "; data = _reportsServices.GetPaymentsMark(getDate.num, whereSql, getDate.section, getDate.start, "updateTime"); data4 = data; break; case "提现": whereSql = string.Empty; whereSql += " and updateTime > '" + getDate.start.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and updateTime < '" + getDate.end.ToString("yyyy-MM-dd HH:mm:ss") + "' "; whereSql += " and status = 2 "; data = _reportsServices.GetTocashMark(getDate.num, whereSql, getDate.section, getDate.start, "updateTime"); data5 = data; break; } if (data != null && data.Any()) { var vals = data.Select(p => p.val).ToList(); echartsOption.series.Add(new SeriesItem() { name = item, type = "line", data = vals.ConvertAll(x => x.ToString(CultureInfo.InvariantCulture)) }); } else { echartsOption.series.Add(new SeriesItem() { name = item, type = "line", data = new List() }); } } //组装数据列表用于table里使用 //var legend = new List() { "收款单", "订单收款", "订单退款", "充值", "提现" }; var tableData = new List(); for (int i = 0; i < getDate.num; i++) { var item = new PaymentsTableItem(); if (echartsOption.xAxis.data != null) item.x = echartsOption.xAxis.data[i]; item.payments_all_val = data1[i].val.ToString(CultureInfo.InvariantCulture); item.payments_all_num = data1[i].num; item.payments_order_val = data2[i].val.ToString(CultureInfo.InvariantCulture); item.payments_order_num = data2[i].num; item.payments_order_refund_val = data3[i].val.ToString(CultureInfo.InvariantCulture); item.payments_order_refund_num = data3[i].num; item.payments_recharge_val = data4[i].val.ToString(CultureInfo.InvariantCulture); item.payments_recharge_num = data4[i].num; item.payments_tocash_val = data5[i].val.ToString(CultureInfo.InvariantCulture); item.payments_tocash_num = data5[i].num; tableData.Add(item); } jm.code = 0; jm.data = new { option = echartsOption, table = tableData }; return jm; } #endregion #region 商品销量统计 // POST: Api/CoreCmsReports/GetGoods /// /// 商品销量统计 /// /// [HttpPost] [Description("商品销量统计")] public async Task GetGoods() { var jm = new AdminUiCallBack(); var page = Request.Form["page"].FirstOrDefault().ObjectToInt(1); var limit = Request.Form["limit"].FirstOrDefault().ObjectToInt(5000); var thesort = Request.Form["thesort"].FirstOrDefault(); if (string.IsNullOrEmpty(thesort)) { thesort = "desc"; } var filter = Request.Form["filter"].FirstOrDefault(); if (string.IsNullOrEmpty(filter)) { filter = "nums"; } var filter_sed = filter == "nums" ? "amount" : "nums"; var dt = DateTime.Now; var start = ""; var end = ""; var date = Request.Form["date"].FirstOrDefault(); if (!string.IsNullOrEmpty(date)) { var dts = date.Split("到"); if (dts.Length == 2) { var startDt = dts[0].Trim().ObjectToDate(); start = startDt.ToString("yyyy-MM-dd 00:00:00"); var endDt = dts[1].Trim().ObjectToDate(); end = endDt.ToString("yyyy-MM-dd 23:59:59"); } else { jm.msg = "时间段格式不正确"; return jm; } } else { //默认今天 start = dt.ToString("yyyy-MM-dd 00:00:00"); end = dt.ToString("yyyy-MM-dd 23:59:59"); } var list = await _reportsServices.GetGoodsSalesVolumes(start, end, filter, filter_sed, thesort, page, limit); jm.code = 0; jm.data = list; jm.count = list.TotalCount; return jm; } #endregion #region 商品收藏统计 // POST: Api/CoreCmsReports/GetGoodsCollection /// /// 商品收藏统计 /// /// [HttpPost] [Description("商品收藏统计")] public async Task GetGoodsCollection() { var jm = new AdminUiCallBack(); var page = Request.Form["page"].FirstOrDefault().ObjectToInt(1); var limit = Request.Form["limit"].FirstOrDefault().ObjectToInt(5000); var thesort = Request.Form["thesort"].FirstOrDefault(); if (string.IsNullOrEmpty(thesort)) { thesort = "desc"; } var dt = DateTime.Now; var start = ""; var end = ""; var date = Request.Form["date"].FirstOrDefault(); if (!string.IsNullOrEmpty(date)) { var dts = date.Split("到"); if (dts.Length == 2) { var startDt = dts[0].Trim().ObjectToDate(); start = startDt.ToString("yyyy-MM-dd 00:00:00"); var endDt = dts[1].Trim().ObjectToDate(); end = endDt.ToString("yyyy-MM-dd 23:59:59"); } else { jm.msg = "时间段格式不正确"; return jm; } } else { //默认今天 start = dt.ToString("yyyy-MM-dd 00:00:00"); end = dt.ToString("yyyy-MM-dd 23:59:59"); } var list = await _reportsServices.GetGoodsCollections(start, end, thesort, page, limit); jm.code = 0; jm.data = list; jm.count = list.TotalCount; return jm; } #endregion #region 换算前台时间按钮 //换算前台时间按钮 // POST: Api/CoreCmsReports/GetDateType /// /// 换算前台时间按钮 /// /// [HttpPost] [Description("换算前台时间按钮")] public AdminUiCallBack GetDateType([FromBody] FMIntId entity) { var jm = new AdminUiCallBack(); if (entity.id <= 0) { jm.msg = "请选择合法的时间段"; return jm; } DateTime dt = DateTime.Now; //当前时间 var start = ""; var end = ""; switch (entity.id) { case 1: //当天 start = dt.ToString("yyyy-MM-dd"); end = start; break; case 2: //昨天 start = dt.AddDays(-1).ToString("yyyy-MM-dd"); end = start; break; case 3: //本周 var startWeek = dt.AddDays(1 - Convert.ToInt32(dt.DayOfWeek.ToString("d"))); //本周周一 var endWeek = startWeek.AddDays(6); //本周周日 start = startWeek.ToString("yyyy-MM-dd"); end = endWeek.ToString("yyyy-MM-dd"); break; case 4: //上周 var lastWeekStart = dt.AddDays(Convert.ToInt32(1 - Convert.ToInt32(dt.DayOfWeek)) - 7); var lastWeekEnd = dt.AddDays(Convert.ToInt32(1 - Convert.ToInt32(dt.DayOfWeek)) - 7).AddDays(6); //上周末(星期日) start = lastWeekStart.ToString("yyyy-MM-dd"); end = lastWeekEnd.ToString("yyyy-MM-dd"); break; case 5: //本月 var startMonth = dt.AddDays(1 - dt.Day); //本月月初 var endMonth = startMonth.AddMonths(1).AddDays(-1); //本月月末 start = startMonth.ToString("yyyy-MM-dd"); end = endMonth.ToString("yyyy-MM-dd"); break; case 6: //上月 start = DateTime.Parse(dt.ToString("yyyy-MM-01")).AddMonths(-1).ToString("yyyy-MM-dd"); end = DateTime.Parse(dt.ToString("yyyy-MM-01")).AddDays(-1).ToString("yyyy-MM-dd"); break; case 7: //最近7天 start = dt.AddDays(-7).ToString("yyyy-MM-dd"); end = dt.Date.ToString("yyyy-MM-dd"); break; case 8: //最近一月 start = dt.AddMonths(-1).AddDays(1).ToString("yyyy-MM-dd"); end = dt.Date.ToString("yyyy-MM-dd"); break; case 9: //最近3月 start = dt.AddMonths(-3).AddDays(1).ToString("yyyy-MM-dd"); end = dt.Date.ToString("yyyy-MM-dd"); break; case 10: //最近6个月 start = dt.AddMonths(-6).AddDays(1).ToString("yyyy-MM-dd"); end = dt.Date.ToString("yyyy-MM-dd"); break; case 11: //最近一年 start = dt.AddMonths(-12).AddDays(1).ToString("yyyy-MM-dd"); end = dt.Date.ToString("yyyy-MM-dd"); break; case 12: //本年度 start = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToString("yyyy-MM-dd"); end = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToString("yyyy-MM-dd"); break; case 13: //上年度 start = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToString("yyyy-MM-dd"); end = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToString("yyyy-MM-dd"); break; default: jm.msg = "没有此时间维度"; break; } jm.code = 0; jm.data = new { start, end }; return jm; } #endregion } }