using Dlhis.Basic.WorkGrids.Request; using Dlhis.Entity.Basic.Entity; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.Basic.WorkGrids.Validations.Implements { public class WorkGridValidateService : IWorkGridValidateService { private readonly ICurrentUser _currentUser; private readonly IDbContext _dbContext; public WorkGridValidateService(ICurrentUser currentUser, IDbContext dbContext) { _currentUser = currentUser; _dbContext = dbContext; } /// /// 验证保存请求 /// /// public async Task ValidateSaveAsync(List requests) { var duplicateUserCodes = requests.GroupBy(x => x.LeaderUserCode) .Where(g => g.Count() > 1) .Select(g => g.Key) .ToList(); duplicateUserCodes.ThrowIfExists($"请求中存在重复工号:{duplicateUserCodes.Join(",")}"); var duplicateNames = requests.GroupBy(x => x.Name) .Where(g => g.Count() > 1) .Select(g => g.Key) .ToList(); duplicateNames.ThrowIfExists($"请求中存在重复网格名称:{duplicateNames.Join(",")}"); var factory = _currentUser.GetStringTenantId(); var leaderUserCodes = requests.Select(x => x.LeaderUserCode).Distinct().ToList(); var userCodeWithFactories = await _dbContext.Queryable() .Where(x => leaderUserCodes.Contains(x.Code)) .Select(x => new { x.Code, x.Factory }) .ToListAsync(); //检查工号是否存在 var existsUserCodes = userCodeWithFactories.Select(x => x.Code).ToList(); var notExistsUserCodes = leaderUserCodes.Except(existsUserCodes).ToList(); notExistsUserCodes.ThrowIfExists($"工号:{notExistsUserCodes.Join(",")}不存在"); //检查负责人工号是否存在 var excludeCodes = userCodeWithFactories .Where(x => x.Factory != factory) .Select(x => x.Code) .ToList(); excludeCodes.ThrowIfExists($"工号:{excludeCodes.Join(",")}不属于当前厂区"); //检查网格名称是否重复 var where = LinqExpressionExtensions.False(); foreach (var req in requests) { where = req.Id.HasValue ? where.Or(x => x.Name == req.Name && x.Id != req.Id.Value) : where.Or(x => x.Name == req.Name); } var existsNames = await _dbContext.Queryable().Where(where).Select(x => x.Name).ToListAsync(); if (existsNames.Any()) { true.ThrowIfTrue($"网格区域名称[{existsNames.Join(",")}]重复"); } } } }