fix 优化首页接口
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Dlhis.Basic.Summary.Response;
|
||||
using Dlhis.Basic.Summary.Services;
|
||||
using Dlhis.Entity.Device.Enums;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
@@ -18,32 +19,12 @@ public class SummariesController : ControllerBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 考勤首页
|
||||
/// 首页
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("attendance-summary")]
|
||||
public async Task<AttendanceSummaryResponse> GetKaoQingSummary()
|
||||
[HttpGet("home-summary")]
|
||||
public async Task<HomeSummaryResponse> GetHomeSummaryAsync(DeviceTypeEnumType type)
|
||||
{
|
||||
return await _summaryService.GetAttendanceSummaryAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 门禁首页设备数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("door-summary")]
|
||||
public async Task<DoorHomeDataResponse> GetDoorHomeDataAsync()
|
||||
{
|
||||
return await _summaryService.GetDoorHomeDataAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 门禁首页数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("door-data")]
|
||||
public async Task<DoorDataResponse> GetDoorDataAsync()
|
||||
{
|
||||
return await _summaryService.GetDoorDataAsync();
|
||||
return await _summaryService.GetHomeSummaryAsync(type);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace Dlhis.Basic.Summary.Response
|
||||
{
|
||||
public class AttendanceSummaryResponse
|
||||
{
|
||||
public AttendanceDeviceSummary DeviceSummary { get; set; }
|
||||
|
||||
public AttendanceDetailSummary AttendanceDetailSummary { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace Dlhis.Basic.Summary.Response;
|
||||
|
||||
public class AttendanceDeviceSummary
|
||||
public class DeviceSummary
|
||||
{
|
||||
/// <summary>
|
||||
/// 总数
|
||||
@@ -1,24 +0,0 @@
|
||||
namespace Dlhis.Basic.Summary.Response;
|
||||
|
||||
public class DoorDataResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 门禁总人数
|
||||
/// </summary>
|
||||
public int Total => Employed + Unemployed;
|
||||
|
||||
/// <summary>
|
||||
/// 在职人数
|
||||
/// </summary>
|
||||
public int Employed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 非在职人数
|
||||
/// </summary>
|
||||
public int Unemployed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 人员趋势 7天
|
||||
/// </summary>
|
||||
public GainfoTrendResponse GainfoTrend { get; set; }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using Dlhis.Basic.Summary.Dto;
|
||||
|
||||
namespace Dlhis.Basic.Summary.Response
|
||||
{
|
||||
public class DoorHomeDataResponse
|
||||
{
|
||||
public int OffNum { get; set; }
|
||||
public int TotalNum { get; set; }
|
||||
public List<TrendDto> Trend { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Dlhis.Basic.Summary.Response;
|
||||
|
||||
public class AttendanceDetailSummary
|
||||
public class GainfoDetailSummary
|
||||
{
|
||||
/// <summary>
|
||||
/// 考勤总人数
|
||||
@@ -1,10 +1,9 @@
|
||||
using Dlhis.Basic.Summary.Dto;
|
||||
|
||||
namespace Dlhis.Basic.Summary.Response
|
||||
namespace Dlhis.Basic.Summary.Response;
|
||||
|
||||
public class GainfoTrendResponse
|
||||
{
|
||||
public class GainfoTrendResponse
|
||||
{
|
||||
public List<TrendDto> EmployedTrend { get; set; }
|
||||
public List<TrendDto> UnemployedTrend { get; set; }
|
||||
}
|
||||
}
|
||||
public List<TrendDto> EmployedTrend { get; set; }
|
||||
public List<TrendDto> UnemployedTrend { get; set; }
|
||||
}
|
||||
14
Src/Dlhis.Basic/Summary/Response/HomeSummaryResponse.cs
Normal file
14
Src/Dlhis.Basic/Summary/Response/HomeSummaryResponse.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace Dlhis.Basic.Summary.Response;
|
||||
|
||||
public class HomeSummaryResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 设备
|
||||
/// </summary>
|
||||
public DeviceSummary DeviceSummary { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 明细
|
||||
/// </summary>
|
||||
public GainfoDetailSummary DetailSummary { get; set; }
|
||||
}
|
||||
@@ -1,12 +1,9 @@
|
||||
using Dlhis.Basic.Summary.Response;
|
||||
using Dlhis.Entity.Device.Enums;
|
||||
|
||||
namespace Dlhis.Basic.Summary.Services;
|
||||
|
||||
public interface ISummaryService : IScopeDependency
|
||||
{
|
||||
Task<AttendanceSummaryResponse> GetAttendanceSummaryAsync();
|
||||
|
||||
Task<DoorHomeDataResponse> GetDoorHomeDataAsync();
|
||||
|
||||
Task<DoorDataResponse> GetDoorDataAsync();
|
||||
Task<HomeSummaryResponse> GetHomeSummaryAsync(DeviceTypeEnumType type);
|
||||
}
|
||||
@@ -23,7 +23,7 @@ public class SummaryService : ISummaryService
|
||||
_currentUser = currentUser;
|
||||
}
|
||||
|
||||
public async Task<AttendanceSummaryResponse> GetAttendanceSummaryAsync()
|
||||
public async Task<HomeSummaryResponse> GetHomeSummaryAsync(DeviceTypeEnumType type)
|
||||
{
|
||||
var now = DateTime.Now;
|
||||
var tenantId = _currentUser.GetStringTenantId();
|
||||
@@ -33,7 +33,7 @@ public class SummaryService : ISummaryService
|
||||
var before7Day = DateTime.Today.AddDays(-6);
|
||||
|
||||
var devices = await _dbContext.Queryable<DeviceEntity>()
|
||||
.Where(x => x.Type == DeviceTypeEnumType.Attendance || (x.Type == DeviceTypeEnumType.Door && x.AsAttendance))
|
||||
.Where(x => x.Type == type)
|
||||
.ToListAsync();
|
||||
|
||||
var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
|
||||
@@ -54,9 +54,9 @@ public class SummaryService : ISummaryService
|
||||
.Where(x => x.Factory == tenantId)
|
||||
.ToListAsync();
|
||||
|
||||
return new AttendanceSummaryResponse
|
||||
return new HomeSummaryResponse
|
||||
{
|
||||
DeviceSummary = new AttendanceDeviceSummary
|
||||
DeviceSummary = new DeviceSummary
|
||||
{
|
||||
Total = devices.Count,
|
||||
EnableCount = devices.Count(x => x.Enable),
|
||||
@@ -73,7 +73,7 @@ public class SummaryService : ISummaryService
|
||||
.GroupBy(x => x.CreateTime.Date)
|
||||
.Select(x => new TrendDto { Date = x.Key, Count = x.Count() }), before30Day, currentDay)
|
||||
},
|
||||
AttendanceDetailSummary = new AttendanceDetailSummary
|
||||
DetailSummary = new GainfoDetailSummary
|
||||
{
|
||||
Employed = workingGainfos.Count,
|
||||
Unemployed = leaveGainfos.Count,
|
||||
@@ -90,64 +90,7 @@ public class SummaryService : ISummaryService
|
||||
};
|
||||
}
|
||||
|
||||
public async Task<DoorHomeDataResponse> GetDoorHomeDataAsync()
|
||||
{
|
||||
var devices = await _dbContext.Queryable<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Door).ToListAsync();
|
||||
|
||||
var offDevices = await GetOfflineDevicesCount(devices);
|
||||
|
||||
DateTime currentDate = DateTime.Now;
|
||||
var times = new List<string>();
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
DateTime date = currentDate.AddDays(-i);
|
||||
string dateString = date.ToString("yyyy-MM-dd");
|
||||
times.Add(dateString);
|
||||
}
|
||||
|
||||
var list = new List<TrendDto>();
|
||||
times.ForEach(time =>
|
||||
{
|
||||
var count = devices.Count(x => x.CreateTime.ToString("yyyy-MM-dd") == time);
|
||||
var trend = new TrendDto
|
||||
{
|
||||
Date = DateTime.ParseExact(time, "yyyy-MM-dd", null),
|
||||
Count = count,
|
||||
};
|
||||
list.Add(trend);
|
||||
});
|
||||
var res = new DoorHomeDataResponse
|
||||
{
|
||||
OffNum = offDevices.Count,
|
||||
TotalNum = devices.Count,
|
||||
Trend = list
|
||||
};
|
||||
return res;
|
||||
}
|
||||
|
||||
public async Task<DoorDataResponse> GetDoorDataAsync()
|
||||
{
|
||||
var workingGainfos = await _gainfoStore.Queryable(GainfoStatusEnumType.Working).ToListAsync();
|
||||
var leaveGainfos = await _gainfoStore.Queryable(GainfoStatusEnumType.Leave).ToListAsync();
|
||||
|
||||
var currentDay = DateTime.Today.AddDays(1).AddSeconds(-1);
|
||||
var before7Day = DateTime.Today.AddDays(-6);
|
||||
|
||||
return new DoorDataResponse
|
||||
{
|
||||
Employed = workingGainfos.Count,
|
||||
Unemployed = leaveGainfos.Count,
|
||||
GainfoTrend = new GainfoTrendResponse()
|
||||
{
|
||||
EmployedTrend = FixTrend(workingGainfos.Where(x => x.EntryDate >= before7Day && x.EntryDate <= currentDay)
|
||||
.GroupBy(x => x.EntryDate)
|
||||
.Select(x => new TrendDto { Date = x.Key!.Value, Count = x.Count() }), before7Day, currentDay),
|
||||
UnemployedTrend = FixTrend(leaveGainfos.Where(x => x.ResignationDate >= before7Day && x.ResignationDate <= currentDay)
|
||||
.GroupBy(x => x.ResignationDate)
|
||||
.Select(x => new TrendDto { Date = x.Key!.Value, Count = x.Count() }), before7Day, currentDay)
|
||||
}
|
||||
};
|
||||
}
|
||||
//********************************************************************************************************************************************
|
||||
|
||||
|
||||
private static List<TrendDto> FixTrend(IEnumerable<TrendDto> dtos, DateTime start, DateTime end)
|
||||
@@ -173,48 +116,4 @@ public class SummaryService : ISummaryService
|
||||
|
||||
return result.OrderBy(x => x.Date).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取离线设备
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task<List<DeviceEntity>> GetOfflineDevicesCount(List<DeviceEntity> devices)
|
||||
{
|
||||
var now = DateTime.Now;
|
||||
|
||||
var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
|
||||
|
||||
var deviceRegistries = await _dbContext.Queryable<DeviceRegistryEntity>()
|
||||
.LeftJoin<DeviceEntity>((x, d) => x.DeviceUniqueNo == d.UniqueNo)
|
||||
.Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo))
|
||||
.Select((x, d) => new
|
||||
{
|
||||
UniqueNo = d.UniqueNo,
|
||||
d.HeartbeatInterval,
|
||||
x.LastHeartbeatTime
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
var onlineDevices = deviceRegistries
|
||||
.Where(x =>
|
||||
{
|
||||
if (x.HeartbeatInterval <= 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval) >= now;
|
||||
})
|
||||
.Select(x => new
|
||||
{
|
||||
UniqueNo = x.UniqueNo,
|
||||
})
|
||||
.ToList();
|
||||
var onlineUniqueNos = new List<string>();
|
||||
onlineDevices.ForEach(x => onlineUniqueNos.Add(x.UniqueNo));
|
||||
|
||||
var offUniqueNos = deviceUniqueNos.Except(onlineUniqueNos).ToList();
|
||||
var list = devices.Where(x => offUniqueNos.Contains(x.UniqueNo)).ToList();
|
||||
return list;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user