示例#1
0
        public async Task <IActionResult> Update(string id, [FromBody] InventoryMeta inventoryMeta, bool isBalanced)
        {
            var result = await _inventoryService.Update(CurrentUser.TenantId, CurrentUser.Id, CurrentUser.FullName, CurrentUser.Avatar,
                                                        id, inventoryMeta, isBalanced);

            if (result.Code <= 0)
            {
                return(BadRequest(result));
            }
            return(Ok(result));
        }
示例#2
0
        public async Task <IActionResult> Exports(string inventoryId, InventoryMeta inventoryMeta)
        {
            var result = await _inventoryService.Exports(CurrentUser.TenantId, CurrentUser.Id, CurrentUser.FullName,
                                                         CurrentUser.Avatar, inventoryId, inventoryMeta);

            if (result.Code <= 0)
            {
                return(BadRequest(result));
            }

            var fileName = "inventory.xlsx";
            var fileType = "application/vnd.ms-excel";

            //string sWebRootFolder = _hostingEnvironment.WebRootPath;
            //string sFileName = @"inventory.xlsx";
            //FileStream fileStream = new FileStream(Path.Combine(sWebRootFolder, sFileName), FileMode.Open);
            return(File(result.Data, fileType, fileName));
        }
示例#3
0
        public async Task <ActionResultResponse <string> > Insert(string tenantId, string creatorId, string creatorFullName, string creatorAvatar,
                                                                  InventoryMeta inventoryMeta, bool isBalance = false)
        {
            var isWarehouseExists =
                await _warehouseRepository.CheckExists(inventoryMeta.WarehouseId, tenantId);

            if (!isWarehouseExists)
            {
                return(new ActionResultResponse <string>(-1, _warehouseResourceService.GetString("Warehouse does not exists. Please check again.")));
            }

            var inventory = new Inventory
            {
                WarehouseId     = inventoryMeta.WarehouseId,
                InventoryDate   = inventoryMeta.InventoryDate,
                Note            = inventoryMeta.Note,
                Status          = InventoryStatus.Waiting,
                TenantId        = tenantId,
                CreatorId       = creatorId,
                CreatorFullName = creatorFullName
            };

            inventory.InventoryDetails = await AddInventoryDetails(tenantId, inventory.WarehouseId, inventory.InventoryDate,
                                                                   inventory.Id, inventoryMeta.Details);
            await AddInventoryMembers();

            if (inventory.InventoryDetails.Count == 0)
            {
                return(new ActionResultResponse <string>(-2, _sharedResourceService.GetString(ValidatorMessage.PleaseSelect,
                                                                                              _warehouseResourceService.GetString("product"))));
            }

            var result = await _inventoryRepository.Insert(inventory);

            if (result <= 0)
            {
                return(new ActionResultResponse <string>(result,
                                                         _sharedResourceService.GetString(ErrorMessage.SomethingWentWrong)));
            }

            await Balance();

            return(new ActionResultResponse <string>(result, _sharedResourceService.GetString(SuccessMessage.AddSuccessful,
                                                                                              _warehouseResourceService.GetString("inventory"))));

            #region Local functions
            async Task AddInventoryMembers()
            {
                var httpService = new HttpClientService();

                foreach (var member in inventoryMeta.Members)
                {
                    //var userInfo = await httpService.GetUserInfo(inventory.TenantId, member.UserId);
                    //if (userInfo == null)
                    //    continue;

                    inventory.InventoryMembers.Add(new InventoryMember
                    {
                        //UserId = userInfo.UserId,
                        //FullName = userInfo.FullName,
                        //Avatar = userInfo.Avatar,
                        //OfficeName = userInfo.OfficeName,
                        //PositionName = userInfo.PositionName,
                        InventoryId = inventory.Id
                    });
                }
            }

            async Task Balance()
            {
                if (isBalance)
                {
                    // Thêm phiếu nhập và xuất để cân bằng kho.
                    await BalanceWarehouse(inventory.TenantId, inventory.Id);
                }
            }

            #endregion Local functions
        }
示例#4
0
        public async Task <ActionResultResponse <string> > Update(string tenantId, string lastUpdateUserId, string lastUpdateFullName, string lastUpdateAvatar,
                                                                  string inventoryId, InventoryMeta inventoryMeta, bool isBalanced)
        {
            var inventory = await _inventoryRepository.GetInfo(inventoryId);

            if (inventory == null)
            {
                return(new ActionResultResponse <string>(-1, _warehouseResourceService.GetString("Inventory does not exists.")));
            }

            if (inventory.TenantId != tenantId)
            {
                return(new ActionResultResponse <string>(-2,
                                                         _warehouseResourceService.GetString(ErrorMessage.NotHavePermission)));
            }

            if (inventory.Status != InventoryStatus.Waiting)
            {
                return(new ActionResultResponse <string>(-3,
                                                         _sharedResourceService.GetString("Inventory already balanced. You can not edit this inventory")));
            }

            if (inventory.ConcurrencyStamp != inventoryMeta.ConcurrencyStamp)
            {
                return(new ActionResultResponse <string>(-4,
                                                         _warehouseResourceService.GetString(
                                                             "The inventory already updated by other people. you are not allowed to edit the inventory information.")));
            }

            var isWarehouseExists =
                await _warehouseRepository.CheckExists(inventoryMeta.WarehouseId, tenantId);

            if (!isWarehouseExists)
            {
                return(new ActionResultResponse <string>(-5, _warehouseResourceService.GetString("Warehouse does not exists. Please check again.")));
            }

            inventory.WarehouseId        = inventoryMeta.WarehouseId;
            inventory.InventoryDate      = inventoryMeta.InventoryDate;
            inventory.Note               = inventoryMeta.Note;
            inventory.ConcurrencyStamp   = Guid.NewGuid().ToString();
            inventory.LastUpdate         = DateTime.Now;
            inventory.LastUpdateUserId   = lastUpdateUserId;
            inventory.LastUpdateFullName = lastUpdateFullName;
            inventory.InventoryDate      = inventoryMeta.InventoryDate;

            await _inventoryRepository.Update(inventory);

            if (isBalanced)
            {
                var resultBalance = await BalanceWarehouse(inventory.TenantId, inventory.Id);

                if (resultBalance.Code <= 0)
                {
                    return(resultBalance);
                }
            }

            await UpdateMembers();
            await UpdateDetail();

            return(new ActionResultResponse <string>(1, _warehouseResourceService.GetString("Update inventory successful."),
                                                     string.Empty, inventory.ConcurrencyStamp));

            async Task UpdateMembers()
            {
                var members = await _inventoryMemberRepository.GetsByInventoryId(inventory.Id);

                if (inventoryMeta.Members == null || !inventoryMeta.Members.Any())
                {
                    await _inventoryMemberRepository.ForceDeleteByInventoryId(inventory.Id);
                }
                else
                {
                    var memberMetaUserIds = inventoryMeta.Members.Select(x => x.UserId).ToList();
                    var memberUserIds     = members.Select(x => x.UserId).ToList();

                    var listNews   = memberMetaUserIds.Except(memberUserIds).ToList();
                    var listDelete = memberUserIds.Except(memberMetaUserIds).ToList();

                    if (listNews.Any())
                    {
                        var httpService = new HttpClientService();
                        foreach (var inventoryMember in inventoryMeta.Members.Where(x => listNews.Contains(x.UserId)))
                        {
                            //var userInfo = await httpService.GetUserInfo(inventory.TenantId, inventoryMember.UserId);
                            //if (userInfo == null)
                            //    continue;

                            inventory.InventoryMembers.Add(new InventoryMember
                            {
                                //UserId = userInfo.UserId,
                                //FullName = userInfo.FullName,
                                //Avatar = userInfo.Avatar,
                                //OfficeName = userInfo.OfficeName,
                                //PositionName = userInfo.PositionName,
                                InventoryId = inventory.Id
                            });
                        }

                        await _inventoryMemberRepository.Inserts(inventory.InventoryMembers);
                    }

                    if (listDelete.Any())
                    {
                        await _inventoryMemberRepository.Deletes(inventory.Id, listDelete);
                    }
                }
            }

            async Task UpdateDetail()
            {
                var inventoryDetails =
                    await _inventoryDetailRepository.GetInventoryDetailByInventoryId(tenantId, inventory.Id);

                if (inventoryDetails == null)
                {
                    inventoryDetails = await AddInventoryDetails(inventory.TenantId, inventory.WarehouseId,
                                                                 inventory.InventoryDate,
                                                                 inventory.Id, inventoryMeta.Details);

                    await _inventoryDetailRepository.Inserts(inventoryDetails);
                }
                else
                {
                    var inventoryDetailMetaIds = inventoryMeta.Details.Select(x => x.Id).ToList();
                    var inventoryDetailIds     = inventoryDetails.Select(x => x.Id).ToList();

                    // Danh sách thêm mới.
                    var listNewInventoryDetailIds    = inventoryDetailMetaIds.Except(inventoryDetailIds).ToList();
                    var listUpdateInventoryDetailIds = inventoryDetailMetaIds.Intersect(inventoryDetailIds).ToList();
                    var listDeleteInventoryDetailIds = inventoryDetailIds.Except(inventoryDetailMetaIds);

                    // Thêm mới chi tiết phiếu nhập.
                    var listNewInventoryDetailMetas =
                        inventoryMeta.Details.Where(x => listNewInventoryDetailIds.Contains(x.Id)).ToList();
                    if (listNewInventoryDetailMetas.Any())
                    {
                        await AddInventoryDetails(inventory.TenantId, inventory.WarehouseId,
                                                  inventory.InventoryDate,
                                                  inventory.Id, listNewInventoryDetailMetas);
                    }

                    var listUpdate = inventoryDetails.Where(x => listUpdateInventoryDetailIds.Contains(x.Id)).ToList();
                    if (listUpdate.Any())
                    {
                        // Cập nhật chi tiết phiếu nhập.
                        foreach (var inventoryDetail in listUpdate)
                        {
                            var inventoryDetailMeta = inventoryMeta.Details.FirstOrDefault(x => x.Id == inventoryDetail.Id);
                            if (inventoryDetailMeta == null)
                            {
                                continue;
                            }

                            if (inventoryDetailMeta.RealQuantity == inventoryDetail.RealQuantity)
                            {
                                continue;
                            }

                            inventoryDetail.RealQuantity = inventoryDetailMeta.RealQuantity;
                        }
                        await _inventoryDetailRepository.Updates(listUpdate);
                    }


                    // Xóa chi tiết phiếu nhập.
                    var listDeleteInventoryDetails =
                        inventoryDetails.Where(x => listDeleteInventoryDetailIds.Contains(x.Id)).ToList();
                    if (listDeleteInventoryDetails.Any())
                    {
                        await _inventoryDetailRepository.Deletes(listDeleteInventoryDetails);
                    }
                }
            }
        }