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