LqAttendanceRestGroupService.cs
8.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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")
};
}
}