using Dlhis.Basic.Places.Request; using Dlhis.Basic.BusinessShift.Request; using Dlhis.Basic.BusinessShift.Response; using Dlhis.Basic.Places.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Sys.Api; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; using Mapster; namespace Dlhis.Basic.BusinessShift.Services.Implements; public class BusinessPlaceShiftService : IBusinessPlaceShiftService { private readonly IDbContext _dbContext; private readonly ITenantApi _tenantApi; public BusinessPlaceShiftService(IDbContext dbContext, ITenantApi tenantApi) { _dbContext = dbContext; _tenantApi = tenantApi; } public async Task> GetPageAsync(BusinessPlaceShiftPageRequest request) { var page = await _dbContext.Queryable() .WhereIF(request.Search.IsPresent(), shift => shift.CustomCode.Contains(request.Search) || shift.Name.Contains(request.Search)) .Select() .ToPageListAsync(request); var shiftCodes = page.Data.Select(x => x.Code).ToList(); //下级就餐时间段 var mealShifts = await _dbContext.Queryable() .Where(x => shiftCodes.Contains(x.ShiftCode)) .Select((x) => new MealShiftResponse { Id = x.Id, ShiftCode = x.ShiftCode, ShiftType = x.ShiftType, Start = x.Start, End = x.End, }) .ToListAsync(); page.Data.ForEach(x => { x.MealShifts = mealShifts.Where(item => item.ShiftCode == x.Code).ToList(); }); return page; } public async Task> GetListAsync() { var result = await _dbContext.Queryable() .Select() .ToListAsync(); return result; } public async Task SaveAsync(BusinessPlaceShiftSaveRequest request) { await CheckExistsAsync(request); if (!request.Id.HasValue) { var entity = request.Adapt(); entity.CustomCode = request.CustomCode; entity.Code = Guid.NewGuid(); await _dbContext.InsertAsync(entity); return entity.Code; } else { var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id); entity.ThrowIfNull("餐别不存在"); request.Adapt(entity); await _dbContext.UpdateAsync(entity); return entity.Code; } } public async Task SaveMealShiftsAsync(List requests) { var shiftCode = requests[0].ShiftCode; var shift = await CheckExistsShiftAsync(shiftCode); await _dbContext.Deleteable().Where(x => x.ShiftCode == shiftCode).ExecuteCommandAsync(); foreach (var request in requests) { request.Id = null; await CheckExistsMealShiftAsync(request); await DuplicateTimePeriodAsync(request); if (!request.Id.HasValue) { var entity = request.Adapt(); entity.ShiftCode = shift.Code; entity.ShiftCustomCode = shift.CustomCode; entity.Start = request.TimePeriod.Start; entity.End = request.TimePeriod.End; await _dbContext.InsertAsync(entity); } else { var entity = await _dbContext.Queryable() .Where(x => x.ShiftCode == shiftCode) .SingleAsync(x => x.Id == request.Id); entity.ThrowIfNull("餐次段不存在"); entity.Start = request.TimePeriod.Start; entity.End = request.TimePeriod.End; request.Adapt(entity); await _dbContext.UpdateAsync(entity); } } } public async Task GetShiftsByPlaceCustomCodeAsync(string placeCustomCode) { var place = await _dbContext.Queryable().Where(x => x.CustomCode == placeCustomCode).FirstAsync(); if (place == null) { return new BusinessPlaceWithShiftResponse() { Shifts = new List() }; } var tenantResult = await _tenantApi.GetTenantByCodeAsync(place.TenantId); var tenantInfo = tenantResult.EnsureSuccessStatusCode(); var relationship = await _dbContext.Queryable().Where(x => x.PlaceCode == place.Code).FirstAsync(); if (relationship == null) { return new BusinessPlaceWithShiftResponse() { CustomCode = placeCustomCode, Name = place.Name, TenantCode = tenantInfo.Code, TenantName = tenantInfo.Name, Shifts = new List() }; } var shifts = await _dbContext.Queryable() .Where(x => x.ShiftCode == relationship.ShiftCode) .OrderBy(x => x.Sequence) //排序 .ToListAsync(); var list = new List(); foreach (BusinessShiftMealRelationshipEntity shiftinfo in shifts) { var shift = new BusinessPlaceShiftTinyResponse { CustomCode = shiftinfo.Id.ToString(), Name = shiftinfo.ShiftType.GetDescription(), Start = shiftinfo.Start, End = shiftinfo.End, Sequence = shiftinfo.Sequence }; list.Add(shift); } return new BusinessPlaceWithShiftResponse { CustomCode = placeCustomCode, Name = place.Name, TenantCode = tenantInfo.Code, TenantName = tenantInfo.Name, Shifts = list.OrderBy(x => x.Sequence).ToList() }; } public async Task> GetAssignmentsAsync(Guid code) { return await _dbContext.Queryable() .LeftJoin((x, d) => x.DeviceUniqueNo == d.UniqueNo) .Where(x => x.BusinessPlaceCode == code) .Select((x, d) => new DeviceCodeNameDetail { UniqueNo = x.DeviceUniqueNo, UniqueName = d.DeployPlace }) .ToListAsync(); } public async Task AssignAsync(DispositionDeviceRequest request) { var place = await _dbContext.Queryable().Where(x => x.Code == request.PlaceCode).SingleAsync(); place.ThrowIfNull("营业点不存在"); var registries = await _dbContext.Queryable() .Where(x => x.BusinessPlaceCode == request.PlaceCode || request.UniqueNos.Contains(x.DeviceUniqueNo)) .ToListAsync(); registries.ForEach(item => { item.BusinessPlaceCode = request.UniqueNos.Contains(item.DeviceUniqueNo) ? request.PlaceCode : null; }); await _dbContext.UpdateAsync(registries); } //*********************************************** help methods ***************************************************// /// /// 时间段重合检查 /// /// /// private async Task DuplicateTimePeriodAsync(BusinessPlaceShiftSaveMealShiftRequest request) { var periods = await _dbContext.Queryable() .Where(x => x.ShiftCode == request.ShiftCode) .WhereIF(request.Id.HasValue, x => x.Id != request.Id) .Select(x => new TimePeriod { Start = x.Start, End = x.End }) .ToListAsync(); foreach (var period in periods) { period.IsDuplicate(request.TimePeriod).ThrowIfTrue($"存在时间段重合[{period.Start}-{period.End}]"); } } /// /// 检查重复 /// /// /// private async Task CheckExistsAsync(BusinessPlaceShiftSaveRequest request) { var existsSameCustomCode = await _dbContext.Queryable() .Where(x => x.CustomCode == request.CustomCode || x.Name == request.Name) .WhereIF(request.Id.HasValue, x => x.Id != request.Id) .AnyAsync(); existsSameCustomCode.ThrowIfTrue($"自定义手工号或者名称存在重复,请检查."); } private async Task CheckExistsShiftAsync(Guid shiftCode) { var shift = await _dbContext.Queryable().Where(x => x.Code == shiftCode).SingleAsync(); shift.ThrowIfNull("餐次不存在"); return shift; } private async Task CheckExistsMealShiftAsync(BusinessPlaceShiftSaveMealShiftRequest request) { var exists = await _dbContext.Queryable() .Where(x => x.ShiftCode == request.ShiftCode) .Where(x => x.ShiftType == request.ShiftType) .WhereIF(request.Id.HasValue, x => x.Id != request.Id) .AnyAsync(); exists.ThrowIfTrue("重复设置!"); } }