Infrastructure/OpenAuth.App/ServiceApp/DataAnalysisApp.cs

610 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Infrastructure;
using Microsoft.Extensions.Configuration;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
using OpenAuth.App.ServiceApp.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp
{
/// <summary>
/// 统计分析
/// </summary>
public class DataAnalysisApp : SqlSugarBaseApp<InsTask, SugarDbContext>
{
private readonly IConfiguration _configuration;
private readonly ISqlSugarClient client;
private readonly IAuth _auth;
public DataAnalysisApp(ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<InsTask> repository, IAuth auth, ISqlSugarClient sqlSugarClient, IConfiguration configuration) : base(unitWork, repository, auth)
{
_configuration = configuration;
this.client = sqlSugarClient;
_auth = auth;
}
/// <summary>
/// 时相统计
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<InsTask>>>> GteTaskListForAdmin(int month, int week, DateTime beginTime, DateTime endTime, string taskName, int page, int limit)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalCount = 0;
var tsakList = await db.InsTask.AsQueryable()
.WhereIF(string.IsNullOrEmpty(taskName), r => r.TaskName.Contains(taskName))
.ToPageListAsync(page, limit, totalCount);
if (beginTime.Year == 0001)
{
beginTime = GetMonthStartAndEndDate(month).Start;
endTime = GetMonthStartAndEndDate(month).End;
}
var tifList = await db.InsTif.AsQueryable()
.WhereIF(beginTime.Year != 0001 || month != 0, r => r.CreateTime >= beginTime && r.CreateTime <= endTime)
.ToListAsync();
//总面积
var totalTifArea = tifList.Sum(r => r.AreaNum);
//个数
var totalTifCount = tifList.Count();
return new Response<PageInfo<List<InsTask>>>
{
Result = new PageInfo<List<InsTask>>
{
Items = tsakList,
Total = totalCount
}
};
}
}
/// <summary>
/// 每个县区的时相统计
/// </summary>
/// <returns></returns>
public async Task<Response<List<dynamic>>> GetShiXiangForArea(int month, int week, DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
if (beginTime.Year == 0001)
{
beginTime = GetMonthStartAndEndDate(month).Start;
endTime = GetMonthStartAndEndDate(month).End;
}
var tifList = db.InsTif.AsQueryable()
.WhereIF(beginTime.Year != 0001 || month != 0, r => r.CreateTime >= beginTime && r.CreateTime <= endTime);
//总面积
var totalTifArea = tifList.Sum(r => r.AreaNum);
//个数
var totalTifCount = tifList.Count();
var endData = await tifList.GroupBy(r => r.AreaNum).Select<dynamic>(r => new
{
r.AreaName,
sumArea = SqlFunc.AggregateSum(r.AreaNum),
}).ToListAsync();
return new Response<List<dynamic>>
{
Result = endData,
};
}
}
/// <summary>
/// 每天时相统计
/// </summary>
/// <returns></returns>
public async Task<Response<List<dynamic>>> GetShiXiangForTime(int month, int week, DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
if (beginTime.Year == 0001)
{
beginTime = GetMonthStartAndEndDate(month).Start;
endTime = GetMonthStartAndEndDate(month).End;
}
var tifList = db.InsTif.AsQueryable()
.WhereIF(beginTime.Year != 0001 || month != 0, r => r.CreateTime >= beginTime && r.CreateTime <= endTime);
//总面积
var totalTifArea = tifList.Sum(r => r.AreaNum);
//个数
var totalTifCount = tifList.Count();
var endData = await tifList.GroupBy(r => r.CreateTime).Select<dynamic>(r => new
{
r.CreateTime,
sumArea = SqlFunc.AggregateSum(r.AreaNum),
}).ToListAsync();
return new Response<List<dynamic>>
{
Result = endData,
};
}
}
static (DateTime Start, DateTime End) GetMonthStartAndEndDate(int month)
{
int year = DateTime.Now.Year; // 获取当前年份
DateTime startDate = new DateTime(year, month, 1, 0, 0, 0); // 当月起始日期
DateTime endDate = startDate.AddMonths(1).AddSeconds(-1); // 当月结束日期
return (startDate, endDate);
}
// 获取本月的起始时间和结束时间
public static (DateTime startOfMonth, DateTime endOfMonth) GetStartEndOfMonth()
{
DateTime now = DateTime.Now;
// 本月的第一天
DateTime startOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
// 本月的最后一天
DateTime endOfMonth = startOfMonth.AddMonths(1).AddSeconds(-1);
return (startOfMonth, endOfMonth);
}
public static (DateTime startOfWeek, DateTime endOfWeek) GetStartEndOfWeek()
{
DateTime now = DateTime.Now;
// 计算本周的第一天(假设一周从周一开始)
DateTime startOfWeek = now.AddDays(-((int)now.DayOfWeek - 1));
startOfWeek = startOfWeek.Date;
// 计算本周的最后一天(假设一周从周一开始,周日为最后一天)
DateTime endOfWeek = startOfWeek.AddDays(7).AddSeconds(-1);
return (startOfWeek, endOfWeek);
}
#region 统计数据
/// <summary>
/// 小组 人员 的任务数和图斑数
/// </summary>
/// <param name="type"></param>
/// <param name="dateType"></param>
/// <returns></returns>
public async Task<Response<List<UserOrGroupTaskResp>>> GetGroupOrUserTaskAndTuBan(int type, int dateType)
{
var user = _auth.GetCurrentUser().User;
DateTime beginTime, endTime;
if (dateType == 1)
{
beginTime = GetStartEndOfMonth().startOfMonth;
endTime = GetStartEndOfMonth().endOfMonth;
}
else if (dateType == 2)
{
beginTime = GetStartEndOfWeek().startOfWeek;
endTime = GetStartEndOfWeek().endOfWeek;
}
else
{
beginTime = DateTime.Today;
endTime = DateTime.Now;
}
using (var db = base.UnitWork.CreateContext())
{
// 获取当前用户相关的所有小组用户
var groupIds = await db.SysGroup.AsQueryable()
.Where(r => r.GroupLeaderId == user.Id.ToString())
.Select(r => r.Id)
.ToListAsync();
var groupUser = await db.SysGroupuser.AsQueryable()
.Where(r => groupIds.Contains(r.GroupId) || r.UserId == user.Id.ToString())
.Select(r => r.UserId)
.ToListAsync();
// 如果是小组统计
if (type == 1)
{
var result = await db.InsTaskgroup.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.ReciveUserId == b.Id.ToString())
.WhereIF(beginTime.Year != 0001, a => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.WhereIF(groupUser.Count > 0, a => groupUser.Contains(a.ReciveUserId))
.Where((a,b)=>!string.IsNullOrEmpty(a.ReciveUserId))
.GroupBy((a, b) => b.Name)
.Select((a, b) => new UserOrGroupTaskResp
{
UserName = b.Name,
TaskCount = SqlFunc.AggregateCount(a.Id),
TuBanCount = SqlFunc.AggregateSum(a.EndNum - a.BeginNum),
}).MergeTable().OrderByDescending((t)=>t.TuBanCount).ToListAsync();
return new Response<List<UserOrGroupTaskResp>>
{
Result = result,
};
}
// 如果是人员统计
else if (type == 2)
{
var result = await db.InsTaskgroup.AsQueryable()
.LeftJoin<SysGroupuser>((a, b) => a.ReciveUserId == b.UserId)
.LeftJoin<SysGroup>((a, b, c) => b.GroupId == c.Id)
.WhereIF(beginTime.Year != 0001, a => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.WhereIF(groupUser.Count > 0, a => groupUser.Contains(a.ReciveUserId))
.Where((a, b) => !string.IsNullOrEmpty(a.ReciveUserId))
.GroupBy((a, b, c) => c.Name)
.Select((a, b, c) => new UserOrGroupTaskResp
{
UserName = c.Name,
TaskCount = SqlFunc.AggregateCount(a.Id),
TuBanCount = SqlFunc.AggregateSum(a.EndNum - a.BeginNum),
}).MergeTable().OrderByDescending((t) => t.TuBanCount).ToListAsync();
return new Response<List<UserOrGroupTaskResp>>
{
Result = result,
};
}
}
return new Response<List<UserOrGroupTaskResp>>(); // 默认返回空列表
}
//public async Task<Response<List<AiShpDataExpenseAccountingTableResp>>> GetAiShpDataExpenseAccountingTableOld(DateTime beginTime, DateTime endTime)
//{
// using (var db = base.UnitWork.CreateContext())
// {
// var aiShpList = db.InsAishp.AsQueryable()
// .WhereIF(beginTime.Year != 0001, r => r.CreateTime >= beginTime && r.CreateTime <= endTime);
// //总面积
// var totalTifArea = aiShpList.Sum(r => r.AreaNum);
// //个数
// var totalTifCount = aiShpList.Count();
// var endData = await aiShpList.GroupBy(r => r.ShpDate.Date).Select(r => new AiShpDataExpenseAccountingTableResp
// {
// ShapDate = r.ShpDate.Date.ToString("yyyyMMdd"),
// AreaNum = SqlFunc.AggregateSum(r.AreaNum),
// ShpCount = SqlFunc.AggregateSum(r.ShpCount),
// }).ToListAsync();
// return new Response<List<AiShpDataExpenseAccountingTableResp>>()
// {
// Result = endData
// };
// }
//}
public async Task<Response<AiShpDataExpenseAccountingTableResp>> GetAiShpDataExpenseAccountingTable1(DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
List<DateTime> dateList = new List<DateTime>();
List<AiShpDataExpenseAccountingResp> dataList = new List<AiShpDataExpenseAccountingResp>();
if (beginTime > endTime)
{
throw new ArgumentException("开始时间需要小于结束时间");
}
// 从开始日期遍历到结束日期
for (DateTime date = beginTime.Date; date <= endTime.Date; date = date.AddDays(1))
{
dateList.Add(date);
}
var aiShpList = db.InsAishp.AsQueryable().WhereIF(beginTime.Year != 0001, r => r.CreateTime >= beginTime && r.CreateTime <= endTime);
var taskList = db.InsTask.AsQueryable().WhereIF(beginTime.Year != 0001, t => t.CreateTime >= beginTime && t.CreateTime <= endTime);
for (int i = 0; i < dateList.Count; i++)
{
AiShpDataExpenseAccountingResp aiShpDataExpenseAccountingResp = new AiShpDataExpenseAccountingResp();
var aiShpListDay = db.InsAishp.AsQueryable().Where(r => r.ShpDate >= dateList[i]);
aiShpDataExpenseAccountingResp.Number = i + 1;
aiShpDataExpenseAccountingResp.ShapDate = dateList[i].ToString("yyyyMMdd");
//提取个数
aiShpDataExpenseAccountingResp.AreaNum = await aiShpListDay.SumAsync(r => r.AreaNum);
aiShpDataExpenseAccountingResp.ShpCount = await aiShpListDay.SumAsync(r => r.ShpCount);
//下发数量
aiShpDataExpenseAccountingResp.IssuedCount = await taskList.Where(t => aiShpListDay.Select(r => r.Id).ToList().Contains(t.ShpId)).CountAsync();
}
AiShpDataExpenseAccountingTableResp aiShpDataExpenseAccountingTableResp = new AiShpDataExpenseAccountingTableResp();
aiShpDataExpenseAccountingTableResp.RespData = dataList;
//总面积
aiShpDataExpenseAccountingTableResp.TotalShpArea = aiShpList.Sum(r => r.AreaNum);
//个数
aiShpDataExpenseAccountingTableResp.TotalShpCount = aiShpList.Count();
return new Response<AiShpDataExpenseAccountingTableResp>()
{
Result = aiShpDataExpenseAccountingTableResp
};
}
}
public async Task<Response<AiShpDataExpenseAccountingTableResp>> GetAiShpDataExpenseAccountingTable(DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
if (beginTime > endTime)
{
throw new ArgumentException("开始时间需要小于结束时间");
}
var dateList = Enumerable.Range(0, (endTime.Date - beginTime.Date).Days + 1)
.Select(offset => beginTime.Date.AddDays(offset))
.ToList();
var aiShpList = await db.InsAishp.AsQueryable()
.Where(r => r.ShpDate >= beginTime && r.ShpDate <= endTime)
.ToListAsync();
var taskList = await db.InsTask.AsQueryable()
.Where(t => t.CreateTime >= beginTime && t.CreateTime <= endTime)
.ToListAsync();
int TotalIssuedCount = 0;
var dataList = dateList.Select(date =>
{
var aiShpForDay = aiShpList.Where(r => r.ShpDate.Date == date).ToList();
var areaNum = aiShpForDay.Sum(r => r.AreaNum);
var shpCount = aiShpForDay.Sum(r => r.ShpCount ?? 0);
var issuedCount = taskList.Count(t => aiShpForDay.Any(r => r.Id == t.ShpId));
TotalIssuedCount += issuedCount;
//文件夹
var folderPath = string.Join(",", aiShpForDay.Select(r =>
{
var directory = Path.GetDirectoryName(r.ShpPath); // 获取目录部分
return directory != null ? Path.GetFileName(directory) : string.Empty; // 获取目录名
}).ToList());
return new AiShpDataExpenseAccountingResp
{
Number = dateList.IndexOf(date) + 1,
ShapDate = date.ToString("yyyyMMdd"),
AreaNum = areaNum,
ShpCount = shpCount,
IssuedCount = issuedCount,
FolderPath = folderPath,
};
}).ToList();
var totalShpArea = aiShpList.Sum(r => r.AreaNum);
var totalShpCount = aiShpList.Count();
var aiShpDataExpenseAccountingTableResp = new AiShpDataExpenseAccountingTableResp
{
RespData = dataList,
TotalShpArea = totalShpArea,
TotalShpCount = totalShpCount,
TotalShpProduction = 0,
TotalShpInterpretation = 0,
TotalJudgment = 0,
TotalPush = 0,
TotalCost = 0,
TotalIssuedCount = TotalIssuedCount
};
return new Response<AiShpDataExpenseAccountingTableResp>
{
Result = aiShpDataExpenseAccountingTableResp
};
}
}
//导出
public Response<MemoryStream> CaseOfMineralsToExcelNew(DateTime startTime, DateTime endTime)
{
Response<MemoryStream> response = new Response<MemoryStream>();
try
{
var list = GetAiShpDataExpenseAccountingTable(startTime, endTime).Result;
HSSFWorkbook workbook = new HSSFWorkbook();
#region 样式设置
ICellStyle CreateCellStyle(HSSFWorkbook wb, short fontHeight, string fontName, HorizontalAlignment hAlign,
VerticalAlignment vAlign, bool bold = false)
{
IFont font = wb.CreateFont();
font.FontName = fontName;
font.FontHeightInPoints = fontHeight;
font.IsBold = bold;
ICellStyle style = wb.CreateCellStyle();
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.Alignment = hAlign;
style.VerticalAlignment = vAlign;
style.SetFont(font);
style.WrapText = true;
return style;
}
ICellStyle CreateCellStyle2(HSSFWorkbook wb, short fontHeight, string fontName, HorizontalAlignment hAlign,
VerticalAlignment vAlign, bool bold = false)
{
IFont font = wb.CreateFont();
font.FontName = fontName;
font.FontHeightInPoints = fontHeight;
font.IsBold = bold;
ICellStyle style = wb.CreateCellStyle();
style.Alignment = hAlign;
style.VerticalAlignment = vAlign;
style.SetFont(font);
style.WrapText = true;
return style;
}
// 创建右对齐样式
ICellStyle rightAlignStyle = workbook.CreateCellStyle();
rightAlignStyle.Alignment = HorizontalAlignment.Right; // 设置右对齐
rightAlignStyle.VerticalAlignment = VerticalAlignment.Center;
IFont font = workbook.CreateFont();
font.FontName = "宋体";
font.FontHeightInPoints = 12;
rightAlignStyle.SetFont(font);
rightAlignStyle.WrapText = true;
//第二个sheet右对齐样式
ICellStyle rightAlignStyle2 = workbook.CreateCellStyle();
rightAlignStyle2.Alignment = HorizontalAlignment.Right; // 设置右对齐
rightAlignStyle2.VerticalAlignment = VerticalAlignment.Center;
IFont font1 = workbook.CreateFont();
font1.FontName = "宋体";
font1.FontHeightInPoints = 9;
rightAlignStyle2.SetFont(font1);
rightAlignStyle2.WrapText = true;
ICellStyle contentStyle =
CreateCellStyle(workbook, 16, "宋体", HorizontalAlignment.Center, VerticalAlignment.Center);
ICellStyle titleStyle =
CreateCellStyle2(workbook, 10, "宋体", HorizontalAlignment.Left, VerticalAlignment.Center);
ICellStyle headerStyle1 = CreateCellStyle2(workbook, 18, "方正小标宋简体", HorizontalAlignment.Center,
VerticalAlignment.Center);
ICellStyle headerStyle2 =
CreateCellStyle(workbook, 16, "宋体", HorizontalAlignment.Right, VerticalAlignment.Center);
ICellStyle headerStyle3 =
CreateCellStyle(workbook, 16, "宋体", HorizontalAlignment.Center, VerticalAlignment.Center);
//第二个sheet
ICellStyle contentStyle22 =
CreateCellStyle(workbook, 12, "宋体", HorizontalAlignment.Center, VerticalAlignment.Center);
ICellStyle titleStyle2 =
CreateCellStyle2(workbook, 9, "宋体", HorizontalAlignment.Left, VerticalAlignment.Center);
ICellStyle headerStyle21 = CreateCellStyle2(workbook, 18, "方正小标宋简体", HorizontalAlignment.Center,
VerticalAlignment.Center);
ICellStyle headerStyle23 =
CreateCellStyle(workbook, 12, "黑体", HorizontalAlignment.Center, VerticalAlignment.Center);
ICellStyle beizhuStyle21 =
CreateCellStyle2(workbook, 9, "宋体", HorizontalAlignment.Left, VerticalAlignment.Center);
#endregion
#region 第一个sheet
#region 创建表头
IRow CreateRowWithHeight(ISheet sht, int rowIndex, float heightInPoints)
{
IRow row = sht.CreateRow(rowIndex);
row.HeightInPoints = heightInPoints;
return row;
}
void SetCellStyle(IRow row, ICellStyle style)
{
foreach (NPOI.SS.UserModel.ICell cell in row.Cells)
{
cell.CellStyle = style;
}
}
#endregion
#endregion
#region 第二个sheet
ISheet sheet2 = workbook.CreateSheet("Sheet2");
#region 创建表头
IRow row20 = CreateRowWithHeight(sheet2, 0, 42);
row20.CreateCell(0).SetCellValue("汇总表");
IRow row22 = CreateRowWithHeight(sheet2, 1, 24);
row22.CreateCell(0).SetCellValue("县区");
row22.CreateCell(1).SetCellValue("下发线索总数(个)");
row22.CreateCell(2).SetCellValue("总数");
row22.CreateCell(3);
row22.CreateCell(4);
row22.CreateCell(5).SetCellValue("定性");
row22.CreateCell(6);
row22.CreateCell(7);
row22.CreateCell(8);
row22.CreateCell(9).SetCellValue("分类");
row22.CreateCell(10);
row22.CreateCell(11).SetCellValue("超期未报(个)");
IRow row23 = CreateRowWithHeight(sheet2, 2, 69);
row23.CreateCell(0);
row23.CreateCell(1);
row23.CreateCell(2).SetCellValue("已完成(个)");
row23.CreateCell(3).SetCellValue("未完成(个)");
row23.CreateCell(4).SetCellValue("完成率(%");
row23.CreateCell(5).SetCellValue("合法(个)");
row23.CreateCell(6).SetCellValue("违法(个)");
row23.CreateCell(7).SetCellValue("其他(个)");
row23.CreateCell(8).SetCellValue("未定性(个)");
row23.CreateCell(9).SetCellValue("非法开采(个)");
row23.CreateCell(10).SetCellValue("非法加工(个)");
row23.CreateCell(11);
// 设置样式
SetCellStyle(row20, headerStyle21);
SetCellStyle(row22, headerStyle23);
SetCellStyle(row23, headerStyle23);
// 合并单元格
sheet2.AddMergedRegion(new CellRangeAddress(0, 0, 0, 11)); // 合并标题行
sheet2.AddMergedRegion(new CellRangeAddress(1, 2, 0, 0));
sheet2.AddMergedRegion(new CellRangeAddress(1, 2, 1, 1));
sheet2.AddMergedRegion(new CellRangeAddress(1, 1, 2, 4));
sheet2.AddMergedRegion(new CellRangeAddress(1, 1, 5, 8));
sheet2.AddMergedRegion(new CellRangeAddress(1, 1, 9, 10));
sheet2.AddMergedRegion(new CellRangeAddress(1, 2, 11, 11));
// 设置列宽
int[] normalColumns2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
foreach (var index in normalColumns2) sheet2.SetColumnWidth(index, 9 * 256); // 设置列宽
int[] normalColumns1 = { 9, 10, 11 };
foreach (var index in normalColumns1) sheet2.SetColumnWidth(index, 12 * 256); // 设置列宽
#endregion
#region 填充数据
for (int i = 0; i < list.Result.RespData.Count - 1; i++)
{
var rowIndex = i + 3; // 数据从第5行开始
var row = CreateRowWithHeight(sheet2, rowIndex, 34);
row.CreateCell(0).SetCellValue(list.Result.RespData[i].Number);
row.CreateCell(1).SetCellValue(list.Result.RespData[i].ShpProduction);
row.CreateCell(2).SetCellValue(list.Result.RespData[i].ShpInterpretation);
row.CreateCell(3).SetCellValue(list.Result.RespData[i].Judgment);
row.CreateCell(4).SetCellValue(list.Result.RespData[i].Push);
row.CreateCell(5).SetCellValue(list.Result.RespData[i].Cost);
row.CreateCell(6).SetCellValue(list.Result.RespData[i].ShpCount.ToString());
row.CreateCell(7).SetCellValue(list.Result.RespData[i].IssuedCount);
row.CreateCell(8).SetCellValue(list.Result.RespData[i].FolderPath);
row.CreateCell(9).SetCellValue(list.Result.RespData[i].Format);
row.CreateCell(10).SetCellValue(list.Result.RespData[i].Remark);
SetCellStyle(row, contentStyle22);
}
#endregion
#endregion
response.Result = new MemoryStream();
workbook.Write(response.Result);
response.Result.Position = 0;
workbook.Close();
response.Code = 200;
response.Message = "获取成功";
}
catch (Exception ex)
{
response.Code = 500;
response.Message = ex.Message;
}
return response;
}
#endregion
}
}