| | |
| | | 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();//注意 这一句 不能少 |
| | | //库存明细 |
| | |
| | | |
| | | }).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; |
| | | |
| | |
| | | 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 |
| | |
| | | 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() |
| | | { |
| | |
| | | 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 = "", |
| | |
| | | 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; |
| | |
| | | { |
| | | 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; |
| | |
| | | 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); |