using Dlhis.Entity.Visitor.Entity;
using Dlhis.Entity.Visitor.Enums;
using Dlhis.External.OpenApi.Request;
using Dlhis.External.OpenApi.Response;
using Dlhis.External.OpenApi.Services;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace Dlhis.External.OpenApi.Controllers;
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class GainfosController : ControllerBase
{
private readonly IGainfoService _gainfoService;
private readonly IDbContext _dbContext;
public GainfosController(IGainfoService gainfoService, IDbContext dbContext)
{
_gainfoService = gainfoService;
_dbContext = dbContext;
}
///
/// 获取山西所有人员
///
///
[HttpGet("shanxi/all")]
public async Task> GetAllGainfosAsync()
{
return await _gainfoService.GetAllGainfosAsync();
}
///
/// 根据厂区获取人员
///
///
///
[HttpGet("list")]
public async Task> GetGainfosAsync(string factory)
{
return await _gainfoService.GetGainfosAsync(factory);
}
///
/// 获取归档人员数据
///
///
[HttpGet("/archive/pagination")]
public async Task> GetGainfoLeavePageAsync([FromQuery] GainfoArchivePageRequest request)
{
return await _gainfoService.GetGainfoLeavePageAsync(request);
}
///
/// 获取考勤数据
///
///
///
[HttpGet("attendance/pagination")]
[IgnoreTenant]
public async Task> GetAttendanceRecordPageAsync([FromQuery] DeviceUploadLogMyRecordRequest request)
{
return await _gainfoService.GetAttendanceRecordPageAsync(request);
}
///
/// 访客明细
///
///
///
///
///
[HttpGet("visitor/summary")]
[IgnoreTenant]
public async Task GetSummaryAsync(string factory, DateTime start, DateTime end)
{
var total = await _dbContext.Queryable()
.Where(x => (x.IsEnterDoorArea && ((x.DoorStart >= start && x.DoorStart <= end) || x.DoorEnd >= start && x.DoorEnd <= end)) ||
(x.IsEnterWorkplace && ((x.WorkplaceStart >= start && x.WorkplaceStart <= end) || (x.WorkplaceEnd >= start && x.WorkplaceEnd <= end)))
)
.Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == factory).Any())
.CountAsync();
var @in = await _dbContext.Queryable()
.Where(x => (x.IsEnterDoorArea && ((x.DoorStart >= start && x.DoorStart <= end) || x.DoorEnd >= start && x.DoorEnd <= end)) ||
(x.IsEnterWorkplace && ((x.WorkplaceStart >= start && x.WorkplaceStart <= end) || (x.WorkplaceEnd >= start && x.WorkplaceEnd <= end)))
)
.Where(x => (x.IsEnterDoorArea && x.DoorStatus == VisitorAppointmentDetailStatusEnumType.Arrived) || (x.IsEnterWorkplace && x.WorkplaceStatus == VisitorAppointmentDetailStatusEnumType.Arrived))
.Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == factory).Any())
.CountAsync();
var notIn = await _dbContext.Queryable()
.Where(x => (x.IsEnterDoorArea && ((x.DoorStart >= start && x.DoorStart <= end) || x.DoorEnd >= start && x.DoorEnd <= end)) ||
(x.IsEnterWorkplace && ((x.WorkplaceStart >= start && x.WorkplaceStart <= end) || (x.WorkplaceEnd >= start && x.WorkplaceEnd <= end)))
)
.Where(x => (x.IsEnterDoorArea && x.DoorStatus == VisitorAppointmentDetailStatusEnumType.Wait) || (x.IsEnterWorkplace && x.WorkplaceStatus == VisitorAppointmentDetailStatusEnumType.Wait))
.Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == factory).Any())
.CountAsync();
var leave = await _dbContext.Queryable()
.Where(x => (x.IsEnterDoorArea && x.DoorEnd >= start && x.DoorEnd <= end) ||
(x.IsEnterWorkplace && x.WorkplaceEnd >= start && x.WorkplaceEnd <= end)
)
.Where(x => (x.IsEnterDoorArea && x.DoorStatus == VisitorAppointmentDetailStatusEnumType.Leave) || (x.IsEnterWorkplace && x.WorkplaceStatus == VisitorAppointmentDetailStatusEnumType.Leave))
.Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == factory).Any())
.CountAsync();
var notLeave = await _dbContext.Queryable()
.Where(x => (x.IsEnterDoorArea && x.DoorEnd >= start && x.DoorEnd <= end) ||
(x.IsEnterWorkplace && x.WorkplaceEnd >= start && x.WorkplaceEnd <= end)
)
.Where(x => (x.IsEnterDoorArea && x.DoorStatus != VisitorAppointmentDetailStatusEnumType.Leave) || (x.IsEnterWorkplace && x.WorkplaceStatus != VisitorAppointmentDetailStatusEnumType.Leave))
.Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == factory).Any())
.CountAsync();
return new AppointmentSummaryResponse
{
Total = total,
In = @in,
NotIn = notIn,
Leave = leave,
NotLeave = notLeave
};
}
}