wxw
昨天 86e443e42c4bee972c5b795def4917e02f98ce40
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -420,7 +420,7 @@
        public async Task<List<DataStockDetail>> GetStockQueryList(string locatNo, string palletNo)
        {
            return await Db.Queryable<DataStockDetail>()
                     .Where(s => s.IsDel == "0" && s.LocatNo.Contains(locatNo) && s.PalletNo.Contains(palletNo))
                     .Where(s => s.IsDel == "0" && s.LocatNo.Contains(locatNo) || s.PalletNo.Contains(palletNo))
                     .OrderBy(s => new { s.LotNo, s.LocatNo, s.PalletNo })
                     .ToListAsync();
@@ -947,6 +947,166 @@
            }
        }
        /// <summary>
        /// 呼叫agv转运空托盘
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="locatNo"></param>
        /// <param name="url"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public async Task AgvNullPallet(string palletNo, string areaNo, string locatNo, string url, int userId)
        {
            try
            {
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw Oops.Bah("请扫描托盘条码!");
                }
                if (string.IsNullOrEmpty(locatNo))
                {
                    throw Oops.Bah("请扫描起始地码!");
                }
                if (string.IsNullOrEmpty(areaNo))
                {
                    throw Oops.Bah("请选择目标区域!");
                }
                string EndLocat = string.Empty;//目标位置
                var log = await Db.Queryable<LogTask>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
                if (log != null)
                {
                    throw Oops.Bah("该托盘已有等待执行或正在执行的任务!");
                }
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail != null)
                {
                    throw Oops.Bah("托盘上物料存在库存明细信息,请检查!");
                }
                var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
                if (storageArea == null)
                {
                    throw Oops.Bah("所选区域信息不存在,请检查!");
                }
                var palletInfo = await Db.Queryable<SysPallets>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (palletInfo == null)
                {
                    throw Oops.Bah("该托盘信息不存在!");
                }
                if (palletInfo.Status!="0")
                {
                    throw Oops.Bah("该托盘不是空托盘!");
                }
                //根据目标区域获取目标储位地址
                EndLocat = await GetLocat(areaNo);
                //起始储位信息
                var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == locatNo);
                if (storageLocat == null)
                {
                    throw Oops.Bah("储位信息不存在,请检查!");
                }
                //目标储位信息
                //var storageLocatEnd = new SysStorageLocat();
                var storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0");
                if (storageLocatEnd == null)
                {
                    throw Oops.Bah("目标储位信息不存在,请检查!");
                }
                //添加出库任务
                var taskNo = new Common().GetMaxNo("TK");
                var moveTask = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "WCS",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = storageLocat.LocatNo,//起始位置
                    EndLocat = EndLocat,//目标位置
                    PalletNo = palletNo,//托盘码
                    Msg = string.Format("转运任务:{0}=>>{1}", storageLocat.LocatNo, EndLocat),
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
                await Db.Insertable(moveTask).ExecuteCommandAsync();
                //修改起始储位地址状态
                storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                await Db.Updateable(storageLocat).ExecuteCommandAsync();
                //修改目标储位地址状态
                //if (storageLocatEnd != null)
                //{
                //    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                //    await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
                //}
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV空托转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                var outDto = new List<OutCommandDto>
                {
                    new OutCommandDto()
                    {
                        TaskNo = moveTask.TaskNo, // 任务号
                        TaskType = "2",// 任务类型 0入 1出 2移
                        PalletNo = moveTask.PalletNo,//托盘号
                        StartLocate = moveTask.StartLocat, // 起始位置
                        EndLocate = EndLocat, // 目标位置
                        Order = 999,
                        Type = PLCTypeEnum.AGV
                    }
                };
                // 正式运行程序放开
                var list2 = outDto.Select(m => m.TaskNo).ToList();
                var jsonData = JsonConvert.SerializeObject(outDto);
                string response = "";
                try
                {
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    //解析返回数据
                    var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                    if (wcsModel.code == 200)
                    {
                        // 更改任务的发送返回时间//
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                    }
                    else
                    {
                        new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
                        throw new Exception(wcsModel.message);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// agv转运呼叫小车取货
        /// </summary>
        /// <param name="soNo"></param>
@@ -1303,9 +1463,8 @@
                    SkuName = boxInfo.SkuName,
                    LotNo = boxInfo.LotNo,
                    BoxNoList = new List<string>() { boxNoNew } ,
                    Date1 = boxInfo.ProductionTime.ToString(),
                    Date2 = boxInfo.ExpirationTime.ToString(),
                    Date1 = boxInfo.ProductionTime == null ? "" : Convert.ToDateTime(boxInfo.ProductionTime).ToString("yyyy-MM-dd"),
                    Date2 = boxInfo.ExpirationTime == null ? "" : Convert.ToDateTime(boxInfo.ExpirationTime).ToString("yyyy-MM-dd"),
                };
                
                #endregion
@@ -1444,12 +1603,15 @@
        #region 物料拆托 (标签、数量)
        /// <summary>
        /// 查询箱信息
        /// </summary>
        /// <param name="boxNo"></param>
        /// <param name="pallNo"></param>
        public void GetBoxInfo(string boxNo,string pallNo)
        {
            try
            {
                var boxInfo = Db.Queryable<DataBoxInfo>().Where(m=>m.IsDel == "0" && m.BoxNo == boxNo).ToList();
                if (!string.IsNullOrWhiteSpace(pallNo))
                {
@@ -1459,8 +1621,274 @@
                {
                    throw new Exception("标签信息错误,请联系管理员");
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        public void UpPalletByBox(string boxNo,string pallet,string palletNew,int userId)
        {
            try
            {
                Db.BeginTran();
                if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(pallet) || string.IsNullOrWhiteSpace(palletNew))
                {
                    throw new Exception("参数错误,托盘、新托盘、箱码均不能为空");
                }
                var boxInfoList = Db.Queryable<DataBoxInfo>().Where(m=>m.IsDel == "0" && m.BoxNo == boxNo).ToList();
                if (boxInfoList.Count != 1)
                {
                    throw new Exception("标签信息数量不是1条");
                }
                var boxInfo = boxInfoList.First();
                var detail1 = Db.Queryable<DataStockDetail>().First(m=>m.IsDel == "0" && m.PalletNo == pallet && m.Id == boxInfo.StockDetailId );
                if (detail1 == null)
                {
                    throw new Exception("未查询到托盘和箱码的库存明细");
                }
                var palletInfoNew = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNew);
                if (palletInfoNew == null)
                {
                    throw new Exception("未查询到新托盘信息");
                }
                var detailNewBl = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNew && (m.SkuNo != boxInfo.SkuNo || m.LotNo != boxInfo.LotNo));
                if (detailNewBl!=null)
                {
                    throw new Exception("新托盘上已有其他物料箱信息");
                }
                //添加/更新库存托盘信息
                var detailNew1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNew && m.SkuNo == boxInfo.SkuNo && m.LotNo == boxInfo.LotNo);
                var newId = 0;
                if (detailNew1 == null)//add
                {
                    var detailNew = new DataStockDetail();
                    detailNew.SkuNo = detail1.SkuNo;
                    detailNew.SkuName = detail1.SkuName;
                    detailNew.LotNo = detail1.LotNo;
                    detailNew.LotText = detail1.LotText;
                    detailNew.SupplierLot = detail1.SupplierLot;
                    detailNew.SupplierNo = detail1.SupplierNo;
                    detailNew.SupplierName = detail1.SupplierName;
                    detailNew.Standard = detail1.Standard;
                    detailNew.Qty = boxInfo.Qty;
                    detailNew.LockQty = 0;
                    detailNew.FrozenQty = 0;
                    detailNew.InspectQty = 0;
                    detailNew.ASNNo = "";
                    detailNew.PalletNo = palletNew;
                    detailNew.ProductionTime = detail1.ProductionTime;
                    detailNew.ExpirationTime = detail1.ExpirationTime;
                    detailNew.PalletTags = "0";
                    detailNew.CompleteTime = DateTime.Now;
                    detailNew.Status = "0";
                    detailNew.InspectMark = detail1.InspectMark;
                    detailNew.BitPalletMark = "1";
                    detailNew.InspectStatus = detail1.InspectStatus;
                    detailNew.PackagNo = detail1.PackagNo;
                    detailNew.IsBale = detail1.IsBale;
                    detailNew.IsBelt = detail1.IsBelt;
                    detailNew.IsDel = "0";
                    detailNew.CreateTime = DateTime.Now;
                    detailNew.CreateUser = 0;
                    newId = Db.Insertable(detailNew).ExecuteReturnIdentity();
                }
                else //update
                {
                    detailNew1.Qty += boxInfo.Qty;
                    detailNew1.PalletNo = palletNew;
                    Db.Updateable(detailNew1).ExecuteCommand();
                    newId = detailNew1.Id;
                }
                //更新托盘状态
                palletInfoNew.Status = "1";
                Db.Updateable(palletInfoNew).ExecuteCommand();
                //更改原托盘信息
                detail1.Qty -= boxInfo.Qty;
                detail1.BitPalletMark = "1";
                if (detail1.Qty <= 0)
                {
                    //更新原托盘状态
                    var palletInfo = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == pallet);
                    palletInfo.Status = "0";
                    Db.Updateable(palletInfo).ExecuteCommand();
                    Db.Deleteable(detail1).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(detail1).ExecuteCommand();
                }
                //更新库存箱信息
                boxInfo.StockDetailId = newId;
                boxInfo.BindNo = 0;
                boxInfo.PalletNo = palletNew;
                Db.Updateable(boxInfo).ExecuteCommand();
                //添加操作日志
                new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", boxNo, "编辑", $"物料拆托:箱码:{boxNo}换托,原托盘{pallet},新托盘{palletNew}", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        //数量页签-----------------------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// 根据托盘获取托盘上的物料批次信息
        /// </summary>
        /// <param name="palletNo"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<SelectSkuLotNo> GetSelectSkuLotNo(string palletNo)
        {
            try
            {
                var data = new List<SelectSkuLotNo>();
                var detailList = Db.Queryable<DataStockDetail>().Where(m=>m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                foreach (var item in detailList)
                {
                    if (data.Count(m=>m.DetailId == item.Id.ToString()) == 0)
                    {
                        data.Add(new SelectSkuLotNo()
                        {
                            SkuNo = item.SkuNo,
                            SkuName = item.SkuName,
                            LotNo = item.LotNo,
                            DetailId = item.Id.ToString(),
                        });
                    }
                }
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 拆托-数量
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="palletNoNew"></param>
        /// <param name="detailId"></param>
        /// <param name="qty"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void UpPalletByQty(string palletNo,string palletNoNew,string detailId,decimal qty,int userId)
        {
            try
            {
                Db.BeginTran();
                if (string.IsNullOrWhiteSpace(detailId) || string.IsNullOrWhiteSpace(palletNo) || string.IsNullOrWhiteSpace(palletNoNew))
                {
                    throw new Exception("参数错误,托盘、新托盘、物料批次均不能为空");
                }
                if (qty<=0)
                {
                    throw new Exception("参数数量不能为小等0");
                }
                 var detailId2 = int.Parse(detailId);
                var detail1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id == detailId2);
                if (detail1 == null)
                {
                    throw new Exception("未查询到托盘库存明细");
                }
                var palletInfoNew = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (palletInfoNew == null)
                {
                    throw new Exception("未查询到新托盘信息");
                }
                //添加/更新库存托盘信息
                var detailNew1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == detail1.SkuNo && m.LotNo == detail1.LotNo);
                var newId = 0;
                if (detailNew1 == null)//add
                {
                    var detailNew = new DataStockDetail();
                    detailNew.SkuNo = detail1.SkuNo;
                    detailNew.SkuName = detail1.SkuName;
                    detailNew.LotNo = detail1.LotNo;
                    detailNew.LotText = detail1.LotText;
                    detailNew.SupplierLot = detail1.SupplierLot;
                    detailNew.SupplierNo = detail1.SupplierNo;
                    detailNew.SupplierName = detail1.SupplierName;
                    detailNew.Standard = detail1.Standard;
                    detailNew.Qty = qty;
                    detailNew.LockQty = 0;
                    detailNew.FrozenQty = 0;
                    detailNew.InspectQty = 0;
                    detailNew.ASNNo = "";
                    detailNew.PalletNo = palletNoNew;
                    detailNew.ProductionTime = detail1.ProductionTime;
                    detailNew.ExpirationTime = detail1.ExpirationTime;
                    detailNew.PalletTags = "0";
                    detailNew.CompleteTime = DateTime.Now;
                    detailNew.Status = "0";
                    detailNew.InspectMark = detail1.InspectMark;
                    detailNew.BitPalletMark = "1";
                    detailNew.InspectStatus = detail1.InspectStatus;
                    detailNew.PackagNo = detail1.PackagNo;
                    detailNew.IsBale = detail1.IsBale;
                    detailNew.IsBelt = detail1.IsBelt;
                    detailNew.IsDel = "0";
                    detailNew.CreateTime = DateTime.Now;
                    detailNew.CreateUser = 0;
                    newId = Db.Insertable(detailNew).ExecuteReturnIdentity();
                }
                else //update
                {
                    detailNew1.Qty += qty;
                    detailNew1.PalletNo = palletNoNew;
                    Db.Updateable(detailNew1).ExecuteCommand();
                    newId = detailNew1.Id;
                }
                //更新托盘状态
                palletInfoNew.Status = "1";
                Db.Updateable(palletInfoNew).ExecuteCommand();
                //更改原托盘信息
                detail1.Qty -= qty;
                detail1.BitPalletMark = "1";
                if (detail1.Qty <= 0)
                {
                    //更新原托盘状态
                    var palletInfo = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                    palletInfo.Status = "0";
                    Db.Updateable(palletInfo).ExecuteCommand();
                    Db.Deleteable(detail1).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(detail1).ExecuteCommand();
                }
                //添加操作日志
                new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", palletNo, "编辑", $"物料拆托:{detail1.SkuName}物料换托,原托盘{palletNo},新托盘{palletNoNew}", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {