using FoodLabeling.Application.Helpers; using FoodLabeling.Application.Contracts.Dtos.Location; using FoodLabeling.Application.Contracts.IServices; using FoodLabeling.Domain.Entities; using FoodLabeling.Application.Contracts.Dtos.Common; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Yi.Framework.SqlSugarCore.Abstractions; namespace FoodLabeling.Application.Services; /// /// 门店管理服务(美国版) /// public class LocationAppService : ApplicationService, ILocationAppService { private readonly ISqlSugarRepository _locationRepository; public LocationAppService(ISqlSugarRepository locationRepository) { _locationRepository = locationRepository; } /// public async Task> GetListAsync([FromQuery] LocationGetListInputVo input) { RefAsync total = 0; var keyword = input.Keyword?.Trim(); var partner = input.Partner?.Trim(); var groupName = input.GroupName?.Trim(); var query = _locationRepository._DbQueryable .Where(x => x.IsDeleted == false) .WhereIF(!string.IsNullOrEmpty(partner), x => x.Partner == partner) .WhereIF(!string.IsNullOrEmpty(groupName), x => x.GroupName == groupName) .WhereIF(input.State is not null, x => x.State == input.State) .WhereIF(!string.IsNullOrEmpty(keyword), x => x.LocationCode.Contains(keyword!) || x.LocationName.Contains(keyword!) || (x.Street != null && x.Street.Contains(keyword!)) || (x.City != null && x.City.Contains(keyword!)) || (x.StateCode != null && x.StateCode.Contains(keyword!)) || (x.Country != null && x.Country.Contains(keyword!)) || (x.ZipCode != null && x.ZipCode.Contains(keyword!)) || (x.Phone != null && x.Phone.Contains(keyword!)) || (x.Email != null && x.Email.Contains(keyword!)) ); // 先按排序字段走(如前端传入),否则默认按创建时间倒序 if (!string.IsNullOrWhiteSpace(input.Sorting)) { query = query.OrderBy(input.Sorting); } else { query = query.OrderBy(x => x.CreationTime, OrderByType.Desc); } var entities = await query.ToPageListAsync(input.SkipCount, input.MaxResultCount, total); var items = entities.Select(x => new LocationGetListOutputDto { Id = x.Id, Partner = x.Partner, GroupName = x.GroupName, LocationCode = x.LocationCode, LocationName = x.LocationName, Street = x.Street, City = x.City, StateCode = x.StateCode, Country = x.Country, ZipCode = x.ZipCode, Phone = x.Phone, Email = x.Email, Latitude = x.Latitude, Longitude = x.Longitude, State = x.State }).ToList(); var pageSize = input.MaxResultCount <= 0 ? items.Count : input.MaxResultCount; var pageIndex = pageSize <= 0 ? 1 : PagedQueryConvention.PageIndexFromSkipCount(input.SkipCount); var totalPages = pageSize <= 0 ? 0 : (int)Math.Ceiling(total / (double)pageSize); return new PagedResultWithPageDto { PageIndex = pageIndex, PageSize = pageSize, TotalCount = total, TotalPages = totalPages, Items = items }; } /// public async Task CreateAsync([FromBody] LocationCreateInputVo input) { var locationCode = input.LocationCode?.Trim(); if (string.IsNullOrWhiteSpace(locationCode)) { throw new UserFriendlyException("Location ID不能为空"); } var locationName = input.LocationName?.Trim(); if (string.IsNullOrWhiteSpace(locationName)) { throw new UserFriendlyException("Location Name不能为空"); } var isExist = await _locationRepository.IsAnyAsync(x => x.LocationCode == locationCode); if (isExist) { throw new UserFriendlyException("Location ID已存在"); } var entity = new LocationAggregateRoot(GuidGenerator.Create()) { Partner = input.Partner?.Trim(), GroupName = input.GroupName?.Trim(), LocationCode = locationCode, LocationName = locationName, Street = input.Street?.Trim(), City = input.City?.Trim(), StateCode = input.StateCode?.Trim(), Country = input.Country?.Trim(), ZipCode = input.ZipCode?.Trim(), Phone = input.Phone?.Trim(), Email = input.Email?.Trim(), Latitude = input.Latitude, Longitude = input.Longitude, State = input.State }; await _locationRepository.InsertAsync(entity); return new LocationGetListOutputDto { Id = entity.Id, Partner = entity.Partner, GroupName = entity.GroupName, LocationCode = entity.LocationCode, LocationName = entity.LocationName, Street = entity.Street, City = entity.City, StateCode = entity.StateCode, Country = entity.Country, ZipCode = entity.ZipCode, Phone = entity.Phone, Email = entity.Email, Latitude = entity.Latitude, Longitude = entity.Longitude, State = entity.State }; } /// public async Task UpdateAsync(Guid id, [FromBody] LocationUpdateInputVo input) { var entity = await _locationRepository.GetSingleAsync(x => x.Id == id && x.IsDeleted == false); if (entity is null) { throw new UserFriendlyException("门店不存在"); } var locationName = input.LocationName?.Trim(); if (string.IsNullOrWhiteSpace(locationName)) { throw new UserFriendlyException("Location Name不能为空"); } // LocationCode 默认不允许修改:业务编码需要保持唯一且稳定(如需变更,应走“新建+迁移”方案) entity.Partner = input.Partner?.Trim(); entity.GroupName = input.GroupName?.Trim(); entity.LocationName = locationName; entity.Street = input.Street?.Trim(); entity.City = input.City?.Trim(); entity.StateCode = input.StateCode?.Trim(); entity.Country = input.Country?.Trim(); entity.ZipCode = input.ZipCode?.Trim(); entity.Phone = input.Phone?.Trim(); entity.Email = input.Email?.Trim(); entity.Latitude = input.Latitude; entity.Longitude = input.Longitude; entity.State = input.State; await _locationRepository.UpdateAsync(entity); return new LocationGetListOutputDto { Id = entity.Id, Partner = entity.Partner, GroupName = entity.GroupName, LocationCode = entity.LocationCode, LocationName = entity.LocationName, Street = entity.Street, City = entity.City, StateCode = entity.StateCode, Country = entity.Country, ZipCode = entity.ZipCode, Phone = entity.Phone, Email = entity.Email, Latitude = entity.Latitude, Longitude = entity.Longitude, State = entity.State }; } /// public async Task DeleteAsync(Guid id) { var entity = await _locationRepository.GetSingleAsync(x => x.Id == id && x.IsDeleted == false); if (entity is null) { throw new UserFriendlyException("门店不存在"); } entity.IsDeleted = true; await _locationRepository.UpdateAsync(entity); } }