浏览代码

增强任务创建和库存管理功能

在 `FjController.cs` 文件中:
- 添加了两个新的静态对象 `lockerCreateMaterialPalletWarehouTask2` 和 `lockerMaterialReturnTaskCreator`。
- 移除了 `AllocatedSpoolFlow` 方法中的注释并发控制代码。
- 为 `GetFlowExceptionResults` 方法添加了 `Name = "GetFlowExceptionResults"` 属性。
- 添加了 `CreateMaterialPalletWarehouTask2` 和 `MaterialReturnTaskCreator` 两个新的 HTTP POST 方法,并在这些方法中使用了并发控制。

在 `FJEnumClass.cs` 文件中:
- 枚举类型中添加了两个新的枚举值 `重绕满托入库` 和 `帘线退料重绕`。

在 `CreateMaterialPalletWarehouTask.cs` 文件中:
- 添加了 `RewindFullPalletTaskRequest` 和 `MaterialReturnTaskCreatorRequest` 两个新的请求类。

在 `SpoolMaterialInfoTransRequest.cs` 文件中:
- 添加了 `SpoolMaterialInfoTransRequest` 类的注释。

在 `IFJService.cs` 文件中:
- 添加了 `CreateMaterialPalletWarehouTask2` 和 `MaterialReturnTaskCreator` 两个新的服务接口方法。
林豪 左 9 月之前
父节点
当前提交
0255c9f256

+ 25 - 2
wms.api/Controllers/FjController.cs

@@ -53,6 +53,8 @@ namespace wms.api.Controllers
         private static object lockerProductionBack = new object();
         private static object lockerCreateMaterialPalletWarehouTask = new object();
         private static object lockerCreateMaterialPalletWarehouTask1 = new object();
+        private static object lockerCreateMaterialPalletWarehouTask2 = new object();
+        private static object lockerMaterialReturnTaskCreator = new object();
         private static object lockerErrorMaterialStockOut = new object();
         private static object lockerBGradeMaterialStockOut = new object();
         private static object lockerlockerStockChange = new object();
@@ -405,7 +407,6 @@ namespace wms.api.Controllers
         [HttpPost]
         public SRes<string> AllocatedSpoolFlow(AllocatedSpoolFlowRequest reqDto)
         {
-            //return ConcurrencyReqControl<AllocatedSpoolFlowRequest, SRes<string>>(lockAllocatedSpoolFlow, "AllocatedSpoolFlow", reqDto.SpoolBarCode, reqDto, _fjService.AllocatedSpoolFlow);
             return _fjService.AllocatedSpoolFlow(reqDto);
         }
 
@@ -414,7 +415,7 @@ namespace wms.api.Controllers
         /// </summary>
         /// <param name="reqDto"></param>
         /// <returns></returns>
-        [HttpPost]
+        [HttpPost(Name = "GetFlowExceptionResults")]
         public SRes GetFlowExceptionResults(GetFlowExceptionResultsRequest reqDto)
         {
             return _fjService.GetFlowExceptionResults(reqDto);
@@ -571,6 +572,28 @@ namespace wms.api.Controllers
             return ConcurrencyReqControl<CreateMaterialPalletWarehouTask1Request, SRes>(lockerCreateMaterialPalletWarehouTask1, "CreateMaterialPalletWarehouTask1", reqDto.SpoolNr, reqDto, _fjService.CreateMaterialPalletWarehouTask1);
         }
 
+        /// <summary>
+        ///  芯股满托创建库存信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto)
+        {
+            return ConcurrencyReqControl<RewindFullPalletTaskRequest, SRes>(lockerCreateMaterialPalletWarehouTask2, "CreateMaterialPalletWarehouTask2", reqDto.TrayCode, reqDto, _fjService.CreateMaterialPalletWarehouTask2);
+        }
+
+        /// <summary>
+        ///  创建退料任务
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto)
+        {
+            return ConcurrencyReqControl<MaterialReturnTaskCreatorRequest, SRes>(lockerMaterialReturnTaskCreator, "lockerMaterialReturnTaskCreator", reqDto.LocCode, reqDto, _fjService.MaterialReturnTaskCreator);
+        }
+
         /// <summary>
         /// 叫料信息反馈接口
         /// </summary>

+ 13 - 1
wms.dto/const/FJEnumClass.cs

@@ -107,7 +107,19 @@ namespace wms.dto
         ///  皮盘入库
         /// </summary>
         [Description("皮盘入库")]
-        皮盘入库 = 16
+        皮盘入库 = 16,
+
+        /// <summary>
+        ///  重绕满托入库
+        /// </summary>
+        [Description("重绕满托入库")]
+        重绕满托入库 = 17,
+
+        /// <summary>
+        ///  帘线退料重绕
+        /// </summary>
+        [Description("帘线退料重绕")]
+        帘线退料重绕 = 18,
     }
 
     /// <summary>

+ 35 - 1
wms.dto/request/fj/CreateMaterialPalletWarehouTask.cs

@@ -1,4 +1,6 @@
-namespace wms.dto.request.fj
+using System.Collections.Generic;
+
+namespace wms.dto.request.fj
 {
     /// <summary>
     ///  创建有料满托入库任务
@@ -61,4 +63,36 @@
         /// </summary>
         public string LocCode { get; set; }
     }
+
+    /// <summary>
+    ///  重绕创建满托任务
+    /// </summary>
+    public class RewindFullPalletTaskRequest : BaseRequest
+    {
+        /// <summary>
+        /// 托盘号
+        /// </summary>
+        public string TrayCode { get; set; }
+
+        /// <summary>
+        /// 工字轮组
+        /// </summary>
+        public List<SpoolMaterialInfoTransRequest> SpoolGroup { get; set; }
+    }
+
+    /// <summary>
+    ///  退料任务创建
+    /// </summary>
+    public class MaterialReturnTaskCreatorRequest : BaseRequest
+    {
+        /// <summary>
+        /// 托盘号
+        /// </summary>
+        public string TrayCode { get; set; }
+
+        /// <summary>
+        ///  机台号
+        /// </summary>
+        public string LocCode { get; set; }
+    }
 }

+ 3 - 0
wms.dto/request/fj/SpoolMaterialInfoTransRequest.cs

@@ -4,6 +4,9 @@ using System.Text;
 
 namespace wms.dto.request.fj
 {
+    /// <summary>
+    ///  工字轮注册信息
+    /// </summary>
     public class SpoolMaterialInfoTransRequest:BaseRequest
     {
         /// <summary>

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

@@ -109,6 +109,20 @@ namespace wms.service.IService
         /// <returns></returns>
         public SRes CreateMaterialPalletWarehouTask1(CreateMaterialPalletWarehouTask1Request reqDto);
 
+        /// <summary>
+        ///  重绕区组盘信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto);
+
+        /// <summary>
+        ///  创建退料任务
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto);
+
         public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto);
 
         public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto);

+ 496 - 276
wms.service/Service/FJService.cs

@@ -66,7 +66,7 @@ namespace wms.service.Service
         ///  容器表
         /// </summary>
         private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
-
+        d
         /// <summary>
         ///  环形库码垛缓存信息
         /// </summary>
@@ -1346,6 +1346,345 @@ namespace wms.service.Service
             return res;
         }
 
+        /// <summary>
+        ///  重绕区组盘信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto)
+        {
+            var res = new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
+
+            //获取工字轮任务信息
+            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
+            if (taskInfo != null)
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
+                return res;
+            }
+
+            //托盘
+            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
+            if (container == null)
+            {
+                var insertcon = new BaseContinfo()
+                {
+                    ContBarCode = reqDto.TrayCode,
+                    Name = reqDto.TrayCode,
+                    TypeCode = ContainerType.ContainerType_Spool.ToString(),
+                    PrintQty = 1,
+                    IsStop = 0,
+                    WarehouseId = 0,
+                    WeightQty = 0,
+                    AddWho = "wms",
+                    AddTime = DateTime.Now
+                };
+                //新加载具信息
+                if (!_baseContinfo.Insert(insertcon))
+                {
+                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    res.ResMsg = "托盘载具初始化失败";
+                    return res;
+                }
+            }
+
+            //托盘库存
+            var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
+            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
+                return res;
+            }
+            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
+                return res;
+            }
+
+            var SpoolNoGroup = reqDto.SpoolGroup.Select(x => x.SpoolCode).ToList();
+            var stackHeaderSet = new List<BillBomsetgrp>();
+
+            #region 校验工字轮信息并获取对应垛型
+
+            foreach (var spool in reqDto.SpoolGroup)
+            {
+                var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == spool.SpoolCode);
+                if (spoolNr == null)
+                {
+                    var insertcon = new BaseContinfo()
+                    {
+                        ContBarCode = spool.SpoolCode,
+                        Name = spool.SpoolCode,
+                        TypeCode = ContainerType.ContainerType_Spool.ToString(),
+                        PrintQty = 1,
+                        IsStop = 0,
+                        WarehouseId = 0,
+                        WeightQty = 0,
+                        AddWho = "wms",
+                        AddTime = DateTime.Now
+                    };
+                    //新加载具信息
+                    if (!_baseContinfo.Insert(insertcon))
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                        res.ResMsg = "工字轮载具初始化失败";
+                        return res;
+                    }
+                }
+
+                //物料
+                var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
+                if (mater == null)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
+                    res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
+                    return res;
+                }
+
+                //工字轮库存
+                var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spool.SpoolCode);
+                if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "该工字轮条码号已在库中,请检查工字轮条码号是否重复";
+                    return res;
+                }
+                if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
+                    return res;
+                }
+
+                //通过投入物料找到垛型编码
+                var stackDetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == spool.MatCode && p.IsStop == 0);
+                if (stackDetail == null)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = reqDto.SpoolGroup + "没有对应的垛型信息,物料编码" + spool.MatCode;
+                    return res;
+                }
+                //获取垛型主表
+                var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackDetail.BomSetHdrId && p.IsStop == 0);
+                stackHeaderSet.Add(stack);
+            }
+
+            if (stackHeaderSet.GroupBy(x=>x.Id).Count()!=1)
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "扫描托盘不属于同一个垛型,请手动处理后重新组盘";
+                return res;
+            }
+
+            #endregion
+
+            var stackHeader = stackHeaderSet.First();
+
+          
+
+            try
+            {
+                _db.BeginTran();
+
+                #region 删除所有工字轮信息,并创建新信息
+
+                _billInvinitrepository.Delete(x => SpoolNoGroup.Contains(x.ContGrpBarCode));
+                _billSpoolTransrepository.Delete(x => SpoolNoGroup.Contains(x.ConBarCode));
+                var materiel = _basematerrepository.GetSingle(p => p.Code == stackHeader.ProMaterCode);
+                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "1"); //TODO:1换成满托平库满盘Code
+                var barInfoList = new List<BillInvinit>();
+                var invNowList = new List<BillInvnow>();
+                var invFlowList=new List<BillInvflow>();
+                foreach (var spool in reqDto.SpoolGroup)
+                {
+                    var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
+                    //工字轮需要用到的托盘类型
+                    var fJPalletType = FJPalletType.Pallet09;
+                    if (spool.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;
+                    var barinfo = InitInvinitInfo(spool, wareHouse, stackHeader, mater, materiel, fJPalletType);
+                    barInfoList.Add(barinfo);
+                    //删除因异常导致残留的对应库存信息
+                    _billInvnowrepository.Delete(x => x.ContGrpBarCode == barinfo.ContGrpBarCode || x.HWBarCode == barinfo.ContGrpBarCode);
+                    
+                    //将条码表映射到库存表
+                    var invnow = _mapper.Map<BillInvnow>(barinfo);
+                    invnow.IsTorsChk = true;
+                    invnow.AddTime = DateTime.Now;
+                    invnow.InvStateCode = FJInvState.InvEcecState_BuildUp.ToString();
+                    invnow.ContGrpBarCode = reqDto.TrayCode;
+                    invnow.Id = IdFactory.NewId();
+                    invnow.WarehouseId = wareHouse.Id;
+                    invNowList.Add(invnow);
+                    
+                }
+                if (!_billInvinitrepository.InsertRange(barInfoList))
+                {
+                    _db.RollbackTran();
+                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                    res.ResMsg = "重绕满托存储条码信息失败";
+                    return res;
+                }
+                if (!_billInvnowrepository.InsertRange(invNowList))
+                {
+                    _db.RollbackTran();
+                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                    res.ResMsg = "重绕满托存储库存信息失败";
+                    return res;
+                }
+                if (!_billInvflow.InsertRange(invFlowList))
+                {
+                    _db.RollbackTran();
+                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                    res.ResMsg = "重绕满托存储库存流水信息失败";
+                    return res;
+                }
+                //创建入库记录
+                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
+                {
+                    BusType = FJTaskBusType.重绕满托入库.GetDescription(),
+                    ContGrpBarCode = reqDto.TrayCode,
+                    Qty = 1,
+                    Floor = 1,
+                    MatCode = "",
+                    EquCode = "",
+                    Type = TaskType.EnterDepot,
+                    DocCode = "",
+                    WorkBench = "",
+                    WarehouseCode = wareHouse.Code,
+                };
+
+                //下发wcs任务 - 分解方法
+                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest,"A" , true);
+                if (taskRes.ResCode != 200)
+                {
+                    _db.RollbackTran();
+                    res.ResCode = taskRes.ResCode;
+                    res.ResMsg = taskRes.ResMsg;
+                    return res;
+                }
+
+                _db.CommitTran();
+                #endregion
+            }
+            catch (Exception e)
+            {
+                _db.RollbackTran();
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = e.Message;
+                return res;
+            }
+
+            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
+            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
+            return res;
+        }
+
+        /// <summary>
+        ///  创建退料任务
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto)
+        {
+            var res = new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
+
+            //获取工字轮任务信息
+            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
+            if (taskInfo != null)
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
+                return res;
+            }
+
+            //托盘
+            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
+            if (container == null)
+            {
+                var insertcon = new BaseContinfo()
+                {
+                    ContBarCode = reqDto.TrayCode,
+                    Name = reqDto.TrayCode,
+                    TypeCode = ContainerType.ContainerType_Spool.ToString(),
+                    PrintQty = 1,
+                    IsStop = 0,
+                    WarehouseId = 0,
+                    WeightQty = 0,
+                    AddWho = "wms",
+                    AddTime = DateTime.Now
+                };
+                //新加载具信息
+                if (!_baseContinfo.Insert(insertcon))
+                {
+                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    res.ResMsg = "托盘载具初始化失败";
+                    return res;
+                }
+            }
+
+            //托盘库存
+            var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
+            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
+                return res;
+            }
+            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
+                return res;
+            }
+
+            try
+            {
+                _db.BeginTran();
+
+                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "1"); //TODO:1换成退料平库满盘Code
+
+                //创建入库记录
+                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
+                {
+                    BusType = FJTaskBusType.帘线退料重绕.GetDescription(),
+                    ContGrpBarCode = reqDto.TrayCode,
+                    Qty = 1,
+                    Floor = 1,
+                    MatCode = "",
+                    EquCode = "",
+                    Type = TaskType.EnterDepot,
+                    DocCode = "",
+                    WorkBench = reqDto.LocCode,
+                    WarehouseCode = wareHouse.Code,
+                };
+
+                //下发wcs任务 - 分解方法
+                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);
+                if (taskRes.ResCode != 200)
+                {
+                    _db.RollbackTran();
+                    res.ResCode = taskRes.ResCode;
+                    res.ResMsg = taskRes.ResMsg;
+                    return res;
+                }
+                _db.CommitTran();
+            }
+            catch (Exception e)
+            {
+                _db.RollbackTran();
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = e.StackTrace;
+                return res;
+            }
+
+            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
+            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
+            return res;
+        }
+
         public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)
         {
             var res = new SRes();
@@ -1508,7 +1847,6 @@ namespace wms.service.Service
             {
                 _logger.LogInformation(reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode);
                 _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);
-                _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);
                 _billSpoolTransrepository.Delete(x => x.ConBarCode == billSpoolTrans.ConBarCode);
                 _logger.LogInformation($"找不到垛形信息时删除缓存信息{billSpoolTrans.ConBarCode}");
                 var task = _taskrepository.GetSingle(x => x.BarCode == billSpoolTrans.ConBarCode);
@@ -3575,184 +3913,6 @@ namespace wms.service.Service
             return res;
         }
 
-        /// <summary>
-        /// 分配分拣库
-        /// </summary>
-        /// <param name="code">工字轮条码</param>
-        /// <returns></returns>
-        public SRes AllocationWarehouseSort(string code)
-        {
-            //开始分配分拣库
-            var res = new SRes();
-            //找到码垛工字轮信息
-            var spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
-            if (spoolTrans == null)
-            {
-                //创建容器信息
-                var cont = new BillSpoolTrans
-                {
-                    ConBarCode = code,
-                    AddWho = "WMS",
-                    AddTime = DateTime.Now,
-                    WorkOrder = "20230210",
-                    MatCode = "shilatest01"
-                };
-                //加载新的容器信息
-                if (!_billSpoolTransrepository.Insert(cont))
-                {
-                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
-                    res.ResMsg = "RFID载具初始化失败";
-                    return res;
-                }
-                spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
-            }
-            if (!spoolTrans.WarehouseCode.IsNullOrEmpty())
-            {
-                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
-                res.ResMsg = "已完成分库";
-                return res;
-            }
-
-            //验证容器是否存在
-            res = _mapper.Map<CopperLineResponse>(CheckContinfo(code, FJContainerType.ContainerType_IShapedWheel));
-            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
-
-            //验证任务信息
-            res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(code));
-            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
-
-            //验证是否条码信息
-            var invini = _billInvinitrepository.GetSingle(p => p.HWBarCode == code);
-            if (invini != null && invini.InvStateCode == FJInvState.InvEcecState_In.ToString())
-            {
-                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
-                res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复";
-                return res;
-            }
-            if (invini != null && invini.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
-            {
-                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
-                res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成";
-                return res;
-            }
-            if (invini != null)
-            {
-                res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();
-                res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();
-                return res;
-            }
-
-            //通过订单找到对应的机台信息
-            var macList = _basemachinforepository.GetList(p => p.WorkOrder == spoolTrans.WorkOrder);
-            var wareList = macList.Select(p => p.WarehouseCode).Distinct().OrderBy(v => v); //找到机台对应的仓库信息
-            if (!wareList.Any()) //当前订单没有对应仓库信息
-            {
-                _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
-                {
-                    ErrType = 1,
-                    ErrMsg = "没有配置机台信息",
-                    EditTime = DateTime.Now
-                }, p => p.ConBarCode == spoolTrans.ConBarCode);
-            }
-            else if (wareList.Count() == 1) //当前订单对应一个仓库信息
-            {
-                var sort = int.Parse(wareList.First().Substring(0, 1));
-                _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
-                {
-                    WarehouseCode = wareList.First(),
-                    WarehouseSort = sort,
-                    Direct = wareList.First().Substring(1, 1),
-                    EditTime = DateTime.Now
-                }, p => p.ConBarCode == spoolTrans.ConBarCode);
-                spoolTrans.WarehouseCode = wareList.First();
-                spoolTrans.WarehouseSort = sort;
-                spoolTrans.Direct = wareList.First().Substring(1, 1);
-            }
-            else //当前订单对应多个仓库信息
-            {
-                //TODO:怎么计算当前订单在当前仓库需要码多少托,跟据当前仓库已有订单需要的托盘数量计算各订单在可用码垛工位占比,再计算当前托盘该码什么跺
-                var wareTempList = macList.Select(p => new { p.WarehouseCode, p.WorkOrder, p.BillCode, }).Distinct();
-                var wareHouseList = _basewarehouserepository.GetList().Select(p => p.Id);
-                foreach (var warehouse in wareHouseList)
-                {
-                    //var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p == warehouse);
-                    //getMatProport(spoolTrans.MatCode, warehouse);
-                }
-            }
-
-            //TODO:此处条码号应当使用材料号,测试时使用条码
-            var barInfo = _billInvinitrepository.GetSingle(p => p.HWBarCode == code);
-            if (barInfo == null)
-            {
-                var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == spoolTrans.WarehouseCode);
-                barInfo = new BillInvinit
-                {
-                    InvBarCode = code,
-                    WarehouseId = wareHosue.Id,
-                    HWBarCode = code,
-                    ExecStateCode = FJInvLockState.InvState_Normal.GetDescription(),
-                    ExecDocsTypeCode = FJDocType.FullWheelPalletizing.GetDescription(),
-                    InvInOut = FJInvInOutType.In,
-                    ExecWho = "WCS",
-                    EditTime = DateTime.Now,
-                    InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),
-                    SuppCode = "",
-                    Size = 1,
-                    MatCode = spoolTrans.MatCode,
-                    AddTime = DateTime.Now,
-                };
-                _billInvinitrepository.InsertReturnEntity(barInfo);
-            }
-
-            //开始生成WCS
-            var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
-            {
-                BusType = FJTaskBusType.二楼组盘.GetDescription(),
-                ContGrpBarCode = code,
-                Qty = 1,
-                WarehouseCode = spoolTrans.WarehouseCode,
-                Floor = 2,
-                MatCode = spoolTrans.MatCode,
-                EquCode = "Robot",
-                Type = TaskType.SetPlate,
-                DocCode = spoolTrans.WorkOrder
-            };
-
-            //下发wcs任务 - 分解方法
-            var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);
-            if (taskRes.ResCode != 200)
-            {
-                res.ResCode = taskRes.ResCode;
-                res.ResMsg = taskRes.ResMsg;
-                return res;
-            }
-            RedisHelper.Set($"AllocationWarehouseSort:{code}", JsonConvert.SerializeObject(new MainlineDiversion
-            {
-                TaskId = taskRes.ResData.ID,
-                WarehouseCode = spoolTrans.WarehouseCode
-            }));
-            return res;
-        }
-
-        /// <summary>
-        ///  计算物料在该仓库的比例
-        /// </summary>
-        /// <param name="matcode">物料编号</param>
-        /// <param name="warehouseId"></param>
-        /// <returns></returns>
-        public decimal getMatProport(string matcode, long warehouseId)
-        {
-            //计算此仓库所有该物料的量 已组盘/已入库
-            var stackLisk = _billInvnowrepository.AsQueryable()
-                                                 .Count(v => v.WarehouseId == warehouseId
-                                                          && v.MatCode == matcode
-                                                          && (v.ExecStateCode == FJInvState.InvEcecState_BuildUp.ToString() || v.ExecStateCode == FJInvState.InvEcecState_In.ToString()));
-
-            //每的单子(每盘的数量)
-            //var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseId == warehouseId);
-            return 0;
-        }
-
         #endregion 满轮主线
 
         #region 环形库
@@ -4899,102 +5059,6 @@ namespace wms.service.Service
             return res;
         }
 
-        /// <summary>
-        ///  计算出库任务
-        /// </summary>
-        public void CalculateOutBoundTasks()
-        {
-            //获取所有的环形库有货库位信息
-            var wareCellList = _basewarecellrepository.GetList(x => x.WarehouseCode.Contains("R") && x.StateNum == FjLocationState.Full).GroupBy(x => x.WarehouseId);
-
-            foreach (var wareCells in wareCellList)
-            {
-                //获取当前仓库对应的订单所有的订单
-                var docs = _billdocrepository.GetList(x => x.IsStop == 0 && wareCells.Key == x.WarehouseId);
-                foreach (var doc in docs) //开始处理当前仓库每个订单相关信息
-                {
-                    //找到对应的垛形信息
-                    var bomSetGrp = _BillBomsetgrpRepository.GetSingle(x => doc.SetGrpCode == x.Code);
-                    var bomSetGrpInfo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomSetGrp.Id);
-
-                    //是否可以码垛,默认可以码垛
-                    var isPalletize = true;
-
-                    #region 计算当前垛形需要的货物是否已满足数量
-
-                    var bomSetGrpMatCodes = bomSetGrpInfo.Select(x => x.MatCode).ToList();
-                    foreach (var matCode in bomSetGrpMatCodes)
-                    {
-                        var wareCellSum = wareCells.Count(x => matCode == x.ContGrpBarCode);
-                        if (wareCellSum == bomSetGrpInfo.Count(x => x.MatCode == matCode)) continue;
-                        isPalletize = false;
-                        //TODO:暂时未计算物料超时处理方案
-                        break;
-                    }
-
-                    #endregion 计算当前垛形需要的货物是否已满足数量
-
-                    //开始计算出库任务
-                    if (isPalletize)
-                    {
-                        //TODO:货物序号暂不做处理直接使用累计数值
-                        short index = 1;
-                        //开始为各种物料生成对应的出库任务
-                        try
-                        {
-                            _db.BeginTran();
-
-                            foreach (var matCode in bomSetGrpMatCodes)
-                            {
-                                #region 生成这种物料所需要的出库任务信息
-
-                                var sum = bomSetGrpInfo.Count(x => x.MatCode == matCode);
-                                var cells = wareCells.Where(x => x.ContGrpBarCode == matCode)
-                                    .OrderBy(x => x.Col)
-                                    .ThenBy(x => x.Layer)
-                                    .ThenBy(x => x.Depth)
-                                    .Take(sum);
-                                foreach (var cell in cells)
-                                {
-                                    //更新货位信息
-                                    _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = FjLocationState.StockOut }, p => p.Id == cell.Id);
-                                    //更新库存信息
-                                    var sotck = _billInvnowrepository.GetSingle(x => x.ContGrpBarCode == cell.ContGrpBarCode);
-                                    _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.HWBarCode == cell.ContGrpBarCode);
-                                    //更新流水信息
-                                    var invflow = _mapper.Map<BillInvflow>(sotck);
-                                    invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
-                                    invflow.AddTime = DateTime.Now;
-                                    invflow.Id = IdFactory.NewId();
-                                    _billInvflow.Insert(invflow);
-                                    //添加出库任务
-                                    RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest()
-                                    {
-                                        ContGrpBarCode = cell.ContGrpBarCode,
-                                        CellNo = cell.Code,
-                                        EquCode = "",
-                                        Floor = 2,
-                                        ProdLine = index,
-                                        //Qty = sotck.LengthQty,
-                                        //Tunnel = temploc.Tunnel.ToString(),
-                                        WarehouseCode = cell.WarehouseCode,
-                                        BusType = FJTaskBusType.环形库出库码垛任务
-                                    });
-                                    index++;
-                                }
-
-                                #endregion 生成这种物料所需要的出库任务信息
-                            }
-                        }
-                        catch (Exception e)
-                        {
-                            _db.CommitTran();
-                        }
-                    }
-                }
-            }
-        }
-
         /// <summary>
         ///  环形库创建WCS出库任务
         /// </summary>
@@ -5695,6 +5759,162 @@ namespace wms.service.Service
 
         #region 巷道及货位分配
 
+        /// <summary>
+        ///  获取平库可用货位
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        public SRes<FJApplyStockInLocResponse> FindAvailableFlatStorageSlot(FJApplyStockInLocRequest reqEntity)
+        {
+            var res = new SRes<FJApplyStockInLocResponse>()
+            {
+                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
+                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
+                ResData = new FJApplyStockInLocResponse()
+            };
+
+            //检擦任务是否异常
+            var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
+            if (wcstask == null)
+            {
+                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
+                return res;
+            }
+            if (wcstask.Type == TaskType.OutDepot)
+            {
+                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;
+                return res;
+            }
+            if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "SRM")//如果目标地址不是堆垛机
+            {
+                res.ResData.TunnelNum = wcstask.Tunnel;
+                res.ResData.CellNo = wcstask.AddrTo;
+                return res;
+            }
+
+            //验证仓库信息
+            var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
+            if (warehouse == null)
+            {
+                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
+                return res;
+            }
+
+            //验证库存
+            var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode.Trim() && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
+            if (stock == null)
+            {
+                if (wcstask.BusType == FJTaskBusType.帘线退料重绕.GetDescription())
+                {
+                    var nov = new BillInvnow()
+                    {
+                        WarehouseId = warehouse.Id,
+                        ContGrpBarCode = wcstask.BarCode,
+                        ContGrpId = IdFactory.NewId(),
+                        BoxBarCode = "",
+                        InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
+                        ExecStateCode = InvLockState.InvState_Normal.ToString(),
+                        MatId = default,
+                        MatCode = "",
+                        MatName = "",
+                        RFIDBarCode = wcstask.BarCode,
+                        HWBarCode = wcstask.BarCode,
+                        HWTypeCode = "",
+                        InvInOut = FJInvInOutType.In,
+                        Size = 1,
+                        ContGrpType = FJContGrpType.EmptyPal,
+                        LengthQty = 0 //存放托盘数量
+                    };
+                    _db.BeginTran();
+                    _billInvnowrepository.Insert(nov);
+                    _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));
+                    _db.CommitTran();
+
+                }
+                else
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有库存信息";
+                    return res;
+                }
+            }
+
+            //预留货位数量
+            var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
+                                                                && p.StateNum == FjLocationState.Empty
+                                                                && p.TypeNum == FjLocationType.Storage
+                                                                && p.WarehouseId == warehouse.Id);
+
+            //找到可用货位
+            var loc1ist = _basewarecellrepository.Context
+                         .Queryable<BaseWarecell>()
+                         .Where((loc1) => loc1.IsStop == 0
+                                            && loc1.StateNum == FjLocationState.Empty
+                                            && loc1.TypeNum == FjLocationType.Storage
+                                            && loc1.Tunnel == reqEntity.TunnelNum
+                                            && loc1.WarehouseId == warehouse.Id
+                                            && loc1.Depth == 1)
+                         .Where((loc1) => loc1.Tunnel == reqEntity.TunnelNum)
+                         .Select((loc1) => new
+                         {
+                             loc1.Code,
+                             loc1.Id,
+                             loc1.Row,
+                             loc1.Col,
+                             loc1.Layer,
+                             loc1.Tunnel,
+                         }).ToList();
+
+            if (loc1ist.Any())
+            {
+                var resloc = loc1ist.ToList().OrderBy(x=>x.Code).First();
+                res.ResData.TunnelNum = resloc.Tunnel.ToString();
+                res.ResData.WarehuoseId = warehouse.Id;
+                res.ResData.CellNo = resloc.Code;
+                res.ResData.Row = resloc.Row;
+                res.ResData.Colomn = resloc.Col;
+                res.ResData.Layer = resloc.Layer;
+
+                try
+                {
+                    _db.BeginTran();
+                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(x => x.Id == wcstask.Id).SplitTable(x => x.Take(2)).First();
+
+                    //更新货位
+                    _basewarecellrepository.UpdateModelColumns(
+                        p => new BaseWarecell()
+                        {
+                            StateNum = FjLocationState.StockIn,
+                            ContGrpBarCode = "",
+                            ContGrpId = 0,
+                            EditTime = DateTime.Now
+                        },
+                        p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);
+                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld()
+                    {
+                        AddrTo = res.ResData.CellNo
+                    }, x => x.Id == task.Id);
+
+                    _db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    _db.RollbackTran();
+                    _logger.LogInformation(ex.ToString());
+                }
+
+                return res;
+            }
+
+            res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+            res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
+
+            return res;
+        }
+
         /// <summary>
         /// 分配货位
         /// </summary>