wxw
2025-03-11 7631b07ef475e8372811b01563a9719033a0a074
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -959,10 +959,11 @@
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    //.And(it => it.WareHouseNo == wareHouseNo)
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus))
                    .And(m => skuStrList.Contains(m.SkuNo))
                    //.And(m => skuStrList.Contains(m.SkuNo))
                    .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主
                    .AndIF(!string.IsNullOrWhiteSpace(msg), it => (it.SkuNo.Contains(msg) || it.SkuName.Contains(msg) || it.LotNo.Contains(msg)))
                    .And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    //.And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    .And(it=>!string.IsNullOrEmpty(it.LotNo))
                    .And(it => (it.Status == "0" || it.Status == "1"))
                    .ToExpression();//注意 这一句 不能少
                //库存明细
@@ -983,42 +984,42 @@
                }).ToList();
                //库存总表
                var stock = stockRst.GetAllAsync().Select(it => new ExStockInfoDto
                {
                    SkuNo = it.SkuNo,
                    SkuName = it.SkuName,
                    LotNo = it.LotNo,
                    Standard = it.Standard,
                    //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty,
                    Qty = it.Qty - it.LockQty - it.FrozenQty,
                //var stock = stockRst.GetAllAsync().Select(it => new ExStockInfoDto
                //{
                //    SkuNo = it.SkuNo,
                //    SkuName = it.SkuName,
                //    LotNo = it.LotNo,
                //    Standard = it.Standard,
                //    //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty,
                //    Qty = it.Qty - it.LockQty - it.FrozenQty,
                }).ToList();
                //}).ToList();
                foreach (var l in stockDetail.ToArray())
                {
                    var fq = stock.Where(s => s.SkuNo == l.SkuNo);
                    if (!string.IsNullOrWhiteSpace(l.LotNo))
                    {
                        fq = fq.Where(s => s.LotNo == l.LotNo);
                    }
                    else
                    {
                        fq = fq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                    }
                    var f = fq.FirstOrDefault();
                    if (f == null)
                    {
                        throw new Exception("库存信息错误,请核实");
                    }
                    if (f.Qty != null && f.Qty.Value < l.Qty)
                    {
                        l.Qty = f.Qty.Value;
                    }
                    if (l.Qty <= 0)
                    {
                        stockDetail.Remove(l);
                    }
                }
                //foreach (var l in stockDetail.ToArray())
                //{
                //    var fq = stock.Where(s => s.SkuNo == l.SkuNo);
                //    if (!string.IsNullOrWhiteSpace(l.LotNo))
                //    {
                //        fq = fq.Where(s => s.LotNo == l.LotNo);
                //    }
                //    else
                //    {
                //        fq = fq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                //    }
                //    var f = fq.FirstOrDefault();
                //    if (f == null)
                //    {
                //        throw new Exception("库存信息错误,请核实");
                //    }
                //    if (f.Qty != null && f.Qty.Value < l.Qty)
                //    {
                //        l.Qty = f.Qty.Value;
                //    }
                //    if (l.Qty <= 0)
                //    {
                //        stockDetail.Remove(l);
                //    }
                //}
                return stockDetail;
@@ -1037,14 +1038,7 @@
                if (model == null || model.Detail.Count == 0)
                {
                    throw new Exception("参数异常");
                }
                var skuNos = model.Detail.Select(a => a.SkuNo).Distinct().ToList();
                //根据物料号获取物料信息、库存明细中获取批次描述供货批次等
                var skuList = Db.Queryable<SysMaterials>().Where(a => skuNos.Contains(a.SkuNo) && a.IsDel == "0").ToList();
                var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //var palletList = contextDb.Queryable<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //客户信息
                var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList();
                }
                var billNo = "";
                var bl = true;
                do
@@ -1055,111 +1049,58 @@
                    bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
                } while (bl);
                Db.BeginTran();//开启事务
                try
                {
                    var list = new List<BllExportNoticeDetail>();
                    //添加出库单
                    foreach (var d in model.Detail)
                    foreach (var item in model.Detail)
                    {
                        if (d.Qty < 1)
                        if (item.Qty < 1)
                        {
                            throw new Exception("出库数量必须大于0");
                        }
                        var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo);
                        if (sku == null)
                        if (string.IsNullOrWhiteSpace(item.LotNo))
                        {
                            throw new Exception($"物料信息中未查询到出库物料信息:{d.SkuNo}");
                            throw new Exception("批次不可为空!");
                        }
                        //0:成品出库、1:领料出库、2:抽检出库、4:不合格品出库、6:代储出库、7:其他出库、 ///3:物料取样出库、5:中间品出库、8:寄存出库
                        if (model.Type == "0" || model.Type == "2" || model.Type == "4" || model.Type == "7")
                        var soNoticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.IsDel == "0" && w.LotNo == item.LotNo);
                        if (soNoticeDetail != null)
                        {
                            if (string.IsNullOrWhiteSpace(d.LotNo))
                            var soNotice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNoticeDetail.SONo && (w.Status == "0" || w.Status == "1" || w.Status == "2" || w.Status == "3"));
                            if (soNotice != null)
                            {
                                throw new Exception("批次不可为空!");
                            }
                        }
                        if (model.Type == "1")
                        {
                            if (list.Count(m=>m.SkuNo == d.SkuNo)>=2)
                            {
                                throw new Exception("领料出库单同单据同物料不允许超过3个批次混批出库");
                            }
                        }
                        else
                        {
                            if (list.Count(m => m.SkuNo == d.SkuNo) >= 1)
                            {
                                throw new Exception("出库单同单据同物料不允许超过2个批次混批出库");
                                throw new Exception($"该批次有未完成的出库单,批次号:{soNoticeDetail.LotNo}!");
                            }
                        }
                        //库存
                        List<DataStock> stocks;
                        var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LotNo == item.LotNo);
                        decimal q1 = 0;
                        Dictionary<int, decimal> dic = new Dictionary<int, decimal>();
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        {
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList();
                        }
                        else
                        {
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                        }
                        if (stocks.Count < 1)
                        {
                            throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}");
                        }
                        //判断数量
                        var qty = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty;
                        if (d.Qty > qty)
                        {
                            throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
                        }
                        var item = new BllExportNoticeDetail()
                        var noticeDetail = new BllExportNoticeDetail()
                        {
                            SONo = billNo,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            LotNo = d.LotNo,
                            SkuNo = stockDetail.SkuNo,
                            SkuName = stockDetail.SkuName,
                            Standard = stockDetail.Standard,
                            LotNo = stockDetail.LotNo,
                            LotText = "",
                            Status = "0",
                            Qty = d.Qty,
                            Qty = item.Qty,
                            AllotQty = 0,
                            FactQty = 0,
                            CompleteQty = 0,
                            PackagNo = sku.PackagNo,
                            Price = sku.Price,
                            Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
                            IsBale = d.IsBale,
                            IsBelt = d.IsBelt,
                            SupplierLot = stocks.First().SupplierLot,
                            IsWave = "0",
                            WaveNo = "",
                            //PackagNo = sku.PackagNo,
                            //Price = sku.Price,
                            //Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
                            //IsBale = d.IsBale,
                            //IsBelt = d.IsBelt,
                            //SupplierLot = stocks.First().SupplierLot,
                            //IsWave = "0",
                            //WaveNo = "",
                            CreateUser = userId,
                        };
                        list.Add(item);
                        stocks.First().LockQty += d.Qty;//锁定数量
                        var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty })
                            .ExecuteCommand();
                        //foreach (var s in dic)
                        //{
                        //    var st = stockList.First(m => m.Id == s.Key);
                        //    st.LockQty += s.Value;//锁定数量
                        //    var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty })
                        //        .ExecuteCommand();
                        //}
                        list.Add(noticeDetail);
                    }
                    var notice = new BllExportNotice()
                    {
@@ -1167,8 +1108,8 @@
                        Type = model.Type,
                        Status = "0",
                        Origin = "WMS",
                        CustomerNo = model.CustomerNo,
                        CustomerName = customer.FirstOrDefault() == null ? "" : customer.First().CustomerName,
                        //CustomerNo = model.CustomerNo,
                        //CustomerName = customer.FirstOrDefault() == null ? "" : customer.First().CustomerName,
                        LogisticsId = model.LogisticsId,
                        IsWave = "0",
                        WaveNo = "",
@@ -1674,37 +1615,16 @@
                    throw new Exception("参数异常,请检查状态是否未等待执行或来源是否是WMS");
                }
                //总库存信息
                var stockList = Db.Queryable<DataStock>().ToList();
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == notice.SONo).ToList();
                Db.BeginTran();//开启事务
                try
                {
                    foreach (var d in noticeDetail)
                    foreach (var item in noticeDetail)
                    {
                        //总库存
                        var sq = stockList.Where(s => s.SkuNo == d.SkuNo);
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        {
                            sq = sq.Where(s => s.LotNo == d.LotNo);
                        }
                        else
                        {
                            sq = sq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                        }
                        var fd = sq.FirstOrDefault();
                        if (fd == null)
                        {
                            throw new Exception($"未找到物料{d.SkuNo}、批次{d.LotNo} 的库存信息");
                        }
                        fd.LockQty -= d.Qty;
                        d.IsDel = "1";
                        d.UpdateUser = userId;
                        d.UpdateTime = DateTime.Now;
                        Db.Updateable(d).ExecuteCommand();
                        Db.Updateable(fd).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                        item.IsDel = "1";
                    }
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    //删除出库单
                    notice.IsDel = "1";
                    notice.UpdateUser = userId;
@@ -4078,38 +3998,30 @@
                    {
                        throw new Exception("未查询到任务信息");
                    }
                    //获取对应库位信息
                    var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    if (startlocat == null)
                    if (task.OrderType == "0" || task.OrderType == "3")//入库或移库
                    {
                        throw new Exception("未查询到储位信息");
                    }
                    startlocat.Status = "0";//修改分配信息状态
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    //获取移库任d务对应目标储位信息
                    SysStorageLocat endlocat = new SysStorageLocat();
                    if (task.Type == "2")
                    {
                        endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.EndLocat);
                        //获取目标库位信息
                        var endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.EndLocat);
                        if (endlocat == null)
                        {
                            throw new Exception("未查询到目标储位信息");
                        }
                    }
                    if (locat == null)
                    {
                        Db.RollbackTran();
                        throw new Exception("未查询到储位信息,请核实!");
                    }
                    locat.Status = "1"; //有物品
                    Db.Updateable(locat).ExecuteCommand();
                    if (endlocat != null)
                    {
                        endlocat.Status = "0"; //空储位 0
                        endlocat.Status = "0";//空储位
                        //修改目标储位状态
                        Db.Updateable(endlocat).ExecuteCommand();
                    }
                    if (task.OrderType == "1" || task.OrderType == "3")//出库或移库
                    {
                        //获取起始库位信息
                        var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.LocatNo == task.StartLocat);
                        if (startlocat == null)
                        {
                            throw new Exception("未查询到起始储位信息");
                        }
                        startlocat.Status = "1";//有物品
                        //修改起始储位状态
                        Db.Updateable(startlocat).ExecuteCommand();
                    }
                    //修改任务 
                    task.IsSuccess = 1;
                    task.IsSend = 0;
@@ -4118,75 +4030,6 @@
                    task.Status = "4";
                    task.CancelDate = DateTime.Now;
                    Db.Updateable(task).ExecuteCommand();
                    //出库分配信息
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList();
                    foreach (var item in allot)
                    {
                        item.Status = "0";//修改分配信息状态
                        item.TaskNo = "";
                        var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                        if (noticeDetail == null)
                        {
                            throw new Exception("未查询到出库单明细信息");
                        }
                        noticeDetail.FactQty -= item.Qty; //修改出库单明细的下架数量
                        Db.Updateable(noticeDetail).ExecuteCommand();
                        if (noticeDetail.FactQty == 0)
                        {
                            var noticeDetail2 = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo && m.Id != noticeDetail.Id).ToList();
                            var num = noticeDetail2.Count(m => m.FactQty > 0);
                            //判断出库单的所有明细是否都为0;如果为0变更出库单状态为已分配
                            if (num == 0)
                            {
                                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == item.SONo);
                                notice.Status = "2";
                                Db.Updateable(notice).ExecuteCommand();
                            }
                        }
                    }
                    //判断是否存在分配信息
                    if (allot == null)
                    {
                        //获取库存明细
                        var stockDetail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.PalletNo == task.PalletNo);
                        //获取库存
                        var datastock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo);
                        //获取储位信息
                        var locate = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == stockDetail.LocatNo);
                        //判断是否为空托盘
                        if (stockDetail.SkuNo == "100099")
                        {
                            //修改库存明细
                            stockDetail.LockQty -= stockDetail.Qty; //锁定数量
                            stockDetail.Status = "0"; //库存状态 0:待分配
                            //修改库存总表
                            datastock.LockQty -= (int)stockDetail.Qty; //锁定数量
                            //修改储位状态
                            locate.Status = "1"; //储位状态 1:有物品
                            Db.Updateable(stockDetail).ExecuteCommand();
                            Db.Updateable(datastock).ExecuteCommand();
                            Db.Updateable(locate).ExecuteCommand();
                        }
                        else
                        {
                            //修改储位状态
                            locate.Status = "1"; //储位状态 1:有物品
                            Db.Updateable(locate).ExecuteCommand();
                        }
                    }
                    else
                    {
                        Db.Updateable(allot).ExecuteCommand();
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "取消", $"点击取消按钮、取消了任务号为:{taskNo}的任务", (int)userId);