using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Core.Utilities; using WIDESEA_DTO.Basic; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_Model.Models; namespace WIDESEA_BasicService { public class LocationInfoService : ServiceBase, ILocationInfoService { private readonly IAreaInfoRepository _areaInfoRepository; private readonly IWarehouseRepository _warehouseRepository; private readonly IRoadwayInfoRepository _roadwayInfoRepository; private Dictionary _emptyAssignOrderBy = new Dictionary() { { nameof(Dt_LocationInfo.Depth), OrderByType.Desc }, { nameof(Dt_LocationInfo.Layer), OrderByType.Asc }, { nameof(Dt_LocationInfo.Column), OrderByType.Asc }, { nameof(Dt_LocationInfo.Row), OrderByType.Asc }, }; public LocationInfoService(ILocationInfoRepository BaseDal, IAreaInfoRepository areaInfoRepository, IWarehouseRepository warehouseRepository, IRoadwayInfoRepository roadwayInfoRepository) : base(BaseDal) { _areaInfoRepository = areaInfoRepository; _warehouseRepository = warehouseRepository; _roadwayInfoRepository = roadwayInfoRepository; } public override WebResponseContent AddData(SaveModel saveModel) { return base.AddData(saveModel); } public Dt_LocationInfo? AssignLocation(string stationCode, int inboundType) { try { Dt_RoadwayInfo roadwayInfo = _roadwayInfoRepository.QueryFirst(x => x.InStationCode == stationCode) ?? throw new Exception("未找到该站台对应的巷道,请检查基础配置信息"); if (roadwayInfo.EnalbeStatus != RoadwayStatusEnum.Normal.ObjToInt() && roadwayInfo.EnalbeStatus != RoadwayStatusEnum.OnlyIn.ObjToInt()) { throw new Exception("该巷道不可入库,请检查巷道禁用信息"); } if (roadwayInfo.WarehouseId > 0) { Dt_Warehouse warehouse = _warehouseRepository.QueryFirst(x => x.Id == roadwayInfo.WarehouseId); if (warehouse != null && warehouse.WarehouseStatus == EnableEnum.Disable.ObjToInt()) { throw new Exception("仓库被禁用,不可入库"); } } if (inboundType == TaskTypeEnum.PalletInbound.ObjToInt())//空盘入库分配逻辑 { return EmptyAssignLocation(roadwayInfo.RoadwayNo); } else if (inboundType == TaskTypeEnum.Inbound.ObjToInt()) { return StoredAssignLocation(roadwayInfo.RoadwayNo); } } catch (Exception ex) { } return null; } private Dt_LocationInfo EmptyAssignLocation(string roadway) { List locationGroups = BaseDal.GetLocationGroups(roadway, LocationStatusEnum.Free, LocationStatusEnum.Pallet); if (locationGroups != null && locationGroups.Count > 0) { return BaseDal.QueryFirst(x => x.Id == locationGroups.FirstOrDefault().IdA); } locationGroups = BaseDal.GetLocationGroups(roadway, LocationStatusEnum.Free, LocationStatusEnum.Free); if (locationGroups != null && locationGroups.Count > 0) { return BaseDal.QueryFirst(x => x.Id == locationGroups.FirstOrDefault().IdB); } return BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnalbeStatus == LocationEnalbeStatusEnum.OnlyIn.ObjToInt() || x.EnalbeStatus == LocationEnalbeStatusEnum.Normal.ObjToInt() && x.RoadwayNo == roadway), _emptyAssignOrderBy); } private Dt_LocationInfo StoredAssignLocation(string roadway) { List locationGroups = BaseDal.GetLocationGroups(roadway, LocationStatusEnum.Free, LocationStatusEnum.InStock); if (locationGroups != null && locationGroups.Count > 0) { return BaseDal.QueryFirst(x => x.Id == locationGroups.FirstOrDefault().IdA); } locationGroups = BaseDal.GetLocationGroups(roadway, LocationStatusEnum.Free, LocationStatusEnum.Free); if (locationGroups != null && locationGroups.Count > 0) { return BaseDal.QueryFirst(x => x.Id == locationGroups.FirstOrDefault().IdB); } return BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnalbeStatus == LocationEnalbeStatusEnum.OnlyIn.ObjToInt() || x.EnalbeStatus == LocationEnalbeStatusEnum.Normal.ObjToInt() && x.RoadwayNo == roadway), _emptyAssignOrderBy); } public Dt_LocationInfo AdjacentDepthLocation(string locationCode) { Dt_LocationInfo locationInfo = BaseDal.QueryFirst(x => x.LocationCode == locationCode); return AdjacentDepthLocation(locationInfo); } public Dt_LocationInfo AdjacentDepthLocation(Dt_LocationInfo locationInfo) { return BaseDal.QueryFirst(x => x.RoadwayNo == locationInfo.RoadwayNo && x.Column == locationInfo.Column && x.Layer == locationInfo.Layer && x.Depth != locationInfo.Depth && x.Row != locationInfo.Row && (SqlFunc.Abs(x.Row - locationInfo.Row) == 1)); } public WebResponseContent InitializationLocation(InitializationLocationDTO initializationLocationDTO) { try { (bool, string, object?) result = ModelValidate.ValidateModelData(initializationLocationDTO); if (!result.Item1) return WebResponseContent.Instance.Error(result.Item2); int side = 1; List locationInfos = new List(); for (int i = 0; i < initializationLocationDTO.MaxRow; i++) { for (int j = 0; j < initializationLocationDTO.MaxColumn; j++) { for (int k = 0; k < initializationLocationDTO.MaxLayer; k++) { Dt_LocationInfo locationInfo = new Dt_LocationInfo() { AreaId = 0, Column = j + 1, EnalbeStatus = LocationEnalbeStatusEnum.Normal.ObjToInt(), Layer = k + 1, LocationStatus = LocationStatusEnum.Free.ObjToInt(), LocationType = LocationTypeEnum.Cube.ObjToInt(), RoadwayNo = initializationLocationDTO.Roadway, Row = i + 1, }; if (initializationLocationDTO.IsSingleDepth) { locationInfo.Depth = 1; locationInfo.LocationCode = $"R{initializationLocationDTO.Roadway.ToString().PadLeft(2, '0')}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}"; locationInfo.LocationName = $"R{initializationLocationDTO.Roadway.ToString().PadLeft(2, '0')}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层{locationInfo.Depth.ToString().PadLeft(2, '0')}深"; } else { if (initializationLocationDTO.FirstDepthRows.Contains(i + 1)) { locationInfo.Depth = 1; } else { locationInfo.Depth = 2; } locationInfo.LocationCode = $"R{initializationLocationDTO.Roadway.ToString().PadLeft(2, '0')}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}"; locationInfo.LocationName = $"R{initializationLocationDTO.Roadway.ToString().PadLeft(2, '0')}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层{locationInfo.Depth.ToString().PadLeft(2, '0')}深"; } locationInfos.Add(locationInfo); } } } BaseDal.AddData(locationInfos); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } } }