Browse Source

优化 SxServiceExtension 逻辑并简化接口

在 `SxServiceExtension.cs` 中添加了多个命名空间引用,并新增了 `ApplyStockInLocTemp` 方法,该方法实现了入库货位申请的逻辑,包括任务验证、库存检查和货位分配,同时添加了异常捕获和事务管理。新增的私有方法 `ApplyLoc` 也包含了详细的逻辑处理。

在 `ISXService.cs` 中删除了多个方法声明,以简化接口和重构代码,提升了代码的可读性和可维护性。
林豪 左 1 month ago
parent
commit
cd3351ccfb
3 changed files with 1795 additions and 6768 deletions
  1. 631 1
      wms.service/Extensions/SxServiceExtension.cs
  2. 0 14
      wms.service/IService/ISXService.cs
  3. 1164 6753
      wms.service/Service/SXService.cs

+ 631 - 1
wms.service/Extensions/SxServiceExtension.cs

@@ -1,12 +1,21 @@
-using SqlSugar;
+using AutoMapper;
+using Microsoft.Extensions.Logging;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Globalization;
 using System.Linq;
+using WCS.Entity.sx;
+using wms.dto;
+using wms.dto.request.sx;
+using wms.dto.response;
+using wms.dto.response.hj;
 using wms.dto.response.sx;
+using wms.service.Service;
 using wms.sqlsugar;
 using wms.sqlsugar.model.sx;
+using wms.util.Ext;
 
 namespace wms.service.Extensions
 {
@@ -180,5 +189,626 @@ namespace wms.service.Extensions
         }
 
         #endregion 获取码垛位
+
+        #region 分配货位
+
+        /// <summary>
+        /// 申请入库货位
+        /// </summary>
+        /// <param name="reqEntity">申请信息</param>
+        /// <param name="_wcstaskoldrepository">任务表</param>
+        /// <param name="_basewarehouserepository">仓库表</param>
+        /// <param name="_billInvnowrepository">库存表</param>
+        /// <param name="_basewarecellrepository">货位表</param>
+        /// <param name="_db">数据库连接</param>
+        /// <param name="_mapper">映射器</param>
+        /// <param name="_logger">日志</param>
+        /// <returns></returns>
+        public static SRes<List<ApplyStockInLocResponse>> ApplyStockInLocTemp(
+            this SxApplyStockInLocRequest reqEntity,
+            RepositoryTask<WCS_TaskOld> _wcstaskoldrepository,
+            Repository<BaseWarehouse> _basewarehouserepository,
+            Repository<BillInvnow> _billInvnowrepository,
+            Repository<BaseWarecell> _basewarecellrepository,
+            ITenant _db,
+            IMapper _mapper,
+            ILogger<SXService> _logger)
+        {
+            var result = new SRes<List<ApplyStockInLocResponse>>() { ResData = new List<ApplyStockInLocResponse>() };
+            var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.Id) && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).ToList();
+            if (!wcstask.Any())
+            {
+                result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
+                result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
+                return result;
+            }
+            if (wcstask.Any(p => p.Type == TaskType.OutDepot))
+            {
+                result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + string.Join(",", reqEntity.TaskNum);
+                return result;
+            }
+            if (reqEntity.TaskNum.Count != wcstask.Count)
+            {
+                result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                result.ResMsg = string.Join(',', reqEntity.TaskNum) + "申请的任务数与实际任务数不符";
+                return result;
+            }
+            var warehouse = _basewarehouserepository.GetFirst(p => p.Code == "sxhouse");
+            if (warehouse == null)
+            {
+                result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
+                result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
+                return result;
+            }
+            var stocklist = _billInvnowrepository.GetList(p => wcstask.Select(p => p.BarCode).Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
+            if (!stocklist.Any())
+            {
+                result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
+                result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.StockNotExist.GetDescription();
+                return result;
+            }
+            if (reqEntity.TaskNum.Count != stocklist.Count)
+            {
+                result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
+                result.ResMsg = string.Join(",", reqEntity.TaskNum) + "申请的任务数与库存数量不符";
+                return result;
+            }
+            if (wcstask.Count > 1)
+            {
+                List<ApplyStockInLocResponse> list = new List<ApplyStockInLocResponse>();
+                var code = string.Empty;
+                var num = new List<int>() { reqEntity.TaskNum[1], reqEntity.TaskNum[0] };
+                foreach (var item in num)
+                {
+                    //验证库存
+                    var task = wcstask.Where(p => p.Id == item).First();
+                    var stock = stocklist.Where(p => p.ContGrpBarCode == task.BarCode).First();
+                    if (!string.IsNullOrEmpty(task.AddrTo) && task.Fork != 0)
+                    {
+                        var applyCell = new ApplyStockInLocResponse()
+                        {
+                            TunnelNum = reqEntity.TunnelNum.ToString(),
+                            CellNo = task.AddrTo,
+                            Row = task.AddrTo.Split('-')[0] != null ? int.Parse(task.AddrTo.Split('-')[0]) : 0,
+                            Colomn = task.AddrTo.Split('-')[1] != null ? int.Parse(task.AddrTo.Split('-')[1]) : 0,
+                            Layer = task.AddrTo.Split('-')[2] != null ? int.Parse(task.AddrTo.Split('-')[2]) : 0,
+                            Fork = task.Fork,
+                            TaskNo = task.Id
+                        };
+                        result.ResData.Add(applyCell);
+                        continue;
+                    }
+
+                    if (!string.IsNullOrEmpty(code))
+                    {
+                        var cell2 = ApplyLoc(new ApplyLocRequest()
+                        {
+                            MaterialId = stock.MatId,
+                            MaterialCode = stock.MatCode,
+                            TunnelNum = reqEntity.TunnelNum,
+                            WarehuoseId = warehouse.Id,
+                            IsMove = task.Type == TaskType.TransferDepot,
+                            Floor = reqEntity.Floor,
+                            CellCode = code,
+                            Fork = 2,
+                            Wind = stock.Wind,
+                            IsControlpanel = stock.IsControlpanel,
+                            IsTorsChk = stock.IsTorsChk,
+                            TorsChkQty = stock.TorsChkQty,
+                            ProductTime = stock.ProductTime,
+                            Wbgroup = stock.WbGroupCode
+                        }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
+                        if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                        {
+                            result.ResCode = cell2.ResCode;
+                            result.ResMsg = item + cell2.ResMsg;
+                            return result;
+                        }
+                        try
+                        {
+                            cell2.ResData.Fork = 2;
+                            cell2.ResData.TaskNo = item;
+                            _db.BeginTran();
+                            _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
+                            {
+                                AddrTo = cell2.ResData.CellNo,
+                                Fork = cell2.ResData.Fork
+                            }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
+                            _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
+                                                                            p => cell2.ResData.CellNo == p.Code);
+
+                            _db.CommitTran();
+                            result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
+                        }
+                        catch (Exception ex)
+                        {
+                            _db.RollbackTran();
+                            result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                            result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
+                            return result;
+                        }
+                        continue;
+                    }
+
+                    #region 处理两个任务都是一货叉情况
+
+                    if (item == reqEntity.TaskNum[0])
+                    {
+                        var cell2 = ApplyLoc(new ApplyLocRequest()
+                        {
+                            MaterialId = stock.MatId,
+                            MaterialCode = stock.MatCode,
+                            TunnelNum = reqEntity.TunnelNum,
+                            WarehuoseId = warehouse.Id,
+                            IsMove = task.Type == TaskType.TransferDepot,
+                            Floor = reqEntity.Floor,
+                            Fork = 2,
+                            Wind = stock.Wind,
+                            IsControlpanel = stock.IsControlpanel,
+                            IsTorsChk = stock.IsTorsChk,
+                            TorsChkQty = stock.TorsChkQty,
+                            ProductTime = stock.ProductTime,
+                            Wbgroup = stock.WbGroupCode
+                        }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
+                        if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                        {
+                            result.ResCode = cell2.ResCode;
+                            result.ResMsg = item + cell2.ResMsg;
+                            return result;
+                        }
+                        try
+                        {
+                            cell2.ResData.Fork = 2;
+                            cell2.ResData.TaskNo = item;
+                            _db.BeginTran();
+                            _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
+                            {
+                                AddrTo = cell2.ResData.CellNo,
+                                Fork = cell2.ResData.Fork
+                            }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
+                            _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
+                                                                            p => cell2.ResData.CellNo == p.Code);
+
+                            _db.CommitTran();
+                            result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
+                        }
+                        catch (Exception ex)
+                        {
+                            _db.RollbackTran();
+                            result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                            result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
+                            return result;
+                        }
+                        continue;
+                    }
+
+                    #endregion 处理两个任务都是一货叉情况
+
+                    var cell1 = ApplyLoc(new ApplyLocRequest()
+                    {
+                        MaterialId = stock.MatId,
+                        MaterialCode = stock.MatCode,
+                        TunnelNum = reqEntity.TunnelNum,
+                        WarehuoseId = warehouse.Id,
+                        IsMove = task.Type == TaskType.TransferDepot,
+                        Floor = reqEntity.Floor,
+                        Fork = 1,
+                        Wind = stock.Wind,
+                        IsControlpanel = stock.IsControlpanel,
+                        IsTorsChk = stock.IsTorsChk,
+                        TorsChkQty = stock.TorsChkQty,
+                        ProductTime = stock.ProductTime,
+                        Wbgroup = stock.WbGroupCode
+                    }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
+                    if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        result.ResCode = cell1.ResCode;
+                        result.ResMsg = item + cell1.ResMsg;
+                        return result;
+                    }
+                    try
+                    {
+                        cell1.ResData.Fork = 1;
+                        cell1.ResData.TaskNo = item;
+                        code = cell1.ResData.CellNo;
+                        _db.BeginTran();
+                        _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
+                        {
+                            AddrTo = cell1.ResData.CellNo,
+                            Fork = cell1.ResData.Fork
+                        }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
+                        _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
+                                                                        p => cell1.ResData.CellNo == p.Code);
+
+                        _db.CommitTran();
+                        result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
+                    }
+                    catch (Exception ex)
+                    {
+                        _db.RollbackTran();
+                        result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
+                        return result;
+                    }
+                }
+            }
+            else
+            {
+                //验证库存
+                var stock = stocklist.Where(p => p.ContGrpBarCode == wcstask.First().BarCode).First();
+                if (stock == null)
+                {
+                    result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
+                    result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
+                    return result;
+                }
+
+                if (!string.IsNullOrEmpty(wcstask.First().AddrTo) && wcstask.First().Fork != 0)
+                {
+                    var applyCell = new ApplyStockInLocResponse()
+                    {
+                        TunnelNum = reqEntity.TunnelNum.ToString(),
+                        CellNo = wcstask.First().AddrTo,
+                        Row = wcstask.First().AddrTo.Split('-')[0] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[0]) : 0,
+                        Colomn = wcstask.First().AddrTo.Split('-')[1] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[1]) : 0,
+                        Layer = wcstask.First().AddrTo.Split('-')[2] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[2]) : 0,
+                        Fork = wcstask.First().Fork,
+                        TaskNo = wcstask.First().Id
+                    };
+                    result.ResData.Add(applyCell);
+                    return result;
+                }
+                var cell1 = ApplyLoc(new ApplyLocRequest()
+                {
+                    MaterialId = stock.MatId,
+                    MaterialCode = stock.MatCode,
+                    TunnelNum = reqEntity.TunnelNum,
+                    WarehuoseId = warehouse.Id,
+                    IsMove = wcstask.First().Type == TaskType.TransferDepot,
+                    Floor = reqEntity.Floor,
+                    Fork = 2,
+                    Wind = stock.Wind,
+                    IsControlpanel = stock.IsControlpanel,
+                    IsTorsChk = stock.IsTorsChk,
+                    TorsChkQty = stock.TorsChkQty,
+                    ProductTime = stock.ProductTime,
+                    Wbgroup = stock.WbGroupCode
+                }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
+                if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    result.ResCode = cell1.ResCode;
+                    result.ResMsg = wcstask.First().Id + cell1.ResMsg;
+                    return result;
+                }
+                try
+                {
+                    cell1.ResData.TaskNo = wcstask.First().Id;
+                    cell1.ResData.Fork = 2;
+                    _db.BeginTran();
+                    _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
+                    {
+                        AddrTo = cell1.ResData.CellNo,
+                        Fork = cell1.ResData.Fork,
+                    }).Where(p => p.Id == wcstask.First().Id).SplitTable(p => p.Take(2)).ExecuteCommand();
+                    _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
+                                                                p => p.Code == cell1.ResData.CellNo);
+
+                    _db.CommitTran();
+                    result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
+                }
+                catch (Exception ex)
+                {
+                    _db.RollbackTran();
+                    result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
+                }
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 申请货位
+        /// </summary>
+        /// <param name="reqEntity">申请信息</param>
+        /// <param name="_basewarecellrepository">货位表</param>
+        /// <param name="_basewarehouserepository">仓库表</param>
+        /// <param name="_billInvnowrepository">库存表</param>
+        /// <param name="_logger">日志</param>
+        /// <returns></returns>
+        private static SRes<ApplyStockInLocResponse> ApplyLoc(
+            ApplyLocRequest reqEntity,
+            Repository<BaseWarecell> _basewarecellrepository,
+            Repository<BaseWarehouse> _basewarehouserepository,
+            Repository<BillInvnow> _billInvnowrepository,
+            ILogger<SXService> _logger)
+        {
+            var result = new SRes<ApplyStockInLocResponse>()
+            {
+                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
+                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
+                ResData = new ApplyStockInLocResponse(),
+            };
+            //预留货位数量
+            var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
+            && p.StateNum == LocationState.LocationState_Empty
+            && p.TypeNum == LocationType.LocationType_StorageLocation
+            && p.Tunnel == reqEntity.TunnelNum
+            && p.WarehouseId == reqEntity.WarehuoseId
+            && p.Floor == reqEntity.Floor
+            );
+
+            //判断是否移库
+            if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10))
+            {
+                result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+                result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
+                return result;
+            }
+
+            var loc1ist = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
+                              && loc1.TypeNum == LocationType.LocationType_StorageLocation
+                              && loc1.Tunnel == reqEntity.TunnelNum
+                              && loc1.WarehouseId == reqEntity.WarehuoseId
+                              && loc1.Floor == reqEntity.Floor && loc1.Depth == 1).ToList()
+                          join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
+                           && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor).ToList()
+                               on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
+                          join stock in _billInvnowrepository.GetList(inv => inv.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(inv.PreStock))
+                          on loct2.ContGrpBarCode equals stock.ContGrpBarCode
+                          where loct1.Tunnel == reqEntity.TunnelNum && loct1.Floor == reqEntity.Floor
+                          select new stocktemp1
+                          {
+                              Code = loct1.Code.ToString(),
+                              Id = loct1.Id,
+                              Row = loct1.Row,
+                              Col = loct1.Col,
+                              Layer = loct1.Layer,
+                              Tunnel = loct1.Tunnel,
+                              Floor = loct1.Floor,
+                              ContGrpBarCode = loct2.ContGrpBarCode,
+                              Shelf = loct2.Shelf,
+                              MatCode = stock.MatCode,
+                              MatId = stock.MatId,
+                              WbGroupCode = stock.WbGroupCode,
+                              InDocsNo = stock.InDocsNo,
+                              Wind = stock.Wind,
+                              IsControlpanel = stock.IsControlpanel,
+                              IsTorsChk = stock.IsTorsChk,
+                              TorsChkQty = stock.TorsChkQty,
+                              ProductTime = stock.ProductTime
+                          };
+
+            #region 非控制盘、已扭转的控制盘
+
+            if (reqEntity.IsControlpanel == false)
+            {
+                if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
+                {
+                    if (reqEntity.Fork == 1)
+                    {
+                        if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
+                        {
+                            var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                            && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                            result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                            result.ResData.CellNo = resloc.Code;
+                            result.ResData.Row = resloc.Row;
+                            result.ResData.Colomn = resloc.Col;
+                            result.ResData.Layer = resloc.Layer;
+                            _logger.LogInformation("分货位埋点1:" + result.ResData.CellNo);
+                            return result;
+                        }
+                    }
+                    else
+                    {
+                        var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                      && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                        result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                        result.ResData.CellNo = resloc.Code;
+                        result.ResData.Row = resloc.Row;
+                        result.ResData.Colomn = resloc.Col;
+                        result.ResData.Layer = resloc.Layer;
+                        _logger.LogInformation("分货位埋点2:" + result.ResData.CellNo);
+                        return result;
+                    }
+                }
+            }
+            else
+            {
+                if (reqEntity.IsControlpanel == true && reqEntity.IsTorsChk == true && reqEntity.TorsChkQty > 0)  //已扭转完
+                {
+                    //var starttime = reqEntity.ProductTime.Date.AddHours(13);
+                    //var endtime = reqEntity.ProductTime.Date.AddDays(1).AddHours(8);
+                    if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                        && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())// && p.ProductTime >= starttime && p.ProductTime <= endtime
+                    {
+                        if (reqEntity.Fork == 1)
+                        {
+                            if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                    && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())//&& p.ProductTime >= starttime && p.ProductTime <= endtime
+                            {
+                                var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                                && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
+                                result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                                result.ResData.CellNo = resloc.Code;
+                                result.ResData.Row = resloc.Row;
+                                result.ResData.Colomn = resloc.Col;
+                                result.ResData.Layer = resloc.Layer;
+                                _logger.LogInformation("分货位埋点3:" + result.ResData.CellNo);
+                                return result;
+                            }
+                        }
+                        else
+                        {
+                            var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
+                                          && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
+                            result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                            result.ResData.CellNo = resloc.Code;
+                            result.ResData.Row = resloc.Row;
+                            result.ResData.Colomn = resloc.Col;
+                            result.ResData.Layer = resloc.Layer;
+                            _logger.LogInformation("分货位埋点4:" + result.ResData.CellNo);
+                            return result;
+                        }
+                    }
+                }
+            }
+
+            #endregion 非控制盘、已扭转的控制盘
+
+            //再找二深位空的
+            if (emptyLoc.Where(p => p.Depth == 2).Any())
+            {
+                //一深位必须空
+
+                var templist = from loc1 in _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0 && p.Floor == reqEntity.Floor && p.Tunnel == reqEntity.TunnelNum)
+                               join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer } equals new { loc2.Col, loc2.Layer }
+                               select loc2;
+
+                if (templist == null || !templist.Any())
+                {
+                    result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+                    result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的二升位";
+                    _logger.LogInformation("分货位埋点5:" + result.ResData.CellNo);
+                    return result;
+                }
+                if (!string.IsNullOrEmpty(reqEntity.CellCode))
+                {
+                    var cell = reqEntity.CellCode.Split('-');
+                    if (cell[4] == "2")
+                    {
+                        var cell2 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3]).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row);  //优先同货架相邻同层货位
+                        if (cell2.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).Any())
+                        {
+                            var cell3 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).OrderBy(p => p.Col).ThenBy(p => p.Row).First();
+                            result.ResData.TunnelNum = cell3.Tunnel.ToString();
+                            result.ResData.CellNo = cell3.Code;
+                            result.ResData.Row = cell3.Row;
+                            result.ResData.Colomn = cell3.Col;
+                            result.ResData.Layer = cell3.Layer;
+                            result.ResData.Fork = 2;
+                            _logger.LogInformation("分货位埋点6:" + result.ResData.CellNo);
+                            return result;
+                        }
+                        else
+                        {
+                            if (cell2.Any())
+                            {
+                                var cell4 = cell2.First();
+                                result.ResData.TunnelNum = cell4.Tunnel.ToString();
+                                result.ResData.CellNo = cell4.Code;
+                                result.ResData.Row = cell4.Row;
+                                result.ResData.Colomn = cell4.Col;
+                                result.ResData.Layer = cell4.Layer;
+                                result.ResData.Fork = 2;
+                                _logger.LogInformation("分货位埋点7:" + result.ResData.CellNo);
+                                return result;
+                            }
+                            else
+                            {
+                                var cell4 = templist.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                                result.ResData.TunnelNum = cell4.Tunnel.ToString();
+                                result.ResData.CellNo = cell4.Code;
+                                result.ResData.Row = cell4.Row;
+                                result.ResData.Colomn = cell4.Col;
+                                result.ResData.Layer = cell4.Layer;
+                                result.ResData.Fork = 2;
+                                _logger.LogInformation("分货位埋点8:" + result.ResData.CellNo);
+                                return result;
+                            }
+                        }
+                    }
+                }
+                if (reqEntity.Fork == 2)
+                {
+                    //var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
+                    var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                    result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                    result.ResData.CellNo = resloc.Code;
+                    result.ResData.Row = resloc.Row;
+                    result.ResData.Colomn = resloc.Col;
+                    result.ResData.Layer = resloc.Layer;
+                    _logger.LogInformation("分货位埋点9:" + result.ResData.CellNo);
+                    return result;
+                }
+                else
+                {
+                    //templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).Any()
+                    if (templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).Any())
+                    {
+                        //var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
+                        var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                        result.ResData.TunnelNum = resloc.Tunnel.ToString();
+                        result.ResData.CellNo = resloc.Code;
+                        result.ResData.Row = resloc.Row;
+                        result.ResData.Colomn = resloc.Col;
+                        result.ResData.Layer = resloc.Layer;
+                        _logger.LogInformation("分货位埋点10:" + result.ResData.CellNo);
+                        return result;
+                    }
+                    else
+                    {
+                    }
+                }
+            }
+            if (loc1ist == null || !loc1ist.Any())
+            {
+                result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+                result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的一升位货位";
+                _logger.LogInformation("分货位埋点11:" + result.ResData.CellNo);
+                return result;
+            }
+            if (reqEntity.Fork == 1)
+            {
+                if (loc1ist.ToList().Where(p => p.Col < 70).Any())
+                {
+                    var aa = loc1ist.ToList();
+                    var code = aa.Where(p => p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+                    result.ResData.TunnelNum = code.Tunnel.ToString();
+                    result.ResData.CellNo = code.Code;
+                    result.ResData.Row = code.Row;
+                    result.ResData.Colomn = code.Col;
+                    result.ResData.Layer = code.Layer;
+                    _logger.LogInformation("分货位埋点12:" + result.ResData.CellNo);
+                    return result;
+                }
+                else
+                {
+                    result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+                    result.ResMsg = "一货叉没有可用库位";
+                    _logger.LogInformation("分货位埋点13:" + result.ResData.CellNo);
+                    return result;
+                }
+            }
+
+            var loc1ist11 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
+           && loc1.TypeNum == LocationType.LocationType_StorageLocation
+            && loc1.Tunnel == reqEntity.TunnelNum
+            && loc1.WarehouseId == reqEntity.WarehuoseId
+            && loc1.Floor == reqEntity.Floor && loc1.Depth == 1 && loc1.Floor == reqEntity.Floor).ToList()
+                            join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
+                           && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor
+                            ).ToList()
+
+                       on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
+                            select loct1;
+
+            var loc = loc1ist11.ToList().OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
+            //var loc = loc1ist.First();
+            result.ResData.TunnelNum = loc.Tunnel.ToString();
+            result.ResData.CellNo = loc.Code;
+            result.ResData.Row = loc.Row;
+            result.ResData.Colomn = loc.Col;
+            result.ResData.Layer = loc.Layer;
+
+            _logger.LogInformation("分货位埋点14:" + result.ResData.CellNo);
+            return result;
+        }
+
+        #endregion 分配货位
     }
 }

+ 0 - 14
wms.service/IService/ISXService.cs

@@ -26,10 +26,6 @@ namespace wms.service.IService
 
         public sxSysConfig GetSysConfigByCode(string code);
 
-        public sxSysConfig GetSysConfigByExpression(Expression<Func<sxSysConfig, bool>> WhereExpression);
-
-        public bool UpdateSysConfigModelColumns(UpdateModelColumns<sxSysConfig> updateModel);
-
         public SRes SpoolMaterialInfoTrans(SxSpoolMaterialInfoTransRequest reqDto);
 
         /// <summary>
@@ -118,20 +114,10 @@ namespace wms.service.IService
 
         SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request);
 
-        public SRes PalletizingSpcNotPackStockOut2(PalletizingPackStockOutRequest request);
-
         public SRes PalletizingSpcNotPackStockOut3(PalletizingPackStockOutRequest request);
 
-        public SRes PalletizingSpcNotPackRulePre(PalletizingPackStockOutRequest request);
-
         SRes PalletizingSpcNotPackRulePre2(PalletizingPackStockOutRequest request);
 
-        public SRes PalletizingSpcPackStockOut2(PalletizingPackStockOutRequest request);
-
-        public SRes PalletizingSpcPackStockOut3(PalletizingPackStockOutRequest request);
-
-        public SRes PalletizingSpcPackRulePre(PalletizingPackStockOutRequest request);
-
         SRes TorsChkStationbinde(TorsChkStationbindeRequest request);
 
         SRes UpdateBlackCount(UpdateBlackCountReq request);

File diff suppressed because it is too large
+ 1164 - 6753
wms.service/Service/SXService.cs


Some files were not shown because too many files changed in this diff