zhaowc
2025-02-28 157abc191c34e57c1b958ae74fc3de6518ca8a30
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -16,6 +16,7 @@
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;
@@ -1060,13 +1061,18 @@
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                //修改库存明细
                stockDetail.Status = "0";//待分配
                stockDetail.LocatNo = "";
                stockDetail.AreaNo = "";
                stockDetail.RoadwayNo = "";
                stockDetail.WareHouseNo = "";
                Db.Updateable(stockDetail).ExecuteCommand();
                if (stockDetail !=null)
                {
                    //修改库存明细
                    stockDetail.Status = "0";//待分配
                    stockDetail.LocatNo = "";
                    stockDetail.AreaNo = "";
                    stockDetail.RoadwayNo = "";
                    stockDetail.WareHouseNo = "";
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                #region 下发WCS放货完成
                var data = new
@@ -1088,6 +1094,7 @@
                        throw new Exception("放货失败,WCS返回信息错误");
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
@@ -1101,7 +1108,7 @@
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception("AGV返回入库完成信号处理错误,错误信息:" + ex);
            }
        }
@@ -1110,8 +1117,9 @@
        /// AGV出库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <param name="url">反馈MES备料完成地址</param>
        /// <returns></returns>
        public void SoFinish(string TaskCode)
        public void SoFinish(string TaskCode,string url)
        {
            try
            {
@@ -1153,12 +1161,162 @@
            }
        }
        //完成接口修改(未完成)
        //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)
        public void MoveFinish(string TaskCode,string url)
        {
            try
            {
@@ -1167,40 +1325,211 @@
                {
                    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); //获取库存信息
                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();
                //修改起始库位状态
                storageLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改目的库位状态
                storageLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                endLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(endLocat).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();
                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);
            }
        }
@@ -1217,32 +1546,41 @@
        {
            try
            {
                List<ReLocateDataModel> list = new List<ReLocateDataModel>();
                //库存信息
                var stockDetailsList = Db.Queryable<StockDetailDto>().ToList();
                if (stockDetailsList.Count == 0)
                {
                    return list;
                }
                for (int i = 0; i < stockDetailsList.Count; i++)
                {
                    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();           //有效期   ??过期时间,是否要更改
                }
                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("AGV返回入库完成信号处理错误,错误信息:" + ex);
                throw new Exception("返回库存信息有误,错误信息:" + ex);
            }
        }
        #endregion