using AutoMapper; 
 | 
using WIDESEAWCS_Common.LocationEnum; 
 | 
using WIDESEAWCS_Common.TaskEnum; 
 | 
using WIDESEAWCS_Core; 
 | 
using WIDESEAWCS_Core.BaseRepository; 
 | 
using WIDESEAWCS_Core.BaseServices; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_Core.Utilities; 
 | 
using WIDESEAWCS_DTO.BasicInfo; 
 | 
using WIDESEAWCS_IWMSPart; 
 | 
using WIDESEAWCS_Model.Models; 
 | 
  
 | 
namespace WIDESEAWCS_WMSPart 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// 货位信息业务接口实现层 
 | 
    /// </summary> 
 | 
    public class LocationInfoService : ServiceBase<Dt_LocationInfo, IRepository<Dt_LocationInfo>>, ILocationInfoService 
 | 
    { 
 | 
        public IRepository<Dt_LocationInfo> Repository => BaseDal; 
 | 
        private readonly IRepository<dt_storagemode> _dt_storagemode; 
 | 
        private readonly IMapper _mapper; 
 | 
        private readonly IRepository<Dt_StockInfo> _stockInfoRepository; 
 | 
        private readonly IRepository<dt_batchInfo> _batchInfoRepository; 
 | 
        //private readonly Idt_ErrormsginfoService _ErrormsginfoService; 
 | 
  
 | 
        public LocationInfoService(IRepository<Dt_LocationInfo> BaseDal, IRepository<dt_storagemode> storagemode, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<dt_batchInfo> batchInfoRepository, IMapper mapper) : base(BaseDal) 
 | 
        { 
 | 
            _dt_storagemode = storagemode; 
 | 
            _mapper = mapper; 
 | 
            _stockInfoRepository = stockInfoRepository; 
 | 
            _batchInfoRepository = batchInfoRepository; 
 | 
        } 
 | 
  
 | 
        public override PageGridData<Dt_LocationInfo> GetPageData(PageDataOptions options) 
 | 
        { 
 | 
            return base.GetPageData(options); 
 | 
        } 
 | 
        public override WebResponseContent UpdateData(SaveModel saveModel) 
 | 
        { 
 | 
            int id = saveModel.MainData["id"].ObjToInt(); 
 | 
            int locationStatus = saveModel.MainData["locationStatus"].ObjToInt(); 
 | 
            int enableStatus = saveModel.MainData["enableStatus"].ObjToInt(); 
 | 
            Dt_LocationInfo locationInfo = BaseDal.QueryFirst(x => x.Id == id); 
 | 
            locationInfo.LocationStatus = locationStatus; 
 | 
            locationInfo.EnableStatus = enableStatus; 
 | 
            //有货生成库存信息 
 | 
            if (locationStatus == 2) 
 | 
            { 
 | 
                //判断是否存在库存信息 
 | 
                var w = _stockInfoRepository.QueryFirst(x => x.LocationCode == locationInfo.LocationCode); 
 | 
                if(w == null) 
 | 
                { 
 | 
                        Dt_StockInfo stockInfo = new Dt_StockInfo(); 
 | 
                        //查询当前需要出库的批次号,以及出库物料类型 
 | 
                        var batch = _batchInfoRepository.QueryFirst(v => v.Id == 1); 
 | 
                        stockInfo.BatchNo = batch.OutBatch; 
 | 
                        stockInfo.Weight = 4; 
 | 
                        stockInfo.LocationCode = locationInfo.LocationCode; 
 | 
                        stockInfo.WarehouseId = 0; 
 | 
                        stockInfo.StockStatus = 0; 
 | 
                        stockInfo.Remark = 1; 
 | 
                        _stockInfoRepository.AddData(stockInfo); 
 | 
                } 
 | 
            } 
 | 
            //无货删除库存信息 
 | 
            else if(locationStatus == 0) 
 | 
            { 
 | 
                //判断是否存在库存信息 
 | 
                var w = _stockInfoRepository.QueryFirst(x => x.LocationCode == locationInfo.LocationCode); 
 | 
                if (w != null) 
 | 
                { 
 | 
                    _stockInfoRepository.DeleteData(w); 
 | 
                } 
 | 
            } 
 | 
            return UpdateData(locationInfo); 
 | 
            //return base.UpdateData(saveModel); 
 | 
        } 
 | 
        public WebResponseContent GetLocationLayer() 
 | 
        { 
 | 
            WebResponseContent content = new WebResponseContent(); 
 | 
            try 
 | 
            { 
 | 
                List<object> data = new List<object>(); 
 | 
                var layerNum = Repository.QueryData().Max(v => v.Layer); 
 | 
                for (int i = 0; i < layerNum; i++) 
 | 
                { 
 | 
                    object obj = new 
 | 
                    { 
 | 
                        value = i + 1, 
 | 
                        label = (i + 1) + "层" 
 | 
                    }; 
 | 
                    data.Add(obj); 
 | 
                } 
 | 
                return content = WebResponseContent.Instance.OK(data: data); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return content = WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
        public WebResponseContent getlocation() 
 | 
        { 
 | 
            WebResponseContent content = new WebResponseContent(); 
 | 
            try 
 | 
            { 
 | 
                List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>(); 
 | 
                for (int i = 1; i < 38; i++) 
 | 
                { 
 | 
                    for (int a = 1; a < 12; a++) 
 | 
                    { 
 | 
                        for (int g = 1; g < 3; g++) 
 | 
                        { 
 | 
                            Dt_LocationInfo location = new Dt_LocationInfo(); 
 | 
                            location.LocationCode = i + "-" + a + "-" + g; 
 | 
                            location.LocationName = i + "行" + a + "列" + "工位" + g; 
 | 
                            location.RoadwayNo = "TC1"; 
 | 
                            location.Row = i; 
 | 
                            location.Column = a; 
 | 
                            location.Layer = 1; 
 | 
                            location.Depth = g; 
 | 
                            location.LocationType = (int)LocationTypeEnum.Flat; 
 | 
                            location.LocationStatus = (int)LocationStatusEnum.Free; 
 | 
                            location.EnableStatus = (int)EnableStatusEnum.Normal; 
 | 
                            location.CreateDate = DateTime.Now; 
 | 
                            location.ModifyDate = DateTime.Now; 
 | 
                            location.Creater = "WCS"; 
 | 
                            locationInfos.Add(location); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
                BaseDal.AddData(locationInfos); 
 | 
                return content = WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return content = WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 根据选择的入库规则分配货位 
 | 
        /// </summary> 
 | 
        /// <param name="InMode"></param> 
 | 
        /// <returns></returns> 
 | 
        public Dt_LocationInfo GetInLocation(int InMode)  
 | 
        { 
 | 
            Dt_LocationInfo location = new Dt_LocationInfo(); 
 | 
            try 
 | 
            { 
 | 
                var mode = _dt_storagemode.QueryFirst(v=>v.Id==1); 
 | 
                if (InMode == 6) 
 | 
                { 
 | 
                    var locations = BaseDal.QueryData(v => v.EnableStatus == (int)EnableStatusEnum.Normal && v.LocationStatus == (int)LocationStatusEnum.Free && v.LocationType==(int)LocationTypeEnum.Cube).OrderBy(v => v.Row).ToList(); 
 | 
                    if (locations.Count <= 0) 
 | 
                    { 
 | 
                        throw new Exception($"入库优先货位分配失败,当前无空闲货位"); 
 | 
                    } 
 | 
                    location = locations[0]; 
 | 
                } 
 | 
                else if (mode.storagemode==(int)StorageModeEnum.Out) 
 | 
                { 
 | 
                    var locations = BaseDal.QueryData(v=>v.EnableStatus== (int)EnableStatusEnum.Normal && v.LocationStatus==(int)LocationStatusEnum.Free && v.LocationType == (int)LocationTypeEnum.Flat).OrderBy(v=>v.Row).ToList(); 
 | 
                    if (locations.Count<=0)  
 | 
                    { 
 | 
                        throw new Exception($"出库优先货位分配失败,当前无空闲货位"); 
 | 
                    } 
 | 
                    location = locations[0]; 
 | 
                } 
 | 
                else if(mode.storagemode == (int)StorageModeEnum.In) 
 | 
                { 
 | 
                    var locations = BaseDal.QueryData(v => v.EnableStatus == (int)EnableStatusEnum.Normal && v.LocationStatus == (int)LocationStatusEnum.Free && v.LocationType == (int)LocationTypeEnum.Flat).OrderByDescending(v => v.Row).ToList(); 
 | 
                    if (locations.Count <= 0) 
 | 
                    { 
 | 
                        throw new Exception($"入库优先货位分配失败,当前无空闲货位"); 
 | 
                    } 
 | 
                    location = locations[0]; 
 | 
                } 
 | 
                if (location!=null) 
 | 
                { 
 | 
                    if (InMode == 6) 
 | 
                    { 
 | 
                        location.LocationStatus = (int)LocationStatusEnum.Lock; 
 | 
                        BaseDal.UpdateData(location); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        //查找相邻的库位 
 | 
                        Dt_LocationInfo Towlocation = new Dt_LocationInfo(); 
 | 
  
 | 
                        var Onelocation = BaseDal.QueryFirst(v => v.LocationCode == location.LocationCode); 
 | 
  
 | 
                        if (Onelocation.Depth == 1) 
 | 
                        { 
 | 
                            Towlocation = BaseDal.QueryFirst(v => v.Row == Onelocation.Row && v.Column == Onelocation.Column && v.Depth == 2); 
 | 
                        } 
 | 
                        else 
 | 
                        { 
 | 
                            Towlocation = BaseDal.QueryFirst(v => v.Row == Onelocation.Row && v.Column == Onelocation.Column && v.Depth == 1); 
 | 
                        } 
 | 
                        location.LocationStatus = (int)LocationStatusEnum.Lock; 
 | 
                        Towlocation.LocationStatus = (int)LocationStatusEnum.Lock; 
 | 
                        BaseDal.UpdateData(location); 
 | 
                        BaseDal.UpdateData(Towlocation); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                throw new Exception(ex.Message); 
 | 
            } 
 | 
            return location; 
 | 
        } 
 | 
  
 | 
        public WebResponseContent GetLocationConfigs(int layer) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                object locationConfigs = Repository.QueryData(x => x.Layer == layer).GroupBy(x => x.RoadwayNo).Select(x => new 
 | 
                { 
 | 
                    colNum = x.Max(v => v.Column), 
 | 
                    rowNum = x.Max(v => v.Row), 
 | 
                    layer = layer, 
 | 
                    tunnel = x.Key, 
 | 
                    tunnelRowNo = x.Key, 
 | 
                    location = layer + "层", 
 | 
                    locationList = x.Select(v => new LocationConfig 
 | 
                    { 
 | 
                        col = v.Column, 
 | 
                        row = v.Row, 
 | 
                        state = v.LocationStatus, 
 | 
                        code = v.LocationCode, 
 | 
                        islock = v.EnableStatus, 
 | 
                        layer = layer, 
 | 
                        name = v.LocationName, 
 | 
                        materiaCode = "", 
 | 
                        materialName = "", 
 | 
                        barcode = "", 
 | 
                        qty = 0 
 | 
                    }) 
 | 
                }).ToList(); 
 | 
  
 | 
                return WebResponseContent.Instance.OK(data: locationConfigs); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        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<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>(); 
 | 
                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() 
 | 
                            { 
 | 
                                Column = j + 1, 
 | 
                                EnableStatus = EnableStatusEnum.Normal.ObjToInt(), 
 | 
                                Layer = k + 1, 
 | 
                                LocationStatus = LocationStatusEnum.Free.ObjToInt(), 
 | 
                                LocationType = LocationTypeEnum.Cube.ObjToInt(), 
 | 
                                RoadwayNo = initializationLocationDTO.Roadway, 
 | 
                                Row = i + 1, 
 | 
                            }; 
 | 
  
 | 
  
 | 
                            locationInfo.Depth = 1; 
 | 
                            locationInfo.LocationCode = $"{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}"; 
 | 
                            locationInfo.LocationName = $"{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层"; 
 | 
  
 | 
  
 | 
  
 | 
                            locationInfos.Add(locationInfo); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
  
 | 
                BaseDal.AddData(locationInfos); 
 | 
                return WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    public class LocationConfig 
 | 
    { 
 | 
        public int layer { get; set; } 
 | 
        public int col { get; set; } 
 | 
  
 | 
        public int row { get; set; } 
 | 
  
 | 
        public string name { get; set; } 
 | 
  
 | 
        public string code { get; set; } 
 | 
  
 | 
        public int state { get; set; } 
 | 
  
 | 
        public int islock { get; set; } 
 | 
  
 | 
        public string materiaCode { get; set; } 
 | 
  
 | 
        public string materialName { get; set; } 
 | 
  
 | 
        public string barcode { get; set; } 
 | 
  
 | 
        public decimal? qty { get; set; } 
 | 
    } 
 | 
} 
 |