public async Task SaveData(PB_Location data) { if (data.Id.IsNullOrEmpty()) { InitEntity(data); if (data.Code.IsNullOrWhiteSpace()) { data.Code = await _provider.GetRequiredService <IPB_BarCodeTypeBusiness>().Generate("PB_Location"); } await _pB_LocationBus.AddDataAsync(data); } else { await _pB_LocationBus.UpdateDataAsync(data); } }
public async Task Approve(AuditDTO audit) { var now = DateTime.Now; var data = await this.GetTheDataAsync(audit.Id); var detail = data.BadDetails; var dicMUnit = detail.GroupBy(s => new { s.Material.Id, s.Material.MeasureId }).Select(s => new { s.Key.Id, s.Key.MeasureId }).ToDictionary(k => k.Id, v => v.MeasureId); PB_Location defaultBadLocation = null; // 找到默认的报损货位 { var localSvc = Db.GetIQueryable <PB_Location>(); //这里要修改,要从货区的类型来过滤 defaultBadLocation = await localSvc.Where(w => w.StorId == audit.StorId && w.PB_StorArea.Type == "Bad").OrderByDescending(o => o.IsDefault).FirstOrDefaultAsync(); if (defaultBadLocation == null) { throw new Exception("没有指定默认报损货位"); } } var lmSvc = _ServiceProvider.GetRequiredService <IIT_LocalMaterialBusiness>(); var ldSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>(); // 原库位出库 { var badGroup = detail .GroupBy(w => new { w.FromLocalId, w.TrayId, w.ZoneId, w.MaterialId, w.BatchNo, w.BarCode }) .Select(s => new { s.Key.FromLocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, BadNum = s.Sum(o => o.BadNum) }) .ToList(); var localIds = badGroup.Select(s => s.FromLocalId).ToList(); var trayIds = badGroup.Select(s => s.TrayId).ToList(); var zoneIds = badGroup.Select(s => s.ZoneId).ToList(); var materialIds = badGroup.Select(s => s.MaterialId).ToList(); var batchNos = badGroup.Select(s => s.BatchNo).ToList(); var barCodes = badGroup.Select(s => s.BarCode).ToList(); //修改库存 { var lmQuery = Db.GetIQueryable <IT_LocalMaterial>(); if (localIds.Count > 0) { lmQuery = lmQuery.Where(w => localIds.Contains(w.LocalId)); } if (trayIds.Count > 0) { lmQuery = lmQuery.Where(w => trayIds.Contains(w.TrayId)); } if (zoneIds.Count > 0) { lmQuery = lmQuery.Where(w => zoneIds.Contains(w.ZoneId)); } if (materialIds.Count > 0) { lmQuery = lmQuery.Where(w => materialIds.Contains(w.MaterialId)); } if (batchNos.Count > 0) { lmQuery = lmQuery.Where(w => batchNos.Contains(w.BatchNo)); } if (barCodes.Count > 0) { lmQuery = lmQuery.Where(w => barCodes.Contains(w.BarCode)); } var listLM = await lmQuery.ToListAsync(); var listDel = new List <IT_LocalMaterial>(); var listUpdate = new List <IT_LocalMaterial>(); var listRB = new List <IT_RecordBook>(); foreach (var bad in badGroup) { var lm = listLM.Where(w => w.StorId == audit.StorId && w.LocalId == bad.FromLocalId && w.TrayId == bad.TrayId && w.ZoneId == bad.ZoneId && w.MaterialId == bad.MaterialId && w.BatchNo == bad.BatchNo && w.BarCode == bad.BarCode).SingleOrDefault(); if (lm == null || lm.Num < bad.BadNum) { throw new Exception($"没有找到对应物料的库存数据/库存数量不够({bad.BadNum})"); } if (lm.Num == bad.BadNum) { listDel.Add(lm); } else if (lm.Num > bad.BadNum) { lm.Num -= bad.BadNum; listUpdate.Add(lm); } // 增加(报损-出)BadOut台帐 var rbOut = new IT_RecordBook() { Id = IdHelper.GetId(), RefCode = data.Code, Type = "BadOut", FromStorId = audit.StorId, FromLocalId = bad.FromLocalId, ToStorId = audit.StorId, ToLocalId = defaultBadLocation.Id, MaterialId = bad.MaterialId, MeasureId = dicMUnit[bad.MaterialId], BarCode = bad.BarCode, BatchNo = bad.BatchNo, Num = bad.BadNum, CreateTime = audit.AuditTime, CreatorId = audit.AuditUserId, Deleted = false }; listRB.Add(rbOut); // 增加(报损-入)BadOut台帐 var rbIn = new IT_RecordBook() { Id = IdHelper.GetId(), RefCode = data.Code, Type = "BadIn", FromStorId = audit.StorId, FromLocalId = bad.FromLocalId, ToStorId = audit.StorId, ToLocalId = defaultBadLocation.Id, MaterialId = bad.MaterialId, MeasureId = dicMUnit[bad.MaterialId], BarCode = bad.BarCode, BatchNo = bad.BatchNo, Num = bad.BadNum, CreateTime = audit.AuditTime, CreatorId = audit.AuditUserId, Deleted = false }; listRB.Add(rbIn); } if (listDel.Count > 0) { await lmSvc.DeleteDataAsync(listDel); } if (listUpdate.Count > 0) { await lmSvc.UpdateDataAsync(listUpdate); } // 保存数据台帐 var rbSvc = _ServiceProvider.GetRequiredService <IIT_RecordBookBusiness>(); await rbSvc.AddDataAsync(listRB); } // 修改库存明细 { var ldQuery = Db.GetIQueryable <IT_LocalDetail>(); if (localIds.Count > 0) { ldQuery = ldQuery.Where(w => localIds.Contains(w.LocalId)); } if (trayIds.Count > 0) { ldQuery = ldQuery.Where(w => trayIds.Contains(w.TrayId)); } if (zoneIds.Count > 0) { ldQuery = ldQuery.Where(w => zoneIds.Contains(w.ZoneId)); } if (materialIds.Count > 0) { ldQuery = ldQuery.Where(w => materialIds.Contains(w.MaterialId)); } if (batchNos.Count > 0) { ldQuery = ldQuery.Where(w => batchNos.Contains(w.BatchNo)); } if (barCodes.Count > 0) { ldQuery = ldQuery.Where(w => barCodes.Contains(w.BarCode)); } var listLD = await ldQuery.ToListAsync(); var listDel = new List <IT_LocalDetail>(); var listUpdate = new List <IT_LocalDetail>(); foreach (var bad in badGroup) { var badNum = bad.BadNum; var lds = listLD.Where(w => w.StorId == audit.StorId && w.LocalId == bad.FromLocalId && w.TrayId == bad.TrayId && w.ZoneId == bad.ZoneId && w.MaterialId == bad.MaterialId && w.BatchNo == bad.BatchNo && w.BarCode == bad.BarCode).OrderBy(o => o.InTime).ToList(); if (lds.Sum(s => s.Num) < badNum) { throw new Exception($"库存(明细)数量不够({bad.BadNum})"); } foreach (var item in lds) { if (item.Num <= badNum) { listDel.Add(item); badNum -= item.Num.GetValueOrDefault(0); } else { item.Num -= badNum; listUpdate.Add(item); badNum = 0; } if (badNum == 0) { break; } } } if (listDel.Count > 0) { await ldSvc.DeleteDataAsync(listDel); } if (listUpdate.Count > 0) { await ldSvc.UpdateDataAsync(listUpdate); } } } //默认报损库位入库 { var badGroup = detail .GroupBy(w => new { w.MaterialId, w.BatchNo, w.BarCode }) .Select(s => new { s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, BadNum = s.Sum(o => o.BadNum) }) .ToList(); var materialIds = badGroup.Select(s => s.MaterialId).ToList(); var batchNos = badGroup.Select(s => s.BatchNo).ToList(); var barCodes = badGroup.Select(s => s.BarCode).ToList(); // 修改库存 { var lmQuery = Db.GetIQueryable <IT_LocalMaterial>().Where(w => w.StorId == audit.StorId && w.LocalId == defaultBadLocation.Id); if (materialIds.Count > 0) { lmQuery = lmQuery.Where(w => materialIds.Contains(w.MaterialId)); } if (batchNos.Count > 0) { lmQuery = lmQuery.Where(w => batchNos.Contains(w.BatchNo)); } if (barCodes.Count > 0) { lmQuery = lmQuery.Where(w => barCodes.Contains(w.BarCode)); } var listLM = await lmQuery.ToListAsync(); var listAdd = new List <IT_LocalMaterial>(); var listUpdate = new List <IT_LocalMaterial>(); foreach (var bad in badGroup) { var lm = listLM.Where(w => w.StorId == audit.StorId && w.LocalId == defaultBadLocation.Id && w.MaterialId == bad.MaterialId && w.BatchNo == bad.BatchNo && w.BarCode == bad.BarCode).SingleOrDefault(); if (lm != null) { lm.Num += bad.BadNum; listUpdate.Add(lm); } else { lm = new IT_LocalMaterial() { Id = IdHelper.GetId(), StorId = audit.StorId, LocalId = defaultBadLocation.Id, MaterialId = bad.MaterialId, MeasureId = dicMUnit[bad.MaterialId], BatchNo = bad.BatchNo, BarCode = bad.BarCode, Num = bad.BadNum }; listAdd.Add(lm); } } if (listAdd.Count > 0) { await lmSvc.AddDataAsync(listAdd); } if (listUpdate.Count > 0) { await lmSvc.UpdateDataAsync(listUpdate); } } // 增加库存明细 { var listAdd = new List <IT_LocalDetail>(); foreach (var bad in detail) { var ld = new IT_LocalDetail(); ld.Id = IdHelper.GetId(); ld.StorId = audit.StorId; ld.LocalId = defaultBadLocation.Id; ld.MaterialId = bad.MaterialId; ld.MeasureId = dicMUnit[bad.MaterialId]; ld.BatchNo = bad.BatchNo; ld.BarCode = bad.BarCode; ld.InTime = audit.AuditTime; ld.Amount = bad.Amount; ld.CreateTime = now; ld.CreatorId = audit.AuditUserId; ld.Price = bad.Price; ld.Num = bad.BadNum; ld.Deleted = false; listAdd.Add(ld); } if (listAdd.Count > 0) { var localdetailSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>(); await localdetailSvc.AddDataAsync(listAdd); } } } // 修改主数据状态 { data.Status = 1; data.AuditeTime = audit.AuditTime; data.AuditUserId = audit.AuditUserId; await UpdateAsync(data); } }
public async Task <AjaxResult> Import(IFormFile file)// file { string ReturnValue = string.Empty; //定义一个bool类型的变量用来做验证 bool flag = true; try { string fileExt = Path.GetExtension(file.FileName).ToLower(); //定义一个集合一会儿将数据存储进来,全部一次丢到数据库中保存 var Data = new List <PB_Location>(); MemoryStream ms = new MemoryStream(); file.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); IWorkbook book; if (fileExt == ".xlsx") { book = new XSSFWorkbook(ms); } else if (fileExt == ".xls") { book = new HSSFWorkbook(ms); } else { book = null; } ISheet sheet = book.GetSheetAt(0); int CountRow = sheet.LastRowNum + 1;//获取总行数 if (CountRow - 1 == 0) { return(Error("Excel列表数据项为空!")); } #region 循环验证 for (int i = 1; i < CountRow; i++) { //获取第i行的数据 var row = sheet.GetRow(i); if (row != null) { //循环的验证单元格中的数据 for (int j = 0; j < 6; j++) { if ((j == 4 || j == 5) || (row.GetCell(j) == null || row.GetCell(j).ToString().Trim().Length == 0)) { //return Error(ReturnValue += $"注意第{i + 1}行,第{j + 1}列数据为空。"); } else if (row.GetCell(j) == null || row.GetCell(j).ToString().Trim().Length == 0) { flag = false; return(Error(ReturnValue += $"第{i + 1}行,第{j + 1}列数据不能为空。")); } } } } #endregion if (flag) { for (int i = 1; i < CountRow; i++)// { //实例化实体对象 PB_Location commodity = new PB_Location(); var row = sheet.GetRow(i); if (row.GetCell(0) != null && row.GetCell(0).ToString().Trim().Length > 0) { commodity.Id = IdHelper.GetId(); commodity.CreatorId = _Op.UserId; //"Admin";//_Op.UserId; commodity.IsForbid = true; //导入默认启用 commodity.IsDefault = false; //导入无默认 commodity.Code = row.GetCell(0).ToString(); } if (row.GetCell(1) != null && row.GetCell(1).ToString().Trim().Length > 0) { commodity.Name = row.GetCell(1).ToString(); } if (row.GetCell(2) != null && row.GetCell(2).ToString().Trim().Length > 0) { commodity.StorId = row.GetCell(2).ToString(); } if (row.GetCell(3) != null && row.GetCell(3).ToString().Trim().Length > 0) { commodity.AreaId = row.GetCell(3).ToString(); } if (row.GetCell(4) != null && row.GetCell(4).ToString().Trim().Length > 0) { commodity.LanewayId = row.GetCell(4).ToString().ToString(); } if (row.GetCell(5) != null && row.GetCell(5).ToString().Trim().Length > 0) { commodity.RackId = row.GetCell(5).ToString(); } if (row.GetCell(6) != null && row.GetCell(6).ToString().Trim().Length > 0) { commodity.OverVol = Convert.ToDouble(row.GetCell(6).ToString()); } Data.Add(commodity); } var listStorCodes = Data.Select(s => s.StorId).Select(s => s.Trim()).Distinct().ToList(); var dicStor = _pB_LocationBus.GetQueryable <PB_Storage>().Where(w => listStorCodes.Contains(w.Code)).ToDictionary(k => k.Code, v => v.Id); var listAreaCodes = Data.Select(s => s.AreaId).Select(s => s.Trim()).Distinct().ToList(); var dicArea = _pB_LocationBus.GetQueryable <PB_StorArea>().Where(w => listAreaCodes.Contains(w.Code)).ToDictionary(k => k.Code, v => v.Id); var listLanewayCodes = Data.Select(s => s.LanewayId).Select(s => s.Trim()).Distinct().ToList(); var dicLaneway = _pB_LocationBus.GetQueryable <PB_Laneway>().Where(w => listLanewayCodes.Contains(w.Code)).ToDictionary(k => k.Code, v => v.Id); var listRackCodes = Data.Select(s => s.RackId).Select(s => s.Trim()).Distinct().ToList(); var dicRack = _pB_LocationBus.GetQueryable <PB_Rack>().Where(w => listRackCodes.Contains(w.Code)).ToDictionary(k => k.Code, v => v.Id); foreach (var item in Data) { if (dicStor.ContainsKey(item.StorId.Trim())) { item.StorId = dicStor[item.StorId.Trim()]; } else { throw new Exception("仓库编号不存在!"); } if (dicArea.ContainsKey(item.AreaId.Trim())) { item.AreaId = dicArea[item.AreaId.Trim()]; } else { throw new Exception("货区编号不存在!"); } if (item.LanewayId == null) { item.LanewayId = null; } else if (dicLaneway.ContainsKey(item.LanewayId.Trim())) { item.LanewayId = dicLaneway[item.LanewayId.Trim()]; } if (item.RackId == null) { item.RackId = null; } else if (dicRack.ContainsKey(item.RackId.Trim())) { item.RackId = dicRack[item.RackId.Trim()]; } } if (Data.Count > 0) { int j = 1000; for (int i = 0; i < Data.Count; i += 1000) { var cList = new List <PB_Location>(); cList = Data.Take(j).Skip(i).ToList(); j += 1000; await _pB_LocationBus.AddDataExlAsync(cList); } ReturnValue = $"数据导入成功,共导入{CountRow - 1}条数据。"; } } if (!flag) { return(Error(ReturnValue = "数据存在问题!" + ReturnValue)); } } catch (Exception) { return(Error("数据异常!")); } return(Success(ReturnValue)); }