| | |
| | | } |
| | | //库存 |
| | | 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) |
| | | { |
| | | 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(); |
| | | 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) |
| | | { |
| | | 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} 库存数量不足"); |
| | | } |
| | | } |
| | | if (stocks.Count < 1) |
| | | |
| | | foreach (var s in dic) |
| | | { |
| | | throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}"); |
| | | 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); |
| | | |
| | | st.LockQty += s.Value;//锁定数量 |
| | | var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty }) |
| | | .ExecuteCommand(); |
| | | } |
| | | |
| | | var item = new BllExportNoticeDetail() |
| | | { |
| | | 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 = "", |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | list.Add(item); |
| | | stocks.First().LockQty += d.Qty;//锁定数量 |
| | | |
| | | var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty }) |
| | | .ExecuteCommand(); |
| | | |
| | | |
| | | } |
| | | var notice = new BllExportNotice() |
| | | { |
| | |
| | | { |
| | | try |
| | | { |
| | | var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id&& m.IsDel == "0"); |
| | | var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id && m.IsDel == "0"); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("未查询到单据信息"); |
| | | } |
| | | if (notice.Status != "5") |
| | | { |
| | | throw new Exception("复核失败,单据非关闭状态"); |
| | | } |
| | | var detail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.SONo == notice.SONo && m.IsDel == "0").ToList(); |
| | | if (detail.Count == 0) |
| | | { |
| | | throw new Exception("未查询到单据明细信息"); |
| | | } |
| | | if (userId == notice.UpdateUser) |
| | | { |
| | | throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); |
| | | } |
| | | var list = new List<SoDetail>(); |
| | | foreach (var d in detail) |
| | |
| | | { |
| | | SkuNo = d.SkuNo, |
| | | LotNo = d.LotNo, |
| | | Qty = int.Parse(d.CompleteQty.ToString()) |
| | | Qty = (decimal)d.CompleteQty |
| | | }; |
| | | list.Add(item); |
| | | } |
| | |
| | | OrderCode = notice.OrderCode, |
| | | SoDetails = list |
| | | }; |
| | | // 通过接口发送至erp |
| | | var jsonData = JsonConvert.SerializeObject(soInfo); |
| | | #region 通过接口发送至erp |
| | | //系统对接后放开 |
| | | /*var jsonData = JsonConvert.SerializeObject(soInfo); |
| | | |
| | | var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP"); |
| | | |
| | | //解析返回数据 |
| | | var obj = JsonConvert.DeserializeObject<ErpModel>(response); |
| | | |
| | | var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据 |
| | | if (obj.Success != 0) |
| | | { |
| | | throw new Exception("上传失败" + obj.Message); |
| | | } |
| | | }*/ |
| | | #endregion |
| | | |
| | | notice.Status = "6"; |
| | | notice.UpdateTime = DateTime.Now; |
| | | notice.UpdateUser = userId; |
| | | notice.CheckTime = DateTime.Now; |
| | | notice.CheckUser = userId; |
| | | Db.Updateable(notice).ExecuteCommand(); |
| | | |
| | | new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"复核了单据号为{notice.SONo}的单据信息", userId); |
| | | return true; |
| | | } |
| | | catch (Exception e) |
| | |
| | | .LeftJoin<SysLogisticsInfo>((a, b) => a.LogisticsId == b.Id) |
| | | .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id) |
| | | .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id) |
| | | .Select((a, b, c, d) => new ExportNoticeDto() |
| | | .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, |
| | |
| | | IsWave = a.IsWave, |
| | | WaveNo = a.WaveNo, |
| | | IsDespatch = a.IsDespatch, |
| | | Demo=a.Demo, |
| | | Demo = a.Demo, |
| | | |
| | | CreateUserName = c.RealName, |
| | | UpdateUserName = c.RealName, |
| | | CreateTime = a.CreateTime, |
| | | UpdateTime = a.UpdateTime |
| | | UpdateTime = a.UpdateTime, |
| | | |
| | | CheckUserName = e.RealName, |
| | | CheckTime = a.CheckTime |
| | | }) |
| | | .OrderByDescending(a => a.CreateTime) |
| | | .ToOffsetPage(page, limit, ref 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)); //排除空托盘的物料集合 |
| | | var inspectStatus = "1";//库存内物料的质检状态 |
| | | var skuTypeC = new List<string>() { "0" };//标准 |
| | | var skuTypeY = new List<string>() { "1" };//非标 |
| | | if (type == "0" || type == "2") //标准 |
| | | string skuType = string.Empty; |
| | | string inspectStatus = string.Empty; |
| | | switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 |
| | | { |
| | | inspectStatus = "0"; |
| | | //if (type == "0") //成品 |
| | | //{ |
| | | skuList = sku.Where(m => inspectStatus==m.IsControlled).Select(m => m.SkuNo).ToList(); |
| | | //} |
| | | |
| | | //if (type == "1") //原料 |
| | | //{ |
| | | // skuList = sku.Where(m => skuTypeY.Contains(m.Type)).Select(m => m.SkuNo).ToList(); |
| | | //} |
| | | case "0"://成品出库 |
| | | skuType = "(2)"; |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "1"://领料出库 |
| | | skuType = "(0,1,3)"; |
| | | inspectStatus = "1"; |
| | | break; |
| | | case "2"://抽检出库 |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0,1,2"; |
| | | break; |
| | | case "3"://物料取样出库 |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0"; |
| | | break; |
| | | case "4"://不合格品出库 |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "2"; |
| | | break; |
| | | case "5"://中间品出库 |
| | | skuType = "(4)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | case "6"://代储出库 |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | case "8"://寄存出库 |
| | | skuType = "(0,1,2,3)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | default: //其它出库 |
| | | skuType = "(0,1,2,3,4)"; |
| | | inspectStatus = "0,1"; |
| | | break; |
| | | } |
| | | else if (type == "1" || type == "3") //非标 |
| | | skuList = sku.Where(m => skuType.Contains(m.Type)).Select(m => m.SkuNo).ToList(); |
| | | if (skuList == null) |
| | | { |
| | | inspectStatus = "1"; |
| | | //if (type == "2") //成品 |
| | | //{ |
| | | skuList = sku.Where(m => inspectStatus==m.IsControlled).Select(m => m.SkuNo).ToList(); |
| | | //} |
| | | throw new Exception("未查到对应出库类型的物料"); |
| | | } |
| | | |
| | | //if (type == "3") //原料 |
| | | //{ |
| | | // skuList = sku.Where(m => skuTypeY.Contains(m.Type)).Select(m => m.SkuNo).ToList(); |
| | | //} |
| | | if (type!="8") |
| | | { |
| | | skuList = skuList.Where(m => m != "100088").ToList(); |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("单据状态有误"); |
| | | 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(!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(); |
| | | |
| | |
| | | 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 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(); |
| | |
| | | } |
| | | //库存 |
| | | 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() |
| | | { |
| | | SONo = billNo, |
| | |
| | | CompleteQty = 0, |
| | | PackagNo = sku.PackagNo, |
| | | Price = sku.Price, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price*d.Qty, |
| | | Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty, |
| | | IsBale = d.IsBale, |
| | | IsBelt = d.IsBelt, |
| | | SupplierLot = stocks.First().SupplierLot, |
| | | IsWave = "0", |
| | | WaveNo= "", |
| | | WaveNo = "", |
| | | |
| | | 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() |
| | |
| | | LogisticsId = model.LogisticsId, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsDespatch="0", |
| | | IsDespatch = "0", |
| | | |
| | | CreateUser = userId, |
| | | }; |
| | |
| | | var stockCount = 0.00m; //st.StockQuantity.Value |
| | | if (s != null) |
| | | { |
| | | stockCount = s.Qty-s.FrozenQty-s.LockQty+d.Qty; |
| | | stockCount = s.Qty - s.FrozenQty - s.LockQty + d.Qty; |
| | | } |
| | | |
| | | var dm = new SelectStockSkuDto() |
| | |
| | | |
| | | 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); |
| | |
| | | .AndIF(!string.IsNullOrWhiteSpace(skuName), m => m.SkuName.Contains(skuName.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(palletNo), m => m.PalletNo.Contains(palletNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(lotNo), m => m.LotNo.Contains(lotNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(inspectMark), m => m.InspectMark==inspectMark) |
| | | .AndIF(!string.IsNullOrWhiteSpace(bitPalletMark), m => m.BitPalletMark== bitPalletMark) |
| | | .AndIF(!string.IsNullOrWhiteSpace(inspectMark), m => m.InspectMark == inspectMark) |
| | | .AndIF(!string.IsNullOrWhiteSpace(bitPalletMark), m => m.BitPalletMark == bitPalletMark) |
| | | .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo)) |
| | | .And(a => a.Status == "0") |
| | | .And(a => a.WareHouseNo == "W01") |
| | |
| | | var outDtoList = new List<OutCommandDto>(); //出库数据的集合 |
| | | str = ""; |
| | | var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList(); |
| | | |
| | | |
| | | if (stockDetailList.Count == 0) |
| | | { |
| | | throw new Exception($"未在库内查询到该托盘信息"); |
| | |
| | | } |
| | | //判断托盘库存信息分组后是否大于1条 |
| | | var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList(); |
| | | if (detailGroup.Count>1) |
| | | if (detailGroup.Count > 1) |
| | | { |
| | | throw new Exception($"未在库内查询到该托盘信息"); |
| | | } |
| | |
| | | throw new Exception($"当前托盘所在的储位已损坏,不能出库,请核实"); |
| | | } |
| | | |
| | | if (locate.Status !="1") |
| | | if (locate.Status != "1") |
| | | { |
| | | throw new Exception($"当前托盘所在的储位状态不是有物品,不能出库,请核实"); |
| | | } |
| | |
| | | Db.Updateable(de).ExecuteCommand(); |
| | | Db.Updateable(stocka).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | locate.Status = "3"; //要出库的储位改变状态 正在出库 |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | |
| | | |
| | | |
| | | #endregion |
| | | |
| | |
| | | #region 下发出库、出库完成、重新下发任务、取消任务、异常处理 |
| | | |
| | | // 下发出库(调用cs接口给他库位地址) |
| | | public List<OutCommandDto> IssueOutHouse(string soNo, string outMode, int userId, string url, out string str) |
| | | public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId, string url, out string str) |
| | | { |
| | | try |
| | | { |
| | | #region 集合 |
| | | |
| | | var outDtoList = new List<OutCommandDto>(); //出库数据的集合 |
| | | var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位) |
| | | var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位) |
| | | var moveDto = new List<OutCommandDto>(); //要移库数据的集合 |
| | | //记录错误信息的集合 |
| | | var flagList = new List<int>();//1:当前要出库的储位正在移出、2 出库的托盘储位信息错误(在储位表中未查询到)、3储位损坏不能出库、4 要出库的托盘正在入库 |
| | | |
| | |
| | | var outLpnList = list.Select(m => m.PalletNo).ToList(); |
| | | //要出库的明细集合 |
| | | var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList(); |
| | | //物料编码表 |
| | | var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0"); |
| | | //包装表 |
| | | var packagList = Db.Queryable<SysPackag>().Where(w => w.IsDel == "0"); |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | |
| | | //循环分配的信息生成出库任务 |
| | | foreach (var item in list) |
| | | { |
| | | var taskNoStr = ""; |
| | | string toLocation = string.Empty;//目标位置 |
| | | string unstackingMode2 = unstackingMode;//拆垛方式,0:机器人拆垛 1:PDA拆垛 |
| | | #region 判断是否需要拆箱 |
| | | if (notice.Type == "0")//成品出库 |
| | | { |
| | | string isChai = "0";//是否需要拆箱,0:否 1:是 |
| | | var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo); |
| | | if (skuInfo == null) |
| | | { |
| | | 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 = loadingAddre;//装车口 |
| | | } |
| | | else //PDA拆垛 |
| | | { |
| | | toLocation = outMode;//出库口 |
| | | } |
| | | } |
| | | else |
| | | { |
| | | unstackingMode2 = "1";//非成品出库走PDA拆垛 |
| | | toLocation = outMode;//出库口 |
| | | } |
| | | #endregion |
| | | |
| | | // 储位号 |
| | | var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo; |
| | | |
| | |
| | | if (locate.Status == "1") //有物品 |
| | | { |
| | | #region 添加出库任务 |
| | | |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //出库任务 |
| | | if (locate.Depth == "01") //深度为1 |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //出库任务 |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = locate.LocatNo,//起始位置 |
| | | EndLocat = outMode,//目标位置 |
| | | PalletNo = item.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "从" + locate.LocatNo + "到" + outMode + "的出库任务", //关键信息 |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | logTaskList.Add(exTask); |
| | | StartLocat = locate.LocatNo,//起始位置 |
| | | EndLocat = toLocation,//outMode,//目标位置 |
| | | PalletNo = item.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "从" + locate.LocatNo + "到" + toLocation + "的出库任务", //关键信息 |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | logTaskList.Add(exTask); |
| | | |
| | | outDtoList.Add(new OutCommandDto() |
| | | outDto1.Add(new OutCommandDto() |
| | | { |
| | | PalletNo = item.PalletNo,//托盘号 |
| | | StartLocate = locate.LocatNo, // 起始位置 |
| | | StartRoadway = locate.RoadwayNo,//其实巷道 |
| | | EndLocate = toLocation,//outMode, // 目标位置 |
| | | TaskNo = exTask.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }); |
| | | taskNoStr = exTask.TaskNo; |
| | | } |
| | | else if (locate.Depth == "02") //深度为2 |
| | | { |
| | | PalletNo = item.PalletNo,//托盘号 |
| | | StartLocate = locate.LocatNo, // 起始位置 |
| | | StartRoadway = locate.RoadwayNo,//其实巷道 |
| | | EndLocate = outMode, // 目标位置 |
| | | TaskNo = exTask.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }); |
| | | //获取出库深度为2储位前面的储位信息 |
| | | var slotBefore = com.GetLocateNoDepth1(locate.WareHouseNo, locate.LocatNo); |
| | | if (slotBefore.Status == "1") //前面的储位有货物、进行移库操作 |
| | | { |
| | | //要出库深度为2的储位前面的储位中货物是否要出库 |
| | | var isout = outStockDetail.Count(m => m.LocatNo == slotBefore.LocatNo); |
| | | |
| | | if (isout <= 0) //进行移库 |
| | | { |
| | | //去库存表中找到储位对应的托盘码操作 |
| | | var stockNew = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == slotBefore.LocatNo); |
| | | if (stockNew == null) |
| | | { |
| | | var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == slotBefore.LocatNo); |
| | | slotChange.Status = "0"; |
| | | Db.Updateable(slotChange).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | //获取移库的库位 |
| | | var newSlot = MoveAddress(slotBefore.LocatNo, slotBefore.RoadwayNo, item.SkuNo); |
| | | //当前移库库位的储位信息 |
| | | var locatey = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == newSlot && m.IsDel == "0"); |
| | | if (!string.IsNullOrEmpty(newSlot)) |
| | | { |
| | | #region 添加出库时发生的移库任务 |
| | | |
| | | var exYkTaskNo = new Common().GetMaxNo("TK"); |
| | | var exYkTask = new LogTask //出库时产生移库任务 |
| | | { |
| | | TaskNo = exYkTaskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = stockNew.LocatNo,//起始位置 |
| | | EndLocat = newSlot,//目标位置 |
| | | PalletNo = stockNew.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | |
| | | Msg = stockNew.LocatNo + " ==>> " + newSlot + "的移库任务", |
| | | }; |
| | | Db.Insertable(exYkTask).ExecuteCommand(); |
| | | |
| | | moveDto.Add(new OutCommandDto() |
| | | { |
| | | StartRoadway = slotBefore.RoadwayNo, //起始巷道 |
| | | PalletNo = stockNew.PalletNo,//托盘号 |
| | | StartLocate = stockNew.LocatNo, // 起始位置 |
| | | EndLocate = newSlot, // 目标位置 |
| | | EndRoadway = locatey.RoadwayNo, // 目标巷道 |
| | | TaskNo = exYkTask.TaskNo, // 任务号 |
| | | TaskType = "2",// 任务类型 (移库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1, |
| | | }); |
| | | #endregion |
| | | |
| | | #region 改变储位装填 |
| | | var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.Id == slotBefore.Id); |
| | | var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == newSlot); |
| | | slotChange.Status = "5"; //改变状态(正在移出) |
| | | slotChange2.Status = "4"; // 改变状态(正在移入) |
| | | Db.Updateable(slotChange).ExecuteCommand(); |
| | | Db.Updateable(slotChange2).ExecuteCommand(); |
| | | #endregion |
| | | } |
| | | else |
| | | { |
| | | #region 添加出库任务 |
| | | |
| | | var exYkTaskNo1 = new Common().GetMaxNo("TK"); |
| | | var exYkTask1 = new LogTask //出库移库没有库位了进行出库任务 |
| | | { |
| | | TaskNo = exYkTaskNo1, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = stockNew.LocatNo,//起始位置 |
| | | EndLocat = toLocation,//目标位置 |
| | | PalletNo = stockNew.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = locate.LocatNo + "的出库任务" |
| | | }; |
| | | Db.Insertable(exYkTask1).ExecuteCommand(); |
| | | |
| | | outDto1.Add(new OutCommandDto() |
| | | { |
| | | StartRoadway = slotBefore.RoadwayNo, //起始巷道 |
| | | PalletNo = stockNew.PalletNo,//托盘号 |
| | | StartLocate = stockNew.LocatNo, // 起始位置 |
| | | EndLocate = toLocation, // 目标位置 |
| | | EndRoadway = "", // 目标巷道 |
| | | TaskNo = exYkTask1.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1, |
| | | }); |
| | | #endregion |
| | | |
| | | #region MyRegion |
| | | |
| | | var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.Id == slotBefore.Id); |
| | | slotChange.Status = "3"; //改变状态(正在出库) |
| | | Db.Updateable(slotChange).ExecuteCommand(); |
| | | |
| | | #endregion |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else if (slotBefore.Status == "2" || slotBefore.Status == "4") //前面储位状态是入库中或者移入中 |
| | | { |
| | | flagList.Add(5); |
| | | continue; |
| | | } |
| | | |
| | | #region 添加出库任务 |
| | | |
| | | var taskNo1 = new Common().GetMaxNo("TK"); |
| | | var exTask1 = new LogTask //出库任务 |
| | | { |
| | | TaskNo = taskNo1, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = locate.LocatNo,//起始位置 |
| | | EndLocat = toLocation,//目标位置 |
| | | PalletNo = item.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = locate.LocatNo + "的出库任务" |
| | | }; |
| | | Db.Insertable(exTask1).ExecuteCommand(); |
| | | logTaskList.Add(exTask1); |
| | | outDto2.Add(new OutCommandDto() |
| | | { |
| | | StartRoadway = locate.RoadwayNo, //起始巷道 |
| | | PalletNo = item.PalletNo,//托盘号 |
| | | StartLocate = locate.LocatNo, // 起始位置 |
| | | EndLocate = toLocation, // 目标位置 |
| | | EndRoadway = locate.RoadwayNo, //目标巷道 |
| | | TaskNo = exTask1.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1, |
| | | }); |
| | | taskNoStr = exTask1.TaskNo; |
| | | #endregion |
| | | |
| | | } |
| | | #endregion |
| | | |
| | | #region 改变数据 |
| | |
| | | locate.Status = "3"; //要出库的储位改变状态 正在出库 |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | |
| | | item.TaskNo = exTask.TaskNo; // 出库分配信息中更新任务号 |
| | | item.TaskNo = taskNoStr; // 出库分配信息中更新任务号 |
| | | item.Status = "1"; // 出库分配信息状态改为正在执行 |
| | | item.OutMode = outMode;//出库口 |
| | | item.UnstackingMode = unstackingMode2;//拆垛方式 |
| | | item.OutMode = unstackingMode2 == "1" ? outMode : "";//出库口 |
| | | item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口 |
| | | Db.Updateable(item).ExecuteCommand(); |
| | | |
| | | |
| | | #endregion |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType =="1"&& m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo==item.PalletNo); |
| | | 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) |
| | | { |
| | |
| | | } |
| | | item.TaskNo = taskNo.TaskNo; |
| | | item.Status = "1"; // 出库分配信息状态改为正在执行 |
| | | item.OutMode = taskNo.EndLocat; |
| | | item.OutMode = unstackingMode2 == "1" ? taskNo.EndLocat : "";//出库口 |
| | | item.LoadingAddre = unstackingMode2 == "0" ? taskNo.EndLocat : "";//装车口 |
| | | Db.Updateable(item).ExecuteCommand(); |
| | | flagList.Add(0); |
| | | #endregion |
| | |
| | | flagList.Add(1); |
| | | } |
| | | } |
| | | |
| | | outDto1.AddRange(moveDto); |
| | | outDto1.AddRange(outDto2); |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId); |
| | | Db.CommitTran(); |
| | |
| | | { |
| | | str += "3.要出库的托盘正在入库、"; |
| | | } |
| | | if (outDtoList.Count > 0) |
| | | if (outDto1.Count > 0) |
| | | { |
| | | // 正式运行程序放开 |
| | | var list2 = outDtoList.Select(m => m.TaskNo).ToList(); |
| | | var jsonData = JsonConvert.SerializeObject(outDtoList); |
| | | var list2 = outDto1.Select(m => m.TaskNo).ToList(); |
| | | var jsonData = JsonConvert.SerializeObject(outDto1); |
| | | string response = ""; |
| | | |
| | | try |
| | | { |
| | | var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | //var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | //response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); |
| | | //var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | ////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list2, time1, time2); |
| | | str += "下发成功"; |
| | | } |
| | | if (wcsModel.StatusCode == -1) |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); |
| | | throw new Exception(wcsModel.Msg); |
| | | } |
| | | //////解析返回数据 |
| | | //var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | //if (wcsModel.StatusCode == 0) |
| | | //{ |
| | | // //更改任务的发送返回时间// |
| | | // new TaskServer().EditTaskIssueOk(list2, time1, time2); |
| | | // str += "下发成功"; |
| | | //} |
| | | //if (wcsModel.StatusCode == -1) |
| | | //{ |
| | | // new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); |
| | | // throw new Exception(wcsModel.Msg); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | } |
| | | |
| | | return outDtoList; |
| | | return outDto1; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | } |
| | | foreach (var item in stockDetail) |
| | | { |
| | | if (item.SkuNo== "100099")//判断是否是空托出库 |
| | | if (item.SkuNo == "100099")//判断是否是空托出库 |
| | | { |
| | | //判断总库存是否为0,如果为0删除 否则减去数量 |
| | | var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099"); |
| | |
| | | } |
| | | } |
| | | |
| | | /// <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) |
| | | { |
| | |
| | | { |
| | | 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 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); |
| | | var num = noticeDetail2.Count(m => m.FactQty > 0); |
| | | //判断出库单的所有明细是否都为0;如果为0变更出库单状态为已分配 |
| | | if (num == 0) |
| | | { |
| | |
| | | //修改库存明细 |
| | | stockDetail.LockQty -= stockDetail.Qty; //锁定数量 |
| | | stockDetail.Status = "0"; //库存状态 0:待分配 |
| | | |
| | | |
| | | //修改库存总表 |
| | | datastock.LockQty -= (int)stockDetail.Qty; //锁定数量 |
| | | |
| | |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | Db.Updateable(allot).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "取消", $"点击取消按钮、取消了任务号为:{taskNo}的任务", (int)userId); |
| | | Db.CommitTran(); |
| | |
| | | try |
| | | { |
| | | // 判断当前任务状态 Status 1:正在执行 3:异常结束 |
| | | var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1"); |
| | | var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1"); |
| | | if (taskModel == null) |
| | | { |
| | | throw new Exception("此任务不存在或任务状态已变更!"); |
| | |
| | | } |
| | | if (notice.Status != "0" && notice.Status != "1") |
| | | { |
| | | throw new Exception("参数异常,请检查状态是否为等待执行或部分分配或来源是否是WMS"); |
| | | throw new Exception("参数异常,请检查状态是否为等待执行或部分分配;"); |
| | | } |
| | | //出库单明细 |
| | | var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == soNo && (m.AllotQty - m.Qty) <= 0).ToList(); |
| | |
| | | //判断单号是否指定批次 |
| | | if (!string.IsNullOrWhiteSpace(detail.LotNo)) |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && m.IsDel == "0").ToList(); |
| | | if (detail.LotNo.Contains(";")) |
| | | { |
| | | var lotNoList = detail.LotNo.Split(";"); |
| | | var lotNoList2 = new List<string>(); |
| | | |
| | | foreach (var lotNoItem in lotNoList) |
| | | { |
| | | lotNoList2.Add(lotNoItem); |
| | | } |
| | | stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && lotNoList2.Contains(m.LotNo) && m.IsDel == "0").ToList(); |
| | | } |
| | | else |
| | | { |
| | | 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 && string.IsNullOrWhiteSpace(m.LotNo) && m.IsDel == "0").ToList(); |
| | | 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" )//成品、原辅料出库 |
| | | { |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList(); |
| | | } |
| | | 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(); |
| | | } |
| | | |
| | | //if (notice.Type == "0" || notice.Type == "1")//成品、原辅料出库 |
| | | //{ |
| | | stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList(); |
| | | //} |
| | | //else if (notice.Type == "2" || notice.Type == "3")//成品、原辅料出库(不合格) |
| | | //{ |
| | | // stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList(); |
| | | //} |
| | | //else if (notice.Type == "4")//取样出库 |
| | | //{ |
| | | // stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList(); |
| | | //} |
| | | //将库存明细按深度进行排序 深度1在前 深度2在后 |
| | | //stockDetail = stockDetail.OrderBy(d => int.Parse(d.LocatNo.Substring(6, 2))).ToList(); |
| | | #region 包装信息 |
| | | |
| | | var pack = packList.FirstOrDefault(p => p.PackagNo == detail.PackagNo); |
| | |
| | | } |
| | | #endregion |
| | | //取合适库存商品 |
| | | Dictionary<int, int> stockQtyDic = new Dictionary<int, int>();//托出库物品数 |
| | | Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数 |
| | | Dictionary<string, int> zxQtyDic = new Dictionary<string, int>();//托出整箱数 |
| | | //分配货物 |
| | | //assign.AllocatePallets(stocks, pNum, bNum, needQty, stockQtyDic, zxQtyDic); |
| | | int qty = assign.AllotPallets(stockDetail, int.Parse(needQty.ToString()), pNum, bNum, stockQtyDic); |
| | | var qty = assign.AllotPallets(stockDetail, decimal.Parse(needQty.ToString()), pNum, bNum, stockQtyDic); |
| | | |
| | | foreach (var sc in stockQtyDic) |
| | | { |
| | |
| | | } |
| | | |
| | | 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; |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | } |
| | | detail.AllotQty += qty; |
| | | detail.UpdateUser = userId; |
| | |
| | | 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 (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5") |
| | | { |
| | | throw new Exception("获取失败,出库单状态不允许!"); |
| | | } |
| | |
| | | m => m.SkuNo.Contains(msg.Trim()) |
| | | || m.SkuName.Contains(msg.Trim()) |
| | | || m.LocatNo.Contains(msg.Trim())) |
| | | .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo &&(m.Status == "0" || m.Status == "1")) |
| | | .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && (m.Status == "0" || m.Status == "1")) |
| | | .ToExpression();//注意 这一句 不能少 |
| | | |
| | | var list = Db.Queryable<DataStockDetail>().Where(item).Select(a => new StockDetailDto |
| | |
| | | LocatNo = a.LocatNo, |
| | | RoadwayNo = a.RoadwayNo, |
| | | PalletNo = a.PalletNo, |
| | | Demo = a.Demo, |
| | | }).ToList(); |
| | | |
| | | return list; |
| | |
| | | { |
| | | throw new Exception("操作失败,出库单已分配完成!"); |
| | | } |
| | | var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel =="0" && a.SONo == detail.SONo); |
| | | var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == detail.SONo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("操作失败,未找到指定出库单!"); |
| | |
| | | //库存明细 |
| | | 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); |
| | |
| | | { |
| | | 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 = "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"; |
| | |
| | | //修改出库单状态 |
| | | if (notice.Status == "0" || notice.Status == "1") |
| | | { |
| | | int totalQty = 0; |
| | | int totalAllotQty = 0; |
| | | decimal totalQty = 0; |
| | | decimal totalAllotQty = 0; |
| | | foreach (var item in detailList) |
| | | { |
| | | totalQty += item.Qty; |
| | |
| | | { |
| | | notice.Status = "2";//证明分配数量大于等于出库数量 修改为已分配 |
| | | } |
| | | else if (totalAllotQty< totalQty && totalAllotQty>0) |
| | | else if (totalAllotQty < totalQty && totalAllotQty > 0) |
| | | { |
| | | notice.Status = "1";//证明分配数量小于等于出库数量 修改为部分分配 |
| | | } |
| | |
| | | |
| | | #endregion |
| | | |
| | | /// <summary> |
| | | /// 判断出库是否需要拆箱 |
| | | /// </summary> |
| | | /// <param name="soNo"></param> |
| | | /// <returns></returns> |
| | | public string IsNeedUnpack(string soNo) |
| | | { |
| | | string result = "0";//是否需要拆箱,0:否 1:是 |
| | | if (string.IsNullOrEmpty(soNo)) |
| | | { |
| | | throw new Exception("未找到对应出库单!"); |
| | | } |
| | | try |
| | | { |
| | | var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("未找到对应出库单!"); |
| | | } |
| | | //物料编码表 |
| | | var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0"); |
| | | //包装表 |
| | | var packagList = Db.Queryable<SysPackag>().Where(w => w.IsDel == "0"); |
| | | //出库分配信息 |
| | | var allotList = Db.Queryable<BllExportAllot>().Where(w => w.IsDel == "0" && w.SONo == soNo).ToList(); |
| | | foreach (var item in allotList) |
| | | { |
| | | var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo); |
| | | if (skuInfo == null) |
| | | { |
| | | 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)//能整除说明不用拆箱,不能整除说明需要拆箱 |
| | | { |
| | | result = "1";//需要拆箱 |
| | | break; |
| | | } |
| | | } |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList(); |
| | | if (boxInfo != null)//托盘上有零箱需要拆箱 |
| | | { |
| | | result = "1";//需要拆箱 |
| | | break; |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取移库目标库位 |
| | | /// </summary> |
| | | /// <param name="oldAddress">需要移动的库位地址</param> |
| | | /// <param name="roadWay">巷道</param> |
| | | /// <param name="skuNo">物料编码</param> |
| | | /// <returns>目标库位地址 为"" 直接下发两次出库指令</returns> |
| | | public string MoveAddress(string oldAddress, string roadWay, string skuNo)//01020201 排-列-层-深度 |
| | | { |
| | | string nowAddress = ""; |
| | | |
| | | //根据物料编码获取对应区域 |
| | | var skuCategoryNo = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.SkuNo == skuNo).Select(a => a.CategoryNo).First(); |
| | | var category = Db.Queryable<SysMaterialCategory>().First(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo); |
| | | |
| | | // 获取移库目标储位 |
| | | var row = int.Parse(oldAddress.Substring(0, 2)); |
| | | 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.AreaNo}') order by distNum;"; |
| | | |
| | | var addressModels = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList(); |
| | | if (addressModels.Count > 0) // 判断同巷道内排空库位 |
| | | { |
| | | var listLocaete = new List<string>(); |
| | | foreach (var item in addressModels) |
| | | { |
| | | // 目标内库位对应的外库位 |
| | | string addressee = item.LocatNo.Substring(0, 6) + "01"; |
| | | |
| | | // 判断目标库位的外库位是否存在货物 (正常情况下正在移入情况不存在,因为移库先移入里面,后移入外面) |
| | | //SlotStatus 0: 空储位 1:有货 2:正在入库 3:正在出库 4:正在移入 5:正在移出 |
| | | sqlString = $"select count(*) from SysStorageLocat where LocatNo = '{addressee}' and Status = '0' and Flag in ('0','1') ; "; |
| | | var rowNum = Db.Ado.SqlQuery<int>(sqlString).First(); |
| | | if (rowNum == 0) |
| | | { |
| | | continue; |
| | | } |
| | | else |
| | | { |
| | | nowAddress = item.LocatNo; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if (nowAddress == "") |
| | | { |
| | | // 判断同巷道外排空库位 |
| | | 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 = '01' and RoadwayNo = '{roadWay}' and AreaNo in '{category}' |
| | | order by distNum;"; |
| | | var adderModeling = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList(); |
| | | if (adderModeling.Count > 0) |
| | | { |
| | | nowAddress = adderModeling[0].LocatNo; |
| | | } |
| | | else |
| | | { |
| | | // 库内不存在空储位 |
| | | nowAddress = ""; |
| | | } |
| | | } |
| | | |
| | | |
| | | return nowAddress; |
| | | } |
| | | } |
| | | } |