zhaowc
5 小时以前 7150774e3fe4ac65653235f46d29eef0bfca2fcb
Wms/WMS.BLL/BllTransServer/HopperTransportServer.cs
@@ -159,13 +159,14 @@
        /// <param name="palletStatus"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<string> GetSkuByStatus(string palletStatus)
        public List<DataStockDetail> GetSkuByStatus(string palletStatus)
        {
            try
            {
                //获取储位上的库存物料
                var detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LocatNo) && m.PalletStatus == palletStatus).Select(m=>m.SkuNo).Distinct().ToList();
                return detail;
                var detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LocatNo) && m.PalletStatus == palletStatus).ToList();
                List<DataStockDetail> result = detail.GroupBy(x => x.SkuNo).Select(xx => xx.First()).ToList();
                return result;
            }
            catch (Exception e)
            {
@@ -191,12 +192,14 @@
            }
        }
        public List<string> GetSku()
        public List<SysMaterials> GetSku()
        {
            try
            {
                //获取储位上的库存物料
                var detail = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" ).Select(m => m.SkuNo).Distinct().ToList();
                //var detail = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" ).Select(m => m.SkuNo).Distinct().ToList();
                var detail = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
                return detail;
            }
            catch (Exception e)
@@ -221,6 +224,7 @@
        {
            try
            {
                string type = "2";//模板类型
                #region 判断
                if (string.IsNullOrWhiteSpace(areaNo) || string.IsNullOrWhiteSpace(endLocate) || string.IsNullOrWhiteSpace(plnStatus) )
@@ -237,6 +241,7 @@
                {
                    throw new Exception("满桶请选择物料与批次");
                }
                //判断目标叫料储位状态
                var endLocateInfo = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == endLocate && m.AreaNo == areaNo);
                if (endLocateInfo == null)
@@ -264,17 +269,32 @@
                    throw new Exception("没有查询到仓库信息");
                }
                //查找状态是未分配且储位不为空的库存信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.Status == "0" && m.WareHouseNo == house.WareHouseNo && !string.IsNullOrWhiteSpace(m.LocatNo)).ToList();
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.Status == "0" && m.WareHouseNo == house.WareHouseNo && !string.IsNullOrWhiteSpace(m.LocatNo) && m.IsDel=="0").ToList();
                //净桶
                if (plnStatus == "0")
                if (plnStatus == "0")  //4L叫净桶不分楼层
                {
                    stockDetail = stockDetail.Where(m => m.PalletStatus == "0" && m.Standard == standard).OrderBy(m => m.LocatNo).ToList();
                    if (house.WareHouseNo == "M01")
                    {
                        stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.Status == "0" && m.PalletStatus == "0" && m.WareHouseNo == "M01" && m.Standard == standard && !string.IsNullOrWhiteSpace(m.LocatNo)).OrderBy(m => m.LocatNo).ToList();
                        if (stockDetail.Count() == 0)
                        {
                            stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.Status == "0" && m.PalletStatus == "0" && m.Standard == standard && !string.IsNullOrWhiteSpace(m.LocatNo)).OrderBy(m => m.LocatNo).ToList();
                        }
                    }
                    else
                    {
                        stockDetail = stockDetail.Where(m => m.IsDel == "0" && m.Status == "0" && m.PalletStatus == "0" && m.Standard == standard && !string.IsNullOrWhiteSpace(m.LocatNo)).OrderBy(m => m.LocatNo).ToList();
                    }
                }
                //满桶
                else if (plnStatus == "2") 
                {
                    stockDetail = stockDetail.Where(m => m.PalletStatus == "2" && m.SkuNo == skuNo && m.LotNo == lotNo).OrderBy(m => m.LocatNo).ToList();
                    stockDetail = stockDetail.Where(m => m.PalletStatus == "2" && m.SkuNo == skuNo && m.LotNo == lotNo && m.InspectStatus == "1").OrderBy(m => m.LocatNo).ToList();
                }
                else
                {
@@ -292,25 +312,47 @@
                bool resultYi = false;
                #region#查找合适的 桶号 储位
                //目标仓库所有储位
                var locatList = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.WareHouseNo == house.WareHouseNo).ToList();
                //目标仓库所有不需要移库的储位
                var locatListWai = locatList.Where(w => string.IsNullOrEmpty(w.AisleOne)).Select(s => s.LocatNo);
                //先找不需要移库的桶
                var palletModel = stockDetail.Where(w => locatListWai.Contains(w.LocatNo)).OrderBy(o => o.UpdateTime).FirstOrDefault();
                if (palletModel == null)
                var locatList = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Flag=="0" && w.WareHouseNo == house.WareHouseNo).OrderBy(w=>w.Column).ToList();
                //目标仓库所有最外侧的储位
                var locatListWai = locatList.Where(w => string.IsNullOrEmpty(w.AisleOne) && w.Flag == "0").Select(s => s.LocatNo);
                var locatListNei = locatList.Where(w => !string.IsNullOrEmpty(w.AisleOne) && w.Flag == "0").Select(s => s.LocatNo);
                var palletModel = new DataStockDetail();
                if (plnStatus == "0") //净桶获取库位
                {
                    //找需要移库的桶
                    palletModel= stockDetail.Where(w => !locatListWai.Contains(w.LocatNo)).OrderBy(o => o.UpdateTime).FirstOrDefault();
                    //先找不需要移库的桶
                    palletModel = stockDetail.Where(w => locatListWai.Contains(w.LocatNo) && w.Status == "0" && w.Standard == standard).OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                    if (palletModel == null)
                    {
                        throw new Exception("未找到对应桶信息");
                        //找需要移库的桶
                        palletModel = stockDetail.Where(w => locatListNei.Contains(w.LocatNo) && w.Standard == standard).OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                        if (palletModel == null)
                        {
                            throw new Exception("未找到对应桶信息");
                        }
                        resultYi = YikuTask(palletModel.PalletNo, taskNo, url, bindUrl);
                    }
                    resultYi = YikuTask(palletModel.PalletNo, taskNo, url,bindUrl);
                }
                else   //满桶获取库位
                {
                    //先找不需要移库的桶
                    palletModel = stockDetail.Where(w => locatListWai.Contains(w.LocatNo) && w.Status == "0").OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                    if (palletModel == null)
                    {
                        //找需要移库的桶
                        palletModel = stockDetail.Where(w => locatListNei.Contains(w.LocatNo)).OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                        if (palletModel == null)
                        {
                            throw new Exception("未找到对应桶信息");
                        }
                        resultYi = YikuTask(palletModel.PalletNo, taskNo, url, bindUrl);
                    }
                }
                palletModel.Status = "2";
                Db.Updateable(palletModel).ExecuteCommand();
                #endregion
                //起始储位地址信息
                var startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.Status == "1" && w.LocatNo == palletModel.LocatNo);
                var startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletModel.LocatNo);
                if (startLoction == null)
                {
                    throw new Exception($"起始目标储位信息不存在,桶号:{palletModel.LocatNo}");
@@ -320,6 +362,12 @@
                {
                    taskNo = taskNo + "-1";
                }
                //检验当前托盘是否有任务未完成
                var checkTask = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "1" || w.Status == "0") && w.PalletNo == palletModel.PalletNo);
                if (checkTask != null)
                {
                    throw new Exception("当前托盘有正在执行的任务!");
                }
                //添加任务
                var logTaskEntry = new LogTask
                {
@@ -328,9 +376,9 @@
                    Receiver = "RCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = "",//起始位置
                    StartLocat = startLoction.LocatNo,//起始位置
                    EndLocat = endLocate,//目标位置
                    PalletNo = "",//托盘码
                    PalletNo = palletModel.PalletNo,//托盘码
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
@@ -341,6 +389,12 @@
                    CreateTime = DateTime.Now
                };
                Db.Insertable(logTaskEntry).ExecuteCommand();
                var endtype = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == endLocate);
                if (plnStatus == "2" && endtype.Layer == 3)
                {
                    type = "1";    //不记货架模板
                }
               
                //没有产生移库任务就直接给小车下发出库任务,若产生移库任务等小车把移库的桶抬起时再下发出库任务
                if (!resultYi)
@@ -352,14 +406,14 @@
                        Startport = palletModel.LocatNo,//起始位置
                        Endport = endLocate,//目标位置
                        Pallno = palletModel.PalletNo,//桶号
                        Crtype = "1",//叫桶
                        Crtype = type,//叫桶
                    };
                    string agvMsg = string.Empty;
                    //给下车下发任务
                    logTaskEntry.SendDate = DateTime.Now;//发送时间
                    //下发载具类型
                    var bind = RcsHelper.BindPalletAndSite(palletModel.PalletNo, palletModel.LocatNo, url, out string agvBindMsg);
                    var bind = RcsHelper.BindPalletAndSite(palletModel.PalletNo, palletModel.LocatNo, bindUrl, out string agvBindMsg);
                    if (bind)
                    {
                        var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
@@ -371,7 +425,7 @@
                            //logTaskEntry.IsCancel = 0;
                            logTaskEntry.BackDate = DateTime.Now;
                            logTaskEntry.Status = "1";//正在执行
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            Db.Updateable(logTaskEntry).ExecuteCommand();
                            startLoction.Status = "3";//出库中
                            Db.Updateable(startLoction).ExecuteCommand();
@@ -381,16 +435,12 @@
                        }
                        else//失败
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            throw new Exception("桶号:"+ task.Pallno + ",调度小车失败");
                        }
                    }
                    else 
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = "货架与货位绑定失败,原因:"+agvBindMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                    }
                   
                }
@@ -421,11 +471,16 @@
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(areaNo) || string.IsNullOrWhiteSpace(StartLocate) || string.IsNullOrWhiteSpace(plnStatus))
                {
                    throw new Exception("区域/起始位/桶类型不能为空");
                }
                if (weight < 0)
                {
                    throw new Exception("重量应不小于0");
                }
                //if (plnStatus == "0" && string.IsNullOrWhiteSpace(standard))
@@ -442,11 +497,12 @@
                Db.BeginTran();
                //桶信息
                var pln = Db.Queryable<SysPallets>().First(w => w.IsDel == "0" && w.PalletNo == plnNo);
                var pln = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == StartLocate && w.AreaNo == areaNo);
                if (pln == null)
                {
                    throw new Exception("未查询到桶信息");
                }
                plnNo = pln.PalletNo;
                //起始储位信息
                var startLoction = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.AreaNo == areaNo && m.LocatNo == StartLocate);
@@ -461,10 +517,6 @@
                        throw new Exception("没有查询到物料信息");
                    }
                    skuName = sku.SkuName;
                }
                else if (plnStatus == "3")
                {
                }
                //目标楼层
                var layer = startLoction.Layer;
@@ -502,30 +554,37 @@
                        CompleteTime = DateTime.Now,
                        PalletStatus = plnStatus,
                        Status = "0",
                        Status = "2",
                        InspectMark = "0",
                        BitPalletMark = "0",
                        InspectStatus = "1",
                        InspectStatus = "0",
                    };
                    Db.Insertable(stockDetailNew).ExecuteCommand();
                    Db.Updateable(stockDetailNew).ExecuteCommand();
                }
                else
                {
                    stockDetail.PalletStatus = plnStatus;
                    stockDetail.SkuNo = skuNo;
                    stockDetail.SkuName = skuName;
                    stockDetail.LotNo = lotNo;
                    stockDetail.Qty = weight;
                    stockDetail.Status = "2";
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                //分配储位
                var endLocatInfo = GetLocatModel(house.WareHouseNo, plnStatus, skuNo, pln.Standard);//目标储位
                var endLocatInfo = GetLocatModel(house.WareHouseNo, plnStatus, startLoction.WareHouseNo, skuNo, pln.Standard,lotNo);//目标储位
                //没有可用空储位
                if (endLocatInfo == null)
                {
                    throw new Exception("没有找到合适的目标储位");
                }
                //检验当前托盘是否有任务未完成
                var checkTask = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "1" || w.Status == "0") && w.PalletNo == plnNo);
                if (checkTask != null)
                {
                    throw new Exception("当前托盘有正在执行的任务!");
                }
                var taskNo = new Common().GetMaxNo("TK");
                //添加任务
                var logTaskEntry = new LogTask
@@ -556,7 +615,7 @@
                    Startport = StartLocate,//起始位置
                    Endport = endLocatInfo.LocatNo,//目标位置
                    Pallno = plnNo,//桶号
                    Crtype = "1",//叫桶
                    Crtype = "2",//叫车模板
                };
                //调用AGV接口下发任务
                string agvMsg = string.Empty;
@@ -575,7 +634,7 @@
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        Db.Updateable(logTaskEntry).ExecuteCommand();
                        startLoction.Status = "3";//出库中
                        Db.Updateable(startLoction).ExecuteCommand();
@@ -585,17 +644,13 @@
                    }
                    else//失败
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = agvMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        throw new Exception("桶号:" + task.Pallno + ",调度小车失败");
                    }
                }
                else
                {
                    logTaskEntry.IsSuccess = 0;
                    logTaskEntry.Information = "货架与货位绑定失败,原因:"+agvBindMsg;
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                }
                
@@ -618,7 +673,7 @@
        /// <param name="comeFrom"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void RCSFinishTask(string taskNo, string status, string comeFrom, int userId = 0)
        public void RCSFinishTask(string taskNo, string locateNo, string status, string comeFrom, int userId = 0)
        {
            try
            {
@@ -634,10 +689,10 @@
                {
                    throw new Exception($"任务号为:{taskNo}的任务不存在!");
                }
                if (taskInfo.Status != "1" && comeFrom != "WMS")
                {
                    throw new Exception($"任务号为:{taskNo}的任务状态异常");
                }
                //if (taskInfo.Status != "0" && comeFrom != "WMS")
                //{
                //    throw new Exception($"任务号为:{taskNo}的任务状态异常");
                //}
                #endregion
                //开启事务
                Db.BeginTran();
@@ -658,7 +713,7 @@
                    return;
                }
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo);
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo && w.IsDel=="0");
                if (stockDetail == null)
                {
                    throw new Exception($"桶库存信息不存在");
@@ -669,18 +724,37 @@
                {
                    throw new Exception($"起始储位信息不存在");
                }
                startLocatInfo.Status = "0";//空储位
                //修改起始储位状态
                Db.Updateable(startLocatInfo).ExecuteCommand();
                //startLocatInfo.Status = "0";//空储位
                ////修改起始储位状态
                //Db.Updateable(startLocatInfo).ExecuteCommand();
                //目标储位信息
                //任务表中目标储位信息
                var endLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
                if (endLocatInfo == null)
                {
                    throw new Exception($"目标储位信息不存在");
                }
                endLocatInfo.Status = "1";//有物品
                //AGV小车返回实际存放目标储位
                var trueLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == locateNo && w.IsDel == "0");
                if (trueLocatInfo == null)
                {
                    throw new Exception($"小车放货储位信息不存在");
                }
                if (endLocatInfo.LocatNo != trueLocatInfo.LocatNo)
                {
                    //不一致时以小车放货储位为准
                    endLocatInfo = trueLocatInfo;
                    //var tasklocat = Db.Queryable<LogTask>().First(w => w.EndLocat == trueLocatInfo.LocatNo && (w.Status == "0" || w.Status == "1") && w.IsDel == "0");
                    //if (tasklocat == null)
                    //{
                    //    trueLocatInfo.Status = "0";
                    //    Db.Updateable(trueLocatInfo).ExecuteCommand();
                    //}
                }
                //修改目标储位状态
                endLocatInfo.Status = "1";//有物品
                endLocatInfo.UpdateTime = DateTime.Now;//更新时间
                Db.Updateable(endLocatInfo).ExecuteCommand();
                //目标储位所属区域
@@ -702,7 +776,7 @@
                }
                else if (endAreaInfo.Type == "1")//满桶区
                {
                    stockDetail.PalletStatus = "1";
                    stockDetail.PalletStatus = "2";
                    stockDetail.Status = "0";//待分配
                }
                else if (endAreaInfo.Type == "2")//脏桶区
@@ -764,6 +838,38 @@
                {
                    throw new Exception("非叫料状态");
                }
                switch (deviceStation)
                {
                    case "input"://叫脏桶
                        switch (deviceID)
                        {
                            case "2001":
                                deviceID = "1001";
                                break;
                            case "2002":
                                deviceID = "1003";
                                break;
                            default:
                                throw new Exception("叫脏桶点位异常");
                        }
                        break;
                    case "output"://叫车拉净桶
                        switch (deviceID)
                        {
                            case "2001":
                                deviceID = "1002";
                                break;
                            case "2002":
                                deviceID = "1004";
                                break;
                            default:
                                throw new Exception("叫净桶点位异常");
                        }
                        break;
                    default:
                        throw new Exception("叫料类型异常");
                }
                //通过设备号查找到所属设备(区域)
                var deviceInfo = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.DeviceCode == deviceID);
                if (deviceInfo == null)
@@ -775,6 +881,8 @@
                var startLoction = new SysStorageLocat();//起始储位信息
                var endLoction = new SysStorageLocat();//目标储位信息
                var palletModel = new DataStockDetail();//分配桶信息
                string locatno = "";
                string type = "";//叫料类型
                //开启事务
                Db.BeginTran();
@@ -783,70 +891,176 @@
                switch (deviceStation)
                {
                    case "input"://叫脏桶
                        //叫桶设备所在储位信息(目标储位)
                        endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                        if (deviceID == "1001" || deviceID == "1003")
                        {
                            type = "3";
                            //叫桶设备所在储位信息(目标储位)
                            endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                        // 所有待分配的脏桶
                        var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.Status == "0" && w.PalletStatus == "3");
                        //优先查找脏桶缓存车间
                        palletModel = stockDetail.Where(w => w.AreaNo == "C43").OrderByDescending(o => o.UpdateTime).First();
                        if (palletModel == null)//脏桶缓存车间没有脏桶,再从三楼中间站脏桶区查找
                        {
                            palletModel = stockDetail.Where(w =>w.WareHouseNo=="M16" && w.AreaNo == "C26").OrderByDescending(o => o.UpdateTime).First();
                            // 所有待分配的脏桶
                            var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.Status == "0" && w.PalletStatus == "3").OrderByDescending(w => w.UpdateTime).ToList();
                            //判断当前清洗机设备上有几个脏桶,status:2 正在清洗的脏桶(状态触发变更为AGV叫第2个脏桶时触发)
                            int ztQty = Db.Queryable<DataStockDetail>().Count(w => w.IsDel == "0" && w.Status == "2" && w.LocatNo == deviceID);
                            if (ztQty == 2)
                            {
                                throw new Exception((deviceID == "1001"?"1":"2") + "号清洗机脏桶已满,重复叫料!");
                            }
                            //先查看叫料设备位是否有脏桶
                            if (endLoction.Status == "1")
                            {
                                //有脏桶的话,将更改此桶状态(代表此桶正在清洗中)
                                var qxStock = Db.Queryable<DataStockDetail>().Where(w => w.LocatNo == endLoction.LocatNo).First();
                                if (qxStock == null)
                                {
                                    throw new Exception("叫料位置状态错误");
                                }
                                qxStock.Status = "2";
                                //qxStock.UpdateTime = DateTime.Now;//清洗时间
                                Db.Updateable(qxStock).ExecuteCommand();
                                //更改设备储位状态为空储位
                                endLoction.Status = "0";
                                Db.Updateable(endLoction).ExecuteCommand();
                            }
                            //优先查找脏桶缓存车间
                            palletModel = stockDetail.Where(w => w.AreaNo == "C54").OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                            if (palletModel == null)//脏桶缓存车间没有脏桶,再从三楼中间站脏桶区查找
                            {
                                palletModel = stockDetail.Where(w => w.WareHouseNo == "M16" && w.AreaNo == "C26").OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                            }
                            if (palletModel == null)//三楼中间站脏桶区没有脏桶,再从四楼中间站脏桶区查找
                            {
                                palletModel = stockDetail.Where(w => w.WareHouseNo == "M01" && w.AreaNo == "C03").OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                            }
                            if (palletModel == null)
                            {
                                throw new Exception("无脏桶可分配");
                            }
                            //起始储位地址信息
                            startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.Status == "1" && w.LocatNo == palletModel.LocatNo);
                            if (startLoction == null)
                            {
                                throw new Exception($"起始目标储位信息不存在,桶号:{palletModel.LocatNo}");
                            }
                            //起始桶信息
                            var startDataDetil = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.Status == "0" && w.PalletStatus == "3" && w.PalletNo == palletModel.PalletNo);
                            if (startDataDetil == null)
                            {
                                throw new Exception($"清洗机所叫的桶状态错误,桶号:{palletModel.LocatNo}");
                            }
                            startDataDetil.Status = "4";
                            Db.Updateable(startDataDetil).ExecuteCommand();
                        }
                        if (palletModel == null)//三楼中间站脏桶区没有脏桶,再从四楼中间站脏桶区查找
                        else
                        {
                            palletModel = stockDetail.Where(w => w.WareHouseNo == "M01" && w.AreaNo == "C03").OrderByDescending(o => o.UpdateTime).First();
                        }
                        if (palletModel == null)
                        {
                            throw new Exception("无脏桶可分配");
                        }
                        //起始储位地址信息
                        startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.Status == "1" && w.LocatNo == palletModel.LocatNo);
                        if (startLoction == null)
                        {
                            throw new Exception($"起始目标储位信息不存在,桶号:{palletModel.LocatNo}");
                            throw new Exception("起始目标储位信息不存在");
                        }
                        break;
                    case "output"://净桶申请储位
                        //叫桶设备所在储位信息(起始储位)
                        startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                        //桶信息
                        palletModel = Db.Queryable<DataStockDetail>().Where(w => w.WareHouseNo==houseNo && w.AreaNo==deviceInfo.AreaNo && w.LocatNo==startLoction.LocatNo).First();
                        if (palletModel == null)
                        if (deviceID == "1002" || deviceID == "1004")
                        {
                            throw new Exception("未查询到净桶信息");
                            type = "4";
                            //叫桶设备所在储位信息(起始储位)
                            startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.AreaNo == deviceInfo.AreaNo);
                            //获取清洗机上第一次叫的脏桶
                            string locate = deviceID == "1002"?"1001":"1003";
                            palletModel = Db.Queryable<DataStockDetail>().Where(w => w.LocatNo == locate).OrderBy(o => o.UpdateTime).First();
                            if (palletModel == null)
                            {
                                throw new Exception("未找到库存中正在清洗的脏桶");
                            }
                            if (!string.IsNullOrEmpty(palletModel.LocatNo))
                            {
                                palletModel.LocatNo = startLoction.LocatNo;
                                palletModel.PalletStatus = "0";
                                palletModel.Status = "4";
                                Db.Updateable(palletModel).ExecuteCommand();
                            }
                            //分配储位
                            //查找所有净桶储位
                            var jtLocate = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0")
                                                .OrderBy(w => w.Row).OrderByDescending(w => w.Column).ToList();
                            if (jtLocate.Count == 0)
                            {
                                throw new Exception("没有空余的净桶储位");
                            }
                            //首先查找是否已有同规格同巷道的空位
                            var pallnoStorage = Db.Queryable<DataStockDetail>().Where(w => w.Standard == palletModel.Standard && w.PalletStatus == "0" && w.Status == "0").OrderBy(o => o.UpdateTime).ToList();
                            if (pallnoStorage.Count()>0)
                            {
                                foreach (var item in pallnoStorage)
                                {
                                    //获取巷道列,查找列中空储位
                                    var pallnoRow = Db.Queryable<SysStorageLocat>().Where(w => w.LocatNo == item.LocatNo).First();
                                    endLoction = jtLocate.Where(w => w.AreaNo == pallnoRow.AreaNo && w.Row == pallnoRow.Row && w.Status == "0" && w.Flag == "0" && w.Column<pallnoRow.Column).FirstOrDefault();
                                    if (endLoction == null)
                                    {
                                        continue;
                                    }
                                    else
                                    {
                                        locatno = endLoction.LocatNo;
                                        break;
                                    }
                                }
                            }
                            if (palletModel.Standard != "400L" && string.IsNullOrEmpty(locatno))
                            {
                                //优先分配四楼中间站净桶区
                                endLoction = jtLocate.Where(w => w.WareHouseNo == "M01" && w.AreaNo == "C01")
                                                    .OrderBy(w => w.Row).OrderByDescending(w => w.Column).FirstOrDefault();
                                if (endLoction != null)
                                {
                                    locatno = endLoction.LocatNo;
                                }
                            }
                            if (string.IsNullOrEmpty(locatno))
                            {
                                endLoction = jtLocate.Where(w => w.WareHouseNo == "M16" && w.AreaNo == "C24")
                                                    .OrderBy(w => w.Row).OrderByDescending(w => w.Column).FirstOrDefault();
                                if (endLoction != null)
                                {
                                    locatno = endLoction.LocatNo;
                                }
                            }
                            if (string.IsNullOrEmpty(locatno))//三楼中间站净桶区没有空储位,再从三楼清洗间缓存区查找
                            {
                                endLoction = jtLocate.Where(w => w.WareHouseNo == "M44" && w.AreaNo == "C55")
                                                .OrderBy(w => w.Row).OrderByDescending(w => w.Column).FirstOrDefault();
                                if (endLoction != null)
                                {
                                    locatno = endLoction.LocatNo;
                                }
                            }
                            if (string.IsNullOrEmpty(locatno))
                            {
                                throw new Exception("未查询到合适储位");
                            }
                            //string startlono = startLoction.LocatNo == "1001" ? "1002" : "1004";//清洗完成点位
                            //startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == startlono);
                            //if (startLoction == null)
                            //{
                            //    throw new Exception("未找到清洗起始点位");
                            //}
                        }
                        //分配储位
                        //优先分配四楼中间站净桶区
                        endLoction= Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M01" && w.AreaNo == "C01")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        if (endLoction == null)//四楼中间站净桶区没有空储位,再从三楼中间站净桶区查找
                        else
                        {
                            endLoction = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M16" && w.AreaNo == "C24")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        }
                        if (endLoction == null)//三楼中间站净桶区没有空储位,再从三楼清洗间缓存区查找
                        {
                            endLoction = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == "M44" && w.AreaNo == "C55")
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        }
                        if (endLoction == null)
                        {
                            throw new Exception("未查询到合适储位");
                            throw new Exception("起始目标储位信息不存在");
                        }
                        break;
                    default:
                        throw new Exception("叫料点位异常");
     
                }
                //检验当前托盘是否有任务未完成
                var checkTask = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "1" || w.Status == "0") && w.PalletNo == palletModel.PalletNo);
                if (checkTask != null)
                {
                    throw new Exception("当前托盘有正在执行的任务!");
                }
                var taskNo = new Common().GetMaxNo("TK");
                //添加任务
@@ -857,9 +1071,9 @@
                    Receiver = "RCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = "",//起始位置
                    StartLocat = startLoction.LocatNo,//起始位置
                    EndLocat = endLoction.LocatNo,//目标位置
                    PalletNo = "",//托盘码
                    PalletNo = palletModel.PalletNo,//托盘码
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
@@ -878,7 +1092,7 @@
                    Startport = palletModel.LocatNo,//起始位置
                    Endport = endLoction.LocatNo,//目标位置
                    Pallno = palletModel.PalletNo,//桶号
                    Crtype = "1",//叫桶
                    Crtype = type,//叫桶
                };
                string agvMsg = string.Empty;
@@ -897,26 +1111,41 @@
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        Db.Updateable(logTaskEntry).ExecuteCommand();
                        startLoction.Status = "3";//出库中
                        Db.Updateable(startLoction).ExecuteCommand();
                        endLoction.Status = "2";//入库中
                        Db.Updateable(endLoction).ExecuteCommand();
                        //净桶申请成功后判断当前清洗机上是否还有桶,没有桶则清空清洗机入口工位状态
                        if (deviceStation == "output")
                        {
                            var rlocat = palletModel.LocatNo == "1002" ? "1001" : "1003";
                            //判断有没有正在执行的到清洗机入口的任务
                            var tasklist = Db.Queryable<LogTask>().First(w => w.EndLocat == rlocat && (w.Status == "0" && w.Status == "1"));
                            if (tasklist == null)
                            {
                                var stocklist = Db.Queryable<DataStockDetail>().First(w => w.LocatNo == rlocat);
                                if (stocklist == null)
                                {
                                    var rdecive = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == rlocat);
                                    rdecive.Status = "0";
                                    Db.Updateable(rdecive).ExecuteCommand();
                                }
                            }
                        }
                    }
                    else//失败
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = agvMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        throw new Exception("桶号:" + task.Pallno + ",调度小车失败");
                    }
                }
                else
                {
                    logTaskEntry.IsSuccess = 0;
                    logTaskEntry.Information = agvBindMsg;
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                }
                
                //提交事务
@@ -934,6 +1163,7 @@
        {
            try
            {
                bool t = false;
                //分配桶的库存信息
                var palletInfo = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (palletInfo == null)
@@ -956,6 +1186,8 @@
                //判断该储位是否是内侧储位
                if (!string.IsNullOrEmpty(locatInfo.AisleOne))
                {
                    ////获取当前库位的外侧储位信息
                    //var waiLocatInfo = Db.Queryable<SysStorageLocat>().First(w=>w.IsDel == "0" && w.Row == locatInfo.Row && w.Column == locatInfo.Column - 1);
                    //判断外侧储位是否有桶
                    var palletInfoYi = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == locatInfo.AisleOne);
                    if (palletInfoYi != null)
@@ -971,6 +1203,18 @@
                        {
                            throw new Exception("要移库的桶有正在执行的任务,请稍后再试");
                        }
                        //判断要移库的桶外侧是否有桶
                        var locatInfoYi = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletInfoYi.LocatNo);
                        if (locatInfo == null)
                        {
                            throw new Exception("未查询到要移库的桶所在的储位信息");
                        }
                        var palletInfoYi2 = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == locatInfoYi.AisleOne);
                        if (palletInfoYi2 != null)
                        {
                            throw new Exception("所要叫料的桶无法进行移库,请联系管理员进行手动移桶");
                        }
                        #region#给要移库的桶先移到中转储位
                        //找到中转储位所在区域
                        var transfeArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.WareHouseNo == WareHouseNo && w.AreaName.Contains("转运区"));
@@ -1008,6 +1252,7 @@
                            Msg = $"将桶{palletInfoYi.PalletNo}从{palletInfoYi.LocatNo}移到{transferLocat.LocatNo}", //关键信息
                            LotNo = ""//批次号
                        };
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        //组织下发小车任务信息
                        var task = new TaskDetial
@@ -1022,7 +1267,7 @@
                        string agvMsg = string.Empty;
                        //给下车下发任务
                        logTaskEntry.SendDate = DateTime.Now;//发送时间
                                                             //下发载具与货位绑定
                        //下发载具与货位绑定
                        var bind = RcsHelper.BindPalletAndSite(palletInfoYi.LocatNo, palletInfoYi.PalletNo, bindUrl, out string agvBindMsg);
                        if (bind)
                        {
@@ -1035,7 +1280,7 @@
                                //logTaskEntry.IsCancel = 0;
                                logTaskEntry.BackDate = DateTime.Now;
                                logTaskEntry.Status = "1";//正在执行
                                Db.Insertable(logTaskEntry).ExecuteCommand();
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                //修改移出储位状态
                                locatInfo.Status = "5";//移出中
@@ -1049,7 +1294,7 @@
                            {
                                logTaskEntry.IsSuccess = 0;
                                logTaskEntry.Information = agvMsg;
                                Db.Insertable(logTaskEntry).ExecuteCommand();
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                throw new Exception($"给小车下发移库任务失败,桶号:{palletInfoYi.PalletNo}");
                            }
@@ -1058,14 +1303,19 @@
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvBindMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            Db.Updateable(logTaskEntry).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{palletInfoYi.PalletNo}");
                        }
                        t = true;
                    }
                    else
                    {
                        return t;
                    }
                }
                return true;
                return t;
            }
            catch (Exception e)
            {
@@ -1086,7 +1336,7 @@
                Db.BeginTran();
                //查找任务信息
                var logTaskInfo = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "1" && w.TaskNo == taskNo);
                var logTaskInfo = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.Status == "0" && w.TaskNo == taskNo);
                if (logTaskInfo == null)
                {
                    throw new Exception("未查询到该任务");
@@ -1144,7 +1394,7 @@
                            //logTaskEntry.IsCancel = 0;
                            logTaskInfoZ.BackDate = DateTime.Now;
                            logTaskInfoZ.Status = "1";//正在执行
                            Db.Insertable(logTaskInfoZ).ExecuteCommand();
                            Db.Updateable(logTaskInfoZ).ExecuteCommand();
                            //修改移出储位状态
                            startLocatInfoZ.Status = "5";//移出中
@@ -1158,7 +1408,7 @@
                        {
                            logTaskInfoZ.IsSuccess = 0;
                            logTaskInfoZ.Information = agvMsg;
                            Db.Insertable(logTaskInfoZ).ExecuteCommand();
                            Db.Updateable(logTaskInfoZ).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{logTaskInfoZ.PalletNo}");
                        }
@@ -1167,12 +1417,13 @@
                    {
                        logTaskInfoZ.IsSuccess = 0;
                        logTaskInfoZ.Information = agvBindMsg;
                        Db.Insertable(logTaskInfoZ).ExecuteCommand();
                        Db.Updateable(logTaskInfoZ).ExecuteCommand();
                        throw new Exception($"给小车下发移库任务失败,桶号:{logTaskInfoZ.PalletNo}");
                    }
                    
                }
                Db.CommitTran();
            }
            catch (Exception e)
            {
@@ -1220,7 +1471,7 @@
                            continue;
                        }
                        //分配储位
                        var endLocatInfo = GetLocatModel(itemHouseNo,detailInfo.PalletStatus,detailInfo.SkuNo,detailInfo.Standard);//目标储位
                        var endLocatInfo = GetLocatModel(itemHouseNo,detailInfo.PalletStatus,"",detailInfo.SkuNo,detailInfo.Standard,detailInfo.LotNo);//目标储位
                        //没有可用空储位
                        if (endLocatInfo == null)
                        {
@@ -1260,7 +1511,7 @@
                            Crtype = "2"//叫桶
                        };
                        string agvMsg = string.Empty;
                        //给下车下发任务
                        //给下车下发任务            s
                        logTaskEntry.SendDate = DateTime.Now;//发送时间
                        //下发载具与货位绑定
                        var bind = RcsHelper.BindPalletAndSite(detailInfo.PalletNo, detailInfo.LocatNo, bindUrl, out string agvBindMsg);
@@ -1275,7 +1526,7 @@
                                //logTaskEntry.IsCancel = 0;
                                logTaskEntry.BackDate = DateTime.Now;
                                logTaskEntry.Status = "1";//正在执行
                                Db.Insertable(logTaskEntry).ExecuteCommand();
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                //修改移出储位状态
                                locatModel.Status = "5";//移出中
@@ -1289,7 +1540,7 @@
                            {
                                logTaskEntry.IsSuccess = 0;
                                logTaskEntry.Information = agvMsg;
                                Db.Insertable(logTaskEntry).ExecuteCommand();
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                throw new Exception($"给小车下发移库任务失败,桶号:{detailInfo.PalletNo}");
                            }
@@ -1298,7 +1549,7 @@
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvBindMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            Db.Updateable(logTaskEntry).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{detailInfo.PalletNo}");
                        }
@@ -1325,7 +1576,7 @@
        /// <param name="standard">桶规格</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        private SysStorageLocat GetLocatModel(string houseNo, string palletStatus,string skuNo="",string standard="")
        private SysStorageLocat GetLocatModel(string houseNo, string palletStatus,string zonghong,string skuNo="",string standard="",string lotNo = "")
        {
            try
            {
@@ -1333,6 +1584,7 @@
                string areaNo = string.Empty;
                switch (palletStatus)
                {
                    case "0"://净桶
                             //查到到净桶区域编号
                        areaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.Type == "0").Select(s => s.AreaNo).First();
@@ -1342,44 +1594,101 @@
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        break;
                    case "2"://满桶
                             //查到到满桶区域编号
                        areaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.Type == "1").Select(s => s.AreaNo).First();
                        //分配储位
                        //先查到同物料的组
                        string sql = $@"select Row from SysStorageLocat where WareHouseNo='{houseNo}' and AreaNo='{areaNo}' and LocatNo in(
                                               select LocatNo from DataStockDetail where SkuNo='{skuNo}' and Standard='{standard}' and WareHouseNo='{houseNo}' and AreaNo='{areaNo}'
                                            ) group by Row";
                        List<int> RowList = Db.Ado.SqlQuery<int>(sql).ToList();
                        foreach (var rowItem in RowList)
                        //总混分配储位 (仓库编码M12,M13),分配逻辑:优先分配同物料的组,再分配到3楼中间站,最后分配到4楼中间站
                        if (zonghong == "M12" || zonghong == "M13")
                        {
                            endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                           && w.WareHouseNo == houseNo && w.AreaNo == areaNo && w.Row == rowItem)
                                           .OrderByDescending(o => o.Column).First();
                            //先查到同物料的组
                            string sql = $@"select Row,AreaNo from SysStorageLocat where LocatNo in(
                                                   select LocatNo from DataStockDetail where SkuNo='{skuNo}' and LotNo = '{lotNo}' and Standard='{standard}'
                                                    and AreaNo in ('C02','C25')
                                                ) group by Row,AreaNo";
                            var RowList = Db.Ado.SqlQuery<TableMan>(sql).ToList();
                            if (endLocatInfo != null)
                            foreach (var rowItem in RowList)
                            {
                                break;
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.Row == rowItem.Row && w.AreaNo == rowItem.AreaNo  && (w.WareHouseNo == "M01"||w.WareHouseNo == "M16"))
                                               .OrderByDescending(o => o.Column).First();
                                if (endLocatInfo != null)
                                {
                                    break;
                                }
                            }
                            if (endLocatInfo == null)
                            {
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && (w.AreaNo == "C02" || w.AreaNo == "C25"))
                                           .OrderBy(o => o.Layer).OrderByDescending(o => o.Column).OrderBy(o => o.Row).First();
                            }
                            //没有找到相同物料同组的空储位
                            if (endLocatInfo.LocatNo == null)
                            {
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                                && (w.AreaNo == "C02" || w.AreaNo == "C25"))
                                               .OrderBy(o=>o.Layer).OrderByDescending(o => o.Column).OrderBy(o => o.Row).First();
                            }
                        }
                        else {//其他区域
                            areaNo = houseNo == "M01" ? "C02" : "C25";
                            //查到到满桶区域编号
                            areaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.Type == "1").Select(s => s.AreaNo).First();
                            //分配储位
                            //先查到同物料的组
                            string sql = $@"select Row,AreaNo from SysStorageLocat where WareHouseNo='{houseNo}' and AreaNo='{areaNo}' and Status = '1' and LocatNo in(
                                                   select LocatNo from DataStockDetail where SkuNo='{skuNo}' and LotNo = '{lotNo}' and Standard='{standard}' and WareHouseNo='{houseNo}' and AreaNo='{areaNo}'
                                                ) group by Row,AreaNo";
                            var RowList = Db.Ado.SqlQuery<TableMan>(sql).ToList();
                            foreach (var rowItem in RowList)
                            {
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                               && w.WareHouseNo == houseNo && w.AreaNo == areaNo && w.Row == rowItem.Row && w.AreaNo == rowItem.AreaNo && (w.WareHouseNo == "M01" || w.WareHouseNo == "M16"))
                                               .OrderByDescending(o => o.Column).First();
                                if (endLocatInfo != null)
                                {
                                    break;
                                }
                            }
                            if (endLocatInfo == null)
                            {
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                              && w.WareHouseNo == houseNo && w.AreaNo == areaNo)
                                              .OrderByDescending(o => o.Column).OrderBy(o => o.Row).First();
                            }
                            //没有找到相同物料同组的空储位
                            if (endLocatInfo.LocatNo == null )
                            {
                                endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                               && w.WareHouseNo == houseNo && w.AreaNo == areaNo)
                                               .OrderByDescending(o => o.Column).OrderBy(o => o.Row).First();
                            }
                        }
                        //没有找到相同物料同组的空储位
                        if (endLocatInfo == null)
                        {
                            endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                           && w.WareHouseNo == houseNo && w.AreaNo == areaNo)
                                           .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        }
                        break;
                    case "3"://脏桶
                             //查到到脏桶区域编号
                        areaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.Type == "2").Select(s => s.AreaNo).First();
                        //查到到脏桶区域编号,存放顺序,C54 料斗清洗暂存间,C26 3楼中间站脏桶区,C03 4楼中间站脏桶区
                        var ztAreaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Type == "2").Select(w => w.AreaNo).ToList();
                        //查找所有可用脏桶库位
                        var ztLocat = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && ztAreaNo.Contains(w.AreaNo))
                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).ToList();
                        //areaNo = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.WareHouseNo == houseNo && w.Type == "2").Select(s => s.AreaNo).First();
                        //分配储位
                        endLocatInfo = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0"
                                            && w.WareHouseNo == houseNo && w.AreaNo == areaNo)
                                            .OrderBy(o => o.Row).OrderByDescending(o => o.Column).First();
                        //料斗清洗暂存间
                        endLocatInfo = ztLocat.Where(w => w.AreaNo == "C54").FirstOrDefault();
                        if (endLocatInfo == null)
                        {
                            endLocatInfo = ztLocat.Where(w => w.AreaNo == "C26").FirstOrDefault();
                            if (endLocatInfo == null)
                            {
                                endLocatInfo = ztLocat.Where(w => w.AreaNo == "C03").FirstOrDefault();
                                if (endLocatInfo == null)
                                {
                                    throw new Exception("无可用脏桶库位");
                                }
                            }
                        }
                        break;
                }
                return endLocatInfo;
@@ -1389,5 +1698,138 @@
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 点对点任务下发
        /// </summary>
        /// <param name="beginLocate">起始位</param>
        /// <param name="endLocate">终点位</param>
        /// <exception cref="Exception"></exception>
        public void PointToPointRequest(string id,string beginPoint, string endPoint, string url, string bindUrl)
        {
            try
            {
                //权限校验
                var user = Db.Queryable<SysUserInfor>().First(m => m.IsDel == "0" && m.UserName == id);
                if (user == null)
                {
                    throw new Exception("没有查询到用户信息");
                }
                if (user.RoleNo != "01")
                {
                    throw new Exception("当前用户没有权限使用此功能");
                }
                //起始储位信息
                var startLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == beginPoint);
                if (startLoction == null)
                {
                    throw new Exception("未找到输入的起始储位");
                }
                if (startLoction.Status != "1")
                {
                      throw new Exception("起始储位:"+beginPoint+"的储位状态错误,储位状态应为:‘有物品’");
                }
                //目标储位信息
                var endLoction = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == endPoint);
                if (endLoction == null)
                {
                    throw new Exception("未找到输入的目标储位");
                }
                if (endLoction.Status != "0")
                {
                    throw new Exception("目标储位:" + endPoint  + "的储位状态错误,储位状态应为:'空储位'");
                }
                //托盘信息
                var palletModel = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == beginPoint);
                if (palletModel == null)
                {
                    throw new Exception("未找到储位对应托盘信息!");
                }
                //检验当前托盘是否有任务未完成
                var checkTask = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && (w.Status == "1" || w.Status == "0") && w.PalletNo == palletModel.PalletNo);
                if (checkTask != null)
                {
                    throw new Exception("当前托盘有正在执行的任务!");
                }
                Db.BeginTran();
                var taskNo = new Common().GetMaxNo("TK");
                //添加任务
                var logTaskEntry = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "RCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = beginPoint,//起始位置
                    EndLocat = endPoint,//目标位置
                    PalletNo = palletModel.PalletNo,//托盘码
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
                Db.Insertable(logTaskEntry).ExecuteCommand();
                //组织下发小车任务信息
                var task = new TaskDetial
                {
                    Taskno = taskNo,//任务号
                    Startport = beginPoint,//起始位置
                    Endport = endPoint,//目标位置
                    Pallno = palletModel.PalletNo,//桶号
                    Crtype = "1",//叫桶
                };
                string agvMsg = string.Empty;
                //给下车下发任务
                logTaskEntry.SendDate = DateTime.Now;//发送时间
                //下发载具与货位绑定
                var bind = RcsHelper.BindPalletAndSite(palletModel.PalletNo, beginPoint, bindUrl, out string agvBindMsg);
                if (bind)
                {
                    var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
                    if (agvResult)//成功
                    {
                        //请求成功修改任务表相应字段状态
                        logTaskEntry.IsSuccess = 1;
                        logTaskEntry.IsSend = 0;
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Updateable(logTaskEntry).ExecuteCommand();
                        startLoction.Status = "3";//出库中
                        Db.Updateable(startLoction).ExecuteCommand();
                        endLoction.Status = "2";//入库中
                        Db.Updateable(endLoction).ExecuteCommand();
                    }
                    else//失败
                    {
                        throw new Exception("桶号:" + task.Pallno + ",调度小车失败");
                    }
                }
                else
                {
                    throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                }
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
    }
}