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)
@@ -217,10 +220,11 @@
        /// <param name="lotNo">批次</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void jiaoLiaoHopper(string areaNo,string endLocate,string plnStatus,string standard,string skuNo,string lotNo,string url,int userId)
        public void jiaoLiaoHopper(string areaNo,string endLocate,string plnStatus,string standard,string skuNo,string lotNo,string url, string bindUrl, int userId)
        {
            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);
                }
                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,35 +406,43 @@
                        Startport = palletModel.LocatNo,//起始位置
                        Endport = endLocate,//目标位置
                        Pallno = palletModel.PalletNo,//桶号
                        Crtype = "1",//叫桶
                        Crtype = type,//叫桶
                    };
                    string agvMsg = string.Empty;
                    //给下车下发任务
                    logTaskEntry.SendDate = DateTime.Now;//发送时间
                    var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
                    if (agvResult)//成功
                    //下发载具类型
                    var bind = RcsHelper.BindPalletAndSite(palletModel.PalletNo, palletModel.LocatNo, bindUrl, out string agvBindMsg);
                    if (bind)
                    {
                        //请求成功修改任务表相应字段状态
                        logTaskEntry.IsSuccess = 1;
                        logTaskEntry.IsSend = 0;
                        //logTaskEntry.IsCancel = 0;
                        logTaskEntry.BackDate = DateTime.Now;
                        logTaskEntry.Status = "1";//正在执行
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        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();
                            startLoction.Status = "3";//出库中
                            Db.Updateable(startLoction).ExecuteCommand();
                        endLocateInfo.Status = "2";//入库中
                        Db.Updateable(endLocateInfo).ExecuteCommand();
                            endLocateInfo.Status = "2";//入库中
                            Db.Updateable(endLocateInfo).ExecuteCommand();
                        }
                        else//失败
                        {
                            throw new Exception("桶号:"+ task.Pallno + ",调度小车失败");
                        }
                    }
                    else//失败
                    else
                    {
                        logTaskEntry.IsSuccess = 0;
                        logTaskEntry.Information = agvMsg;
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                    }
                }
                //提交事务
                Db.CommitTran();
@@ -405,15 +467,20 @@
        /// <param name="lotNo">批次</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void jiaoCheHopper(string areaNo, string StartLocate, string plnNo, string plnStatus, decimal weight,  string skuNo, string lotNo, string url,int userId)
        public void jiaoCheHopper(string areaNo, string StartLocate, string plnNo, string plnStatus, decimal weight,  string skuNo, string lotNo, string url,string bindUrl,int userId)
        {
            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))
@@ -430,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);
@@ -449,10 +517,6 @@
                        throw new Exception("没有查询到物料信息");
                    }
                    skuName = sku.SkuName;
                }
                else if (plnStatus == "3")
                {
                }
                //目标楼层
                var layer = startLoction.Layer;
@@ -490,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
@@ -544,35 +615,44 @@
                    Startport = StartLocate,//起始位置
                    Endport = endLocatInfo.LocatNo,//目标位置
                    Pallno = plnNo,//桶号
                    Crtype = "1",//叫桶
                    Crtype = "2",//叫车模板
                };
                //调用AGV接口下发任务
                string agvMsg = string.Empty;
                //给下车下发任务
                logTaskEntry.SendDate = DateTime.Now;//发送时间
                var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
                if (agvResult)//成功
                //下发载具与货位绑定
                var bind = RcsHelper.BindPalletAndSite(plnNo, StartLocate, bindUrl, out string agvBindMsg);
                if (bind)
                {
                    //请求成功修改任务表相应字段状态
                    logTaskEntry.IsSuccess = 1;
                    logTaskEntry.IsSend = 0;
                    //logTaskEntry.IsCancel = 0;
                    logTaskEntry.BackDate = DateTime.Now;
                    logTaskEntry.Status = "1";//正在执行
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    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();
                        startLoction.Status = "3";//出库中
                        Db.Updateable(startLoction).ExecuteCommand();
                    endLocatInfo.Status = "2";//入库中
                    Db.Updateable(endLocatInfo).ExecuteCommand();
                        endLocatInfo.Status = "2";//入库中
                        Db.Updateable(endLocatInfo).ExecuteCommand();
                    }
                    else//失败
                    {
                        throw new Exception("桶号:" + task.Pallno + ",调度小车失败");
                    }
                }
                else//失败
                else
                {
                    logTaskEntry.IsSuccess = 0;
                    logTaskEntry.Information = agvMsg;
                    Db.Insertable(logTaskEntry).ExecuteCommand();
                    throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                }
                //提交事务
                Db.CommitTran();
@@ -593,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
            {
@@ -609,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();
@@ -633,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($"桶库存信息不存在");
@@ -644,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();
                //目标储位所属区域
@@ -677,7 +776,7 @@
                }
                else if (endAreaInfo.Type == "1")//满桶区
                {
                    stockDetail.PalletStatus = "1";
                    stockDetail.PalletStatus = "2";
                    stockDetail.Status = "0";//待分配
                }
                else if (endAreaInfo.Type == "2")//脏桶区
@@ -688,6 +787,10 @@
                    stockDetail.SkuName = "";
                    stockDetail.Status = "0";//待分配
                    stockDetail.InspectStatus = "0";//待检验
                }
                else if (endAreaInfo.Type == "4")//设备区
                {
                }
                //修改库存明细
                Db.Updateable(stockDetail).ExecuteCommand();
@@ -716,11 +819,351 @@
            }
        }
        private bool YikuTask(string palletNo, string taskNo, string url)
        /// <summary>
        /// 清洗机叫料状态
        /// </summary>
        /// <param name="deviceID">清洗机编号</param>
        /// <param name="deviceStation">叫料点位:”input”-入口(叫脏桶),”output”-出口(净桶申请储位)</param>
        /// <param name="status"></param>
        /// <exception cref="Exception"></exception>
        public void RCSCleanRequest(string deviceID,string deviceStation,string status,string url,string bindUrl)
        {
            try
            {
                if (string.IsNullOrEmpty(deviceID))
                {
                    throw new Exception("清洗机编号不能为空");
                }
                if (status != "1")
                {
                    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)
                {
                    throw new Exception("设备信息不存在");
                }
                var houseNo = deviceInfo.WareHouseNo;//叫桶设备所属车间编号
                var startLoction = new SysStorageLocat();//起始储位信息
                var endLoction = new SysStorageLocat();//目标储位信息
                var palletModel = new DataStockDetail();//分配桶信息
                string locatno = "";
                string type = "";//叫料类型
                //开启事务
                Db.BeginTran();
                //叫料点位
                switch (deviceStation)
                {
                    case "input"://叫脏桶
                        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").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();
                        }
                        else
                        {
                            throw new Exception("起始目标储位信息不存在");
                        }
                        break;
                    case "output"://净桶申请储位
                        if (deviceID == "1002" || deviceID == "1004")
                        {
                            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("未找到清洗起始点位");
                            //}
                        }
                        else
                        {
                            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");
                //添加任务
                var logTaskEntry = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "RCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = startLoction.LocatNo,//起始位置
                    EndLocat = endLoction.LocatNo,//目标位置
                    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 = palletModel.LocatNo,//起始位置
                    Endport = endLoction.LocatNo,//目标位置
                    Pallno = palletModel.PalletNo,//桶号
                    Crtype = type,//叫桶
                };
                string agvMsg = string.Empty;
                //给下车下发任务
                logTaskEntry.SendDate = DateTime.Now;//发送时间
                //下发载具与货位绑定
                var bind = RcsHelper.BindPalletAndSite(palletModel.PalletNo, palletModel.LocatNo, 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();
                        //净桶申请成功后判断当前清洗机上是否还有桶,没有桶则清空清洗机入口工位状态
                        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//失败
                    {
                        throw new Exception("桶号:" + task.Pallno + ",调度小车失败");
                    }
                }
                else
                {
                    throw new Exception("桶号:" + task.Pallno + ",绑定货位失败");
                }
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        private bool YikuTask(string palletNo, string taskNo, string url,string bindUrl)
        {
            try
            {
                bool t = false;
                //分配桶的库存信息
                var palletInfo = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (palletInfo == null)
@@ -743,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)
@@ -758,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("转运区"));
@@ -795,6 +1252,7 @@
                            Msg = $"将桶{palletInfoYi.PalletNo}从{palletInfoYi.LocatNo}移到{transferLocat.LocatNo}", //关键信息
                            LotNo = ""//批次号
                        };
                        Db.Insertable(logTaskEntry).ExecuteCommand();
                        //组织下发小车任务信息
                        var task = new TaskDetial
@@ -809,36 +1267,55 @@
                        string agvMsg = string.Empty;
                        //给下车下发任务
                        logTaskEntry.SendDate = DateTime.Now;//发送时间
                        var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg, "70");
                        if (agvResult)//成功
                        //下发载具与货位绑定
                        var bind = RcsHelper.BindPalletAndSite(palletInfoYi.LocatNo, palletInfoYi.PalletNo, bindUrl, out string agvBindMsg);
                        if (bind)
                        {
                            //请求成功修改任务表相应字段状态
                            logTaskEntry.IsSuccess = 1;
                            logTaskEntry.IsSend = 0;
                            //logTaskEntry.IsCancel = 0;
                            logTaskEntry.BackDate = DateTime.Now;
                            logTaskEntry.Status = "1";//正在执行
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg, "70");
                            if (agvResult)//成功
                            {
                                //请求成功修改任务表相应字段状态
                                logTaskEntry.IsSuccess = 1;
                                logTaskEntry.IsSend = 0;
                                //logTaskEntry.IsCancel = 0;
                                logTaskEntry.BackDate = DateTime.Now;
                                logTaskEntry.Status = "1";//正在执行
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                            //修改移出储位状态
                            locatInfo.Status = "5";//移出中
                            Db.Updateable(locatInfo).ExecuteCommand();
                                //修改移出储位状态
                                locatInfo.Status = "5";//移出中
                                Db.Updateable(locatInfo).ExecuteCommand();
                            //修改移入储位状态
                            transferLocat.Status = "4";//移入中
                            Db.Updateable(transferLocat).ExecuteCommand();
                                //修改移入储位状态
                                transferLocat.Status = "4";//移入中
                                Db.Updateable(transferLocat).ExecuteCommand();
                            }
                            else//失败
                            {
                                logTaskEntry.IsSuccess = 0;
                                logTaskEntry.Information = agvMsg;
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                throw new Exception($"给小车下发移库任务失败,桶号:{palletInfoYi.PalletNo}");
                            }
                        }
                        else//失败
                        else
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            logTaskEntry.Information = agvBindMsg;
                            Db.Updateable(logTaskEntry).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{palletInfoYi.PalletNo}");
                        }
                        t = true;
                    }
                    else
                    {
                        return t;
                    }
                }
                return true;
                return t;
            }
            catch (Exception e)
            {
@@ -851,7 +1328,7 @@
        /// <param name="taskNo"></param>
        /// <param name="url"></param>
        /// <exception cref="Exception"></exception>
        public void OutBinAgv(string taskNo,string url)
        public void OutBinAgv(string taskNo,string url, string bindUrl)
        {
            try
            {
@@ -859,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("未查询到该任务");
@@ -904,34 +1381,49 @@
                    string agvMsg = string.Empty;
                    //给下车下发任务
                    logTaskInfoZ.SendDate = DateTime.Now;//发送时间
                    var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg, "70");
                    if (agvResult)//成功
                    //下发载具与货们绑定
                    var bind = RcsHelper.BindPalletAndSite(logTaskInfoZ.PalletNo, logTaskInfoZ.StartLocat, bindUrl, out string agvBindMsg);
                    if (bind)
                    {
                        //请求成功修改任务表相应字段状态
                        logTaskInfoZ.IsSuccess = 1;
                        logTaskInfoZ.IsSend = 0;
                        //logTaskEntry.IsCancel = 0;
                        logTaskInfoZ.BackDate = DateTime.Now;
                        logTaskInfoZ.Status = "1";//正在执行
                        Db.Insertable(logTaskInfoZ).ExecuteCommand();
                        var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg, "70");
                        if (agvResult)//成功
                        {
                            //请求成功修改任务表相应字段状态
                            logTaskInfoZ.IsSuccess = 1;
                            logTaskInfoZ.IsSend = 0;
                            //logTaskEntry.IsCancel = 0;
                            logTaskInfoZ.BackDate = DateTime.Now;
                            logTaskInfoZ.Status = "1";//正在执行
                            Db.Updateable(logTaskInfoZ).ExecuteCommand();
                        //修改移出储位状态
                        startLocatInfoZ.Status = "5";//移出中
                        Db.Updateable(startLocatInfoZ).ExecuteCommand();
                            //修改移出储位状态
                            startLocatInfoZ.Status = "5";//移出中
                            Db.Updateable(startLocatInfoZ).ExecuteCommand();
                        //修改移入储位状态
                        endLocatInfoZ.Status = "4";//移入中
                        Db.Updateable(endLocatInfoZ).ExecuteCommand();
                            //修改移入储位状态
                            endLocatInfoZ.Status = "4";//移入中
                            Db.Updateable(endLocatInfoZ).ExecuteCommand();
                        }
                        else//失败
                        {
                            logTaskInfoZ.IsSuccess = 0;
                            logTaskInfoZ.Information = agvMsg;
                            Db.Updateable(logTaskInfoZ).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{logTaskInfoZ.PalletNo}");
                        }
                    }
                    else//失败
                    else
                    {
                        logTaskInfoZ.IsSuccess = 0;
                        logTaskInfoZ.Information = agvMsg;
                        Db.Insertable(logTaskInfoZ).ExecuteCommand();
                        logTaskInfoZ.Information = agvBindMsg;
                        Db.Updateable(logTaskInfoZ).ExecuteCommand();
                        throw new Exception($"给小车下发移库任务失败,桶号:{logTaskInfoZ.PalletNo}");
                    }
                }
                Db.CommitTran();
            }
            catch (Exception e)
            {
@@ -946,7 +1438,7 @@
        /// </summary>
        /// <param name="url"></param>
        /// <exception cref="Exception"></exception>
        public void TransferBackTimer(string url)
        public void TransferBackTimer(string url,string bindUrl)
        {
            try
            {
@@ -979,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)
                        {
@@ -1019,36 +1511,49 @@
                            Crtype = "2"//叫桶
                        };
                        string agvMsg = string.Empty;
                        //给下车下发任务
                        //给下车下发任务            s
                        logTaskEntry.SendDate = DateTime.Now;//发送时间
                        var agvResult = RcsHelper.CreateTaskForAgv(task, url, out agvMsg);
                        if (agvResult)//成功
                        //下发载具与货位绑定
                        var bind = RcsHelper.BindPalletAndSite(detailInfo.PalletNo, detailInfo.LocatNo, bindUrl, out string agvBindMsg);
                        if (bind)
                        {
                            //请求成功修改任务表相应字段状态
                            logTaskEntry.IsSuccess = 1;
                            logTaskEntry.IsSend = 0;
                            //logTaskEntry.IsCancel = 0;
                            logTaskEntry.BackDate = DateTime.Now;
                            logTaskEntry.Status = "1";//正在执行
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            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();
                            //修改移出储位状态
                            locatModel.Status = "5";//移出中
                            Db.Updateable(locatModel).ExecuteCommand();
                                //修改移出储位状态
                                locatModel.Status = "5";//移出中
                                Db.Updateable(locatModel).ExecuteCommand();
                            //修改移入储位状态
                            endLocatInfo.Status = "4";//移入中
                            Db.Updateable(endLocatInfo).ExecuteCommand();
                                //修改移入储位状态
                                endLocatInfo.Status = "4";//移入中
                                Db.Updateable(endLocatInfo).ExecuteCommand();
                            }
                            else//失败
                            {
                                logTaskEntry.IsSuccess = 0;
                                logTaskEntry.Information = agvMsg;
                                Db.Updateable(logTaskEntry).ExecuteCommand();
                                throw new Exception($"给小车下发移库任务失败,桶号:{detailInfo.PalletNo}");
                            }
                        }
                        else//失败
                        else
                        {
                            logTaskEntry.IsSuccess = 0;
                            logTaskEntry.Information = agvMsg;
                            Db.Insertable(logTaskEntry).ExecuteCommand();
                            logTaskEntry.Information = agvBindMsg;
                            Db.Updateable(logTaskEntry).ExecuteCommand();
                            throw new Exception($"给小车下发移库任务失败,桶号:{detailInfo.PalletNo}");
                        }
                    }
                }
                //提交事务
@@ -1071,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
            {
@@ -1079,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();
@@ -1088,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;
@@ -1135,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);
            }
        }
    }
}