using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using NCC.Common.Core.Manager;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.Extend.Entitys.Dto.LqAttendanceRestGroup;
using NCC.Extend.Entitys.lq_attendance_rest_group;
using NCC.Extend.Interfaces.LqAttendanceRestGroup;
using NCC.FriendlyException;
using NCC.System.Entitys.Permission;
using SqlSugar;
using Yitter.IdGenerator;
namespace NCC.Extend.LqAttendanceRestGroup
{
///
/// 应休分组:月应休、可拆分半天、解锁周期;人员在用户管理中绑定 F_AttendanceRestGroupId。
///
[ApiDescriptionSettings(Tag = "绿纤应休分组", Name = "LqAttendanceRestGroup", Order = 201)]
[Route("api/Extend/[controller]")]
[ApiController]
public class LqAttendanceRestGroupService : ILqAttendanceRestGroupService, IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
public LqAttendanceRestGroupService(ISqlSugarClient db, IUserManager userManager)
{
_db = db;
_userManager = userManager;
}
private ISugarQueryable RestGroupQuery() =>
_db.Queryable().Where(x => SqlFunc.IsNull(x.DeleteMark, 0) == 0);
///
/// 应休分组下拉(启用项)
///
[HttpGet("Selector")]
public async Task GetSelector()
{
var list = await RestGroupQuery()
.Where(x => x.IsEnabled == 1)
.OrderBy(x => x.SortCode)
.Select(x => new
{
id = x.Id,
fullName = x.GroupName,
monthlyRestDays = x.MonthlyRestDays,
halfDaySplitRestDays = x.HalfDaySplitRestDays,
restUnlockCycle = x.RestUnlockCycle
})
.ToListAsync();
return new { list };
}
///
/// 分页列表
///
[HttpGet("List")]
public async Task GetList([FromQuery] int currentPage = 1, [FromQuery] int pageSize = 20,
[FromQuery] string keyword = null)
{
currentPage = currentPage <= 0 ? 1 : currentPage;
pageSize = pageSize <= 0 ? 20 : pageSize;
var q = RestGroupQuery()
.WhereIF(!string.IsNullOrWhiteSpace(keyword),
x => x.GroupName.Contains(keyword.Trim()) || x.Remark.Contains(keyword.Trim()));
var total = await q.CountAsync();
var rows = await q.OrderBy(x => x.SortCode).ToPageListAsync(currentPage, pageSize);
var list = rows.Select(MapRow).ToList();
return new { list, pagination = new { total, currentPage, pageSize } };
}
///
/// 保存(新增或更新)
///
/// 月应休、可拆分半天校验与考勤分组一致。
[HttpPost("Save")]
public async Task Save([FromBody] LqAttendanceRestGroupSaveInput input)
{
input ??= new LqAttendanceRestGroupSaveInput();
input.groupName = string.IsNullOrWhiteSpace(input.groupName) ? null : input.groupName.Trim();
input.remark = string.IsNullOrWhiteSpace(input.remark) ? null : input.remark.Trim();
if (string.IsNullOrWhiteSpace(input.groupName))
{
throw NCCException.Oh("应休分组名称不能为空");
}
if (input.monthlyRestDays < 0)
{
throw NCCException.Oh("月应休天数不能小于0");
}
if (input.halfDaySplitRestDays < 0)
{
throw NCCException.Oh("可拆分半天休假天数不能小于0");
}
if (input.halfDaySplitRestDays > input.monthlyRestDays)
{
throw NCCException.Oh("可拆分半天休假天数不能大于月应休天数");
}
var currentUser = await _userManager.GetUserInfo();
var now = DateTime.Now;
if (string.IsNullOrWhiteSpace(input.id))
{
var entity = new LqAttendanceRestGroupEntity
{
Id = YitIdHelper.NextId().ToString(),
GroupName = input.groupName,
MonthlyRestDays = input.monthlyRestDays,
HalfDaySplitRestDays = input.halfDaySplitRestDays,
RestUnlockCycle = Math.Max(0, input.restUnlockCycle),
IsEnabled = input.isEnabled != 0 ? 1 : 0,
Remark = input.remark,
SortCode = await GetNextSortCodeAsync(),
CreateTime = now,
CreateUserId = currentUser?.userId,
DeleteMark = 0,
VersionNo = 1,
LastModifyTime = now,
LastModifyUserId = currentUser?.userId,
LastModifyUserName = currentUser?.userName
};
await _db.Insertable(entity).ExecuteCommandAsync();
return new { id = entity.Id, data = MapRow(entity) };
}
var dbEntity = await RestGroupQuery().Where(x => x.Id == input.id).FirstAsync();
_ = dbEntity ?? throw NCCException.Oh("应休分组不存在或已删除");
dbEntity.GroupName = input.groupName;
dbEntity.MonthlyRestDays = input.monthlyRestDays;
dbEntity.HalfDaySplitRestDays = input.halfDaySplitRestDays;
dbEntity.RestUnlockCycle = Math.Max(0, input.restUnlockCycle);
dbEntity.IsEnabled = input.isEnabled != 0 ? 1 : 0;
dbEntity.Remark = input.remark;
dbEntity.LastModifyTime = now;
dbEntity.LastModifyUserId = currentUser?.userId;
dbEntity.LastModifyUserName = currentUser?.userName;
dbEntity.VersionNo = (dbEntity.VersionNo ?? 0) + 1;
await _db.Updateable(dbEntity).ExecuteCommandAsync();
return new { id = dbEntity.Id, data = MapRow(dbEntity) };
}
///
/// 删除(逻辑删除;仍有人员绑定则禁止)
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
if (string.IsNullOrWhiteSpace(id))
{
throw NCCException.Oh("应休分组ID不能为空");
}
var bindCount = await _db.Queryable()
.Where(x => x.DeleteMark == null && x.AttendanceRestGroupId == id)
.CountAsync();
if (bindCount > 0)
{
throw NCCException.Oh("当前应休分组下仍有人员绑定,请先解除绑定后再删除");
}
var entity = await RestGroupQuery().Where(x => x.Id == id).FirstAsync();
_ = entity ?? throw NCCException.Oh("应休分组不存在或已删除");
var currentUser = await _userManager.GetUserInfo();
var now = DateTime.Now;
entity.DeleteMark = 1;
entity.LastModifyTime = now;
entity.LastModifyUserId = currentUser?.userId;
entity.LastModifyUserName = currentUser?.userName;
await _db.Updateable(entity).ExecuteCommandAsync();
}
private async Task GetNextSortCodeAsync()
{
var max = await RestGroupQuery().MaxAsync(x => (int?)x.SortCode);
return (max ?? 0) + 1;
}
private static object MapRow(LqAttendanceRestGroupEntity x) => new
{
id = x.Id,
groupName = x.GroupName,
monthlyRestDays = x.MonthlyRestDays,
halfDaySplitRestDays = x.HalfDaySplitRestDays,
restUnlockCycle = x.RestUnlockCycle,
isEnabled = x.IsEnabled,
remark = x.Remark,
sortCode = x.SortCode,
versionNo = x.VersionNo,
lastModifyTime = x.LastModifyTime?.ToString("yyyy-MM-dd HH:mm:ss")
};
}
}