zhaowc
2025-04-07 b9f7560cbe0e562a40e9515a0559a3e951f0fee6
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -306,6 +306,10 @@
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
                if (date.Id == notice.CreateUser)
                {
                    throw new Exception("复核失败,复核人员和创建订单人员不能相同!");
                }
                var list = new List<SoDetail>();
                foreach (var d in detail)
                {
@@ -1283,8 +1287,7 @@
                                throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实");
                            }
                        }
                        if (d.Qty < d.CompleteQty)
                        {
                            //更改库存明细锁定数量
                            var allotList = Db.Queryable<BllExportAllot>().Where(o => o.SODetailNo == d.Id && o.Status == "3" && o.IsDel == "0").ToList();
                            foreach (var o in allotList)
@@ -1335,7 +1338,7 @@
                                Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                            }
                            #endregion
                        }
                    }
                    //添加操作日志记录
@@ -1687,7 +1690,7 @@
        #region 下发出库、出库完成、重新下发任务、取消任务、异常处理
        // 下发出库(调用cs接口给他库位地址)
        public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId, string url, out string str)
        public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode,string checkmode, string loadingAddre, int userId, string url, out string str)
        {
            try
            {
@@ -1707,8 +1710,11 @@
                {
                    throw new Exception($"未找到{soNo}出库单信息");
                }
                //所有要出库的出库分配信息(未下发的信息和待拣货的信息)
                var list = Db.Queryable<BllExportAllot>().Where(a => a.IsDel == "0" && a.SONo == soNo && a.Status == "0").ToList();
                //更新出库单拣选方式
                notice.UDF1 = checkmode;
                Db.Updateable(notice).ExecuteCommand();
                //所有要出库的出库分配信息(未下发的信息和待拣货的信息和部分拣货后回流入库的托盘)
                var list = Db.Queryable<BllExportAllot>().Where(a => a.IsDel == "0" && a.SONo == soNo && (a.Status == "0" || a.Status == "3")).ToList();
                if (list.Count == 0) //判断是否有需要下发的出库流水
                {
                    throw new Exception("当前出库单据无需要下发的托盘");
@@ -1758,7 +1764,7 @@
                            if (isChai == "0")
                            {
                                var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList();
                                if (boxInfo != null)//托盘上有零箱需要拆箱
                                if (boxInfo.Count>0)//托盘上有零箱需要拆箱
                                {
                                    isChai = "1";
                                    unstackingMode2 = "1";//需要拆箱需走PDA拆垛
@@ -2249,7 +2255,7 @@
                //出库任务号更改,如果由PLC出库,则PLC回传任务号为:任务号+实际出库口
                var TtaskNo = taskNo;
                var outLine = "";
                if (userId == 0)
                if (taskNo.Length == 18)
                {
                    TtaskNo = taskNo.Substring(0, taskNo.Length - 3);
                    outLine = taskNo.Substring(taskNo.Length - 3, 3);
@@ -2395,24 +2401,22 @@
                        //添加操作日志记录
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", TtaskNo, "完成", $"点击完成按钮、完成任务号为:{TtaskNo}的任务", userId);
                    }
                    if (outLine != "")
                    if (outLine != "" && outLine != "009" && outLine != "013" && outLine != "018" && outLine != "022")
                    {
                        #region 分配出库目的位
                        string positionStart = outLine, positionEnd = "" ,type ="D00";
                        string positionStart = outLine, positionEnd = "", type = "D00";
                        var type1 = Db.Queryable<BllExportNotice>().Where(m => m.SONo == allot.First().SONo && m.IsDel == "0" && m.Status == "3").First();
                        if (type1 == null)
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B13").ToList();
                            type = "D02" ; //空托盘垛出库
                             if (outLine == "443")//西侧出库
                            type = "D02"; //空托盘垛出库
                            if (outLine == "443")//西侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01" && m.LocatNo.Substring(3, 2) == "02" && m.LocatNo.Substring(3, 2) == "03" &&
                                m.Status == "0" && m.Flag == "0").LocatNo;
                                positionEnd = locateno.First(m => m.Row == 1 && m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                            else if (outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" && m.LocatNo.Substring(4, 2) == "06" &&
                                m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                                positionEnd = locateno.First(m => m.Row == 2 && m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                            else  //1楼空托盘出库不调用AGV
                            {
@@ -2421,31 +2425,45 @@
                            }
                        }
                        if (type1.Type == "1" && (type1.Type == "5" || (positionStart == "440" && positionStart == "440")))  //3楼领料出库 /3L中间品出库
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B11").ToList();
                            if (outLine == "443")//西侧出库
                        else
                        {
                            if (type1.Type == "1" || (type1.Type == "5" && (positionStart == "440" || positionStart == "443")))  //3楼领料出库 /3L中间品出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01"&& m.LocatNo.Substring(4, 2) == "02" && m.Status == "0" && m.Flag == "0").LocatNo; //西侧房间库位
                            }
                            else  if(outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "03" && m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" &&
                                m.LocatNo.Substring(4, 2) == "06" && m.LocatNo.Substring(3, 2) == "07" && m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                        }
                        else if (type1.Type == "2" && type1.Type == "3") //抽检出库 /取样出库
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B04" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else if (type1.Type == "4")//不合格品出库
                        {
                                var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B11").ToList();
                                if (outLine == "443")//西侧出库
                                {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B03" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else //其他单据类型都存放发货缓存区
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo;
                                    positionEnd = locateno.OrderBy(m => m.LocatNo).First(m => m.Row == 1 && m.Status == "0" && m.Flag == "0").LocatNo; //西侧房间库位
                                }
                                else if (outLine == "440")  //东侧出库
                                {
                                    positionEnd = locateno.OrderBy(m => m.LocatNo).First(m => m.Row == 3  && m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位和对面房间
                                }
                            }
                            else if (type1.Type == "2" || type1.Type == "3") //抽检出库 /取样出库
                            {
                                positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m=>m.LocatNo).First(m => m.AreaNo == "B04" && m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                            else if (type1.Type == "4")//不合格品出库
                            {
                                positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => (m.AreaNo == "B01"|| m.AreaNo == "B02"||m.AreaNo == "B04") && m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                            else if (type1.Type == "0")//成品出库
                            {
                                if (type1.UDF1 == "0") //出库到暂存区
                                {
                                    positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo;
                                }
                                else
                                {
                                    return;
                                }
                            }
                            else //其他单据类型都存放发货缓存区
                            {
                                positionEnd = Db.Queryable<SysStorageLocat>().OrderBy(m => m.LocatNo).First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                        }
                        #endregion
@@ -2480,7 +2498,8 @@
                        agvTask.CtnrTyp = "1";            //容器类型,值为1
                        if (type == "D02")
                        {
                            agvTask.CtnrNum = "10";     //叠托任务需要下发空托盘数量
                            var palnoNum = Db.Queryable<BllPalletBind>().OrderByDescending(w=>w.Id).First(w => w.IsDel == "0" && w.PalletNo == task.PalletNo);
                            agvTask.CtnrNum = palnoNum.Qty.ToString();     //叠托任务需要下发空托盘数量
                        }
                        agvTaskList.Add(agvTask);
@@ -2500,6 +2519,41 @@
                            LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr);
                        }
                        #endregion
                        #region 添加出库任务信息
                        var taskNonew = new Common().GetMaxNo("TK");
                        var exTask = new LogTask    //小车移库任务
                        {
                            TaskNo = TtaskNo,
                            Sender = "WMS",
                            Receiver = "AGV",
                            IsSuccess = 1, //是否下发成功 0失败 1成功
                            StartLocat = positionStart,//起始位置
                            EndLocat = positionEnd,//目标位置
                            PalletNo = task.PalletNo,//托盘码
                            IsSend = 1,//是否可再次下发
                            IsCancel = 1,//是否可取消
                            IsFinish = 1,//是否可完成
                            Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                            OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                            CreateTime = DateTime.Now, //创建时间
                            CreateUser = userId, //创建人
                            Msg = "小车从" + positionStart  + "到" + positionEnd + "的移库任务", //关键信息
                                                                                                             //FinishDate = serverTime, //完成时间
                        };
                        Db.Insertable(exTask).ExecuteCommand();
                        #endregion
                        #region 储位状态变更
                        //更改储位状态为出库中
                        var locat = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == positionEnd);
                        locat.Status = "4"; //4 移入中
                        Db.Updateable(locat).ExecuteCommand();//修改储位信息
                        #endregion
                    }
                    Db.CommitTran();
@@ -2632,8 +2686,9 @@
                    StartLocate = locateNo, // 起始位置
                    StartRoadway = locate.RoadwayNo,
                    EndLocate = task.EndLocat, // 目标位置 
                    EndRoadway = task.EndRoadway,
                    TaskNo = task.TaskNo, // 任务号
                    TaskType = "1",// 任务类型 (出库)
                    TaskType = task.Type,// 任务类型 (出库)
                    OutMode = "",  //目标地址
                    Order = 1
                }; //出库数据 
@@ -2887,7 +2942,15 @@
                    // 出库总表  状态改为部分分配
                    var noticeModel = Db.Queryable<BllExportNotice>().First(m => m.SONo == noticeDetailModel.SONo && m.IsDel == "0");
                    noticeModel.Status = "1";
                    if (noticeDetailModel.AllotQty<=0)
                    {
                        noticeModel.Status = "0";
                    }
                    else
                    {
                        noticeModel.Status = "1";
                    }
                    Db.Updateable(noticeModel).ExecuteCommand();
                    // 库存明细表 状态修改为异常锁定 锁定数量修改为托盘上数量
@@ -2901,7 +2964,7 @@
                    // 库存总表 锁定数量=当前锁定数量 +  (库存明细托盘上数量-库存明细托盘上已锁定的数量)
                    var stockModel = Db.Queryable<DataStock>().First(m => m.LotNo == stockDetailModel.LotNo && m.SkuNo == stockDetailModel.SkuNo && m.IsDel == "0");
                    stockModel.LockQty = stockModel.LockQty + (int)(stockDetailModel.Qty - lockQty);
                    stockModel.LockQty = stockModel.LockQty + (decimal)(stockDetailModel.Qty - lockQty);
                    Db.Updateable(stockModel).ExecuteCommand();
                    // 拣货明细表 删除
@@ -3586,7 +3649,7 @@
                    foreach (var item in detailList)
                    {
                        totalQty += item.Qty;
                        totalAllotQty += Convert.ToInt32(item.AllotQty);
                        totalAllotQty += Convert.ToDecimal(item.AllotQty);
                    }
                    if (totalAllotQty >= totalQty)
@@ -3660,7 +3723,7 @@
                        }
                    }
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList();
                    if (boxInfo != null)//托盘上有零箱需要拆箱
                    if (boxInfo.Count>0)//托盘上有零箱需要拆箱
                    {
                        result = "1";//需要拆箱
                        break;
@@ -3753,14 +3816,14 @@
            try
            {
                // 判断当前任务状态  Status 1:正在执行 3:异常结束
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" );
                if (taskModel == null)
                {
                    throw new Exception("此任务不存在或任务状态已变更!");
                }
                // 验证托盘分配信息
                var palletBindModel = Db.Queryable<BllExportAllot>().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (palletBindModel != null)
                var palletBindModel = Db.Queryable<BllExportAllot>().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "2");
                if (palletBindModel == null)
                {
                    throw new Exception("未找到当前托盘分配任务信息!");
                }
@@ -3887,7 +3950,7 @@
                    throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                }
                decimal pickQty = 0;//拣货的数量
                Db.BeginTran();
                var comList = new List<BllCompleteDetail>();
                foreach (var item in boxInfos)
                {
@@ -3994,12 +4057,12 @@
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
                Db.CommitTran();
                return allot.LoadingAddre;
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }