chengsc
2025-05-08 fc2b395e10c968f4bcf540613538265655b7a15e
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -21,6 +21,7 @@
using Model.ModelDto.DataDto;
using System.Xml.Schema;
using ZXing.OneD;
using System.Threading.Tasks;
namespace WMS.BLL.BllPdaServer
{
@@ -128,39 +129,8 @@
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                if (pack == null)
                {
                    throw new Exception("获取物料包装信息失败,请核实!");
                }
                if (pack.L5Num.HasValue)
                {
                    pNum = (int)pack.L5Num;
                    bNum = (int)pack.L4Num;
                }
                else if (pack.L4Num.HasValue)
                {
                    pNum = (int)pack.L4Num;
                    bNum = (int)pack.L3Num;
                }
                else if (pack.L3Num.HasValue)
                {
                    pNum = (int)pack.L3Num;
                    bNum = (int)pack.L2Num;
                }
                else if (pack.L2Num.HasValue)
                {
                    pNum = (int)pack.L2Num;
                    bNum = (int)pack.L1Num;
                }
                else if (pack.L1Num.HasValue)
                {
                    pNum = (int)pack.L1Num;
                    bNum = (int)pack.L1Num;
                }
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!");
                }
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                #endregion
@@ -1123,6 +1093,7 @@
        {
            try
            {
                Db.BeginTran();
                #region 判断
                //0:成品入库 1:采购入库 3:退货入库 4:车间余料入库 8:生产退料入库
@@ -1197,44 +1168,13 @@
                #region 包装
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo);
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);    // liudl 由Sku包装编号变更为入库单明细包装编号
                //var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);    // liudl 由Sku包装编号变更为入库单明细包装编号
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                if (pack == null)
                {
                    throw new Exception("获取物料包装失败,请核实!");
                }
                if (pack.L5Num.HasValue)
                {
                    pNum = (int)pack.L5Num;
                    bNum = (int)pack.L4Num;
                }
                else if (pack.L4Num.HasValue)
                {
                    pNum = (int)pack.L4Num;
                    bNum = (int)pack.L3Num;
                }
                else if (pack.L3Num.HasValue)
                {
                    pNum = (int)pack.L3Num;
                    bNum = (int)pack.L2Num;
                }
                else if (pack.L2Num.HasValue)
                {
                    pNum = (int)pack.L2Num;
                    bNum = (int)pack.L1Num;
                }
                else if (pack.L1Num.HasValue)
                {
                    pNum = (int)pack.L1Num;
                    bNum = (int)pack.L1Num;
                }
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!");
                }
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                #endregion
@@ -1330,10 +1270,16 @@
                {
                    tags = "1";
                }
                //验证库存托盘是否有贴标物料
                var skuStr = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" && m.IsPasteCode == "1").Select(m => m.SkuNo).ToList();
                var sdHave = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && skuStr.Contains(m.SkuNo));
                if (sdHave>0)
                {
                    throw new Exception("当前托盘含有贴标物料信息,不能组托");
                }
                // 判断库存明细是否已有此托盘信息  
                var sd1 = Db.Queryable<DataStockDetail>()
                    .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.LotNo == bind.LotNo);
                    .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.SkuNo == detail.SkuNo && m.LotNo == bind.LotNo);
                var sdId1 = 0;
                if (sd1 != null)
                {
@@ -1426,8 +1372,6 @@
                }
                #endregion
                #region 更改组托信息
                var isSample = "0";//是否取样
@@ -1497,10 +1441,12 @@
                Db.Updateable(notice).ExecuteCommand();
                #endregion
                #region 库存明细
                #region 更改库存明细数量
                sd1.Qty = bind.Qty;
                //更改库存明细数量
                Db.Updateable(sd1).Where(m => m.Id == sdId1).ExecuteCommand();
                #endregion
                #region 库存
@@ -1574,9 +1520,12 @@
                sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                Db.Ado.ExecuteCommand(sqlStr);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
@@ -1878,11 +1827,16 @@
                {
                    if (models[0].Status == "1")
                    {
                        sqlString = $"select count(id) from DataStockDetail where PalletNo = '{palletNo}' and isnull(LocatNo,'') != '' and isdel = '0';";
                        int rowNum = Db.Ado.GetInt(sqlString);
                        if (rowNum > 0)
                        var detail = Db.Queryable<DataStockDetail>().First(m=>m.PalletNo == palletNo );
                        if (detail!= null && !string.IsNullOrWhiteSpace(detail.LocatNo))
                        {
                            sqlMsg = "-1:托盘使用中,此托盘应在库内请核实!";
                            var pingAreaStr = Db.Queryable<SysStorageArea>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
                            var pingLocateInfo = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == detail.LocatNo && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0");
                            if (pingLocateInfo == null)
                            {
                                sqlMsg = "-1:托盘使用中,此托盘应在库内请核实!";
                            }
                        }
                    }
                }
@@ -1896,6 +1850,217 @@
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 根据单据获取标签数量
        /// </summary>
        /// <param name="asnNo">入库单</param>
        /// <param name="asnDetailId">入库单明细号</param>
        /// <returns></returns>
        public BoxListInfoDto GetBoxCountByAsn(string asnNo,int? asnDetailId)
        {
            try
            {
                var detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == asnDetailId);
                if (detail == null)
                {
                    throw new Exception("没有查询到单据明细信息");
                }
                var data = new BoxListInfoDto()
                {
                    SkuNo = detail.SkuNo,
                    SkuName = detail.SkuName,
                    LotNo = detail.LotNo,
                };
                //获取状态是未组托的标签信息
                var models = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId ).GroupBy(m=> new { m.ProductionTime,m.ExpirationTime }).Select(m=>new { m.ProductionTime ,m.ExpirationTime}).OrderBy(m=>m.ProductionTime).ToList();//&& m.Status == "0"
                foreach (var item in models)
                {
                    var boxNoList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId && m.ProductionTime == item.ProductionTime).Select(m => m.BoxNo).ToList();
                    if (boxNoList.Count > 0)
                    {
                        data.BoxNoList = boxNoList;
                        data.Date1 = item.ProductionTime.ToString();
                        data.Date2 = item.ExpirationTime.ToString();
                        break;
                    }
                }
                return data;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 保存指定的储位
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="locateNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void SaveAppointLocate(string palletNo, string locateNo, int userId)
        {
            try
            {
                //托盘库存信息
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                if (stockDetailList.Count(m=> string.IsNullOrWhiteSpace(m.LocatNo)) > 0)
                {
                    throw new Exception("托盘没有在平库储位上");
                }
                //判断托盘的储位是否是平库
                var stockDetail = stockDetailList.First();
                var oldLocate = stockDetail.LocatNo;
                var pingAreaStr = Db.Queryable<SysStorageArea>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
                var pingLocateInfo = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldLocate && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0");
                if (pingLocateInfo == null)
                {
                    throw new Exception("当前托盘所在的储位没有在系统中找到信息");
                }
                var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
                //验证物料是否有成品
                foreach (var item in stockDetailList)
                {
                    var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
                    if (skuItem.Type == "2")
                    {
                        throw new Exception("成品物料请入成品库");
                    }
                }
                //储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateNo);
                if (locate == null)
                {
                    throw new Exception("未查询到储位的信息");
                }
                if (locate.WareHouseNo != "W02")
                {
                    throw new Exception("只能指定立库的储位");
                }
                if (locate.Status != "0" || locate.Flag != "0")
                {
                    throw new Exception("该储位状态不是空储位或标志不是正常的");
                }
                Db.BeginTran();
                try
                {
                    var time = DateTime.Now;
                    //判断当前托盘是否存在绑定信息
                    var task = Db.Queryable<LogTask>().First(m=> m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1") && m.OrderType == "0" && m.Type == "0");
                    var upShelf = Db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
                    if (task != null)
                    {
                        if (task.Status == "1")
                        {
                            throw new Exception("托盘正在执行任务,不可指定储位");
                        }
                        if (task.Status == "0")
                        {
                            if (upShelf != null)
                            {
                                if (upShelf.Status == "1")
                                {
                                    throw new Exception("托盘正在执行上架任务,不可指定储位");
                                }
                                if (upShelf.Status == "0")
                                {
                                    if (locate.LocatNo == task.EndLocat)
                                    {
                                        throw new Exception("已指定储位,无需重复指定");
                                    }
                                    //重新指定储位
                                    task.EndLocat = locate.LocatNo;
                                    task.EndRoadway = locate.RoadwayNo;
                                    upShelf.LocatNo = locate.LocatNo;
                                    upShelf.RoadwayNo = locate.RoadwayNo;
                                    Db.Updateable(task).ExecuteCommand();
                                    Db.Updateable(upShelf).ExecuteCommand();
                                    new OperationASNServer().AddLogOperationAsn("PDA模块", "指定储位", palletNo, "编辑", $"指定了储位:{locate.LocatNo}、托盘码:{palletNo}的信息", userId);
                                    Db.CommitTran();
                                    return;
                                }
                            }
                            else
                            {
                                throw new Exception("查询出任务但没有上架记录,信息错误");
                            }
                        }
                    }
                    // 添加入库日志记录
                    var taskNo = new Common().GetMaxNo("TK");
                    var addTask = new LogTask    //入库任务
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 1, //是否下发成功 0失败 1成功
                        SendDate = DateTime.Now,  //发送时间
                        //BackDate = DateTime.Now,  //返回时间
                        StartRoadway = "",            // 起始巷道
                        StartLocat = oldLocate,//起始位置
                        EndLocat = locate.LocatNo,//目标位置
                        EndRoadway = locate.RoadwayNo,  // 目标巷道
                        PalletNo = palletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "0",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = $"{oldLocate}到=>>{locate.LocatNo}的入库任务", //关键信息
                    };
                    Db.Insertable(addTask).ExecuteCommand();
                    //添加托盘上架记录
                    var upShelfAdd = new BllPalletUpShelf()
                    {
                        TaskNo = addTask.TaskNo,
                        TraceNo = "",
                        PalletNo = palletNo,
                        SkuNo = stockDetail.SkuNo,
                        SkuName = stockDetail.SkuName,
                        LotNo = stockDetail.LotNo,
                        Status = "0",
                        WareHouseNo = locate.WareHouseNo,
                        RoadwayNo = locate.RoadwayNo,
                        AreaNo = locate.AreaNo,
                        LocatNo = locate.LocatNo,
                        CreateUser = 0,
                    };
                    Db.Insertable(upShelfAdd).ExecuteCommand();
                    locate.Status = "2";
                    Db.Updateable(locate).ExecuteCommand();
                    new OperationASNServer().AddLogOperationAsn("PDA模块", "指定储位", palletNo, "编辑", $"指定了储位:{locate.LocatNo}、托盘码:{palletNo}的信息", userId);
                    Db.CommitTran();
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
@@ -3294,7 +3459,7 @@
            try
            {
                string strMsg = "";
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo && w.Status == "0" && w.WareHouseNo == "W02");
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo && w.Status == "0" && w.WareHouseNo == "W04");
                if (storageLocat == null)
                {
                    throw new Exception("-1:地码(储位信息)不存在或非空闲状态,请核查!");
@@ -5431,7 +5596,7 @@
                    //修改库存明细信息
                    foreach (var item in stockDetail)
                    {
                        item.Status = "0";                                  // 状态更改为待分配
                        //item.Status = "0";                                  // 状态更改为待分配
                        item.WareHouseNo = storageLocat.WareHouseNo;        // 所属仓库
                        item.RoadwayNo = storageLocat.RoadwayNo;            // 所属巷道
                        item.AreaNo = storageLocat.AreaNo;                  // 所属区域
@@ -5463,14 +5628,14 @@
                        SendDate = DateTime.Now,  //发送时间
                        BackDate = DateTime.Now,  //返回时间
                        StartLocat = "",//起始位置
                        EndLocat = "平库",//目标位置
                        EndLocat = model.LocatNo,//目标位置
                        PalletNo = model.PalletNo,//托盘码
                        IsSend = 0,//是否可再次下发
                        IsCancel = 0,//是否可取消
                        IsFinish = 0,//是否可完成
                        Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "2",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                        OrderType = "0",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = "平库的入库任务",
                    };
                    Db.Insertable(exTask).ExecuteCommand();