| | |
| | | using WMS.IBLL.IBllSoServer; |
| | | using Model.ModelVm; |
| | | using System.Runtime.Intrinsics.X86; |
| | | using WMS.Entity.BllAsnEntity; |
| | | using Model.ModelDto; |
| | | using WMS.BLL.BllPdaServer; |
| | | using WMS.IBLL.IPdaServer; |
| | | using System.DirectoryServices.Protocols; |
| | | using Model.ModelDto.SysDto; |
| | | |
| | | namespace WMS.BLL.BllSoServer |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public bool ErpAddExportNotice(SoInfo model) |
| | | public void HttpAddExportNotice(SoInfo model) |
| | | { |
| | | try |
| | | { |
| | |
| | | { |
| | | throw new Exception("单据类型不可为空!"); |
| | | } |
| | | if (string.IsNullOrEmpty(model.Customer)) |
| | | { |
| | | throw new Exception("客户不可为空!"); |
| | | } |
| | | if (string.IsNullOrEmpty(model.OrderCode)) |
| | | //if (string.IsNullOrEmpty(model.Customer)) |
| | | //{ |
| | | // throw new Exception("客户不可为空!"); |
| | | //} |
| | | if (string.IsNullOrEmpty(model.OrderNo)) |
| | | { |
| | | throw new Exception("系统单号不可为空!"); |
| | | } |
| | |
| | | |
| | | //客户信息 |
| | | var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer); |
| | | if (customer == null) |
| | | { |
| | | throw new Exception("客户不可为空!"); |
| | | } |
| | | //if (customer == null) |
| | | //{ |
| | | // throw new Exception("客户不可为空!"); |
| | | //} |
| | | var logistics = Db.Queryable<SysLogisticsInfo>().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo); |
| | | int? logisticsId = null; |
| | | if (logistics != null) |
| | |
| | | } |
| | | //库存 |
| | | List<DataStock> stocks; |
| | | |
| | | 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(); |
| | | 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} 库存数量不足"); |
| | | } |
| | | if (qty > d.Qty - q1) |
| | | { |
| | | dic.Add(stocks.First().Id, d.Qty - q1); |
| | | |
| | | q1 += d.Qty - q1; |
| | | } |
| | | else |
| | | { |
| | | q1 += qty; |
| | | dic.Add(stocks.First().Id, qty); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | } |
| | | if (stocks.Count < 1) |
| | | { |
| | | throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}"); |
| | | stocks = stockList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList(); |
| | | |
| | | foreach (var demo in stocks) |
| | | { |
| | | if (q1 >= d.Qty) |
| | | { |
| | | continue; |
| | | } |
| | | var q2 = demo.Qty - demo.LockQty - demo.FrozenQty; |
| | | |
| | | if (q2 >= d.Qty - q1) |
| | | { |
| | | dic.Add(demo.Id, d.Qty - q1); |
| | | |
| | | q1 += d.Qty - q1; |
| | | } |
| | | else |
| | | { |
| | | q1 += q2; |
| | | dic.Add(demo.Id, q2); |
| | | } |
| | | |
| | | } |
| | | if (d.Qty > q1) |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | if (stocks.Count == 0) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo}库存数量不足"); |
| | | } |
| | | var q2 = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty; |
| | | if (q2 >= d.Qty - q1) |
| | | { |
| | | dic.Add(stocks.First().Id, d.Qty - q1); |
| | | |
| | | q1 += d.Qty - q1; |
| | | } |
| | | else |
| | | { |
| | | q1 += q2; |
| | | dic.Add(stocks.First().Id, q2); |
| | | } |
| | | } |
| | | if (d.Qty > q1) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足"); |
| | | } |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | | foreach (var s in dic) |
| | | { |
| | | SONo = billNo, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | | LotNo = d.LotNo, |
| | | LotText = "", |
| | | Qty = d.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 = "", |
| | | IsBelt = "", |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | var st = stockList.First(a => a.Id == s.Key); |
| | | var item = new BllExportNoticeDetail() |
| | | { |
| | | SONo = billNo, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | | LotNo = st.LotNo, |
| | | LotText = st.LotText, |
| | | Qty = s.Value, |
| | | AllotQty = 0, |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | PackagNo = sku.PackagNo, |
| | | Price = sku.Price, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty, |
| | | IsBale = "", |
| | | IsBelt = "", |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1", |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | list.Add(item); |
| | | stocks.First().LockQty += d.Qty;//锁定数量 |
| | | CreateUser = 0, |
| | | }; |
| | | list.Add(item); |
| | | |
| | | var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty }) |
| | | .ExecuteCommand(); |
| | | st.LockQty += s.Value;//锁定数量 |
| | | var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty }) |
| | | .ExecuteCommand(); |
| | | } |
| | | |
| | | } |
| | | var notice = new BllExportNotice() |
| | |
| | | SONo = billNo, |
| | | Type = model.SoType, |
| | | Status = "0", |
| | | Origin = "WMS", |
| | | CustomerNo = model.Customer, |
| | | CustomerName = customer.CustomerName, |
| | | Origin = model.Origin, |
| | | OrderCode = model.OrderNo, |
| | | //CustomerNo = model.Customer, |
| | | //CustomerName = customer.CustomerName, |
| | | LogisticsId = logisticsId, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | |
| | | |
| | | if (n <= 0 || m <= 0) |
| | | { |
| | | Db.RollbackTran(); |
| | | return false; |
| | | throw new Exception("入库单或明细添加保存失败"); |
| | | } |
| | | Db.CommitTran(); |
| | | return true; |
| | | |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | |
| | | //回传出库单 |
| | | public bool FinishSo(int id, string url, int userId) |
| | | public bool FinishSo(int id, string url, string userNo, string pwd, int userId) |
| | | { |
| | | try |
| | | { |
| | | var loginPwd = Md5Tools.CalcMd5(pwd); |
| | | var date = Db.Queryable<SysUserInfor>().First(m => m.IsDel == "0" && m.UserName == userNo && m.PassWord == loginPwd); |
| | | |
| | | if (date == null) //账号密码是否正确 |
| | | { |
| | | throw new Exception("账号密码不正确或没有此账号"); |
| | | } |
| | | if (date.Status != "0") //当前账号是否正常启用 |
| | | { |
| | | throw new Exception("当前账号非启用状态"); |
| | | } |
| | | |
| | | var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id && m.IsDel == "0"); |
| | | if (notice == null) |
| | | { |
| | |
| | | { |
| | | throw new Exception("未查询到单据明细信息"); |
| | | } |
| | | if (userId == notice.UpdateUser) |
| | | if (date.Id == notice.UpdateUser) |
| | | { |
| | | throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); |
| | | } |
| | |
| | | } |
| | | var soInfo = new SoInfo() |
| | | { |
| | | OrderCode = notice.OrderCode, |
| | | OrderNo = notice.OrderCode, |
| | | SoDetails = list |
| | | }; |
| | | #region 通过接口发送至erp |
| | |
| | | |
| | | notice.Status = "6"; |
| | | notice.CheckTime = DateTime.Now; |
| | | notice.CheckUser = userId; |
| | | notice.CheckUser = date.Id; |
| | | Db.Updateable(notice).ExecuteCommand(); |
| | | |
| | | new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"复核了单据号为{notice.SONo}的单据信息", userId); |
| | | new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"{date.RealName}复核了单据号为{notice.SONo}的单据信息", userId); |
| | | return true; |
| | | } |
| | | catch (Exception e) |
| | |
| | | .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id) |
| | | .Select((a, b, c, d, e) => new ExportNoticeDto() |
| | | { |
| | | Id = a.Id, |
| | | SONo = a.SONo, |
| | | Type = a.Type, |
| | | Status = a.Status, |
| | | Origin = a.Origin, |
| | | CustomerNo = a.CustomerNo, |
| | | CustomerName = a.CustomerName, |
| | | LotNo = a.LotNo, |
| | | LotText = a.LotText, |
| | | SupplierLot = a.SupplierLot, |
| | | LogisticsId = a.LogisticsId, |
| | | //Id = a.Id, |
| | | //SONo = a.SONo, |
| | | //Type = a.Type, |
| | | //Status = a.Status, |
| | | //Origin = a.Origin, |
| | | //CustomerNo = a.CustomerNo, |
| | | //CustomerName = a.CustomerName, |
| | | //LotNo = a.LotNo, |
| | | //LotText = a.LotText, |
| | | //SupplierLot = a.SupplierLot, |
| | | //LogisticsId = a.LogisticsId, |
| | | LogisticsName = b.CarrierName, |
| | | IsWave = a.IsWave, |
| | | WaveNo = a.WaveNo, |
| | | IsDespatch = a.IsDespatch, |
| | | Demo = a.Demo, |
| | | //IsWave = a.IsWave, |
| | | //WaveNo = a.WaveNo, |
| | | //IsDespatch = a.IsDespatch, |
| | | //Demo = a.Demo, |
| | | |
| | | CreateUserName = c.RealName, |
| | | UpdateUserName = c.RealName, |
| | | CreateTime = a.CreateTime, |
| | | UpdateTime = a.UpdateTime, |
| | | //CreateTime = a.CreateTime, |
| | | //UpdateTime = a.UpdateTime, |
| | | |
| | | CheckUserName = e.RealName, |
| | | CheckTime = a.CheckTime |
| | | }) |
| | | //CheckTime = a.CheckTime |
| | | },true) |
| | | .OrderByDescending(a => a.CreateTime) |
| | | .ToOffsetPage(page, limit, ref total); |
| | | count = total; |
| | |
| | | } |
| | | } |
| | | |
| | | public List<ExStockInfoDto> GetStockGroupList(string type, string msg) |
| | | public List<ExStockInfoDto> GetStockGroupList(string type, string ownerNo, string msg) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(type)) |
| | | { |
| | | throw new Exception("请选择出库单类型"); |
| | | } |
| | | if (type == "6" && string.IsNullOrEmpty(ownerNo)) |
| | | { |
| | | throw new Exception("代储单据请选择货主"); |
| | | } |
| | | var plnList = new List<string>() { "100099" }; |
| | | var skuList = new List<string>(); |
| | | var sku = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" && !plnList.Contains(m.SkuNo)); //排除空托盘的物料集合 |
| | | string skuType = string.Empty; |
| | | string inspectStatus = string.Empty; |
| | | switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 |
| | | { |
| | | case "0"://成品入库 |
| | | case "0"://成品出库 |
| | | skuType = "(2)"; |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "1"://领料出库 |
| | | skuType = "(0,1,3)"; |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "2"://抽检出库 |
| | | skuType = "(2)"; |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0,1,2"; |
| | | break; |
| | | case "3"://物料取样出库 |
| | | skuType = "(0)"; |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0"; |
| | | break; |
| | | case "4"://不合格品出库 |
| | | skuType = "(2)"; |
| | | skuType = "(0,1,2,3,4)"; |
| | | inspectStatus = "2"; |
| | | break; |
| | | case "5"://中间品出库 |
| | | skuType = "(4)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | case "6"://代储出库 |
| | | skuType = "(2)"; |
| | | skuType = "(0,1,2,3,4)"; |
| | | inspectStatus = "0,1,2"; |
| | | break; |
| | | case "8"://寄存出库 |
| | | skuType = "(3)"; |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | default: //其它出库 |
| | | skuType = "(0,1,2,3,4)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | } |
| | | skuList = sku.Where(m => skuType.Contains(m.Type)).Select(m => m.SkuNo).ToList(); |
| | |
| | | { |
| | | throw new Exception("未查到对应出库类型的物料"); |
| | | } |
| | | |
| | | if (type != "8") |
| | | { |
| | | skuList = skuList.Where(m => m != "100088").ToList(); |
| | | } |
| | | else |
| | | { |
| | | skuList = skuList.Where(m => m == "100088").ToList(); |
| | | } |
| | | //skuList = sku.Select(m => m.SkuNo).ToList(); |
| | | var stockRst = new StockServer(); |
| | | var stockDetailRst = new StockDetailServer(); |
| | | Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>() |
| | | //.And(it => it.WareHouseNo == wareHouseNo) |
| | | .And(it => it.InspectStatus == "1") |
| | | .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus)) |
| | | .And(m => skuList.Contains(m.SkuNo)) |
| | | .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主 |
| | | .AndIF(type != "6", m=> string.IsNullOrWhiteSpace(m.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.Status == "0" || it.Status == "1")) |
| | |
| | | SkuName = it.SkuName, |
| | | LotNo = it.LotNo, |
| | | Standard = it.Standard, |
| | | Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty |
| | | //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty, |
| | | Qty = it.Qty - it.LockQty - it.FrozenQty, |
| | | |
| | | }).ToList(); |
| | | |
| | |
| | | //添加出库单 |
| | | foreach (var d in model.Detail) |
| | | { |
| | | if (d.Qty < 1) |
| | | if (d.Qty <=0) |
| | | { |
| | | throw new Exception("出库数量必须大于0"); |
| | | } |
| | |
| | | } |
| | | //库存 |
| | | List<DataStock> stocks; |
| | | //List<DataStockDetail> pallets; |
| | | |
| | | 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(); |
| | | //pallets = palletList.Where(p => p.SkuNo == d.SkuNo && p.LotNo == d.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} 库存数量不足"); |
| | | //} |
| | | //if (qty > d.Qty - q1) |
| | | //{ |
| | | // q1 += d.Qty - q1; |
| | | // dic.Add(stocks.First().Id, d.Qty - q1); |
| | | //} |
| | | //else |
| | | //{ |
| | | // q1 += qty; |
| | | // dic.Add(stocks.First().Id, qty); |
| | | //} |
| | | } |
| | | else |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | //pallets = palletList.Where(p => p.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(p.LotNo)).ToList(); |
| | | } |
| | | if (stocks.Count < 1) |
| | | { |
| | | throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}"); |
| | | } |
| | | //stocks = stockList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList(); |
| | | |
| | | //判断数量 |
| | | var qty = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty; |
| | | if (d.Qty > qty) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); |
| | | //foreach (var demo in stocks) |
| | | //{ |
| | | // if (q1 >= d.Qty) |
| | | // { |
| | | // continue; |
| | | // } |
| | | // var q2 = demo.Qty - demo.LockQty - demo.FrozenQty; |
| | | |
| | | // if (q2 > d.Qty - q1) |
| | | // { |
| | | // q1 += d.Qty - q1; |
| | | // dic.Add(demo.Id, d.Qty - q1); |
| | | // } |
| | | // else |
| | | // { |
| | | // q1 += q2; |
| | | // dic.Add(demo.Id, q2); |
| | | // } |
| | | |
| | | //} |
| | | //if (d.Qty >= q1) |
| | | //{ |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | // if (stocks.Count == 0) |
| | | // { |
| | | // throw new Exception($"总库存中出库物料信息:{d.SkuNo}库存数量不足"); |
| | | // } |
| | | // var q2 = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty; |
| | | // if (q2 > d.Qty - q1) |
| | | // { |
| | | // q1 += d.Qty - q1; |
| | | // dic.Add(stocks.First().Id, d.Qty - q1); |
| | | // } |
| | | // else |
| | | // { |
| | | // q1 += q2; |
| | | // dic.Add(stocks.First().Id, q2); |
| | | // } |
| | | //} |
| | | //if (d.Qty > q1) |
| | | //{ |
| | | // throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足"); |
| | | //} |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | |
| | | CreateUser = userId, |
| | | }; |
| | | list.Add(item); |
| | | stocks.First().LockQty += d.Qty;//锁定数量 |
| | | |
| | | |
| | | 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(); |
| | | //} |
| | | |
| | | } |
| | | var notice = new BllExportNotice() |
| | |
| | | |
| | | try |
| | | { |
| | | //删除旧 |
| | | foreach (var d in noticeDetail) |
| | | if (notice.Origin == "WMS") |
| | | { |
| | | var mq = model.Detail.Where(o => o.SkuNo == d.SkuNo).ToList(); |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | //删除旧 |
| | | foreach (var d in noticeDetail) |
| | | { |
| | | mq = mq.Where(o => o.LotNo == d.LotNo).ToList(); |
| | | } |
| | | if (mq.Any()) //如果有这个物料及批次则跳过 |
| | | { |
| | | continue; |
| | | } |
| | | // |
| | | var fl = stockList.Where(s => s.SkuNo == d.SkuNo).ToList(); |
| | | DataStock fls; |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | fls = fl.FirstOrDefault(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo); |
| | | } |
| | | else |
| | | { |
| | | fls = fl.FirstOrDefault(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)); |
| | | } |
| | | if (fls == null) |
| | | { |
| | | throw new Exception($"未找到物料{d.SkuNo}、批次{d.LotNo} 的库存信息"); |
| | | } |
| | | fls.LockQty -= d.Qty; |
| | | d.IsDel = "1"; |
| | | d.UpdateUser = userId; |
| | | d.UpdateTime = DateTime.Now; |
| | | Db.Updateable(d).ExecuteCommand(); |
| | | Db.Updateable(fls).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | |
| | | //更新出库单 |
| | | foreach (var d in model.Detail) |
| | | { |
| | | if (d.Qty < 1) |
| | | { |
| | | throw new Exception("出库数据必须大于0"); |
| | | } |
| | | var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("出库物品为空"); |
| | | } |
| | | //库存 |
| | | List<DataStock> stocks; |
| | | List<DataStockDetail> pallet; |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList(); |
| | | pallet = palletList.Where(p => p.SkuNo == d.SkuNo && p.LotNo == d.LotNo).ToList(); |
| | | } |
| | | else |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | pallet = palletList.Where(p => p.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(p.LotNo)).ToList(); |
| | | } |
| | | |
| | | if (stocks.Count < 1) |
| | | { |
| | | throw new Exception("出库物品库存不足"); |
| | | } |
| | | var stock = stocks.First();//总库存 |
| | | // |
| | | BllExportNoticeDetail old; |
| | | if (string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(o.LotNo)); |
| | | } |
| | | else |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && o.LotNo == d.LotNo); |
| | | } |
| | | |
| | | //新加项 |
| | | if (old == null) |
| | | { |
| | | //判断数量 |
| | | var qty = stock.Qty - stock.LockQty - stock.FrozenQty; |
| | | if (d.Qty > qty) |
| | | var mq = model.Detail.Where(o => o.SkuNo == d.SkuNo).ToList(); |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); |
| | | mq = mq.Where(o => o.LotNo == d.LotNo).ToList(); |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | | if (mq.Any()) //如果有这个物料及批次则跳过 |
| | | { |
| | | SONo = notice.SONo, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | | LotNo = d.LotNo, |
| | | LotText = "", |
| | | Status = "0", |
| | | Qty = d.Qty, |
| | | AllotQty = 0, |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | PackagNo = sku.PackagNo, |
| | | Price = sku.Price, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * qty, |
| | | IsBale = d.IsBale, |
| | | IsBelt = d.IsBelt, |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | |
| | | CreateUser = userId, |
| | | }; |
| | | |
| | | stock.LockQty += d.Qty;//锁定数量 |
| | | var m = Db.Insertable<BllExportNoticeDetail>(item).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | else if (old.Qty != d.Qty || old.IsBale != d.IsBale || old.IsBelt != d.IsBelt) |
| | | { |
| | | if (d.Qty > (stock.Qty - stock.FrozenQty - stock.LockQty) + old.Qty) |
| | | { |
| | | throw new Exception("物品库存数量不足"); |
| | | continue; |
| | | } |
| | | //增加 |
| | | if (d.Qty > old.Qty) |
| | | // |
| | | var fl = stockList.Where(s => s.SkuNo == d.SkuNo).ToList(); |
| | | DataStock fls; |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | stock.LockQty += d.Qty - old.Qty; |
| | | fls = fl.FirstOrDefault(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo); |
| | | } |
| | | else |
| | | { |
| | | stock.LockQty -= old.Qty - d.Qty; |
| | | fls = fl.FirstOrDefault(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)); |
| | | } |
| | | old.IsBale = d.IsBale; |
| | | old.IsBelt = d.IsBelt; |
| | | old.Qty = d.Qty; |
| | | old.UpdateUser = userId; |
| | | old.UpdateTime = DateTime.Now; |
| | | var m = Db.Updateable(old).UpdateColumns(it => new { it.IsBale, it.IsBelt, it.Qty, it.UpdateUser, it.UpdateTime }).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | if (fls == null) |
| | | { |
| | | throw new Exception($"未找到物料{d.SkuNo}、批次{d.LotNo} 的库存信息"); |
| | | } |
| | | fls.LockQty -= d.Qty; |
| | | d.IsDel = "1"; |
| | | d.UpdateUser = userId; |
| | | d.UpdateTime = DateTime.Now; |
| | | Db.Updateable(d).ExecuteCommand(); |
| | | Db.Updateable(fls).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | |
| | | //更新出库单 |
| | | foreach (var d in model.Detail) |
| | | { |
| | | if (d.Qty < 1) |
| | | { |
| | | throw new Exception("出库数据必须大于0"); |
| | | } |
| | | var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("出库物品为空"); |
| | | } |
| | | //库存 |
| | | List<DataStock> stocks; |
| | | List<DataStockDetail> pallet; |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList(); |
| | | pallet = palletList.Where(p => p.SkuNo == d.SkuNo && p.LotNo == d.LotNo).ToList(); |
| | | } |
| | | else |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | pallet = palletList.Where(p => p.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(p.LotNo)).ToList(); |
| | | } |
| | | |
| | | if (stocks.Count < 1) |
| | | { |
| | | throw new Exception("出库物品库存不足"); |
| | | } |
| | | var stock = stocks.First();//总库存 |
| | | // |
| | | BllExportNoticeDetail old; |
| | | if (string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(o.LotNo)); |
| | | } |
| | | else |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && o.LotNo == d.LotNo); |
| | | } |
| | | |
| | | //新加项 |
| | | if (old == null) |
| | | { |
| | | //判断数量 |
| | | var qty = stock.Qty - stock.LockQty - stock.FrozenQty; |
| | | if (d.Qty > qty) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | | { |
| | | SONo = notice.SONo, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | | LotNo = d.LotNo, |
| | | LotText = "", |
| | | Status = "0", |
| | | Qty = d.Qty, |
| | | AllotQty = 0, |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | PackagNo = sku.PackagNo, |
| | | Price = sku.Price, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * qty, |
| | | IsBale = d.IsBale, |
| | | IsBelt = d.IsBelt, |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | |
| | | CreateUser = userId, |
| | | }; |
| | | |
| | | stock.LockQty += d.Qty;//锁定数量 |
| | | var m = Db.Insertable<BllExportNoticeDetail>(item).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | else if (old.Qty != d.Qty || old.IsBale != d.IsBale || old.IsBelt != d.IsBelt) |
| | | { |
| | | if (d.Qty > (stock.Qty - stock.FrozenQty - stock.LockQty) + old.Qty) |
| | | { |
| | | throw new Exception("物品库存数量不足"); |
| | | } |
| | | //增加 |
| | | if (d.Qty > old.Qty) |
| | | { |
| | | stock.LockQty += d.Qty - old.Qty; |
| | | } |
| | | else |
| | | { |
| | | stock.LockQty -= old.Qty - d.Qty; |
| | | } |
| | | old.IsBale = d.IsBale; |
| | | old.IsBelt = d.IsBelt; |
| | | old.Qty = d.Qty; |
| | | old.UpdateUser = userId; |
| | | old.UpdateTime = DateTime.Now; |
| | | var m = Db.Updateable(old).UpdateColumns(it => new { it.IsBale, it.IsBelt, it.Qty, it.UpdateUser, it.UpdateTime }).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | //客户信息 |
| | | var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList().FirstOrDefault(); |
| | | notice.Type = model.Type; |
| | | notice.CustomerNo = model.CustomerNo; |
| | | notice.CustomerName = customer == null ? "" : customer.CustomerName; |
| | | notice.LogisticsId = model.LogisticsId; |
| | | notice.UpdateUser = userId; |
| | | notice.UpdateTime = DateTime.Now; |
| | | |
| | | var n = Db.Updateable(notice).ExecuteCommand(); |
| | | if (n <= 0) |
| | | { |
| | | Db.RollbackTran(); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | //客户信息 |
| | | var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList().FirstOrDefault(); |
| | | notice.Type = model.Type; |
| | | notice.CustomerNo = model.CustomerNo; |
| | | notice.CustomerName = customer == null ? "" : customer.CustomerName; |
| | | notice.LogisticsId = model.LogisticsId; |
| | | notice.UpdateUser = userId; |
| | | notice.UpdateTime = DateTime.Now; |
| | | |
| | | var n = Db.Updateable(notice).ExecuteCommand(); |
| | | if (n <= 0) |
| | | else //erp/mes |
| | | { |
| | | Db.RollbackTran(); |
| | | return false; |
| | | //更新出库单 |
| | | foreach (var d in model.Detail) |
| | | { |
| | | if (d.Qty < 1) |
| | | { |
| | | throw new Exception("出库数据必须大于0"); |
| | | } |
| | | var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("出库物品为空"); |
| | | } |
| | | //库存 |
| | | List<DataStock> stocks; |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && d.LotNo.Contains(s.LotNo)).ToList(); |
| | | } |
| | | else |
| | | { |
| | | stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); |
| | | } |
| | | |
| | | if (stocks.Count < 1) |
| | | { |
| | | throw new Exception("出库物品库存不足"); |
| | | } |
| | | var stock = stocks.First();//总库存 |
| | | // |
| | | BllExportNoticeDetail old; |
| | | if (string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(o.LotNo)); |
| | | } |
| | | else |
| | | { |
| | | old = noticeDetail.FirstOrDefault(o => o.SkuNo == d.SkuNo && o.LotNo == d.LotNo); |
| | | } |
| | | |
| | | //新加项 |
| | | if (old == null) |
| | | { |
| | | //判断数量 |
| | | var qty = stock.Qty - stock.LockQty - stock.FrozenQty; |
| | | if (d.Qty > qty) |
| | | { |
| | | throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | | { |
| | | SONo = notice.SONo, |
| | | SkuNo = sku.SkuNo, |
| | | SkuName = sku.SkuName, |
| | | Standard = sku.Standard, |
| | | LotNo = d.LotNo, |
| | | LotText = "", |
| | | Status = "0", |
| | | Qty = d.Qty, |
| | | AllotQty = 0, |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | PackagNo = sku.PackagNo, |
| | | Price = sku.Price, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * qty, |
| | | IsBale = d.IsBale, |
| | | IsBelt = d.IsBelt, |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | |
| | | CreateUser = userId, |
| | | }; |
| | | |
| | | stock.LockQty += d.Qty;//锁定数量 |
| | | var m = Db.Insertable<BllExportNoticeDetail>(item).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | else if (old.Qty != d.Qty || old.IsBale != d.IsBale || old.IsBelt != d.IsBelt) |
| | | { |
| | | if (d.Qty > (stock.Qty - stock.FrozenQty - stock.LockQty) + old.Qty) |
| | | { |
| | | throw new Exception("物品库存数量不足"); |
| | | } |
| | | //增加 |
| | | if (d.Qty > old.Qty) |
| | | { |
| | | stock.LockQty += d.Qty - old.Qty; |
| | | } |
| | | else |
| | | { |
| | | stock.LockQty -= old.Qty - d.Qty; |
| | | } |
| | | old.IsBale = d.IsBale; |
| | | old.IsBelt = d.IsBelt; |
| | | old.Qty = d.Qty; |
| | | old.UpdateUser = userId; |
| | | old.UpdateTime = DateTime.Now; |
| | | var m = Db.Updateable(old).UpdateColumns(it => new { it.IsBale, it.IsBelt, it.Qty, it.UpdateUser, it.UpdateTime }).ExecuteCommand(); |
| | | var i = Db.Updateable(stock).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | //客户信息 |
| | | var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList().FirstOrDefault(); |
| | | notice.Type = model.Type; |
| | | notice.CustomerNo = model.CustomerNo; |
| | | notice.CustomerName = customer == null ? "" : customer.CustomerName; |
| | | notice.LogisticsId = model.LogisticsId; |
| | | notice.UpdateUser = userId; |
| | | notice.UpdateTime = DateTime.Now; |
| | | |
| | | var n = Db.Updateable(notice).ExecuteCommand(); |
| | | if (n <= 0) |
| | | { |
| | | Db.RollbackTran(); |
| | | return false; |
| | | } |
| | | } |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "编辑", $"编辑了单据号为{notice.SONo}的单据信息", userId); |
| | |
| | | { |
| | | throw new Exception("未查询到出库单据信息"); |
| | | } |
| | | if (notice.Status != "4") |
| | | if (notice.Status != "4" && notice.Status != "3") |
| | | { |
| | | throw new Exception("参数异常,请检查状态是否为执行完成或订单关闭"); |
| | | throw new Exception("参数异常,请检查状态是否为正在执行或执行完成"); |
| | | } |
| | | //总库存信息 |
| | | var stockList = Db.Queryable<DataStock>().ToList(); |
| | |
| | | |
| | | foreach (var d in noticeDetail) |
| | | { |
| | | //更改库存明细锁定数量 |
| | | //var orders = dataContext.WmsExportOrder.Where(o => o.ExportDetailId == d.Id |
| | | // && o.ExportExecuteFlag != "4" && o.ExportExecuteFlag == "3" && o.pickingType == 0).ToList(); |
| | | //foreach (var o in orders) |
| | | //{ |
| | | // if (o.ExportQuantity > o.PickedNum) //判断拣货是否已拣完 |
| | | // { |
| | | // var pq = dataContext.WmsStockTray.Where(t => t.StockGoodId == o.ExportGoodsCode && t.StockStockCode == o.ExportStockCode); |
| | | |
| | | // if (string.IsNullOrWhiteSpace(o.ExportLotNo)) |
| | | // { |
| | | // pq = pq.Where(t => t.StockLotNo == null || t.StockLotNo == ""); |
| | | // } |
| | | // else |
| | | // { |
| | | // pq = pq.Where(t => t.StockLotNo == o.ExportLotNo); |
| | | // } |
| | | // var pallet = pq.FirstOrDefault(); |
| | | // //库存托盘信息锁定数量还原为未锁定 |
| | | // if (pq != null) |
| | | // { |
| | | // pallet.LockQuantity -= o.ExportQuantity.Value - o.PickedNum; |
| | | // pallet.StockQuantity += o.ExportQuantity.Value - o.PickedNum; |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | if (d.Qty != d.CompleteQty) |
| | | if (notice.Type == "0")//成品出库 |
| | | { |
| | | throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实"); |
| | | } |
| | | #region 库存表减去锁定数量与总数量(PDA拣货的时候已经减去数量了) |
| | | /*var sq = stocks.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 st = sq.FirstOrDefault(); |
| | | if (st != null) |
| | | { |
| | | if (d.CompleteQty <= d.Qty) |
| | | if (d.Qty != d.CompleteQty) |
| | | { |
| | | st.Qty += d.Qty - d.CompleteQty.Value; |
| | | 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) |
| | | { |
| | | if (o.Qty > o.CompleteQty) //判断拣货是否已拣完 |
| | | { |
| | | var pq = Db.Queryable<DataStockDetail>().Where(t => t.IsDel == "0" && t.Id == o.StockId && t.SkuNo == o.SkuNo); |
| | | |
| | | if (string.IsNullOrWhiteSpace(o.LotNo)) |
| | | { |
| | | pq = pq.Where(t => string.IsNullOrWhiteSpace(t.LotNo)); |
| | | } |
| | | else |
| | | { |
| | | pq = pq.Where(t => t.LotNo == o.LotNo); |
| | | } |
| | | var pallet = pq.First(); |
| | | //库存托盘信息锁定数量还原为未锁定 |
| | | if (pq != null) |
| | | { |
| | | //pallet.Qty -= o.CompleteQty.Value - o.Qty; |
| | | pallet.LockQty -= o.Qty - o.CompleteQty.Value; |
| | | Db.Updateable(pallet).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | #region 库存表减去锁定数量与总数量(PDA拣货的时候已经减去数量了) |
| | | var sq = stocks.Where(s => s.SkuNo == d.SkuNo); |
| | | if (!string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | sq = sq.Where(s => s.LotNo == d.LotNo); |
| | | } |
| | | else |
| | | { |
| | | st.Qty -= d.CompleteQty.Value - d.Qty; |
| | | sq = sq.Where(s => string.IsNullOrWhiteSpace(s.LotNo)); |
| | | } |
| | | st.LockQty -= d.Qty; |
| | | st.Qty -= d.Qty; |
| | | //修改总库存表 |
| | | Db.Updateable(st).UpdateColumns(it => new { it.Qty, it.LockQty }).ExecuteCommand(); |
| | | }*/ |
| | | #endregion |
| | | if (notice.Type == "6")//代储 |
| | | { |
| | | sq = sq.Where(s => s.OwnerNo == notice.CustomerNo); |
| | | } |
| | | var st = sq.FirstOrDefault(); |
| | | if (st != null) |
| | | { |
| | | st.LockQty -= d.Qty - d.CompleteQty.Value; |
| | | //修改总库存表 |
| | | Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); |
| | | } |
| | | #endregion |
| | | } |
| | | |
| | | } |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "关单", $"关闭了单据号为{notice.SONo}的单据信息", userId); |
| | |
| | | string toLocation = string.Empty;//目标位置 |
| | | string unstackingMode2 = unstackingMode;//拆垛方式,0:机器人拆垛 1:PDA拆垛 |
| | | #region 判断是否需要拆箱 |
| | | string isChai = "0";//是否需要拆箱,0:否 1:是 |
| | | var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo); |
| | | if (skuInfo == null) |
| | | if (notice.Type == "0")//成品出库 |
| | | { |
| | | throw new Exception("物料信息不存在!"); |
| | | } |
| | | var packagInfo = packagList.First(w => w.PackagNo == skuInfo.PackagNo); |
| | | if (packagInfo == null) |
| | | { |
| | | throw new Exception("包装信息不存在!"); |
| | | } |
| | | if (packagInfo.L2Name == "箱") |
| | | { |
| | | if (item.Qty % (decimal)packagInfo.L2Num != 0)//能整除说明不用拆箱,不能整除说明需要拆箱 |
| | | string isChai = "0";//是否需要拆箱,0:否 1:是 |
| | | var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo); |
| | | if (skuInfo == null) |
| | | { |
| | | isChai = "1"; |
| | | unstackingMode2 = "1";//需要拆箱需走PDA拆垛 |
| | | throw new Exception("物料信息不存在!"); |
| | | } |
| | | var packagInfo = packagList.First(w => w.PackagNo == skuInfo.PackagNo); |
| | | if (packagInfo == null) |
| | | { |
| | | throw new Exception("包装信息不存在!"); |
| | | } |
| | | if (packagInfo.L2Name == "箱") |
| | | { |
| | | if (item.Qty % (decimal)packagInfo.L2Num != 0)//能整除说明不用拆箱,不能整除说明需要拆箱 |
| | | { |
| | | isChai = "1"; |
| | | unstackingMode2 = "1";//需要拆箱需走PDA拆垛 |
| | | } |
| | | } |
| | | if (isChai == "0") |
| | | { |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList(); |
| | | if (boxInfo != null)//托盘上有零箱需要拆箱 |
| | | { |
| | | isChai = "1"; |
| | | unstackingMode2 = "1";//需要拆箱需走PDA拆垛 |
| | | } |
| | | } |
| | | |
| | | if (unstackingMode2 == "0")//机器人拆垛 |
| | | { |
| | | toLocation = "009";//机器人拆垛统一发送到009工位,由PLC自动分配拆垛位 |
| | | } |
| | | else //PDA拆垛 |
| | | { |
| | | toLocation = outMode;//出库口 |
| | | } |
| | | } |
| | | if (isChai == "0") |
| | | else |
| | | { |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList(); |
| | | if (boxInfo != null)//托盘上有零箱需要拆箱 |
| | | { |
| | | isChai = "1"; |
| | | unstackingMode2 = "1";//需要拆箱需走PDA拆垛 |
| | | } |
| | | } |
| | | #endregion |
| | | if (unstackingMode2 == "0")//机器人拆垛 |
| | | { |
| | | toLocation = loadingAddre;//装车口 |
| | | } |
| | | else //PDA拆垛 |
| | | { |
| | | unstackingMode2 = "1";//非成品出库走PDA拆垛 |
| | | toLocation = outMode;//出库口 |
| | | } |
| | | #endregion |
| | | |
| | | // 储位号 |
| | | var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo; |
| | |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }); |
| | | taskNoStr = exTask.TaskNo; |
| | | } |
| | | else if (locate.Depth == "02") //深度为2 |
| | | { |
| | |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = stockNew.LocatNo,//起始位置 |
| | | EndLocat = "",//目标位置 |
| | | EndLocat = toLocation,//目标位置 |
| | | PalletNo = stockNew.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | |
| | | StartRoadway = slotBefore.RoadwayNo, //起始巷道 |
| | | PalletNo = stockNew.PalletNo,//托盘号 |
| | | StartLocate = stockNew.LocatNo, // 起始位置 |
| | | EndLocate = "", // 目标位置 |
| | | EndLocate = toLocation, // 目标位置 |
| | | EndRoadway = "", // 目标巷道 |
| | | TaskNo = exYkTask1.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = locate.LocatNo,//起始位置 |
| | | EndLocat = "",//目标位置 |
| | | EndLocat = toLocation,//目标位置 |
| | | PalletNo = item.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | |
| | | Msg = locate.LocatNo + "的出库任务" |
| | | }; |
| | | Db.Insertable(exTask1).ExecuteCommand(); |
| | | |
| | | logTaskList.Add(exTask1); |
| | | outDto2.Add(new OutCommandDto() |
| | | { |
| | | StartRoadway = locate.RoadwayNo, //起始巷道 |
| | | PalletNo = item.PalletNo,//托盘号 |
| | | StartLocate = locate.LocatNo, // 起始位置 |
| | | EndLocate = "", // 目标位置 |
| | | EndLocate = toLocation, // 目标位置 |
| | | EndRoadway = locate.RoadwayNo, //目标巷道 |
| | | TaskNo = exTask1.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | |
| | | var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType == "1" && m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo == item.PalletNo); |
| | | if (taskNo == null) |
| | | { |
| | | taskNo = logTaskList.First(m => m.PalletNo == item.PalletNo);//当前有同托盘不同物料出库 |
| | | taskNo = logTaskList.FirstOrDefault(m => m.PalletNo == item.PalletNo);//当前有同托盘不同物料出库 |
| | | } |
| | | if (taskNo == null) |
| | | { |
| | |
| | | flagList.Add(1); |
| | | } |
| | | } |
| | | |
| | | outDto1.AddRange(moveDto); |
| | | outDto1.AddRange(outDto2); |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId); |
| | | Db.CommitTran(); |
| | |
| | | { |
| | | str += "3.要出库的托盘正在入库、"; |
| | | } |
| | | if (string.IsNullOrWhiteSpace(str)) |
| | | { |
| | | str += "托盘可执行,无需下发出库任务"; |
| | | } |
| | | if (outDto1.Count > 0) |
| | | { |
| | | // 正式运行程序放开 |
| | |
| | | response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | ////解析返回数据 |
| | | //////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | //wcs返回的成功信号(出库成功) |
| | | public void ExportSuccess(string taskNo, int userId) |
| | | //wcs返回的成功信号(出库成功) |
| | | public void ExportSuccess(string taskNo, int userId,string url) |
| | | { |
| | | try |
| | | { |
| | | //出库任务号更改,如果由PLC出库,则PLC回传任务号为:任务号+实际出库口 |
| | | var TtaskNo = taskNo; |
| | | var outLine = ""; |
| | | if (userId == 0) |
| | | { |
| | | TtaskNo = taskNo.Substring(0, taskNo.Length - 3); |
| | | outLine = taskNo.Substring(taskNo.Length - 3, 3); |
| | | } |
| | | //当前任务信息 |
| | | var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); |
| | | var task = Db.Queryable<LogTask>().First(m => m.TaskNo == TtaskNo && m.IsDel == "0"); |
| | | if (task == null) |
| | | { |
| | | throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); |
| | | throw new Exception($"未查询到任务号为:‘{TtaskNo}’的任务信息"); |
| | | } |
| | | if (task.Status == "2") |
| | | { |
| | |
| | | Db.Updateable(item).ExecuteCommand(); |
| | | } |
| | | //出库流水(更改状态) |
| | | var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList(); |
| | | var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == TtaskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList(); |
| | | |
| | | foreach (var item in allot) |
| | | { |
| | |
| | | if (userId != 0) |
| | | { |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", TtaskNo, "完成", $"点击完成按钮、完成任务号为:{TtaskNo}的任务", userId); |
| | | } |
| | | if (outLine != "") |
| | | { |
| | | #region 分配出库目的位 |
| | | 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")//西侧出库 |
| | | { |
| | | 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; |
| | | } |
| | | 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; //东侧房间库位 |
| | | } |
| | | else //1楼空托盘出库不调用AGV |
| | | { |
| | | Db.CommitTran(); |
| | | return; |
| | | } |
| | | |
| | | } |
| | | 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")//西侧出库 |
| | | { |
| | | 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")//不合格品出库 |
| | | { |
| | | |
| | | 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; |
| | | } |
| | | #endregion |
| | | |
| | | #region AGV调用 |
| | | var storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == positionEnd && w.Flag == "0" && w.Status == "0"); |
| | | if (storageLocatEnd == null) |
| | | { |
| | | throw new Exception("生成的AGV任务目的地址不正确"); |
| | | } |
| | | List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>(); |
| | | |
| | | object[] position = new object[2]; |
| | | position[0] = new |
| | | { |
| | | positionCode = positionStart, |
| | | type = "00" |
| | | }; |
| | | position[1] = new |
| | | { |
| | | positionCode = positionEnd, |
| | | type = "00" |
| | | }; |
| | | |
| | | AgvSchedulingTask agvTask = new AgvSchedulingTask(); |
| | | Random r = new Random(); |
| | | long ran = DateTime.Now.Ticks; |
| | | agvTask.ReqCode = ran.ToString(); |
| | | //agvTask.ReqCode = TtaskNo; //agv请求编号,需要随机生成 (最大32位) |
| | | agvTask.TaskCode = TtaskNo; //任务号 |
| | | agvTask.TaskTyp = type; //搬运类型 |
| | | agvTask.PositionCodePath = position; //起始和目的位集合 |
| | | agvTask.CtnrTyp = "1"; //容器类型,值为1 |
| | | if (type == "D02") |
| | | { |
| | | agvTask.CtnrNum = "10"; //叠托任务需要下发空托盘数量 |
| | | } |
| | | |
| | | agvTaskList.Add(agvTask); |
| | | |
| | | string str = ""; |
| | | var list2 = agvTaskList.Select(m => m.TaskCode).ToList(); |
| | | var jsonData = JsonConvert.SerializeObject(agvTaskList); |
| | | jsonData = jsonData.Substring(1, jsonData.Length - 1); |
| | | jsonData = jsonData.Substring(0, jsonData.Length - 1); |
| | | var response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV"); |
| | | var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response); |
| | | if (agvModel.Code != "0") |
| | | { |
| | | //记录log |
| | | var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; |
| | | jsonData = JsonConvert.SerializeObject(agvModel); |
| | | LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr); |
| | | } |
| | | |
| | | #endregion |
| | | } |
| | | Db.CommitTran(); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// wcs返回的成功信号(移库成功) |
| | | /// </summary> |
| | | /// <param name="taskNo">任务号</param> |
| | | /// <param name="userId">操作人</param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void RelocationSuccess(string taskNo, int userId) |
| | | { |
| | | try |
| | | { |
| | | //当前任务信息 |
| | | var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); |
| | | if (task == null) |
| | | { |
| | | throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); |
| | | } |
| | | if (task.Status == "2") |
| | | { |
| | | throw new Exception("当前任务已完成"); |
| | | } |
| | | Db.BeginTran(); |
| | | //库存中当前托盘的信息 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); |
| | | //当前任务中的目标储位信息 |
| | | //当前任务中的原储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat); |
| | | if (locate == null) |
| | | { |
| | | throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息"); |
| | | } |
| | | var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat); |
| | | if (locate2 == null) |
| | | { |
| | | throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息"); |
| | | } |
| | | |
| | | try |
| | | { |
| | | task.Status = "2";//任务状态 |
| | | task.IsSend = 0; |
| | | task.IsCancel = 0; |
| | | task.IsFinish = 0; |
| | | task.FinishDate = DateTime.Now;//完成时间 |
| | | Db.Updateable(task).ExecuteCommand(); |
| | | |
| | | #region 修改储位状态 |
| | | |
| | | //原储位改为空储位 0 |
| | | locate.Status = "0"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | |
| | | //目标储位改为有货物 1 |
| | | locate2.Status = "1"; |
| | | Db.Updateable(locate2).ExecuteCommand(); |
| | | foreach (var item in stockDetail) |
| | | { |
| | | item.WareHouseNo = locate2.WareHouseNo; |
| | | item.AreaNo = locate2.AreaNo; |
| | | item.RoadwayNo = locate2.RoadwayNo; |
| | | item.LocatNo = locate2.LocatNo; |
| | | } |
| | | Db.Updateable(stockDetail).ExecuteCommand(); |
| | | |
| | | #endregion |
| | | |
| | | Db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception("完成反馈失败:" + ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | //重新下发出库任务 |
| | | public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url) |
| | | public OutCommandDto AgainSendSoTask(string taskNo, string Receiver, int userId, string url) |
| | | { |
| | | try |
| | | { |
| | |
| | | { |
| | | //程序正式发布后放开 |
| | | var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | var response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); |
| | | var response = HttpHelper.DoPost(url, jsonData, Receiver == "WCS" ? "下发给WCS出库命令" : "下发给AGV出库命令", "WCS"); |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | ////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | if (Receiver == "WCS") |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list, time1, time2); |
| | | ////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list, time1, time2); |
| | | |
| | | } |
| | | if (wcsModel.StatusCode == -1) |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg); |
| | | throw new Exception($"wcs返回状态异常:{wcsModel.Msg}"); |
| | | } |
| | | } |
| | | if (wcsModel.StatusCode == -1) |
| | | else if (Receiver == "AGV") |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg); |
| | | throw new Exception($"wcs返回状态异常:{wcsModel.Msg}"); |
| | | ////解析返回数据 |
| | | var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response); |
| | | if (agvModel.Code == "0") |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list, time1, time2); |
| | | |
| | | } |
| | | if (agvModel.Code == "1") |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list, time1, time2, agvModel.Message); |
| | | throw new Exception($"agv返回状态异常:{agvModel.Message}"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | { |
| | | throw new Exception("未查询到任务信息"); |
| | | } |
| | | //获取对应库位信息 |
| | | var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat); |
| | | if (startlocat == null) |
| | | { |
| | | 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); |
| | | 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 |
| | | Db.Updateable(endlocat).ExecuteCommand(); |
| | | } |
| | | |
| | | //修改任务 |
| | | task.IsSuccess = 1; |
| | | task.IsSend = 0; |
| | |
| | | |
| | | noticeDetail.FactQty -= item.Qty; //修改出库单明细的下架数量 |
| | | Db.Updateable(noticeDetail).ExecuteCommand(); |
| | | |
| | | //获取储位信息 |
| | | var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat); |
| | | |
| | | if (locat == null) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception("未查询到储位信息,请核实!"); |
| | | } |
| | | locat.Status = "1"; //有物品 |
| | | Db.Updateable(locat).ExecuteCommand(); |
| | | |
| | | if (noticeDetail.FactQty == 0) |
| | | { |
| | |
| | | |
| | | // 出库总表 状态改为部分分配 |
| | | 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(); |
| | | |
| | | // 库存明细表 状态修改为异常锁定 锁定数量修改为托盘上数量 |
| | |
| | | |
| | | // 库存总表 锁定数量=当前锁定数量 + (库存明细托盘上数量-库存明细托盘上已锁定的数量) |
| | | 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(); |
| | | |
| | | // 拣货明细表 删除 |
| | |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && m.IsDel == "0").ToList(); |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.IsDel == "0").ToList(); //&& string.IsNullOrWhiteSpace(m.LotNo) |
| | | stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.IsDel == "0" && string.IsNullOrWhiteSpace(m.LotNo)).ToList(); // |
| | | } |
| | | |
| | | if (stockDetail.Count < 1) |
| | |
| | | throw new Exception("库存不足,无可出库库存"); |
| | | } |
| | | //0:成品出库、1:领料出库、2:抽检出库、3:物料取样出库、4:不合格品出库、5:中间品出库、6:代储出库、7:其他出库、8:寄存出库 |
| | | if (notice.Type == "0" || notice.Type == "1" || notice.Type == "2" || notice.Type == "5")//成品、原辅料出库 |
| | | if (notice.Type == "0" || notice.Type == "1")//成品、原辅料出库 |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList(); |
| | | } |
| | | else if (notice.Type == "3" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//取样出库 |
| | | else if (notice.Type == "3")//取样出库 |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList(); |
| | | } |
| | | else if (notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8") |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "0" || m.InspectStatus == "1").ToList(); |
| | | } |
| | | else if (notice.Type == "4")//不合格出库 |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList(); |
| | | } |
| | | |
| | | |
| | | #region 包装信息 |
| | | |
| | | var pack = packList.FirstOrDefault(p => p.PackagNo == detail.PackagNo); |
| | | if (pack == null) |
| | | { |
| | | throw new Exception("未查询到物料包装"); |
| | | } |
| | | var pNum = 0;//托盘物品数量 |
| | | var bNum = 0;//箱物品数量 |
| | | if (pack.L5Num.HasValue) |
| | | if (pack != null) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L5Num); |
| | | bNum = Convert.ToInt32(pack.L4Num); |
| | | //throw new Exception("未查询到物料包装"); |
| | | if (pack.L5Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L5Num); |
| | | bNum = Convert.ToInt32(pack.L4Num); |
| | | } |
| | | else if (pack.L4Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L4Num); |
| | | bNum = Convert.ToInt32(pack.L3Num); |
| | | } |
| | | else if (pack.L3Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L3Num); |
| | | bNum = Convert.ToInt32(pack.L2Num); |
| | | } |
| | | else if (pack.L2Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L2Num); |
| | | bNum = Convert.ToInt32(pack.L1Num); |
| | | } |
| | | else if (pack.L1Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L1Num); |
| | | bNum = Convert.ToInt32(pack.L1Num); |
| | | } |
| | | } |
| | | else if (pack.L4Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L4Num); |
| | | bNum = Convert.ToInt32(pack.L3Num); |
| | | } |
| | | else if (pack.L3Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L3Num); |
| | | bNum = Convert.ToInt32(pack.L2Num); |
| | | } |
| | | else if (pack.L2Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L2Num); |
| | | bNum = Convert.ToInt32(pack.L1Num); |
| | | } |
| | | else if (pack.L1Num.HasValue) |
| | | { |
| | | pNum = Convert.ToInt32(pack.L1Num); |
| | | bNum = Convert.ToInt32(pack.L1Num); |
| | | } |
| | | if (pNum == 0) |
| | | { |
| | | throw new Exception("未查询到物料包装托箱关系信息"); |
| | | } |
| | | |
| | | |
| | | //if (pNum == 0) |
| | | //{ |
| | | // throw new Exception("未查询到物料包装托箱关系信息"); |
| | | //} |
| | | #endregion |
| | | //取合适库存商品 |
| | | Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数 |
| | |
| | | } |
| | | |
| | | var sd = Db.Updateable(s).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand(); |
| | | if (notice.Type == "1" || notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//1:领料出库、 |
| | | { |
| | | if (string.IsNullOrWhiteSpace(detail.LotNo)) |
| | | { |
| | | detail.LotNo = s.LotNo; |
| | | |
| | | } |
| | | else |
| | | { |
| | | if (!detail.LotNo.Contains(s.LotNo)) |
| | | { |
| | | detail.LotNo += ";" + s.LotNo; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //if (notice.Type == "1" || notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//1:领料出库、 |
| | | //{ |
| | | // if (string.IsNullOrWhiteSpace(detail.LotNo)) |
| | | // { |
| | | // detail.LotNo = s.LotNo; |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // if (!detail.LotNo.Contains(s.LotNo)) |
| | | // { |
| | | // detail.LotNo += ";" + s.LotNo; |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | } |
| | | detail.AllotQty += qty; |
| | | detail.UpdateUser = userId; |
| | |
| | | { |
| | | detail.Status = "1"; |
| | | } |
| | | |
| | | |
| | | //库存总表 |
| | | //var stock = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo); |
| | | //stock.LockQty += qty; |
| | |
| | | d.Status = "0"; |
| | | d.UpdateUser = userId; |
| | | d.UpdateTime = DateTime.Now; |
| | | |
| | | //if (notice.Type == "1" || notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//1:领料出库、 |
| | | //{ |
| | | // if (d.IsIssueLotNo != "1") |
| | | // { |
| | | // d.LotNo = ""; |
| | | // } |
| | | |
| | | //} |
| | | } |
| | | notice.Status = "0"; |
| | | notice.UpdateUser = userId; |
| | |
| | | { |
| | | throw new Exception("获取失败,未找到指定出库单!"); |
| | | } |
| | | if (detail.Status != "0" && detail.Status != "1" && detail.AllotQty >= detail.Qty) |
| | | { |
| | | throw new Exception("获取失败,出库单状态不是等待执行或分配中!"); |
| | | } |
| | | if (detail.AllotQty >= detail.Qty) |
| | | { |
| | | throw new Exception("获取失败,出库单已分配完成!"); |
| | | } |
| | | |
| | | var notice = Db.Queryable<BllExportNotice>().First(a => a.SONo == detail.SONo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("获取失败,未找到指定出库单!"); |
| | | } |
| | | if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | if (notice.Type != "1" && notice.Type != "2" && notice.Type != "3") |
| | | { |
| | | throw new Exception("获取失败,出库单状态不允许!"); |
| | | if (detail.Status != "0" && detail.Status != "1" && detail.AllotQty >= detail.Qty) |
| | | { |
| | | throw new Exception("获取失败,出库单状态不是等待执行或分配中!"); |
| | | } |
| | | if (detail.AllotQty >= detail.Qty) |
| | | { |
| | | throw new Exception("获取失败,出库单已分配完成!"); |
| | | } |
| | | |
| | | if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | { |
| | | throw new Exception("获取失败,出库单状态不允许!"); |
| | | } |
| | | } |
| | | string inspectStatus = string.Empty; |
| | | switch (notice.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 |
| | | { |
| | | case "0"://成品出库 |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "1"://领料出库 |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "2"://抽检出库 |
| | | inspectStatus = "0,1,2"; |
| | | break; |
| | | case "3"://物料取样出库 |
| | | inspectStatus = "0"; |
| | | break; |
| | | case "4"://不合格品出库 |
| | | inspectStatus = "2"; |
| | | break; |
| | | case "5"://中间品出库 |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "6"://代储出库 |
| | | inspectStatus = "0,1,2"; |
| | | break; |
| | | case "8"://寄存出库 |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | default: //其它出库 |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | } |
| | | #endregion |
| | | |
| | | Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>() |
| | | .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), m => inspectStatus.Contains(m.InspectStatus)) |
| | | .AndIF(!string.IsNullOrWhiteSpace(houseNo), m => m.WareHouseNo == houseNo) |
| | | .AndIF(!string.IsNullOrWhiteSpace(roadwayNo), m => m.RoadwayNo == roadwayNo) |
| | | .AndIF(!string.IsNullOrWhiteSpace(locateNo), m => m.LocatNo == locateNo) |
| | |
| | | { |
| | | throw new Exception("操作失败,未找到指定出库单详情!"); |
| | | } |
| | | if (detail.AllotQty >= detail.Qty || (detail.Status != "0" && detail.Status != "1")) |
| | | { |
| | | throw new Exception("操作失败,出库单已分配完成!"); |
| | | } |
| | | var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == detail.SONo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("操作失败,未找到指定出库单!"); |
| | | } |
| | | if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | if (notice.Type != "1" && notice.Type != "2" && notice.Type !="3") |
| | | { |
| | | throw new Exception("操作失败,出库单已分配完成!"); |
| | | if (detail.AllotQty >= detail.Qty || (detail.Status != "0" && detail.Status != "1")) |
| | | { |
| | | throw new Exception("操作失败,出库单已分配完成!"); |
| | | } |
| | | |
| | | if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | { |
| | | throw new Exception("操作失败,出库单已分配完成!"); |
| | | } |
| | | |
| | | //单据明细需要的出库数量 |
| | | var needQty = detail.Qty - detail.AllotQty; |
| | | //分配的出库数量 |
| | | var outQty = model.StockList.Select(s => s.Qty).ToList().Sum(); |
| | | if (outQty < needQty) |
| | | { |
| | | throw new Exception("操作失败,出库数量不能大于计划数量!"); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | //单据明细需要的出库数量 |
| | | var needQty = detail.Qty - detail.AllotQty; |
| | | //分配的出库数量 |
| | | var outQty = model.StockList.Select(s => s.Qty).ToList().Sum(); |
| | | if (outQty != needQty) |
| | | { |
| | | throw new Exception("操作失败,出库数量与计划数量不一致!"); |
| | | } |
| | | |
| | | var stockIds = model.StockList.Select(a => a.StockId).ToList(); |
| | | //库存明细 |
| | | var stockList = Db.Queryable<DataStockDetail>().Where(a => stockIds.Contains(a.Id)).ToList(); |
| | | |
| | | //分配信息 |
| | | var allots = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == detail.Id && m.Status == "0").ToList(); |
| | | |
| | | //库存总表 |
| | | //var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo); |
| | | var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo); |
| | | |
| | | var allotList = new List<BllExportAllot>(); |
| | | var outQtys = 0; |
| | | decimal outQtys = 0; |
| | | foreach (var st in model.StockList) |
| | | { |
| | | var stock = stockList.First(a => a.Id == st.StockId); |
| | |
| | | { |
| | | throw new Exception("操作失败,部分储位库存异常!"); |
| | | } |
| | | if (st.Qty > (stock.Qty - stock.LockQty - stock.FrozenQty - stock.InspectQty)) |
| | | if (st.Qty > (stock.Qty - stock.LockQty - stock.FrozenQty)) // 输入的数量 - 托盘上可用的数量(托盘上数量-锁定的数量-冻结的数量) |
| | | { |
| | | throw new Exception("操作失败,出库数量超出库存数量!"); |
| | | } |
| | | //添加分配表信息 |
| | | var allot = new BllExportAllot |
| | | { |
| | | SONo = notice.SONo, |
| | | WaveNo = "", |
| | | SODetailNo = detail.Id, |
| | | StockId = st.StockId, |
| | | LotNo = stock.LotNo, |
| | | LotText = stock.LotText, |
| | | SupplierLot = stock.SupplierLot, |
| | | SkuNo = stock.SkuNo, |
| | | SkuName = stock.SkuName, |
| | | Standard = stock.Standard, |
| | | PalletNo = stock.PalletNo, |
| | | IsBale = stock.IsBale, |
| | | IsBelt = stock.IsBelt, |
| | | Qty = st.Qty, |
| | | CompleteQty = 0, |
| | | Status = "0", |
| | | LogisticsId = notice.LogisticsId, |
| | | IsAdvance = "0", |
| | | OutMode = "",//出库口 |
| | | |
| | | CreateUser = userId, |
| | | CreateTime = DateTime.Now |
| | | }; |
| | | allotList.Add(allot); |
| | | var bl = allots.FirstOrDefault(m => m.StockId == st.StockId); |
| | | if (bl == null) |
| | | { |
| | | //添加分配表信息 |
| | | var allot = new BllExportAllot |
| | | { |
| | | SONo = notice.SONo, |
| | | WaveNo = "", |
| | | SODetailNo = detail.Id, |
| | | StockId = st.StockId, |
| | | LotNo = stock.LotNo, |
| | | LotText = stock.LotText, |
| | | SupplierLot = stock.SupplierLot, |
| | | SkuNo = stock.SkuNo, |
| | | SkuName = stock.SkuName, |
| | | Standard = stock.Standard, |
| | | PalletNo = stock.PalletNo, |
| | | IsBale = stock.IsBale, |
| | | IsBelt = stock.IsBelt, |
| | | Qty = st.Qty, |
| | | CompleteQty = 0, |
| | | Status = notice.Status == "4"? "2":"0", |
| | | LogisticsId = notice.LogisticsId, |
| | | IsAdvance = "0", |
| | | OutMode = "",//出库口 |
| | | |
| | | CreateUser = userId, |
| | | CreateTime = DateTime.Now |
| | | }; |
| | | allotList.Add(allot); |
| | | } |
| | | else |
| | | { |
| | | bl.Qty += st.Qty; |
| | | Db.Updateable(bl).ExecuteCommand(); |
| | | } |
| | | |
| | | //库存明细 |
| | | stock.LockQty += st.Qty; |
| | | stock.Status = stock.LockQty == stock.Qty ? "2" : "1"; |
| | | |
| | | //库存总表 |
| | | //stockz.LockQty += st.Qty; |
| | | //Db.Updateable(stockz).ExecuteCommand(); |
| | | |
| | | if (detail.AllotQty+ st.Qty > detail.Qty) |
| | | { |
| | | //库存总表 |
| | | stockz.LockQty += (decimal)detail.AllotQty + st.Qty - detail.Qty; |
| | | Db.Updateable(stockz).ExecuteCommand(); |
| | | } |
| | | |
| | | Db.Updateable(stock).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand(); |
| | | outQtys += st.Qty; |
| | |
| | | foreach (var item in detailList) |
| | | { |
| | | totalQty += item.Qty; |
| | | totalAllotQty += Convert.ToInt32(item.AllotQty); |
| | | totalAllotQty += Convert.ToDecimal(item.AllotQty); |
| | | } |
| | | |
| | | if (totalAllotQty >= totalQty) |
| | |
| | | var lie = int.Parse(oldAddress.Substring(2, 2)); |
| | | var ceng = int.Parse(oldAddress.Substring(4, 2)); |
| | | |
| | | var sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng})) as distNum |
| | | from SysStorageLocat |
| | | where Flag = '0' and Status = '0' and Depth = '02' and RoadwayNo = '{roadWay}' and AreaNo in '{category}' |
| | | order by distNum;"; |
| | | var sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng})) as distNum from SysStorageLocat where Flag = '0' and Status = '0' and Depth = '02' and RoadwayNo = '{roadWay}' and AreaNo in ('{category.AreaNo}') order by distNum;"; |
| | | |
| | | var addressModels = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList(); |
| | | if (addressModels.Count > 0) // 判断同巷道内排空库位 |
| | |
| | | |
| | | return nowAddress; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取拆垛托盘拆垛信息 |
| | | /// </summary> |
| | | /// <param name="model">拆垛托盘号和WCS任务号</param> |
| | | /// <returns>拆垛托盘信息</returns> |
| | | public RequestBoxInfoCheck BoxInfoCheckWcs (BoxInfoCheck model) |
| | | { |
| | | try |
| | | { |
| | | // 判断当前任务状态 Status 1:正在执行 3:异常结束 |
| | | var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1"); |
| | | 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) |
| | | { |
| | | throw new Exception("未找到当前托盘分配任务信息!"); |
| | | } |
| | | //计算当前当前托盘上箱数和拆垛箱数 |
| | | var storcklist = Db.Queryable<DataStockDetail>().First(m => m.PalletNo == palletBindModel.PalletNo && m.SkuNo == palletBindModel.SkuNo && m.LotNo == palletBindModel.LotNo); |
| | | |
| | | string level = "1"; |
| | | int qty = 0, qtycount = 0; |
| | | var packlist = Db.Queryable<SysPackag>().First(m => m.PackagNo == palletBindModel.SkuNo && m.IsDel == "0"); |
| | | if (packlist.L2Name == "箱") |
| | | { |
| | | level = "2"; |
| | | } |
| | | switch (level) |
| | | { |
| | | case "1": |
| | | qty = (int)(palletBindModel.Qty / packlist.L1Num); |
| | | qtycount = (int)(storcklist.Qty / packlist.L1Num); |
| | | break; |
| | | case "2": |
| | | qty = (int)(palletBindModel.Qty / packlist.L2Num); |
| | | qtycount = (int)(storcklist.Qty / packlist.L2Num); |
| | | break; |
| | | |
| | | } |
| | | |
| | | var list = new RequestBoxInfoCheck |
| | | { |
| | | PalletNo = model.PalletNo, |
| | | TaskNo = model.TaskNo, |
| | | SkuNo = palletBindModel.SkuNo, |
| | | SkuName = palletBindModel.SkuName, |
| | | LotNo = palletBindModel.LotNo, |
| | | OrderNo = palletBindModel.SONo, |
| | | Standard = palletBindModel.Standard, |
| | | Qty = qty,//拆垛箱数 |
| | | QtyCount = qtycount //托盘上箱数 |
| | | }; |
| | | return list; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 拆垛分拣主扫箱码出库 |
| | | /// </summary> |
| | | /// <param name="model">箱号</param> |
| | | /// <returns>出库分拣口</returns> |
| | | public string BoxInfoExportWcs(string boxno) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrWhiteSpace(boxno)) |
| | | { |
| | | throw new Exception("主扫分拣箱码为空"); |
| | | } |
| | | //箱码所在拆垛拣货信息 |
| | | var boxModel = Db.Queryable<DataBoxInfo>().First(m=>m.BoxNo == boxno); |
| | | if (boxModel == null) |
| | | { |
| | | throw new Exception("未查询到该箱码的信息"); |
| | | } |
| | | //出库分配信息 |
| | | var allot = Db.Queryable<BllExportAllot>().First(m => |
| | | m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == boxModel.PalletNo); |
| | | if (allot == null) |
| | | { |
| | | throw new Exception("未查询到该托盘的分配信息"); |
| | | } |
| | | //出库单 |
| | | var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == allot.SONo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("未查询到该出库单的信息"); |
| | | } |
| | | //出库单明细 |
| | | var noticeDetail = Db.Queryable<BllExportNoticeDetail>() |
| | | .First(m => m.IsDel == "0" && m.Id == allot.SODetailNo); |
| | | if (noticeDetail == null) |
| | | { |
| | | throw new Exception("未查询到该出库单明细的信息"); |
| | | } |
| | | |
| | | //剩余拣货数量(待拣减去已拣) |
| | | var needQty = allot.Qty - allot.CompleteQty; |
| | | |
| | | //库存明细 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId); |
| | | if (stockDetail == null) |
| | | { |
| | | throw new Exception("未查询到该托盘分配的库存明细信息!"); |
| | | } |
| | | //库存总表 |
| | | var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo); |
| | | if (stock == null) |
| | | { |
| | | throw new Exception("未查询到该托盘分配的库存信息!"); |
| | | } |
| | | |
| | | List<DataBoxInfo> boxInfos; |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxno && m.StockDetailId == stockDetail.Id); |
| | | if (boxInfo.Count() == 0) |
| | | { |
| | | throw new Exception("未查询到该箱码及追溯码的信息"); |
| | | } |
| | | boxInfos = boxInfo.ToList(); |
| | | |
| | | var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == boxModel.PalletNo).ToList(); |
| | | if (boxInfo.Count() == 0) |
| | | { |
| | | throw new Exception("未查询到该箱码的信息"); |
| | | } |
| | | if (boxInfo.Any(m => m.PalletNo != boxModel.PalletNo)) |
| | | { |
| | | throw new Exception("该托盘与箱码没有绑定关系"); |
| | | } |
| | | var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList(); |
| | | if (boxQty[0] > needQty) |
| | | { |
| | | throw new Exception("拣货数量不能大于箱内剩余待拣数量"); |
| | | } |
| | | decimal pickQty = 0;//拣货的数量 |
| | | |
| | | var comList = new List<BllCompleteDetail>(); |
| | | foreach (var item in boxInfos) |
| | | { |
| | | //添加拣货明细 |
| | | var completeDetail = new BllCompleteDetail() |
| | | { |
| | | SONo = allot.SONo, |
| | | SODetailNo = allot.SODetailNo, |
| | | ExportAllotId = allot.Id, |
| | | StockId = allot.StockId, |
| | | BoxNo = item.BoxNo, |
| | | BoxNo2 = item.BoxNo2, |
| | | BoxNo3 = item.BoxNo3, |
| | | |
| | | LotNo = allot.LotNo, |
| | | LotText = allot.LotText, |
| | | SupplierLot = allot.SupplierLot, |
| | | SkuNo = allot.SkuNo, |
| | | SkuName = allot.SkuName, |
| | | Standard = allot.Standard, |
| | | PalletNo = boxModel.PalletNo, |
| | | CompleteQty = item.Qty, |
| | | |
| | | }; |
| | | comList.Add(completeDetail); |
| | | |
| | | |
| | | pickQty += item.Qty; |
| | | //删除库存箱码明细 |
| | | Db.Deleteable(item).ExecuteCommand(); |
| | | } |
| | | |
| | | Db.Insertable(comList).ExecuteCommand(); |
| | | //修改出库分配信息 |
| | | allot.CompleteQty += pickQty; |
| | | allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; |
| | | allot.UpdateTime = DateTime.Now; |
| | | if (allot.Status == "5") |
| | | { |
| | | //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成 |
| | | } |
| | | Db.Updateable(allot).ExecuteCommand(); |
| | | |
| | | //删除或修改库存明细 |
| | | stockDetail.BitPalletMark = "1";//修改为零托标识 |
| | | stockDetail.Qty -= pickQty; |
| | | stockDetail.LockQty -= pickQty; |
| | | if (stockDetail.Qty == stockDetail.LockQty) |
| | | { |
| | | stockDetail.Status = "2"; |
| | | } |
| | | else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0) |
| | | { |
| | | stockDetail.Status = "1"; |
| | | } |
| | | else |
| | | { |
| | | stockDetail.Status = "0"; |
| | | } |
| | | |
| | | if (stockDetail.Qty <= 0) |
| | | { |
| | | Db.Deleteable(stockDetail).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | Db.Updateable(stockDetail).ExecuteCommand(); |
| | | } |
| | | stock.Qty -= pickQty; |
| | | stock.LockQty -= pickQty; |
| | | if (stock.Qty <= 0) |
| | | { |
| | | Db.Deleteable(stock).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | Db.Updateable(stock).ExecuteCommand(); |
| | | } |
| | | var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == boxModel.PalletNo); |
| | | if (num2 <= 0) |
| | | { |
| | | //改变托盘状态 |
| | | var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == boxModel.PalletNo && m.IsDel == "0"); |
| | | if (pallet == null) |
| | | { |
| | | throw new Exception("未在托盘表中查询到托盘信息"); |
| | | } |
| | | pallet.Status = "0"; |
| | | Db.Updateable(pallet).ExecuteCommand(); |
| | | } |
| | | //修改出库单明细拣货数量 |
| | | noticeDetail.CompleteQty += pickQty; |
| | | noticeDetail.Status = "2"; |
| | | Db.Updateable(noticeDetail).ExecuteCommand(); |
| | | |
| | | var num = Db.Queryable<BllExportNoticeDetail>() |
| | | .Count(m => m.IsDel == "0" && m.SONo == allot.SONo && m.CompleteQty < m.Qty); |
| | | if (num <= 0) |
| | | { |
| | | notice.Status = "4"; //更改为执行完成 |
| | | |
| | | noticeDetail.Status = "3"; |
| | | Db.Updateable(noticeDetail).ExecuteCommand(); |
| | | } |
| | | //修改出库单信息 |
| | | Db.Updateable(notice).ExecuteCommand(); |
| | | |
| | | return allot.LoadingAddre; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | } |
| | | } |