zhaowc
2025-02-28 157abc191c34e57c1b958ae74fc3de6518ca8a30
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -4,14 +4,23 @@
using System.Linq;
using System.Runtime.Intrinsics.X86;
using System.Security.Claims;
using System.Security.Policy;
using System.Text;
using Model.InterFaceModel;
using Model.ModelDto;
using Model.ModelDto.DataDto;
using Model.ModelDto.SysDto;
using Model.ModelVm.DataVm;
using Newtonsoft.Json;
using SqlSugar;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllSoEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.LogEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IDataServer;
@@ -129,16 +138,23 @@
        /// <param name="palletNo">托盘条码</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <param name="houseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <param name="type">物料类型</param>
        /// <param name="ownerNo">货主编号</param>
        /// <param name="ownerName">货主名称</param>
        /// <returns></returns>
        public List<StockDetailDto> GetInventoryList1(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, 
            string status, string inspectStatus, string ownerNo, string ownerName)
            string status, string inspectStatus, string ownerNo, string ownerName, string houseNo, string areaNo, string categoryNo, string type)
        {
            string str = "select detail.*,house.WareHouseNo + '-' + house.WareHouseName as WareHouseName," +
            string str = "select detail.*,sku.Type,house.WareHouseNo + '-' + house.WareHouseName as WareHouseName," +
                "roadway.RoadwayNo + '-' + roadway.RoadwayName as RoadwayName,area.AreaNo + '-' + area.AreaName as AreaName  " +
                "from DataStockDetail detail " +
                "left join SysStorageRoadway roadway on detail.RoadwayNo = roadway.RoadwayNo " +
                "left join SysWareHouse house on detail.WareHouseNo = house.WareHouseNo " +
                "left join SysStorageArea area on detail.AreaNo = area.AreaNo " +
                "left join SysMaterials as sku on detail.skuNo = sku.skuNo " +
                "left join SysMaterialCategory as cat on sku.CategoryNo = cat.CategoryNo " +
                "Where detail.IsDel = @isdel";
            //判断物料编码是否为空
            if (!string.IsNullOrEmpty(skuNo))
@@ -184,21 +200,42 @@
            if (!string.IsNullOrEmpty(ownerName))
            {
                str += " and detail.OwnerName like @ownerName";
            }
            if (!string.IsNullOrEmpty(houseNo))
            {
                str += " and house.WareHouseNo = @wareHouseNo";
            }
            if (!string.IsNullOrEmpty(areaNo))
            {
                str += " and area.AreaNo = @areaNo";
            }
            if (!string.IsNullOrEmpty(categoryNo))
            {
                str += " and cat.CategoryNo = @categoryNo";
            }
            if (!string.IsNullOrEmpty(type))
            {
                str += " and sku.Type = @type";
            }
            //排序
            str += " order by detail.SkuNo,detail.PalletNo,detail.LotNo";
            List<StockDetailDto> stockDetailsList = Db.Ado.SqlQuery<StockDetailDto>(str, new
            {
                isdel = "0", //是否删除
                skuno = "%" + skuNo + "%", //物料编码
                skuname = "%" + skuName + "%", //物料名称
                lotno = "%" + lotNo + "%", //批次
                locatno = "%" + locatNo + "%", //储位地址
                palletno = "%" + palletNo + "%", //托盘条码
                status = status, //库存状态
                inspectstatus = inspectStatus, //质检状态
                ownerNo = "%" + ownerNo + "%", //货主编码
                ownerName = "%" + ownerName + "%" //货主名称
                isdel = "0",                                //是否删除
                skuno = "%" + skuNo + "%",                  //物料编码
                skuname = "%" + skuName + "%",              //物料名称
                lotno = "%" + lotNo + "%",                  //批次
                locatno = "%" + locatNo + "%",              //储位地址
                palletno = "%" + palletNo + "%",            //托盘条码
                status = status,                            //库存状态
                inspectstatus = inspectStatus,              //质检状态
                ownerNo = "%" + ownerNo + "%",              //货主编码
                ownerName = "%" + ownerName + "%",          //货主名称
                wareHouseNo = houseNo,
                areaNo = areaNo,                         //所属区域
                categoryNo = categoryNo,                //逻辑库区
                type = type
            });
            return stockDetailsList;
        }
@@ -380,7 +417,7 @@
                "where bind.IsDel = '0' and notice.IsDel = '0' and bind.LotNo in (select LotNo from DataStock where IsDel = '0')   ";
            //出库
            string cstr = "select notice.SONo,allot.LotNo,allot.TaskNo CTaskNo,allot.SkuNo,allot.SkuName,allot.PalletNo," +
                "allot.CreateTime CCreateTime,allot.Qty CQty,allot.Qty CAllotQty,Allot.Qty CFactQty,Allot.CompleteQty CompleteQty," +
                "allot.UpdateTime CCreateTime,allot.Qty CQty,allot.Qty CAllotQty,Allot.Qty CFactQty,Allot.CompleteQty CompleteQty," +
                "allot.LotText,allot.SupplierLot " +
                "from BllExportAllot allot left join BllExportNoticeDetail notice on allot.SODetailNo = notice.Id " +
                "where allot.IsDel = '0' and notice.IsDel = '0' " +
@@ -571,7 +608,7 @@
                {
                    EndTime = (Convert.ToDateTime(EndTime).AddDays(1)).ToString();
                }
                int countjie = 0; //统计结存数量
                decimal countjie = 0; //统计结存数量
                ////判断库存信息是否为空
                //if (stockInfo != null)
                //{
@@ -596,10 +633,10 @@
                    }
                //}
                int yeara = 0; //年入库
                int years = 0; //年出库
                int montha = 0; //月入库
                int months = 0; //月出库
                decimal yeara = 0; //年入库
                decimal years = 0; //年出库
                decimal montha = 0; //月入库
                decimal months = 0; //月出库
                DateTime createTime = DateTime.Now.AddYears(-1000); //时间
                //获取有多少年
@@ -839,10 +876,12 @@
                        //判断物料是否相同
                        if (dto.SkuNo == item.SkuNo)
                        {
                            dto.Qty = (Convert.ToInt32(dto.Qty) + Convert.ToInt32(item.Qty)).ToString();
                            dto.FrozenQty = (Convert.ToInt32(dto.FrozenQty) + Convert.ToInt32(item.FrozenQty)).ToString();
                            dto.LockQty = (Convert.ToInt32(dto.LockQty) + Convert.ToInt32(item.LockQty)).ToString();
                            dto.ResidueQty = (Convert.ToInt32(dto.ResidueQty) + Convert.ToInt32(item.ResidueQty)).ToString();
                            var s = Convert.ToDecimal(dto.Qty) ;
                            var ss = Convert.ToDecimal(item.Qty);
                            dto.Qty = (Convert.ToDecimal(dto.Qty) + Convert.ToDecimal(item.Qty)).ToString();
                            dto.FrozenQty = (Convert.ToDecimal(dto.FrozenQty) + Convert.ToDecimal(item.FrozenQty)).ToString();
                            dto.LockQty = (Convert.ToDecimal(dto.LockQty) + Convert.ToDecimal(item.LockQty)).ToString();
                            dto.ResidueQty = (Convert.ToDecimal(dto.ResidueQty) + Convert.ToDecimal(item.ResidueQty)).ToString();
                            break;
                        }
                        i += 1;
@@ -990,5 +1029,560 @@
            return stockDetailsList;
        }
        #endregion
        #region AGV小车任务完成更新库存
        /// <summary>
        /// AGV入库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <param name="wcsurl">下发WCS放货完成地址</param>
        /// <returns></returns>
        public void ArriveFinish(string TaskCode,string wcsurl)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "0" && m.Status == "1");//获取正在执行的任务信息
                if (palletNo == null)
                {
                    throw new Exception("此任务已完成");
                }
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo);
                //开启事务
                Db.BeginTran();
                //修改起始库位状态
                storageLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                if (stockDetail !=null)
                {
                    //修改库存明细
                    stockDetail.Status = "0";//待分配
                    stockDetail.LocatNo = "";
                    stockDetail.AreaNo = "";
                    stockDetail.RoadwayNo = "";
                    stockDetail.WareHouseNo = "";
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                #region 下发WCS放货完成
                var data = new
                {
                    Port = palletNo.EndLocat
                };
                var jsonData = JsonConvert.SerializeObject(data);
                string response = "";
                try
                {
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    response = HttpHelper.DoPost(wcsurl, jsonData, "下发给WCS放货完成命令", "WCS");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    //////解析返回数据
                    var res = JsonConvert.DeserializeObject<WcsModel>(response);
                    if (res.StatusCode == -1)
                    {
                        throw new Exception("放货失败,WCS返回信息错误");
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                #endregion
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception("AGV返回入库完成信号处理错误,错误信息:" + ex);
            }
        }
        /// <summary>
        /// AGV出库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <param name="url">反馈MES备料完成地址</param>
        /// <returns></returns>
        public void SoFinish(string TaskCode,string url)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "1" && m.Status == "1");//获取正在执行的任务信息
                if (palletNo == null)
                {
                    throw new Exception("此任务已完成");
                }
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat); //获取库位信息
                var storageStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo); //获取库存信息
                //开启事务
                Db.BeginTran();
                //修改目的库位状态
                storageLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                //修改库存明细
                stockDetail.Status = "2";// 0:待分配   1:部分分配 2:已分配 3:盘点锁定: 4移库锁定
                stockDetail.LocatNo = storageLocat.LocatNo;
                stockDetail.AreaNo = storageLocat.AreaNo;
                stockDetail.RoadwayNo = storageLocat.RoadwayNo;
                stockDetail.WareHouseNo = storageLocat.WareHouseNo;
                Db.Updateable(stockDetail).ExecuteCommand();
                Db.CommitTran();
            }
            catch (Exception ex )
            {
                throw new Exception("AGV返回出库完成信号处理错误,错误信息:" + ex);
            }
        }
        //完成接口修改(未完成)
        //try
        //{
        //    var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.Status == "1");//获取正在执行的任务信息
        //    if (palletNo == null)
        //    {
        //        throw new Exception("此任务已完成");
        //    }
        //    var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat); //获取库位信息
        //    var storageStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
        //    var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo).ToList();
        //    if (stockDetail.Count == 0)
        //    {
        //        throw new Exception("托盘上物料库存明细信息不存在,请检查!");
        //    }
        //    //开启事务
        //    Db.BeginTran();
        //    if (storageLocat != null)
        //    {
        //        if (storageLocat.AreaNo == "B12")//车间缓存位需要通知MES
        //        {
        //            var data = new List<RequertBeiliaoInfoModel>();
        //            //更改库存明细
        //            foreach (var item in stockDetail)
        //            {
        //                item.LocatNo = item.LocatNo;//储位更改
        //                item.WareHouseNo = item.WareHouseNo;//所属仓库更改
        //                item.RoadwayNo = item.RoadwayNo;//所属巷道更改
        //                item.AreaNo = item.AreaNo;//所属区域更改
        //                Db.Updateable(item).ExecuteCommand();
        //                if (string.IsNullOrWhiteSpace(item.SONo))
        //                {
        //                    throw new Exception("当前托盘不是拼托出库托盘");
        //                }
        //                var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).ToList();
        //                if (boxInfo.Count == 0)
        //                {
        //                    throw new Exception("托盘上物料箱码信息不存在,请检查!");
        //                }
        //                //var boxno = boxInfo.GroupBy(w => w.BoxNo).ToList();
        //                var boxno = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).GroupBy(m => new
        //                {
        //                    m.BoxNo
        //                }).Select(it => new DataBoxInfo()
        //                {
        //                    BoxNo = it.BoxNo
        //                }).ToList();
        //                //记录托盘上信息给MES
        //                foreach (var item2 in boxno)
        //                {
        //                    var a = item.ProductionTime.ToString();
        //                    data.Add(new RequertBeiliaoInfoModel()
        //                    {
        //                        no = item2.BoxNo,
        //                        materiel_no = item.SkuNo,
        //                        materiel_name = item.SkuName,
        //                        qty = item.Qty,
        //                        batch = item.LotNo,
        //                        producttime = item.ProductionTime.ToString().Substring(0, 10),
        //                        expiry = item.ExpirationTime.ToString().Substring(0, 10)
        //                    });
        //                }
        //                //库存箱码明细删除
        //                Db.Deleteable(boxInfo).ExecuteCommand();
        //                //删除库存托盘信息
        //                Db.Deleteable(item).ExecuteCommand();
        //                //更改库存总表
        //                var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
        //                stock.LockQty -= (decimal)item.Qty;
        //                stock.Qty -= (decimal)item.Qty;
        //                Db.Updateable(stock).ExecuteCommand();
        //                //更改托盘状态
        //                var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
        //                if (pallet != null)
        //                {
        //                    pallet.Status = "0";
        //                    Db.Updateable(pallet).ExecuteCommand();
        //                }
        //            }
        //            //获取令牌
        //            //var token = new Token().GetMesToken(mesTokenUrl);
        //            var token = "";
        //            Dictionary<string, string> mesDic = new Dictionary<string, string>()
        //        {
        //        {"Authorization",token }
        //        };
        //            var endlono = palletNo.EndLocat;
        //            //缓存库位转换
        //            switch (palletNo.EndLocat.ToString().Substring(4, 1))
        //            {
        //                case "1":
        //                    endlono = "Y003_00" + palletNo.EndLocat.ToString().Substring(6, 1);
        //                    break;
        //                case "2":
        //                    endlono = "Y138_0" + palletNo.EndLocat.ToString().Substring(5, 2);
        //                    break;
        //                case "3":
        //                    endlono = "Y128_0" + palletNo.EndLocat.ToString().Substring(5, 2);
        //                    break;
        //                default:
        //                    break;
        //            }
        //            var mescode = Db.Queryable<BllExportNotice>().Where(w => w.SONo == stockDetail.First().SONo).First();
        //            var mesData = new RequertBeiliaoModel()
        //            {
        //                morder_no = mescode.OrderCode,
        //                pallet = stockDetail.First().PalletNo,
        //                layer_no = endlono,
        //                items = data
        //            };
        //            var jsonData = JsonConvert.SerializeObject(mesData);
        //            //调用接口
        //            var response = HttpHelper.DoPost(url, jsonData, "备料完成运至缓存区反馈至MES", "MES", mesDic);
        //            var obj = JsonConvert.DeserializeObject<MesModel>(response);//解析返回数据
        //            if (obj.status != "success")
        //            {
        //                throw new Exception("备料同步MES失败:" + obj.message);
        //            }
        //        }
        //        //修改目的库位状态
        //        storageLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
        //        Db.Updateable(storageLocat).ExecuteCommand();
        //        //修改任务状态
        //        palletNo.Status = "2";   //已完成
        //        Db.Updateable(palletNo).ExecuteCommand();
        //        //修改库存明细
        //        item.Status = "2";// 0:待分配   1:部分分配 2:已分配 3:盘点锁定: 4移库锁定
        //        stockDetail.LocatNo = storageLocat.LocatNo;
        //        stockDetail.AreaNo = storageLocat.AreaNo;
        //        stockDetail.RoadwayNo = storageLocat.RoadwayNo;
        //        stockDetail.WareHouseNo = storageLocat.WareHouseNo;
        //        Db.Updateable(stockDetail).ExecuteCommand();
        //    }
        //    Db.CommitTran();
        //}
        /// <summary>
        /// AGV移库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <param name="url">反馈MES备料完成地址</param>
        /// <returns></returns>
        public void MoveFinish(string TaskCode,string url)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "3" && m.Status == "1");//获取正在执行的任务信息
                if (palletNo == null)
                {
                    throw new Exception("此任务已完成");
                }
                var startLocat = new SysStorageLocat();
                var endLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat); //获取目的库位信息
                if (endLocat == null)
                {
                    throw new Exception("未找到相应的目的库位");
                }
                var storageStart = new SysStorageLocat();
                int isstock = 1;
                var bindDetail = new BllPalletBind();
                var sysPanlno = new SysPallets();
                var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo).ToList(); //获取库存信息
                if (stockDetail.Count == 0)
                {
                    //未找到库存后需要判断是否是空托盘移库
                    isstock = 0;
                    bindDetail = Db.Queryable<BllPalletBind>().OrderByDescending(w=>w.Id).First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat);//获取组托盘信息
                    if (bindDetail == null)
                    {
                        bindDetail = Db.Queryable<BllPalletBind>().OrderByDescending(w => w.Id).First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat);//获取组托盘信息
                        if (bindDetail == null)
                        {
                            throw new Exception("未找到空托盘组托信息");
                        }
                    }
                }
                else
                {
                    storageStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取起始库位信息
                    if (storageStart == null)
                    {
                        throw new Exception("未找到相应的起始库位");
                    }
                }
                //var soAllot = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.PalletNo == palletNo.PalletNo);//获取分配信息
                //开启事务
                Db.BeginTran();
                //修改目的库位状态
                endLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(endLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                if (isstock == 1)
                {
                    startLocat = Db.Queryable<SysStorageLocat>().First(w=> w.IsDel == "0" && w.LocatNo == palletNo.StartLocat);
                    //修改起始库位状态
                    startLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(startLocat).ExecuteCommand();
                    //调用MES备料反馈完成接口
                    #region  MES备料完成反馈
                    var data = new List<RequertBeiliaoInfoModel>();
                    //更改库存明细
                    foreach (var item in stockDetail)
                    {
                        item.LocatNo = endLocat.LocatNo;//储位更改
                        item.WareHouseNo = endLocat.WareHouseNo;//所属仓库更改
                        item.RoadwayNo = endLocat.RoadwayNo;//所属巷道更改
                        item.AreaNo = endLocat.AreaNo;//所属区域更改
                        Db.Updateable(item).ExecuteCommand();
                        if (endLocat != null && endLocat.AreaNo == "B12") //是否是3楼缓存区 是:删除库存
                        {
                            if (string.IsNullOrWhiteSpace(item.SONo))
                            {
                                throw new Exception("当前托盘不是拼托出库托盘");
                            }
                            var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).ToList();
                            if (boxInfo.Count == 0)
                            {
                                throw new Exception("托盘上物料箱码信息不存在,请检查!");
                            }
                            //var boxno = boxInfo.GroupBy(w => w.BoxNo).ToList();
                            var boxno = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).GroupBy(m => new
                            {
                                m.BoxNo,
                                m.ProductionTime,
                                m.ExpirationTime,
                            }).Select(it => new DataBoxInfo()
                            {
                                BoxNo = it.BoxNo,
                                ProductionTime = it.ProductionTime,
                                ExpirationTime = it.ExpirationTime,
                            }).ToList();
                            //记录托盘上信息给MES
                            foreach (var item2 in boxno)
                            {
                                //var a = item.ProductionTime.ToString();
                                data.Add(new RequertBeiliaoInfoModel()
                                {
                                    no = item2.BoxNo,
                                    materiel_no = item.SkuNo,
                                    materiel_name = item.SkuName,
                                    qty = item.Qty,
                                    batch = item.LotNo,
                                    producttime = item2.ProductionTime.ToString().Substring(0, 10),
                                    expiry = item2.ExpirationTime.ToString().Substring(0, 10)
                                });
                            }
                            //库存箱码明细删除
                            Db.Deleteable(boxInfo).ExecuteCommand();
                            //删除库存托盘信息
                            Db.Deleteable(item).ExecuteCommand();
                            //更改库存总表
                            var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                            stock.LockQty -= (decimal)item.Qty;
                            stock.Qty -= (decimal)item.Qty;
                            Db.Updateable(stock).ExecuteCommand();
                            //更改托盘状态
                            var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo.PalletNo);
                            if (pallet != null)
                            {
                                pallet.Status = "0";
                                Db.Updateable(pallet).ExecuteCommand();
                            }
                        }
                    }
                    if (endLocat != null && endLocat.AreaNo == "B12")
                    {
                        //获取令牌
                        //var token = new Token().GetMesToken(mesTokenUrl);
                        var token = "";
                        Dictionary<string, string> mesDic = new Dictionary<string, string>()
                        {
                            {"Authorization",token }
                        };
                        var endlono = endLocat.LocatNo;
                        //缓存库位转换
                        switch (endLocat.LocatNo.ToString().Substring(4, 1))
                        {
                            case "1":
                                endlono = "Y003_0" + endLocat.LocatNo.ToString().Substring(5, 2);
                                break;
                        }
                        var mescode = Db.Queryable<BllExportNotice>().Where(w => w.SONo == stockDetail.First().SONo).First();
                        var mesData = new RequertBeiliaoModel()
                        {
                            morder_no = mescode.OrderCode,
                            pallet = stockDetail.First().PalletNo,
                            layer_no = endlono,
                            items = data
                        };
                        var jsonData = JsonConvert.SerializeObject(mesData);
                        //调用接口
                        var response = HttpHelper.DoPost(url, jsonData, "备料完成运至缓存区反馈至MES", "MES", mesDic);
                        var obj = JsonConvert.DeserializeObject<MesModel>(response);//解析返回数据
                        if (obj.status != "success")
                        {
                            throw new Exception("备料同步MES失败:" + obj.message);
                        }
                    }
                    #endregion
                }
                else  //空托盘处理
                {
                    //修改组托信息
                    if (bindDetail.WareHouseNo == "W01") //1、空托盘垛到空托盘收集器;
                    {
                        bindDetail.WareHouseNo = "W02";
                        bindDetail.LocatNo = endLocat.LocatNo;
                        bindDetail.RoadwayNo = "";
                        //修改起始库位状态
                        startLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                        Db.Updateable(startLocat).ExecuteCommand();
                    }
                    else//2、拣货叫空托盘,小车完成一次,扣减一个空托盘垛上数量
                    {
                        bindDetail.Qty = bindDetail.Qty - 1;
                        if (bindDetail.Qty == 0)//数量为0后更改组托状态和托盘使用状态
                        {
                            bindDetail.Status = "2";
                            bindDetail.IsDel = "1";
                            //修改起始库位状态
                            startLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                            Db.Updateable(startLocat).ExecuteCommand();
                        }
                        else
                        {
                            bindDetail.LocatNo = startLocat.LocatNo;//?????拣货位托盘如何处理,拣货位是否需要更改状态,是否需要增加库存;
                        }
                    }
                    Db.Updateable(bindDetail).ExecuteCommand();
                }
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception("AGV返回移库完成信号处理错误,错误信息:"+ex);
            }
        }
        #endregion
        #region 数字孪生系统获取库存信息
        /// <summary>
        /// 反馈数字孪生系统库存信息
        /// </summary>
        /// <param name=""></param>
        /// <returns></returns>
        public List<ReLocateDataModel> GetLocateList()
        {
            try
            {
                //库存信息
                var stockDetailsList = Db.Queryable<DataStockDetail>().ToList();
                var sql = "select LocatNo,PalletNo,SkuName,Standard,LotNo,InspectStatus,Qty,ExpirationTime as Warranty from DataStockDetail ";
                List<ReLocateDataModel> list = Db.Ado.SqlQuery<ReLocateDataModel>(sql);
                //if (stockDetailsList.Count == 0)
                //{
                //    return list;
                //}
                //foreach (var item in stockDetailsList)
                //{
                //    list.Add(item);
                //}
                //for (int i = 0; i < stockDetailsList.Count; i++)
                //{
                //    list.Add(stockDetailsList);
                //    list[i].LocatNo = stockDetailsList[i].LocatNo;                  //库位
                //    list[i].PalletNo = stockDetailsList[i].PalletNo;                //托盘号
                //    list[i].SkuName = stockDetailsList[i].SkuName;                  //物料名称
                //    list[i].Stadard = stockDetailsList[i].Standard;                  //规格
                //    list[i].LotNo = stockDetailsList[i].LotNo;                      //批次
                //    list[i].InspectStatus = stockDetailsList[i].InspectStatus;      //质量状态
                //    list[i].Qty = stockDetailsList[i].Qty.ToString();                           //库存数量
                //    list[i].Warranty = stockDetailsList[i].ExpirationTime.ToString();           //有效期   ??过期时间,是否要更改
                //}
                return list;
            }
            catch (Exception ex)
            {
                throw new Exception("返回库存信息有误,错误信息:" + ex);
            }
        }
        #endregion
    }
}