コード例 #1
0
        public async Task <ApiResult <bool> > SaveCorrection([FromBody] DTO.CounterpartyRestCorrection document)
        {
            try
            {
                var rests = await dbContext.CounterpartyMaterialRests
                            .Where(x => x.CounterpartyId == document.CounterpartyId)
                            .Select(x => new { x.MaterialId, x.Rest })
                            .ToListAsync();

                int.TryParse(HttpContext.User.Identity.Name, out int userId);
                userId = await dbContext.Users
                         .Where(x => x.Id == userId)
                         .Select(x => x.Id)
                         .FirstOrDefaultAsync();

                var doc = new CounterpartyRestCorrection
                {
                    CounterpartyId      = document.CounterpartyId,
                    Date                = document.Date,
                    IsDeleted           = document.IsDeleted,
                    UserId              = userId,
                    MaterialCorrections =
                        document
                        .MaterialCorrections
                        .GroupJoin(rests, x => x.MaterialId, x => x.MaterialId,
                                   (x, y) => new { Corr = x, Rests = y })
                        .SelectMany(x => x.Rests.DefaultIfEmpty(),
                                    (x, rest) =>
                                    new
                    {
                        x.Corr.MaterialId,
                        Correction = x.Corr.Correction - (rest == null ? 0 : rest.Rest)
                    })
                        .Adapt <List <CounterpartyRestCorrectionMaterial> >()
                };

                dbContext.Database.BeginTransaction();
                dbContext.CounterpartyRestCorrections.Add(doc);
                await dbContext.SaveChangesAsync();

                repository.AddCounterpartyMaterialMovements(doc,
                                                            doc.MaterialCorrections
                                                            .Select(x => new CounterpartyMaterialMvt
                {
                    CounterpartyId = doc.CounterpartyId,
                    Date           = doc.Date,
                    MaterialId     = x.MaterialId,
                    Quantity       = x.Correction
                }));

                await dbContext.SaveChangesAsync();

                dbContext.Database.CommitTransaction();
            }
            catch (Exception ex)
            {
                dbContext.Database.RollbackTransaction();
                return(ApiResult(false, $"{ex.Message}\n{ex.InnerException?.Message}"));
            }

            return(ApiResult(true));
        }