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 }; } }