using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.Core.User.Abstractions; using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; using Mapster; namespace Dlhis.Basic.Organization.Services.Implements; public class GainfoService : IGainfoService { private readonly IGainfoStore _gainfoStore; private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; public GainfoService(IGainfoStore gainfoStore, IDbContext dbContext, ICurrentUser currentUser) { _gainfoStore = gainfoStore; _dbContext = dbContext; _currentUser = currentUser; } /// /// 档案分页 /// /// /// public async Task> GetPageAsync(GainfoPageRequest request) { request.DepartmentNos = await GetRecursionDepartmentNosAsync(request.DepartmentNos); var page = await _gainfoStore.Queryable(request.Status) .WhereIF(request.DepartmentNos.IsPresent(), gainfo => request.DepartmentNos.Contains(gainfo.DepartmentNo)) .Select() .ToPageListAsync(request); return page; } /// ///保存档案号 /// /// /// public async Task SaveAsync(List request) { //todo check var entities = request.Adapt>(); entities.ForEach(x => { if (x.No.IsEmpty()) { x.No = "F" + Guid.NewGuid().ToString(); } }); await _gainfoStore.InsertAsync(entities); } /// ///修改档案号 /// /// /// public async Task UpdateAsync(GainfoSaveRequest request) { var gainfo = await _gainfoStore.Queryable(request.GainfoStatus).Where(x => x.Id == request.Id).FirstAsync(); gainfo.ThrowIfNull("档案数据不存在,无法更新"); request.Adapt(gainfo); await _gainfoStore.UpdateAsync(gainfo); } /// /// 正式转离职 /// /// /// [Transactional] public async Task DimissionAsync(GainfoDImissionRequest request) { var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.Working) .Where(x => x.No == request.UserId) .FirstAsync(); gainfo.ThrowIfNull("该档案不存在"); //添加到离职表 await _gainfoStore.InsertAsync(gainfo, GainfoStatusEnumType.Leave); //删除原数据 await _gainfoStore.DeleteAsync(gainfo, GainfoStatusEnumType.Working); } /// /// 临时转正式 /// /// /// /// public async Task OnboardingAsync(GainfoDImissionRequest request) { var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.External) .Where(x => x.No == request.UserId) .FirstAsync(); gainfo.ThrowIfNull($"该档案不存在"); //添加到正式表,不删除原数据,留档处理 await _gainfoStore.InsertAsync(gainfo); } public async Task CurrentUserInfoAsync() { var identityId = _currentUser.GetIntSubjectId(); var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.Working) .LeftJoin((ga, department) => ga.DepartmentNo == department.No) .LeftJoin((ga, department, mealUser) => ga.No == mealUser.UserNo) .Where((ga, department) => ga.IdentityUserId == identityId) .Select((ga, department, mealUser) => new GainfoCurrentResponse { UserNo = ga.No, Birthday = ga.Birthday, DepartmentNo = department.No, DepartmentName = department.Name, Gender = ga.Gender, UserCode = ga.Code, UserName = ga.Name, MealInfo = new GainfoCurrentMealInfoResponse { Balance = mealUser.Balance } }) .FirstAsync(); return gainfo; } //-------------------------------------------help methods ------------------------------------------------ /// /// 递归获取部门No /// /// /// private async Task> GetRecursionDepartmentNosAsync(List departmentNos) { if (departmentNos == null || departmentNos.Count == 0) { return new List(); } var departments = await _dbContext.Queryable().ToListAsync(); var currentNos = departments.Where(x => departmentNos.Contains(x.No)).ToList(); foreach (var item in currentNos) { RecursionGetNext(item.No, departments, departmentNos); } return departmentNos.Distinct().ToList(); void RecursionGetNext(string currentCode, List departments, List result) { var next = departments.Where(x => x.PNo == currentCode).ToList(); foreach (var item in next) { result.Add(item.No); } foreach (var item in next) { RecursionGetNext(item.No, departments, result); } } } }