LqAttendanceRestGroupService.cs 8.13 KB
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
{
    /// <summary>
    /// 应休分组:月应休、可拆分半天、解锁周期;人员在用户管理中绑定 <c>F_AttendanceRestGroupId</c>。
    /// </summary>
    [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<LqAttendanceRestGroupEntity> RestGroupQuery() =>
            _db.Queryable<LqAttendanceRestGroupEntity>().Where(x => SqlFunc.IsNull(x.DeleteMark, 0) == 0);

        /// <summary>
        /// 应休分组下拉(启用项)
        /// </summary>
        [HttpGet("Selector")]
        public async Task<dynamic> 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 };
        }

        /// <summary>
        /// 分页列表
        /// </summary>
        [HttpGet("List")]
        public async Task<dynamic> 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 } };
        }

        /// <summary>
        /// 保存(新增或更新)
        /// </summary>
        /// <remarks>月应休、可拆分半天校验与考勤分组一致。</remarks>
        [HttpPost("Save")]
        public async Task<dynamic> 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) };
        }

        /// <summary>
        /// 删除(逻辑删除;仍有人员绑定则禁止)
        /// </summary>
        [HttpDelete("{id}")]
        public async Task Delete(string id)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                throw NCCException.Oh("应休分组ID不能为空");
            }

            var bindCount = await _db.Queryable<UserEntity>()
                .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<int> 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")
        };
    }
}