Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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));
        }