Administrator
2 天以前 d386d8d2ca5fd242b99c9cedf670e6d680eca0ed
Wms/WMS.BLL/HttpServer.cs
@@ -26,6 +26,309 @@
        private static readonly SqlSugarScope Db = DataContext.Db;
        public HttpServer() { }
        public OutCommandDto RequestPalletIn(string palletNo, string houseNo, int palletNum, string Strlocate)
        {
            //return null;
            try
            {
                #region 判断
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw new Exception("托盘号不能为空");
                }
                if (string.IsNullOrEmpty(houseNo))
                {
                    throw new Exception("仓库号不能为空");
                }
                if (palletNum <= 0)
                {
                    throw new Exception("托盘数量不能小等0");
                }
                if (string.IsNullOrEmpty(Strlocate))
                {
                    throw new Exception("起始位置不能为空");
                }
                //获取储位信息
                var locateInfo = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.LocatNo == Strlocate);
                if (locateInfo == null)
                {
                    throw new Exception("未查询到空储位");
                }
                if (locateInfo.Flag != "0")
                {
                    throw new Exception("当前位置标识状态是非正常的");
                }
                #endregion
                #region MyRegion
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                if (stockDetail.Count > 0)
                {
                    throw new Exception("当前托盘在库内已有库存信息,请核实");
                }
                //获取托盘信息
                var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                if (pallet == null)
                {
                    throw new Exception("未查询到托盘信息");
                }
                if (pallet.Status != "0")
                {
                    throw new Exception("托盘状态不能未使用状态");
                }
                //获取托盘信息
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == "100099");
                if (sku == null)
                {
                    throw new Exception("物料信息中未查询到空托盘的物料信息,不可入库");
                }
                var pNum = 0;
                var bNum = 0;
                new Common().GetPackQtyInfo(sku.PackagNo, ref pNum, ref bNum);
                var datetime = Db.GetDate();
                Db.BeginTran();
                // 插入托盘绑定表
                var modelpb = new BllPalletBind
                {
                    ASNNo = "",
                    ASNDetailNo = 0,
                    TaskNo = "", //任务号
                    PalletNo = palletNo,
                    Qty = palletNum,
                    FullQty = pNum,
                    Status = "2", //上架完成
                    Type = "1", //0 物料托 1 空托
                    LotNo = "",
                    LotText = "",
                    SupplierLot = "",
                    InspectMark = "0", //0 否 1 是
                    BitPalletMark = pNum == palletNum ? "0" : "1",
                    IsBale = "0",
                    IsBelt = "0",
                    CreateUser = 0,
                    CreateTime = Db.GetDate()
                };
                var id = Db.Insertable(modelpb).ExecuteReturnIdentity();
                #region 申请储位
                SysStorageLocat locate = null;
                //判断物料是否含有类别信息
                if (string.IsNullOrWhiteSpace(sku.CategoryNo))
                {
                    throw new Exception($"物料:{sku.SkuNo}未查询到类别信息");
                }
                var skuCategory = Db.Queryable<SysMaterialCategory>().First(m => m.IsDel == "0" && m.CategoryNo == sku.CategoryNo);
                if (skuCategory == null)
                {
                    throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别");
                }
                var areaStr = skuCategory.AreaNo.Split(",");
                var areaList = new List<string>();
                foreach (var item in areaStr)
                {
                    areaList.Add(item);
                }
                var allotLocate = new AllotLocation();
                for (int i = 1; i <= 2; i++)
                {
                    var iStr = i.ToString();
                    locate = allotLocate.GetSuiTableLocate(houseNo, areaList, "", iStr);
                    if (locate != null)
                    {
                        break;
                    }
                }
                #endregion
                #region 库存明细
                var sd1 = new DataStockDetail()
                {
                    LotNo = modelpb.LotNo,
                    LotText = modelpb.LotText,
                    SupplierLot = modelpb.SupplierLot,
                    SkuNo = sku.SkuNo,
                    SkuName = sku.SkuName,
                    Standard = sku.Standard,
                    Qty = modelpb.Qty,
                    LockQty = 0,
                    FrozenQty = 0,
                    InspectQty = 0,
                    ASNNo = modelpb.ASNNo,
                    ASNDetailNo = modelpb.ASNDetailNo,
                    //WareHouseNo = locate.WareHouseNo,
                    //RoadwayNo = locate.RoadwayNo,
                    //AreaNo = locate.AreaNo,
                    //LocatNo = locate.LocatNo,
                    PalletNo = modelpb.PalletNo,
                    PalletNo2 = modelpb.PalletNo2,
                    PalletNo3 = modelpb.PalletNo3,
                    PalletTags = "0",
                    CompleteTime = datetime,
                    ProductionTime = modelpb.ProductionTime,
                    ExpirationTime = modelpb.ExpirationTime,
                    Status = "0",
                    InspectMark = modelpb.InspectMark,
                    InspectStatus = sku.IsInspect,
                    BitPalletMark = modelpb.BitPalletMark,
                    PackagNo = sku.PackagNo,
                    IsBale = modelpb.IsBale,
                    IsBelt = modelpb.IsBelt,
                    IsDel = "0",
                    CreateUser = 0,
                    CreateTime = datetime
                };
                var sdId1 = Db.Insertable(sd1).ExecuteReturnIdentity();
                #endregion
                #region 库存
                var dataStock1 = Db.Queryable<DataStock>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo);
                if (dataStock1 != null)
                {
                    dataStock1.Qty += modelpb.Qty;
                    if (modelpb.InspectMark == "1")
                    {
                        dataStock1.IsSampling = "0";
                    }
                    Db.Updateable(dataStock1).ExecuteCommand();
                }
                else
                {
                    var stock = new DataStock()
                    {
                        SkuNo = sku.SkuNo,
                        SkuName = sku.SkuName,
                        Standard = sku.Standard,
                        LotNo = "",
                        LotText = "",
                        Qty = modelpb.Qty,
                        LockQty = 0,
                        FrozenQty = 0,
                        IsSampling = "0",
                        IsDel = "0",
                        CreateUser = 0,
                        CreateTime = datetime
                    };
                    Db.Insertable(stock).ExecuteCommand();
                }
                #endregion
                // 更改托盘使用状态
                string sqlStr = string.Empty;
                sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{palletNo}';";
                Db.Ado.ExecuteCommand(sqlStr);
                #region 添加任务
                //添加巷道使用记录
                var log = new SysRoadwayUseLog
                {
                    RoadwayNo = locate.RoadwayNo,
                    WareHouseNo = houseNo,
                    Row = 0,
                    Column = 0,
                    Layer = 0,
                };
                Db.Insertable(log).ExecuteCommand();
                var taskNo = new Common().GetMaxNo("TK");
                var inTask = new LogTask    //入库任务
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "WCS",
                    IsSuccess = 1, //是否下发成功 0失败 1成功
                    SendDate = DateTime.Now,  //发送时间
                    BackDate = DateTime.Now,  //返回时间
                    StartRoadway = "",            // 起始巷道
                    StartLocat = Strlocate,//起始位置
                    EndLocat = locate.LocatNo,//目标位置
                    EndRoadway = locate.RoadwayNo,  // 目标巷道
                    PalletNo = palletNo,//托盘码
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "1",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "0",//0 入库单 1 出库单  2 盘点单  3 移库单
                    Msg = $"{locateInfo.LocatNo}到=>>" + locate.LocatNo + "的入库任务", //关键信息
                };
                Db.Insertable(inTask).ExecuteCommand();
                var asnNo = "";
                //添加托盘上架记录
                var upShelf = new BllPalletUpShelf()
                {
                    TaskNo = inTask.TaskNo,
                    TraceNo = asnNo,
                    PalletNo = palletNo,
                    SkuNo = sku.SkuNo,
                    SkuName = sku.SkuName,
                    LotNo = "",
                    Status = "1",
                    WareHouseNo = houseNo,
                    RoadwayNo = locate.RoadwayNo,
                    AreaNo = locate.AreaNo,
                    LocatNo = locate.LocatNo,
                    CreateUser = 0,
                };
                Db.Insertable(upShelf).ExecuteCommand();
                locate.Status = "2";
                Db.Updateable(locate).ExecuteCommand();
                var comDto = new OutCommandDto()
                {
                    TaskNo = taskNo, // 任务号
                    TaskType = "0",// 任务类型
                    PalletNo = palletNo,//托盘号
                    StartRoadway = inTask.StartRoadway,
                    StartLocate = inTask.StartLocat, // 起始位置
                    EndLocate = inTask.EndLocat, // 目标位置
                    EndRoadway = inTask.EndRoadway,   // 目标巷道
                    Qty = int.Parse(modelpb.Qty.ToString()),
                    Order = 999,
                    Type = PLCTypeEnum.AGV
                };
                #endregion
                Db.CommitTran();
                #endregion
                return comDto;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 申请储位  (立体库)
        /// </summary>
@@ -417,18 +720,18 @@
                //托盘库存信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
                //验证物料是否有成品
                foreach (var item in stockDetail)
                {
                    var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
                    if (skuItem.SkuNo == "100099")
                    {
                        continue;
                    }
                    if (skuItem.Type != "2")
                    {
                        throw new Exception("托盘上有不是成品的物料");
                    }
                }
                //foreach (var item in stockDetail)
                //{
                //    var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
                //    if (skuItem.SkuNo == "100099")
                //    {
                //        continue;
                //    }
                //    if (skuItem.Type != "2")
                //    {
                //        throw new Exception("托盘上有不是成品的物料");
                //    }
                //}
                var upShelfOld = Db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
                if (upShelfOld != null) //正常入库
@@ -534,9 +837,9 @@
                {
                    areaList.Add(item);
                }
                var roadStr = Db.Queryable<SysStorageRoadway>().Where(m => m.IsDel == "0" && m.Status == "0").Select(m=>m.RoadwayNo).ToList();
                //巷道组信息
                var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo) && !string.IsNullOrWhiteSpace(m.RoadwayNo))
                var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo) && !string.IsNullOrWhiteSpace(m.RoadwayNo) && roadStr.Contains(m.RoadwayNo))
                    .GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList();
                #endregion
@@ -724,18 +1027,18 @@
                var oldTaskNo = "";  //旧任务号
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
                //验证物料是否有成品
                foreach (var item in stockDetail)
                {
                    var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
                    if (skuItem.SkuNo == "100099")
                    {
                        continue;
                    }
                    if (skuItem.Type != "2")
                    {
                        throw new Exception("托盘上有不是成品的物料");
                    }
                }
                //foreach (var item in stockDetail)
                //{
                //    var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
                //    if (skuItem.SkuNo == "100099")
                //    {
                //        continue;
                //    }
                //    if (skuItem.Type != "2")
                //    {
                //        throw new Exception("托盘上有不是成品的物料");
                //    }
                //}
                
                var upShelfOld = Db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
@@ -1231,7 +1534,7 @@
                else
                {
                    locate2.Status = "1";
                    Db.Updateable(locate).ExecuteCommand();
                    Db.Updateable(locate2).ExecuteCommand();
                }
                
                Db.Updateable(stockDetail).ExecuteCommand();
@@ -1348,12 +1651,13 @@
        /// <param name="soNo"></param>
        /// <param name="detailId"></param>
        /// <param name="outMode"></param>
        /// <param name="palletNo"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<OutCommandDto> IssueOutHouseLk(string soNo, string detailId,string outMode, int userId, string url, out string str)
        public List<OutCommandDto> IssueOutHouseLk(string soNo, string detailId,string outMode, string palletNo, int userId, string url, out string str)
        {
            try
            {
@@ -1377,7 +1681,7 @@
                    throw new Exception("选择的出库单明细参数错误");
                }
                //所有要出库的出库分配信息(未下发的信息和待拣货的信息)
                var item = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.SONo == soNo && a.SODetailNo == intDetailId && a.Status == "0" );
                var item = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.SONo == soNo && a.SODetailNo == intDetailId && a.PalletNo == palletNo && a.Status == "0" );
                if (item == null) //判断是否有需要下发的出库流水
                {
                    throw new Exception("当前出库单据无需要下发的托盘");
@@ -1417,8 +1721,7 @@
                        var imBl = com.GetImTask(item.PalletNo);
                        if (imBl != null)
                        {
                            str = "要出库的托盘正在入库";
                            return outDto1;
                            throw new Exception("要出库的托盘正在入库");
                        }
                        //判断是否是已经出过库又回库 
                        if (item.Status == "0")
@@ -1444,26 +1747,35 @@
                                    Db.Updateable(notice).ExecuteCommand();
                                }
                            }
                            str = "要出库的托盘已在库外";
                            Db.CommitTran();
                            str = "托盘已在库外";
                            return outDto1;
                        }
                        str = "要出库的托盘正在入库";
                        return outDto1;
                    }
                    var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
                    if (locate == null)
                    {
                        str = "出库的托盘储位信息错误(在储位表中未查询到)";
                        return outDto1;
                        throw new Exception("出库的托盘储位信息错误(在储位表中未查询到)");
                    }
                    //判断储位标志是否为损坏
                    if (locate.Flag == "2")
                    {
                        str = "储位损坏不能出库";
                        return outDto1;
                        throw new Exception("储位损坏不能出库");
                    }
                    if (locate.WareHouseNo != "W02")
                    {
                        throw new Exception("托盘不在货架库上");
                    }
                    var locateEnd = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == outModeLocate && m.IsDel == "0");//当前出库的目标储位信息
                    if (locateEnd == null)
                    {
                        throw new Exception("出库的托盘储位信息错误(在储位表中未查询到)");
                    }
                    else if (locateEnd.Status != "0")
                    {
                        throw new Exception("目标储位状态不是空储位");
                    }
                    #endregion
                    if (locate.Status == "1") //有物品
@@ -1590,8 +1902,7 @@
                    }
                    else if (locate.Status == "5") //移出中
                    {
                        str = "当前要出库的储位正在移出";
                        return outDto1;
                        throw new Exception("当前要出库的储位正在移出");
                    }
                    
@@ -1614,7 +1925,7 @@
                            //解析返回数据 
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                            if (wcsModel.code == 0)
                            if (wcsModel.code == 200)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);