Esempio n. 1
0
        public void Setup()
        {
            // Mock
            _configuration = new Mock <IConfiguration>(MockBehavior.Loose);
            _auditRepo     = new Mock <IAuditRepo>(MockBehavior.Loose);
            _logger        = new Mock <ILogger <AuditController> >(MockBehavior.Loose);

            // Mapper
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new AutoMapperConfig());
            });

            _mapper = new Mapper(config);

            // Config
            Filler <Audit>    pFiller    = new Filler <Audit>();
            Filler <AuditDTO> pFillerDTO = new Filler <AuditDTO>();

            audit    = pFiller.Create();
            auditDTO = pFillerDTO.Create();

            // Service under test
            _auditController = new AuditController(_configuration.Object, _mapper, _auditRepo.Object, _logger.Object);
        }
Esempio n. 2
0
        public async Task Reject(AuditDTO audit)
        {
            var data = await this.GetTheDataAsync(audit.Id);

            // 修改主数据状态
            {
                data.Status      = 2;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }

            // 解锁货位 在自动入库的时候,货位可能被入库锁锁定了
            {
                var localIds  = data.InStorDetails.Select(s => s.LocalId).ToList();
                var listLocal = await Db.GetIQueryable <PB_Location>().Where(w => localIds.Contains(w.Id) && w.LockType == 1).ToListAsync();

                foreach (var item in listLocal)
                {
                    item.LockType = 0;
                }
                var localSvc = _ServiceProvider.GetRequiredService <IPB_LocationBusiness>();
                await localSvc.UpdateDataAsync(listLocal);
            }

            // 更新收货单数据
            if (!data.RecId.IsNullOrEmpty())
            {
                var recSvc = _ServiceProvider.GetRequiredService <ITD_ReceivingBusiness>();
                await recSvc.UpdateByInStorage(data.RecId);
            }
        }
Esempio n. 3
0
        public async Task Reject(AuditDTO audit)
        {
            var data = await this.GetTheDataAsync(audit.Id);

            // 修改出库状态
            {
                data.Status      = 2;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }

            // 解锁货位 在自动出库的时候,货位可能被出库锁锁定了
            {
                var localIds  = data.OutStorDetails.Select(s => s.LocalId).ToList();
                var listLocal = await Db.GetIQueryable <PB_Location>().Where(w => localIds.Contains(w.Id) && w.LockType == 2).ToListAsync();

                foreach (var item in listLocal)
                {
                    item.LockType = 0;
                }
                var localSvc = _ServiceProvider.GetRequiredService <IPB_LocationBusiness>();
                await localSvc.UpdateDataAsync(listLocal);
            }
        }
Esempio n. 4
0
        public async Task Approval(AuditDTO audit)
        {
            var data = await this.GetEntityAsync(audit.Id);

            if (audit.AuditType == AuditType.Confirm)
            {
                data.Status        = 1;
                data.ConfirmTime   = audit.AuditTime;
                data.ConfirmUserId = audit.AuditUserId;
            }
            if (audit.AuditType == AuditType.Cancel)
            {
                data.Status        = 2;
                data.ConfirmTime   = audit.AuditTime;
                data.ConfirmUserId = audit.AuditUserId;
            }
            if (audit.AuditType == AuditType.Approve)
            {
                data.Status      = 3;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
            }
            if (audit.AuditType == AuditType.Reject)
            {
                data.Status      = 4;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
            }
            await UpdateAsync(data);
        }
Esempio n. 5
0
        public ActionResult Create(AuditDTO audit)
        {
            MethodBase method = MethodBase.GetCurrentMethod();

            try
            {
                Audit newAudit = Mapper.Map <Audit>(audit);
                newAudit.IsValid = true;
                newAudit.Id      = 0;
                var response = AuditRepo.Create(newAudit);
                if (response > 0)
                {
                    CreateLog(Enums.Success, GetMethodCode(method), LogLevel.Information);
                    return(Ok(response));
                }
                else
                {
                    CreateLog(Enums.BadRequest, GetMethodCode(method), LogLevel.Warning);
                    return(BadRequest(response));
                }
            }
            catch (Exception ex)
            {
                return(HandleError(ex.Message, GetMethodCode(method)));
            }
        }
Esempio n. 6
0
 public async Task Approval(AuditDTO audit)
 {
     audit.StorId      = _Op.Property.DefaultStorageId;
     audit.AuditUserId = _Op.UserId;
     audit.AuditTime   = DateTime.Now;
     await _tD_SendBus.Approval(audit);
 }
Esempio n. 7
0
        public HttpResponseMessage AddAudit(int id, AuditDTO data)
        {
            var ordData = new OrderData(id);

            ordData.AddAuditMessage(data.Message, "Conference", UserInfo.DisplayName, "False");
            ordData.Save();
            return(Request.CreateResponse(HttpStatusCode.OK, NBrightRepository.Instance.GetOrders(PortalSettings.PortalId).FirstOrDefault(o => o.ItemId == id)));
        }
Esempio n. 8
0
        public async Task ComplatedInByTray(string id)
        {
            var audit = new AuditDTO();

            audit.Id          = id;
            audit.StorId      = _Op.Property.DefaultStorageId;
            audit.AuditUserId = _Op.UserId;
            audit.AuditTime   = DateTime.Now;
            audit.AuditType   = AuditType.Approve;
            await _tD_InStorageBus.Approve(audit);
        }
Esempio n. 9
0
        public async Task <ReturnVal <bool> > ListToRegion(AuditDTO dto)
        {
            var sc = await this._user.Get(AppUserFlagData.OrgRegion);

            var rev = await this._courseSvc.List2RegionAsync(new CourseAuditCommand(dto.CourseID, this._user.UserId, this._user.UserName, sc.Code, sc.Name, dto.Desc));

            await this._partnerSvc.CourseToList(rev.Creator.Code, dto.CourseID, sc.Name, sc.Code, 0);

            await this._puserSvc.ListedCourse(rev.Creator.Code, dto.CourseID);

            return(this.RetOk(true));
        }
Esempio n. 10
0
        public async Task Reject(AuditDTO audit)
        {
            var data = await this.GetEntityAsync(audit.Id);

            // 修改主数据状态
            {
                data.Status      = 2;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }
        }
Esempio n. 11
0
        public async Task <ReturnVal <bool> > ListToRegionRemove(AuditDTO dto)
        {
            var sc = await this._user.GetRegion();

            //_ = await this._user.Get(AppUserFlagData.OrgRegion);
            var coures = await this._courseSvc.UnList2RegionAsync(new CourseAuditCommand(dto.CourseID, this._user.UserId, this._user.UserName, sc.Code, sc.Name, dto.Desc));

            await this._partnerSvc.CourselistRemove(dto.CourseID, sc.Code, PartnerType.Region);

            await this._puserSvc.ListCourseRemove(coures.Creator.Code, dto.CourseID);

            return(this.RetOk(true));
        }
Esempio n. 12
0
 public async Task Audit(AuditDTO audit)
 {
     audit.StorId      = _Op.Property.DefaultStorageId;
     audit.AuditUserId = _Op.UserId;
     audit.AuditTime   = DateTime.Now;
     if (audit.AuditType == AuditType.Approve)
     {
         await _tD_OutStorageBus.Approve(audit);
     }
     else
     {
         await _tD_OutStorageBus.Reject(audit);
     }
 }
Esempio n. 13
0
        public async Task <ReturnVal <bool> > RegionReject(AuditDTO dto)
        {
            var sc = await this._user.Get(AppUserFlagData.OrgRegion);

            await this._courseSvc.RegionRejectAsync(new CourseAuditCommand(dto.CourseID
                                                                           , this._user.UserId
                                                                           , this._user.UserName
                                                                           , sc.Code
                                                                           , sc.Name
                                                                           , dto.Desc
                                                                           ));

            return(RetOk(true));
        }
Esempio n. 14
0
 public ActionResult <ObjectResult> Audit([FromBody] AuditDTO auditDTO)
 {
     try
     {
         OrderService   orderService   = new OrderService(Startup.BeePlaceDataBaseConnectionString);
         OrderItemAudit orderItemAudit = new OrderItemAudit();
         orderItemAudit.IdOrderItem = auditDTO.IdOrderItem;
         orderItemAudit.Name        = auditDTO.Name;
         orderItemAudit.Type        = auditDTO.Type;
         orderItemAudit.FilePath    = auditDTO.FilePath;
         orderItemAudit.DateCreated = DateTime.Now;
         orderItemAudit.DateUpdated = DateTime.Now;
         orderService.CreateAudit(orderItemAudit);
         return(StatusCode((int)HttpStatusCode.OK));
     }
     catch (Exception e)
     {
         return(StatusCode((int)HttpStatusCode.InternalServerError));
     }
 }
Esempio n. 15
0
        public List <AuditDTO> GetAuditBS(string itemsPerPage, string pageno)
        {
            List <AuditDTO> auditDTOList = new List <AuditDTO>();
            List <AuditDO>  auditDOList  = new List <AuditDO>();
            AdminRepository adminDAobj   = new AdminRepository();

            auditDOList = adminDAobj.GetAuditDA(itemsPerPage, pageno);

            foreach (AuditDO auditDO in auditDOList)
            {
                AuditDTO auditDTO = new AuditDTO();
                auditDTO.RowNum     = auditDO.AuditId.ToString();
                auditDTO.TotalCount = auditDO.TotalCount.ToString();
                auditDTO.AuditId    = auditDO.AuditId;
                auditDTO.CreatedON  = auditDO.CreatedON;
                auditDTO.RequestId  = auditDO.RequestId;
                auditDTO.UserName   = auditDO.UserName;

                auditDTOList.Add(auditDTO);
            }

            return(auditDTOList);
        }
Esempio n. 16
0
        public ActionResult Delete(AuditDTO audit)
        {
            MethodBase method = MethodBase.GetCurrentMethod();

            try
            {
                if (audit.Id > 0)
                {
                    Audit delAudit = Mapper.Map <Audit>(audit);
                    AuditRepo.Delete(delAudit);
                    CreateLog(Enums.Success, GetMethodCode(method), LogLevel.Information);
                    return(Ok(true));
                }
                else
                {
                    CreateLog(Enums.BadRequest, GetMethodCode(method), LogLevel.Information);
                    return(BadRequest());
                }
            }
            catch (Exception ex)
            {
                return(HandleError(ex.Message, GetMethodCode(method)));
            }
        }
Esempio n. 17
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);
            }
        }
Esempio n. 18
0
        public IHttpActionResult PostUserActions(AuditDTO model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (audittrail.validAppID(model.application_id))
                    {
                        if (audittrail.GetAppType(model.application_id) == "web")
                        {
                            audit_trail audit = new audit_trail()
                            {
                                id             = Guid.NewGuid(),
                                application_id = model.application_id,
                                user_id        = model.user_id,
                                action         = model.action,
                                date_time      = DateTime.Now,
                                device_name    = model.device_name,
                                os_version     = model.os_version,
                                location       = model.location,
                                ip_address     = model.ip_address
                            };

                            db.audit_trail.Add(audit);
                            db.SaveChanges();

                            if (db.SaveChanges() >= 0)
                            {
                                return(Ok());
                            }
                            else
                            {
                                return(Conflict());
                            }
                        }
                        else if (audittrail.GetAppType(model.application_id) == "ios")
                        {
                            audit_trail audit = new audit_trail()
                            {
                                id             = Guid.NewGuid(),
                                application_id = model.application_id,
                                user_id        = model.user_id,
                                action         = model.action,
                                date_time      = DateTime.Now,
                                device_name    = model.device_name,
                                os_version     = model.os_version,
                                location       = model.location,
                                ip_address     = null
                            };

                            db.audit_trail.Add(audit);
                            db.SaveChanges();

                            if (db.SaveChanges() >= 0)
                            {
                                return(Ok());
                            }
                            else
                            {
                                return(Conflict());
                            }
                        }
                        else
                        {
                            return(NotFound());
                        }
                    }
                    else
                    {
                        return(NotFound());
                    }
                }
                return(BadRequest(ModelState));
            }
            catch (Exception e)
            {
                return(InternalServerError(e));
            }
        }
Esempio n. 19
0
        public async Task Approve(AuditDTO audit)
        {
            var now  = DateTime.Now;
            var data = await this.GetTheDataAsync(audit.Id);

            var detail   = data.InStorDetails;
            var dicMUnit = detail.Select(s => new { s.MaterialId, s.Material.MeasureId }).GroupBy(g => new { g.MaterialId, g.MeasureId }).ToDictionary(k => k.Key.MaterialId, v => v.Key.MeasureId);

            // 增加库存明细
            {
                var ldGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode, g.Price })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, s.Key.Price, TotalAmt = s.Sum(o => o.TotalAmt), Num = s.Sum(o => o.Num) })
                              .ToList();
                var listLd = new List <IT_LocalDetail>();
                foreach (var item in ldGrout)
                {
                    var ld = new IT_LocalDetail();
                    ld.Id         = IdHelper.GetId();
                    ld.StorId     = audit.StorId;
                    ld.InStorId   = audit.Id;
                    ld.LocalId    = item.LocalId;
                    ld.TrayId     = item.TrayId;
                    ld.ZoneId     = item.ZoneId;
                    ld.MaterialId = item.MaterialId;
                    ld.MeasureId  = dicMUnit[item.MaterialId];
                    ld.BatchNo    = item.BatchNo;
                    ld.BarCode    = item.BarCode;
                    ld.InTime     = audit.AuditTime;
                    ld.Amount     = item.TotalAmt;
                    ld.CreateTime = now;
                    ld.CreatorId  = audit.AuditUserId;
                    ld.Price      = item.Price;
                    ld.Num        = item.Num;
                    ld.Deleted    = false;
                    listLd.Add(ld);
                }
                if (listLd.Count > 0)
                {
                    var localdetailSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>();
                    await localdetailSvc.AddDataAsync(listLd);
                }
            }

            // 增加库存
            {
                var lmGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, Num = s.Sum(o => o.Num) })
                              .ToList();
                //查询当前库存记录
                var localIds = lmGrout.Select(s => s.LocalId).ToList();
                var trayIds  = lmGrout.Select(s => s.TrayId).ToList();
                var zoneIds  = lmGrout.Select(s => s.ZoneId).ToList();
                var materIds = lmGrout.Select(s => s.MaterialId).ToList();
                var batchNos = lmGrout.Select(s => s.BatchNo).ToList();
                var barCodes = lmGrout.Select(s => s.BarCode).ToList();

                var lmQuery = Db.GetIQueryable <IT_LocalMaterial>();
                lmQuery = lmQuery.Where(w => w.StorId == audit.StorId);
                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 (materIds.Count > 0)
                {
                    lmQuery = lmQuery.Where(w => materIds.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 lmDbData = await lmQuery.ToListAsync();

                //处理库存
                var localMaterialSvc = _ServiceProvider.GetRequiredService <IIT_LocalMaterialBusiness>();
                var listLmAdd        = new List <IT_LocalMaterial>();
                var listLmUpdate     = new List <IT_LocalMaterial>();
                foreach (var item in lmGrout)
                {
                    //如果存再当前相同的物料,就在库存上直接相加
                    var lmItem = lmDbData.Where(w => w.StorId == item.StorId && w.LocalId == item.LocalId && w.TrayId == item.TrayId && w.ZoneId == item.ZoneId && w.MaterialId == item.MaterialId && w.BatchNo == item.BatchNo && w.BarCode == item.BarCode).SingleOrDefault();
                    if (lmItem != null)
                    {
                        lmItem.Num += item.Num;
                        listLmUpdate.Add(lmItem);
                    }
                    else
                    {
                        //如果当前库存不存再相同的物料,就增加此物料的记录
                        var lm = new IT_LocalMaterial();
                        lm.Id         = IdHelper.GetId();
                        lm.StorId     = item.StorId;
                        lm.LocalId    = item.LocalId;
                        lm.TrayId     = item.TrayId;
                        lm.ZoneId     = item.ZoneId;
                        lm.MaterialId = item.MaterialId;
                        lm.MeasureId  = dicMUnit[item.MaterialId];
                        lm.BatchNo    = item.BatchNo;
                        lm.BarCode    = item.BarCode;
                        lm.Num        = item.Num;
                        listLmAdd.Add(lm);
                    }
                }
                if (listLmAdd.Count > 0)
                {
                    await localMaterialSvc.AddDataAsync(listLmAdd);
                }
                if (listLmUpdate.Count > 0)
                {
                    await localMaterialSvc.UpdateDataAsync(listLmUpdate);
                }
            }

            // 处理台帐
            {
                var lmGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, Num = s.Sum(o => o.Num) })
                              .ToList();

                var listRB = new List <IT_RecordBook>();
                foreach (var item in lmGrout)
                {
                    var rb = new IT_RecordBook();
                    rb.Id         = IdHelper.GetId();
                    rb.RefCode    = data.Code;
                    rb.Type       = "In";
                    rb.ToStorId   = item.StorId;
                    rb.ToLocalId  = item.LocalId;
                    rb.MaterialId = item.MaterialId;
                    rb.MeasureId  = dicMUnit[item.MaterialId];
                    rb.BatchNo    = item.BatchNo;
                    rb.BarCode    = item.BarCode;
                    rb.Num        = item.Num;
                    rb.CreateTime = now;
                    rb.CreatorId  = audit.AuditUserId;
                    rb.Deleted    = false;
                    listRB.Add(rb);
                }
                if (listRB.Count > 0)
                {
                    var bookSvc = _ServiceProvider.GetRequiredService <IIT_RecordBookBusiness>();
                    await bookSvc.AddDataAsync(listRB);
                }
            }

            // 处理托盘位置数据
            {
                var dicTray = new Dictionary <string, string>();
                foreach (var item in detail)
                {
                    if (item.TrayId != null && !dicTray.ContainsKey(item.TrayId))
                    {
                        dicTray.Add(item.TrayId, item.LocalId);
                    }
                }
                var trayIds = dicTray.Keys.ToList();
                if (trayIds.Count > 0)
                {
                    var listTray = await Db.GetIQueryable <PB_Tray>().Where(w => trayIds.Contains(w.Id)).ToListAsync();

                    foreach (var tray in listTray)
                    {
                        tray.LocalId = dicTray[tray.Id];
                    }
                    var traySvc = _ServiceProvider.GetRequiredService <IPB_TrayBusiness>();
                    await traySvc.UpdateDataAsync(listTray);
                }
            }

            // 解锁货位 在自动入库的时候,货位可能被入库锁锁定了
            {
                var localIds  = detail.Select(s => s.LocalId).ToList();
                var listLocal = await Db.GetIQueryable <PB_Location>().Where(w => localIds.Contains(w.Id) && w.LockType == 1).ToListAsync();

                //await Db.Update_SqlAsync<PB_Location>(w => localIds.Contains(w.Id) && w.LockType == 1, ("LockType", UpdateType.Equal, 0));
                foreach (var item in listLocal)
                {
                    item.LockType = 0;
                }
                var localSvc = _ServiceProvider.GetRequiredService <IPB_LocationBusiness>();
                await localSvc.UpdateDataAsync(listLocal);
            }

            // 修改主数据状态
            {
                data.Status      = 1;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }

            // 更新收货单数据
            if (!data.RecId.IsNullOrEmpty())
            {
                var recSvc = _ServiceProvider.GetRequiredService <ITD_ReceivingBusiness>();
                await recSvc.UpdateByInStorage(data.RecId);
            }
        }
Esempio n. 20
0
        public async Task Approve(AuditDTO audit)
        {
            var now  = DateTime.Now;
            var data = await this.GetTheDataAsync(audit.Id);

            var detail   = data.OutStorDetails;
            var dicMUnit = detail.Select(s => new { s.MaterialId, s.Material.MeasureId }).GroupBy(g => new { g.MaterialId, g.MeasureId }).ToDictionary(k => k.Key.MaterialId, v => v.Key.MeasureId);

            var lmSvc = _ServiceProvider.GetRequiredService <IIT_LocalMaterialBusiness>();
            var ldSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>();

            // 减库存明细
            {
                //await UpdateAsync(data);
                var ldGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode, g.Price })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, s.Key.Price, TotalAmt = s.Sum(o => o.TotalAmt), Num = s.Sum(o => o.OutNum) })
                              .ToList();
                //查询当前库存明细记录
                var localIds = ldGrout.Select(s => s.LocalId).ToList();
                var trayIds  = ldGrout.Select(s => s.TrayId).ToList();
                var zoneIds  = ldGrout.Select(s => s.ZoneId).ToList();
                var materIds = ldGrout.Select(s => s.MaterialId).ToList();
                var batchNos = ldGrout.Select(s => s.BatchNo).ToList();
                var barCodes = ldGrout.Select(s => s.BarCode).ToList();

                var listLd = Db.GetIQueryable <IT_LocalDetail>();
                listLd = listLd.Where(w => w.StorId == audit.StorId);
                if (localIds.Count > 0)
                {
                    listLd = listLd.Where(w => localIds.Contains(w.LocalId));
                }
                if (trayIds.Count > 0)
                {
                    listLd = listLd.Where(w => trayIds.Contains(w.TrayId));
                }
                if (zoneIds.Count > 0)
                {
                    listLd = listLd.Where(w => zoneIds.Contains(w.ZoneId));
                }
                if (materIds.Count > 0)
                {
                    listLd = listLd.Where(w => materIds.Contains(w.MaterialId));
                }
                if (batchNos.Count > 0)
                {
                    listLd = listLd.Where(w => batchNos.Contains(w.BatchNo));
                }
                if (barCodes.Count > 0)
                {
                    listLd = listLd.Where(w => barCodes.Contains(w.BarCode));
                }
                var lmDbData = await listLd.ToListAsync();

                //处理库存明细
                var localMaterialSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>();
                var listLmUpdate     = new List <IT_LocalDetail>();
                var listDel          = new List <IT_LocalDetail>();
                foreach (var lm in ldGrout)
                {
                    var lmNum = lm.Num;
                    var lds   = lmDbData.Where(w => w.StorId == audit.StorId && w.LocalId == lm.LocalId && w.TrayId == lm.TrayId && w.ZoneId == lm.ZoneId && w.MaterialId == lm.MaterialId && w.BatchNo == lm.BatchNo && w.BarCode == lm.BarCode).OrderBy(o => o.InTime).ToList();
                    if (lds.Sum(s => s.Num) < lmNum)
                    {
                        throw new Exception($"库存(明细)数量不够({lm.Num})");
                    }
                    foreach (var item in lds)
                    {
                        if (item.Num <= lmNum)
                        {
                            listDel.Add(item);
                            lmNum -= item.Num.GetValueOrDefault(0);
                        }
                        else
                        {
                            item.Num -= lmNum;
                            listLmUpdate.Add(item);
                            lmNum = 0;
                        }
                        if (lmNum == 0)
                        {
                            break;
                        }
                    }
                }
                if (listDel.Count > 0)
                {
                    await ldSvc.DeleteDataAsync(listDel);
                }
                if (listLmUpdate.Count > 0)
                {
                    await ldSvc.UpdateDataAsync(listLmUpdate);
                }
            }

            // 减除库存
            {
                var lmGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, Num = s.Sum(o => o.OutNum) })
                              .ToList();
                //查询当前库存记录
                var localIds = lmGrout.Select(s => s.LocalId).ToList();
                var trayIds  = lmGrout.Select(s => s.TrayId).ToList();
                var zoneIds  = lmGrout.Select(s => s.ZoneId).ToList();
                var materIds = lmGrout.Select(s => s.MaterialId).ToList();
                var batchNos = lmGrout.Select(s => s.BatchNo).ToList();
                var barCodes = lmGrout.Select(s => s.BarCode).ToList();

                var lmQuery = Db.GetIQueryable <IT_LocalMaterial>();
                lmQuery = lmQuery.Where(w => w.StorId == audit.StorId);
                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 (materIds.Count > 0)
                {
                    lmQuery = lmQuery.Where(w => materIds.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 lmDbData = await lmQuery.ToListAsync();

                //处理库存
                var listLmUpdate = new List <IT_LocalMaterial>();
                var listDel      = new List <IT_LocalMaterial>();
                foreach (var lm in lmGrout)
                {
                    var lds = lmDbData.Where(w => w.StorId == audit.StorId && w.LocalId == lm.LocalId && w.TrayId == lm.TrayId && w.ZoneId == lm.ZoneId && w.MaterialId == lm.MaterialId && w.BatchNo == lm.BatchNo && w.BarCode == lm.BarCode).SingleOrDefault();
                    if (lds == null || lds.Num < lm.Num)
                    {
                        throw new Exception($"没有找到对应物料的库存数据/库存数量不够({lm.Num})");
                    }
                    if (lds.Num == lm.Num)
                    {
                        listDel.Add(lds);
                    }
                    else if (lds.Num > lm.Num)
                    {
                        lds.Num -= lm.Num;
                        listLmUpdate.Add(lds);
                    }
                }
                if (listDel.Count > 0)
                {
                    await lmSvc.DeleteDataAsync(listDel);
                }
                if (listLmUpdate.Count > 0)
                {
                    await lmSvc.UpdateDataAsync(listLmUpdate);
                }
            }

            // 添加台帐
            {
                var lmGrout = detail
                              .GroupBy(g => new { g.StorId, g.LocalId, g.TrayId, g.ZoneId, g.MaterialId, g.BatchNo, g.BarCode })
                              .Select(s => new { s.Key.StorId, s.Key.LocalId, s.Key.TrayId, s.Key.ZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, Num = s.Sum(o => o.OutNum) })
                              .ToList();

                var listRB = new List <IT_RecordBook>();
                foreach (var item in lmGrout)
                {
                    var rb = new IT_RecordBook();
                    rb.Id         = IdHelper.GetId();
                    rb.RefCode    = data.Code;
                    rb.Type       = "Out";
                    rb.ToStorId   = item.StorId;
                    rb.ToLocalId  = item.LocalId;
                    rb.MaterialId = item.MaterialId;
                    rb.MeasureId  = dicMUnit[item.MaterialId];
                    rb.BatchNo    = item.BatchNo;
                    rb.BarCode    = item.BarCode;
                    rb.Num        = item.Num;
                    rb.CreateTime = now;
                    rb.CreatorId  = audit.AuditUserId;
                    rb.Deleted    = false;
                    listRB.Add(rb);
                }
                if (listRB.Count > 0)
                {
                    var bookSvc = _ServiceProvider.GetRequiredService <IIT_RecordBookBusiness>();
                    await bookSvc.AddDataAsync(listRB);
                }
            }

            // 处理托盘位置数据
            //{
            //    var dicTray = new Dictionary<string, string>();
            //    foreach (var item in detail)
            //    {
            //        if (item.TrayId != null && !dicTray.ContainsKey(item.TrayId))
            //            dicTray.Add(item.TrayId, item.LocalId);
            //    }
            //    var trayIds = dicTray.Keys.ToList();
            //    if (trayIds.Count > 0)
            //    {
            //        var listTray = await Service.GetIQueryable<PB_Tray>().Where(w => trayIds.Contains(w.Id)).ToListAsync();
            //        foreach (var tray in listTray)
            //        {
            //            tray.LocalId = dicTray[tray.Id];
            //        }
            //        var traySvc = _ServiceProvider.GetRequiredService<IPB_TrayBusiness>();
            //        await traySvc.UpdateDataAsync(listTray);
            //    }
            //}

            // 解锁货位 在自动出库的时候,货位可能被出库锁锁定了
            {
                var localIds  = data.OutStorDetails.Select(s => s.LocalId).ToList();
                var listLocal = await Db.GetIQueryable <PB_Location>().Where(w => localIds.Contains(w.Id) && w.LockType == 2).ToListAsync();

                foreach (var item in listLocal)
                {
                    item.LockType = 0;
                }
                var localSvc = _ServiceProvider.GetRequiredService <IPB_LocationBusiness>();
                await localSvc.UpdateDataAsync(listLocal);
            }

            // 修改出库状态
            {
                data.Status      = 1;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }
        }
Esempio n. 21
0
        public async Task Approve(AuditDTO audit)
        {
            var now  = DateTime.Now;
            var data = await this.GetTheDataAsync(audit.Id);

            var detail   = data.MoveDetails;
            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);

            var lmSvc = _ServiceProvider.GetRequiredService <IIT_LocalMaterialBusiness>();
            var ldSvc = _ServiceProvider.GetRequiredService <IIT_LocalDetailBusiness>();

            // 原库位出库
            {
                var badGroup = detail
                               .GroupBy(w => new { w.FromLocalId, w.FromTrayId, w.FromZoneId, w.MaterialId, w.BatchNo, w.BarCode })
                               .Select(s => new { s.Key.FromLocalId, s.Key.FromTrayId, s.Key.FromZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, MoveNum = s.Sum(o => o.MoveNum) })
                               .ToList();
                var localIds    = badGroup.Select(s => s.FromLocalId).ToList();
                var trayIds     = badGroup.Select(s => s.FromTrayId).ToList();
                var zoneIds     = badGroup.Select(s => s.FromZoneId).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>();
                    foreach (var move in badGroup)
                    {
                        var lm = listLM.Where(w => w.StorId == audit.StorId && w.LocalId == move.FromLocalId && w.TrayId == move.FromTrayId && w.ZoneId == move.FromZoneId && w.MaterialId == move.MaterialId && w.BatchNo == move.BatchNo && w.BarCode == move.BarCode).SingleOrDefault();
                        if (lm == null || lm.Num < move.MoveNum)
                        {
                            throw new Exception($"没有找到对应物料的库存数据/库存数量不够({move.MoveNum})");
                        }
                        if (lm.Num == move.MoveNum)
                        {
                            listDel.Add(lm);
                        }
                        else if (lm.Num > move.MoveNum)
                        {
                            lm.Num -= move.MoveNum;
                            listUpdate.Add(lm);
                        }
                    }
                    if (listDel.Count > 0)
                    {
                        await lmSvc.DeleteDataAsync(listDel);
                    }
                    if (listUpdate.Count > 0)
                    {
                        await lmSvc.UpdateDataAsync(listUpdate);
                    }
                }

                // 修改库存明细
                {
                    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.MoveNum;
                        var lds    = listLD.Where(w => w.StorId == audit.StorId && w.LocalId == bad.FromLocalId && w.TrayId == bad.FromTrayId && w.ZoneId == bad.FromZoneId && 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.MoveNum})");
                        }
                        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 lmGrout = detail
                                  .GroupBy(g => new { g.StorId, g.ToLocalId, g.ToTrayId, g.ToZoneId, g.MaterialId, g.BatchNo, g.BarCode })
                                  .Select(s => new { s.Key.StorId, s.Key.ToLocalId, s.Key.ToTrayId, s.Key.ToZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, MoveNum = s.Sum(o => o.MoveNum) })
                                  .ToList();
                    //查询当前库存记录
                    var localIds = lmGrout.Select(s => s.ToLocalId).ToList();
                    var trayIds  = lmGrout.Select(s => s.ToTrayId).ToList();
                    var zoneIds  = lmGrout.Select(s => s.ToZoneId).ToList();
                    var materIds = lmGrout.Select(s => s.MaterialId).ToList();
                    var batchNos = lmGrout.Select(s => s.BatchNo).ToList();
                    var barCodes = lmGrout.Select(s => s.BarCode).ToList();

                    var lmQuery = Db.GetIQueryable <IT_LocalMaterial>();
                    lmQuery = lmQuery.Where(w => w.StorId == audit.StorId);
                    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 (materIds.Count > 0)
                    {
                        lmQuery = lmQuery.Where(w => materIds.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 lmDbData = await lmQuery.ToListAsync();

                    //处理库存
                    var listLmAdd    = new List <IT_LocalMaterial>();
                    var listLmUpdate = new List <IT_LocalMaterial>();
                    foreach (var item in lmGrout)
                    {
                        //如果存再当前相同的物料,就在库存上直接相加
                        var lmItem = lmDbData.Where(w => w.StorId == item.StorId && w.LocalId == item.ToLocalId && w.TrayId == item.ToTrayId && w.ZoneId == item.ToZoneId && w.MaterialId == item.MaterialId && w.BatchNo == item.BatchNo && w.BarCode == item.BarCode).SingleOrDefault();
                        if (lmItem != null)
                        {
                            lmItem.Num += item.MoveNum;
                            listLmUpdate.Add(lmItem);
                        }
                        else
                        {
                            //如果当前库存不存再相同的物料,就增加此物料的记录
                            var lm = new IT_LocalMaterial();
                            lm.Id         = IdHelper.GetId();
                            lm.StorId     = item.StorId;
                            lm.LocalId    = item.ToLocalId;
                            lm.TrayId     = item.ToTrayId;
                            lm.ZoneId     = item.ToZoneId;
                            lm.MaterialId = item.MaterialId;
                            lm.MeasureId  = dicMUnit[item.MaterialId];
                            lm.BatchNo    = item.BatchNo;
                            lm.BarCode    = item.BarCode;
                            lm.Num        = item.MoveNum;
                            listLmAdd.Add(lm);
                        }
                    }
                    if (listLmAdd.Count > 0)
                    {
                        await lmSvc.AddDataAsync(listLmAdd);
                    }
                    if (listLmUpdate.Count > 0)
                    {
                        await lmSvc.UpdateDataAsync(listLmUpdate);
                    }
                }

                // 增加库存明细
                {
                    var ldGrout = detail
                                  .GroupBy(g => new { g.StorId, g.ToLocalId, g.ToTrayId, g.ToZoneId, g.MaterialId, g.BatchNo, g.BarCode, g.Price })
                                  .Select(s => new { s.Key.StorId, s.Key.ToLocalId, s.Key.ToTrayId, s.Key.ToZoneId, s.Key.MaterialId, s.Key.BatchNo, s.Key.BarCode, s.Key.Price, TotalAmt = s.Sum(o => o.Amount), MoveNum = s.Sum(o => o.MoveNum) })
                                  .ToList();
                    var listLd = new List <IT_LocalDetail>();
                    foreach (var item in ldGrout)
                    {
                        var ld = new IT_LocalDetail();
                        ld.Id         = IdHelper.GetId();
                        ld.StorId     = audit.StorId;
                        ld.InStorId   = null;
                        ld.LocalId    = item.ToLocalId;
                        ld.TrayId     = item.ToTrayId;
                        ld.ZoneId     = item.ToZoneId;
                        ld.MaterialId = item.MaterialId;
                        ld.MeasureId  = dicMUnit[item.MaterialId];
                        ld.BatchNo    = item.BatchNo;
                        ld.BarCode    = item.BarCode;
                        ld.InTime     = audit.AuditTime;
                        ld.Amount     = item.TotalAmt;
                        ld.CreateTime = now;
                        ld.CreatorId  = audit.AuditUserId;
                        ld.Price      = item.Price;
                        ld.Num        = item.MoveNum;
                        ld.Deleted    = false;
                        listLd.Add(ld);
                    }
                    if (listLd.Count > 0)
                    {
                        await ldSvc.AddDataAsync(listLd);
                    }
                }
            }

            // 处理台帐
            {
                var listRB = new List <IT_RecordBook>();
                foreach (var move in detail)
                {
                    // 增加(移库-出)MoveOut台帐
                    var rbOut = new IT_RecordBook()
                    {
                        Id          = IdHelper.GetId(),
                        RefCode     = data.Code,
                        Type        = "MoveOut",
                        FromStorId  = audit.StorId,
                        FromLocalId = move.FromLocalId,
                        ToStorId    = audit.StorId,
                        ToLocalId   = move.ToLocalId,
                        MaterialId  = move.MaterialId,
                        MeasureId   = dicMUnit[move.MaterialId],
                        BarCode     = move.BarCode,
                        BatchNo     = move.BatchNo,
                        Num         = move.MoveNum,
                        CreateTime  = audit.AuditTime,
                        CreatorId   = audit.AuditUserId,
                        Deleted     = false
                    };
                    listRB.Add(rbOut);
                    // 增加(移库-入)MoveIn台帐
                    var rbIn = new IT_RecordBook()
                    {
                        Id          = IdHelper.GetId(),
                        RefCode     = data.Code,
                        Type        = "MoveIn",
                        FromStorId  = audit.StorId,
                        FromLocalId = move.FromLocalId,
                        ToStorId    = audit.StorId,
                        ToLocalId   = move.ToLocalId,
                        MaterialId  = move.MaterialId,
                        MeasureId   = dicMUnit[move.MaterialId],
                        BarCode     = move.BarCode,
                        BatchNo     = move.BatchNo,
                        Num         = move.MoveNum,
                        CreateTime  = audit.AuditTime,
                        CreatorId   = audit.AuditUserId,
                        Deleted     = false
                    };
                    listRB.Add(rbIn);
                }
                // 保存数据台帐
                var rbSvc = _ServiceProvider.GetRequiredService <IIT_RecordBookBusiness>();
                await rbSvc.AddDataAsync(listRB);
            }

            // 处理托盘位置数据
            {
                var dicTray = new Dictionary <string, string>();
                foreach (var item in detail)
                {
                    if (item.ToTrayId != null && !dicTray.ContainsKey(item.ToTrayId))
                    {
                        dicTray.Add(item.ToTrayId, item.ToLocalId);
                    }
                }
                var trayIds = dicTray.Keys.ToList();
                if (trayIds.Count > 0)
                {
                    var listTray = await Db.GetIQueryable <PB_Tray>().Where(w => trayIds.Contains(w.Id)).ToListAsync();

                    foreach (var tray in listTray)
                    {
                        tray.LocalId = dicTray[tray.Id];
                    }
                    var traySvc = _ServiceProvider.GetRequiredService <IPB_TrayBusiness>();
                    await traySvc.UpdateDataAsync(listTray);
                }
            }

            // 修改主数据状态
            {
                data.Status      = 1;
                data.AuditeTime  = audit.AuditTime;
                data.AuditUserId = audit.AuditUserId;
                await UpdateAsync(data);
            }
        }