using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Caching; using Volo.Abp.Domain.Repositories; using Volo.Abp.Validation; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Domain; using Win_in.Sfs.Basedata.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Basedata.Application; [Authorize] [Route($"{BasedataConsts.RootPath}Location")] public class LocationAppService : SfsBaseDataWithCodeAppServiceBase , ILocationAppService { private readonly ILocationManager _manager; private readonly LocationValidator _locationValidator; private readonly ILocationGroupAppService _locationGroupAppService; private readonly IWorkGroupAppService _workGroupAppService; private readonly IAreaAppService _areaAppService; public LocationAppService( ILocationRepository repository , IDistributedCache cache , LocationValidator locationValidator , ILocationManager manager , ILocationGroupAppService locationGroupAppService , IWorkGroupAppService workGroupAppService , IAreaAppService areaAppService ) : base(repository, cache) { //_locationCapacityAppService = locationCapacityAppService; _locationValidator = locationValidator; _manager = manager; base.CreatePolicyName = LocationPermissions.Create; base.UpdatePolicyName = LocationPermissions.Update; base.DeletePolicyName = LocationPermissions.Delete; _areaAppService = areaAppService; _locationGroupAppService = locationGroupAppService; _workGroupAppService = workGroupAppService; } [HttpPost("check")] //[Authorize(LocationPermissions.Default)] public virtual async Task CheckAsync(string code, LocationCheckInput input) { var result = new AbpValidationResult(); _locationValidator.CheckFormat(code); var dto = await GetByCodeAsync(code).ConfigureAwait(false); var entity = ObjectMapper.Map(dto); _locationValidator.CheckType(entity, input.Types, result); _locationValidator.CheckLocationGroup(entity, input.LocationGroups, result); _locationValidator.CheckWorkGroup(entity, input.WorkGroups, result); // _locationValidator.CheckLocation(entity, input.Locations, result); _locationValidator.CheckWarehouse(entity, input.Warehouses, result); _locationValidator.CheckMixItem(entity, input.MixItem, result); _locationValidator.CheckMixLot(entity, input.MixLot, result); _locationValidator.CheckMixStatus(entity, input.MixStatus, result); _locationValidator.CheckNegative(entity, input.Negative, result); _locationValidator.CheckKeepZero(entity, input.KeepZero, result); _locationValidator.CheckOpportunityCount(entity, input.OpportunityCount, result); _locationValidator.CheckPick(entity, input.Pick, result); _locationValidator.CheckOverPick(entity, input.OverPick, result); _locationValidator.CheckWholeStore(entity, input.WholeStore, result); _locationValidator.CheckBreakStore(entity, input.BreakStore, result); _locationValidator.CheckShip(entity, input.Ship, result); _locationValidator.CheckReceive(entity, input.Receive, result); _locationValidator.CheckReturnToSupplier(entity, input.ReturnToSupplier, result); _locationValidator.CheckReturnFromCustomer(entity, input.ReturnFromCustomer, result); await _locationValidator.CheckItemAsync(entity, input.ItemCode, result).ConfigureAwait(false); if (result.Errors.Count > 0) { throw new AbpValidationException(result.Errors); } } /// /// 筛选可用领料的库位 /// /// /// /// /// [HttpGet("list/by-codes-and-enable-pick")] public virtual async Task> GetListByCodesAndEnablePickAsync(List locationCodes, bool enablePick) { var locations = await _repository.GetListAsync(c => c.EnablePick == enablePick && locationCodes.Contains(c.Code)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-enable-picks")] public virtual async Task> GetListByEnablePickAsync(bool enablePick) { var locations = await _repository.GetListAsync(c => c.EnablePick == enablePick).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-groups")] public virtual async Task> GetListByGroupsAsync(List locationGroupCodes) { var locations = await _repository.GetListAsync(c => locationGroupCodes.Contains(c.LocationGroupCode)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-areas")] public virtual async Task> GetListByAreasAsync(List areas) { var locations = await _repository.GetListAsync(c => areas.Contains(c.AreaCode)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-codes-and-types")] public virtual async Task> GetListByCodesAndTypesAsync(List locationCodes, List locationTypes) { var locations = await _repository.GetListAsync(c => locationCodes.Contains(c.Code) && locationTypes.Contains(c.Type)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("first/by-type")] public virtual async Task GetFirstByTypeAsync(EnumLocationType type) { //特殊库位可能有多个 多个溢出 多个锁定 var location = await _repository.FirstOrDefaultAsync(p => p.Type == type).ConfigureAwait(false); var dto = ObjectMapper.Map(location); return dto; } [HttpGet("list/by-types")] public virtual async Task> GetListByTypesAsync(List types) { var locations = await _repository.GetListAsync(c => types.Contains(c.Type)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-types-and-erp")] public virtual async Task> GetListByTypesAndErpCodeAsync(List types, string erpCode) { var locations = await _repository.GetListAsync(c => types.Contains(c.Type) && c.ErpLocationCode == erpCode).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-types-and-erp-code")] public virtual async Task> GetListByTypesAndErpCodeAsync(List types, string erpCode,string locCode) { var locations = await _repository.GetListAsync(c => types.Contains(c.Type) && c.ErpLocationCode == erpCode&&c.Code==locCode).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); return dtos; } [HttpGet("list/by-location-group-code-and-location-type")] public virtual async Task> GeListByLocationGroupCodeAndLocationType(List locationGroupCodes, List locationTypes) { List locations = await _repository.GetListAsync(c => locationGroupCodes.Contains(c.LocationGroupCode) && locationTypes.Contains(c.Type)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(locations); //var result = new List(); //foreach (var item in dtos) //{ // var flag = await _itemStoreRelationRepository.GetListAsync(p => p.StoreValue == item.Code && p.StoreRelationType == EnumStoreRelationType.Location); // if (!flag.Any()) // { // result.Add(item); // } //} return dtos; } [HttpPost("list/by-many-codes")] public virtual async Task> GetListByManyCodes(List codes) { var entitys = await _repository.GetListAsync(p => codes.Contains(p.Code)).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(entitys); return dtos; } [HttpGet("get-all")] //[Authorize(LocationPermissions.Default)] public virtual async Task> GetAllAsync() { var list = await _repository.GetListAsync().ConfigureAwait(false); return ObjectMapper.Map, List>(list); } protected override async Task ValidateImportModelAsync(LocationImportInput importInput, List validationRresult) { await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false); await base.CheckAreaCodeAsync(importInput.AreaCode, validationRresult).ConfigureAwait(false); await base.CheckWorkGroupWorkshopCodeAsync(importInput.WorkGroupCode, validationRresult).ConfigureAwait(false); await base.CheckLocationGroupCodeAsync(importInput.LocationGroupCode, validationRresult).ConfigureAwait(false); await base.CheckWarehouseCodeAsync(importInput.WarehouseCode, validationRresult).ConfigureAwait(false); } }