diff --git a/README.md b/README.md index ef6723d02..f0cd9bf14 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,23 @@ # 开发和部署方式 -## windows x64 下本地开发 +## 开发环境配置 -当前项目基于 .net 6 sdk,安装 visual studio 2022 时通常会自带 +### 软件安装 -### supervisor 方式开发 +1. visual studio 2022(.net 6 sdk) +1. Docker Desktop(wsl2) -1. 根据项目需求,安装 SQL Server 或 MySQL -2. 使用 build/src/win-x64/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理非数据库依赖 +### 配置文件 -配置文件: +配置文件存储在build\src\docker\publish\conf 目录下,settings 目录存放程序配置文件,其他目录存放依赖配置文件 -1. supervisor: `build\src\win-x64\publish\supervisord\supervisor.dev.conf` -1. nginx: `build\src\win-x64\publish\nginx\conf\nginx.conf` -1. gateway: `build\src\win-x64\publish\gateway\appsettings.json` -1. config: `build\src\win-x64\publish\gateway\wwwroot\settings\appsettings.json` -1. config: `build\src\win-x64\publish\gateway\wwwroot\settings\appsettings.Development.json` +### 依赖管理 -```mermaid -flowchart LR -nginx --localhost:21093--> gateway--localhost:59092--> api:59092 -api:59092 --localhost:6379--> redis:6379 -api:59092 --localhost:13319--> database:13319 -gateway --localhost:8086--> influxdb:8086 -``` - -### Docker Desktop 方式开发 - -1. 无需按照数据库 -2. 使用 build/src/docker/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理依赖 +使用 build/src/docker/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理依赖的停止启动,可以在Docker Desktop中查看和管理启动的服务 ## 部署 -### windows x64 supervisor 方式部署 - -1. 执行: `build\src\win-x64\build.cmd` -2. 上传: `build\dist\win-x64\publish` 目录到服务器 -3. 修改配置,执行 publish 目录下的 start.cmd +Docker 和 Windows 部署两种方式只需要按需修改配置文件中的主机名和端口,windows单机部署时使用localhost作为主机名,docker compose单机部署时使用service name 作为主机名 ### docker compose 方式部署 @@ -44,7 +25,8 @@ gateway --localhost:8086--> influxdb:8086 2. 上传: `build\dist\win-x64\publish` 目录到服务器 3. 修改配置,执行 publish 目录下的 start.sh 或 start.cmd -构建时的处理: +### windows x64 方式部署 -1. 复制并重命名 build\src\win-x64\publish\nginx\conf 到 build\dist\docker\publish\conf\nginx,保持nginx的配置文件统一在 build\src\win-x64\publish\nginx\conf 目录维护 -1. 复制 build\src\win-x64\publish\gateway 到 build\dist\docker\publish\gateway,保持网关的配置和应用的配置统一在 build\src\win-x64\publish\gateway 目录维护 +1. 执行: `build\src\win-x64\build.cmd` +2. 上传: `build\dist\win-x64\publish` 目录到服务器 +3. 修改配置,执行 publish 目录下的 start.cmd diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs index bc9666215..ff543a74f 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs @@ -157,6 +157,7 @@ public static class IncomingToWmsExtensions var backFlush = JsonSerializer.Deserialize(incomingConverted.DataContent); var balanceAppService = workerContext.ServiceProvider.GetRequiredService(); + var balanceDtos = await balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput() { Qty = backFlush.Qty, diff --git a/be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs b/be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs index c22fde641..56945a228 100644 --- a/be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs +++ b/be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs @@ -1,9 +1,10 @@ -using System; using System.ComponentModel.DataAnnotations; using System.Net.Http; +using System.Net.Http.Headers; using System.Threading.Tasks; using IdentityModel.Client; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; @@ -11,35 +12,31 @@ using Volo.Abp.Application.Services; namespace Win_in.Sfs.Auth.Tokens; -[Route($"api/token")] +[Route($"api")] +[Authorize] public class TokenService : ApplicationService { + private readonly IHttpContextAccessor _httpContextAccessor; private readonly IHttpClientFactory _httpClientFactory; private readonly ILogger _logger; private readonly IConfiguration _configuration; - - public TokenService(IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger logger) + public TokenService(IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger logger) { + this._httpContextAccessor = httpContextAccessor; this._httpClientFactory = httpClientFactory; this._configuration = configuration; this._logger = logger; } - [HttpPost] + [HttpPost("token")] [AllowAnonymous] public async Task CreateAsync(LoginModel model) { var address = _configuration["AuthServer:Authority"]; - var request = new DiscoveryDocumentRequest - { - Address = address, - Policy = new DiscoveryPolicy { RequireHttps = false } - }; - var discovery = await _httpClientFactory.CreateClient().GetDiscoveryDocumentAsync(request).ConfigureAwait(false); var clientId = _configuration["AuthServer:ClientId"]; var clientSecret = _configuration["AuthServer:ClientSecret"]; - this._logger.LogInformation($"address:{address},TokenEndpoint:{discovery.TokenEndpoint},clientId:{clientId},clientSecret:{clientSecret}"); + var result = await _httpClientFactory.CreateClient().RequestPasswordTokenAsync(new PasswordTokenRequest { Address = $"{address.TrimEnd('/')}/connect/token", @@ -49,11 +46,6 @@ public class TokenService : ApplicationService UserName = model.UserName, Password = model.Password }).ConfigureAwait(false); - Console.WriteLine($"Result:${(result.IsError ? result.ErrorDescription : result.AccessToken)}"); - //if (result.RefreshToken == null) - //{ - // throw new UserFriendlyException("用户名或密码错误"); - //} return new JsonResult(new { @@ -72,18 +64,26 @@ public class TokenService : ApplicationService }); } - [HttpGet("[action]")] - [AllowAnonymous] - public string Test() + [HttpGet("token/application-configuration")] + public async Task ApplicationConfiguration() { - return "Test"; + var address = _configuration["AuthServer:Authority"]; + var url = $"{address.TrimEnd('/')}/api/abp/application-configuration"; + var httpClient = _httpClientFactory.CreateClient(); + var token = this._httpContextAccessor.HttpContext.Request.Headers.Authorization.ToString(); + httpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse(token); + var response = await httpClient.GetAsync(url).ConfigureAwait(false); + var result = new ContentResult(); + result.ContentType = "application/json"; + result.Content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + return result; } - [HttpGet("/token/test")] + [HttpGet("token/test")] [AllowAnonymous] - public string Test1() + public string Test() { - return "Test"; + return "test"; } } diff --git a/be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql b/be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql index 87364c0a6..286935fff 100644 --- a/be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql +++ b/be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql @@ -2529,6 +2529,9 @@ CREATE TABLE [Job_PutawayJobDetail] ( CREATE TABLE [Job_UnplannedIssueJobDetail] ( [Id] uniqueidentifier NOT NULL, [ReasonCode] nvarchar(max) NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, @@ -2579,6 +2582,9 @@ CREATE TABLE [Job_UnplannedIssueJobDetail] ( CREATE TABLE [Job_UnplannedReceiptJobDetail] ( [Id] uniqueidentifier NOT NULL, [ReasonCode] nvarchar(max) NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, @@ -4875,6 +4881,9 @@ CREATE TABLE [Store_TransferRequestDetail] ( CREATE TABLE [Store_UnplannedIssueNoteDetail] ( [Id] uniqueidentifier NOT NULL, [ReasonCode] nvarchar(max) NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, @@ -4937,6 +4946,9 @@ CREATE TABLE [Store_UnplannedIssueNoteDetail] ( CREATE TABLE [Store_UnplannedIssueRequestDetail] ( [Id] uniqueidentifier NOT NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, @@ -4974,6 +4986,9 @@ CREATE TABLE [Store_UnplannedIssueRequestDetail] ( CREATE TABLE [Store_UnplannedReceiptNoteDetail] ( [Id] uniqueidentifier NOT NULL, [ReasonCode] nvarchar(max) NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, @@ -5036,6 +5051,10 @@ CREATE TABLE [Store_UnplannedReceiptNoteDetail] ( CREATE TABLE [Store_UnplannedReceiptRequestDetail] ( [Id] uniqueidentifier NOT NULL, + [ReasonCode] nvarchar(max) NULL, + [CaseCode] nvarchar(max) NULL, + [ProjCapacityCode] nvarchar(max) NULL, + [OnceBusiCode] nvarchar(max) NULL, [ExtraProperties] nvarchar(max) NULL, [CreationTime] datetime2 NOT NULL, [CreatorId] uniqueidentifier NULL, diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs index d063a0463..bcfbbed1c 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs @@ -275,6 +275,7 @@ public class BalanceAppService dto.ItemName = item.Name; dto.ItemDesc1 = item.Desc1; dto.ItemDesc2 = item.Desc2; + dto.Uom = item.BasicUom; } return dtos; } diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Transactions/TransactionManager.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Transactions/TransactionManager.cs index 26cf02cbd..fabcb95d3 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Transactions/TransactionManager.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Transactions/TransactionManager.cs @@ -18,7 +18,8 @@ public class TransactionManager : DomainService, ITransactionManager private readonly IBalanceManager _balanceManager; private readonly IItemBasicAclService _itemBasicAclService; private readonly ILocationAclService _locationAclService; - private readonly ITransactionTypeAclService _transactionTypeAclService; + //private readonly ITransactionTypeAclService _transactionTypeAclService; + private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionRepository _transactionRepository; private readonly IBalanceRepository _balanceRepository; private readonly ISnowflakeIdGenerator _numberGenerator; @@ -28,20 +29,22 @@ public class TransactionManager : DomainService, ITransactionManager IBalanceManager balanceManager , IItemBasicAclService itemBasicAclService , ILocationAclService locationAclService - , ITransactionTypeAclService transactionTypeAclService + //, ITransactionTypeAclService transactionTypeAclService , ITransactionRepository transactionRepository , IBalanceRepository balanceRepository , ISnowflakeIdGenerator numberGenerator - , ILocationCapacityManager locationCapacityManager) + , ILocationCapacityManager locationCapacityManager + , ITransactionTypeAppService transactionTypeAppService) { _balanceManager = balanceManager; _itemBasicAclService = itemBasicAclService; _locationAclService = locationAclService; - _transactionTypeAclService = transactionTypeAclService; + //_transactionTypeAclService = transactionTypeAclService; _transactionRepository = transactionRepository; _balanceRepository = balanceRepository; _numberGenerator = numberGenerator; _locationCapacityManager = locationCapacityManager; + _transactionTypeAppService = transactionTypeAppService; } public virtual async Task AddAsync(Transaction transaction) @@ -96,7 +99,7 @@ public class TransactionManager : DomainService, ITransactionManager var item = await _itemBasicAclService.GetByCodeAsync(transaction.ItemCode).ConfigureAwait(false); var location = await _locationAclService.GetByCodeAsync(transaction.LocationCode).ConfigureAwait(false); - var transactionType = await _transactionTypeAclService.GetByTransTypeAsync(transaction.TransType, transaction.TransSubType).ConfigureAwait(false); + var transactionType = await _transactionTypeAppService.GetByTransTypeAsync(transaction.TransType, transaction.TransSubType).ConfigureAwait(false); transaction.CheckTransactionType(transactionType, item, location); //执行库存余额的变动 @@ -158,7 +161,7 @@ public class TransactionManager : DomainService, ITransactionManager //库位注意大小写 var location = locations.FirstOrDefault(p => p.Code.ToUpper() == transaction.LocationCode.ToUpper()); - var transactionType = await _transactionTypeAclService.GetByTransTypeAsync(transaction.TransType, transaction.TransSubType).ConfigureAwait(false); + var transactionType = await _transactionTypeAppService.GetByTransTypeAsync(transaction.TransType, transaction.TransSubType).ConfigureAwait(false); transaction.CheckTransactionType(transactionType, item, location); await UpdateBalanceAsync(transaction, item, location).ConfigureAwait(false); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs index f0d2cc33a..1b9ad5f7d 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs @@ -14,4 +14,6 @@ public interface IIssueJobAppService Task> GetListByTypeAsync(SfsJobRequestInputBase requestInput, string requestType, bool includeDetails = false, CancellationToken cancellationToken = default); + + Task> GetByRequestNumberAsync(string requestNumber); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs index c50180570..034ea1a1b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs @@ -29,7 +29,7 @@ public interface IPurchaseOrderAppService /// /// /// - Task UpdateDetailsAsync(string number, List input); + Task UpdateDetailsAsync(string number,List input); /// /// 【批量创建】到货通知 (收货单) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs index 7515e713f..6ec183a2b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.ObjectMapping; using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Wms.Store.Application.Contracts; @@ -151,6 +152,13 @@ public class IssueJobAppService } + [HttpPost("by-request-number/{requestNumber}")] + public virtual async Task> GetByRequestNumberAsync(string requestNumber) + { + var entitys = await _repository.GetListAsync(p => p.MaterialRequestNumber == requestNumber).ConfigureAwait(false); + return ObjectMapper.Map, List>(entitys); + } + /* /// /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/BackFlushNotes/BackFlushNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/BackFlushNotes/BackFlushNoteAppService.cs index ff86c9f94..90f9f8fd1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/BackFlushNotes/BackFlushNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/BackFlushNotes/BackFlushNoteAppService.cs @@ -43,5 +43,4 @@ public class BackFlushNoteAppService : return ObjectMapper.Map, List>(entities); } - } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs index 647f38610..c2e79752c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs @@ -75,9 +75,11 @@ public class ItemTransformRequestAppService : { var fromLocationDto= await LocationAclService.GetByCodeAsync(detail.FromLocationCode).ConfigureAwait(false); var toLocationDto= await LocationAclService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); - var itemBasicDto=await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); + var fromItemBasicDto=await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); + var toItemBasicDto = await ItemBasicAclService.GetByCodeAsync(detail.ToItemCode).ConfigureAwait(false); var balanceDto= await _balanceAppService.GetByItemLocationAndPackingAsync(detail.FromPackingCode, detail.ItemCode, detail.FromLocationCode).ConfigureAwait(false); + var inventoryLabelDto= await _inventoryLabelAppService.GetByCodeAsync(detail.ToPackingCode).ConfigureAwait(false); detail.FromLocationArea = fromLocationDto.AreaCode; detail.FromLocationErpCode = fromLocationDto.ErpLocationCode; @@ -89,7 +91,7 @@ public class ItemTransformRequestAppService : detail.FromStatus = balanceDto.Status; detail.ToSupplierBatch = string.Empty; - detail.ToLot = balanceDto.Lot; + detail.ToLot = inventoryLabelDto.Lot; detail.ToStatus = balanceDto.Status; detail.ToLocationArea = toLocationDto.AreaCode; @@ -97,10 +99,15 @@ public class ItemTransformRequestAppService : detail.ToLocationGroup = toLocationDto.LocationGroupCode; detail.ToWarehouseCode = toLocationDto.WarehouseCode; - detail.ItemDesc1 = itemBasicDto.Desc1; - detail.ItemDesc2= itemBasicDto.Desc2; - detail.ItemName= itemBasicDto.Name; - detail.Uom = itemBasicDto.BasicUom; + detail.ItemDesc1 = fromItemBasicDto.Desc1; + detail.ItemDesc2= fromItemBasicDto.Desc2; + detail.ItemName= fromItemBasicDto.Name; + detail.Uom = fromItemBasicDto.BasicUom; + + detail.ToItemCode = toItemBasicDto.Code; + detail.ToItemDesc1 = toItemBasicDto.Desc1; + detail.ToItemDesc2 = toItemBasicDto.Desc2; + detail.ToItemName = toItemBasicDto.Name; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs index 7a3ddd00b..bf07d2a39 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; +using DocumentFormat.OpenXml.Office.PowerPoint.Y2021.M06.Main; using IdentityModel; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -43,15 +44,17 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase /// /// + /// /// private async Task SetDetailPropertiesAsync( PurchaseReturnRequestDetail detail, InventoryLabelDto labelDto, BalanceDTO balanceDto, - LocationDTO locationDto) + LocationDTO locationDto, + PurchaseOrderDTO purchaseOrderDto + ) { if (labelDto != null) { @@ -171,6 +179,12 @@ public class PurchaseReturnRequestAppService : detail.StdPackQty = balanceDto.StdPackQty; detail.Qty = balanceDto.Qty; } + + if (purchaseOrderDto != null) + { + detail.PoLine = + purchaseOrderDto.Details.FirstOrDefault(p => p.ItemCode == balanceDto.ItemCode && p.Lot == balanceDto.Lot).PoLine; + } } #endregion diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs index 2d4e5ba9d..1c59a4fda 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs @@ -74,7 +74,7 @@ public class MaterialRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLoca public EnumStatus Status { get; set; } /// - /// 请求未发 + /// 请求未发 还未发送的数量 /// [NotMapped] public decimal ToBeIssuedQty => Qty - IssuedQty; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs index f64b4e6e4..5d0666e85 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using DocumentFormat.OpenXml.Math; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Event; using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings; @@ -12,12 +14,15 @@ public class MaterialRequestManager , IMaterialRequestManager { private readonly IMaterialRequestRepository _repository; + private readonly IIssueJobRepository _issueJobRepository; public MaterialRequestManager( IMaterialRequestRepository repository + , IIssueJobRepository issueJobRepository ) : base(repository) { _repository = repository; + _issueJobRepository = issueJobRepository; } /// @@ -38,6 +43,79 @@ public class MaterialRequestManager return entity; } + public virtual async Task UpdateDetailsAsync(MaterialRequest newEntity) + { + var oldEntity = await Repository.FindAsync(newEntity.Id, true).ConfigureAwait(false); + + foreach (var newDetail in newEntity.Details) + { + oldEntity.ReplaceDetail(newDetail.Id, newDetail); + } + + foreach (var detail in oldEntity.Details) + { + SetMaterialRequestDetailStatus(detail); + } + + await SetMaterialRequestStatus(oldEntity).ConfigureAwait(false); + + await Repository.UpdateAsync(oldEntity).ConfigureAwait(false); + } + + private void SetMaterialRequestDetailStatus(MaterialRequestDetail detail) + { + if (detail.ReceivedQty >= detail.Qty)//执行的时候 实际收料 多余 要料数 + { + detail.Status = EnumStatus.Close; + } + else + { + detail.Status = EnumStatus.Open; + } + } + + private async Task SetMaterialRequestStatus(MaterialRequest materialRequest) + { + if (materialRequest.Details.All(p => p.Status == EnumStatus.Close)) + { + materialRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + var issueJobs = await _issueJobRepository.GetListAsync(t => t.MaterialRequestNumber == materialRequest.Number).ConfigureAwait(false); + if (issueJobs.Count > 0) + { + if (issueJobs.All(t => t.JobStatus == EnumJobStatus.Done || t.JobStatus == EnumJobStatus.Closed || t.JobStatus == EnumJobStatus.Cancelled)) + { + if (materialRequest.Details.All(p => p.ReceivedQty >= p.Qty)) + { + materialRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + materialRequest.RequestStatus = EnumRequestStatus.Partial; + } + } + else + { + materialRequest.RequestStatus = EnumRequestStatus.Partial; + } + } + else + { + materialRequest.RequestStatus = EnumRequestStatus.Partial; + } + } + } + + public virtual async Task CompleteAsync(string number) + { + var entity = await GetByNumberAsync(number).ConfigureAwait(false); + if (entity != null && !entity.Details.Any(p => p.ToBeIssuedQty > 0)) + { + await CompleteAsync(entity).ConfigureAwait(false); + } + } #region 公有 @@ -119,52 +197,6 @@ public class MaterialRequestManager } */ - public virtual async Task UpdateDetailsAsync(MaterialRequest newEntity) - { - var oldEntity = await Repository.FindAsync(newEntity.Id, true).ConfigureAwait(false); - - foreach (var newDetail in newEntity.Details) - { - oldEntity.ReplaceDetail(newDetail.Id, newDetail); - } - - foreach (var detail in oldEntity.Details) - { - SetMaterialRequestDetailStatus(detail); - } - - //SetMaterialRequestStatus(oldEntity); - - await Repository.UpdateAsync(oldEntity).ConfigureAwait(false); - } - - private void SetMaterialRequestDetailStatus(MaterialRequestDetail detail) - { - if (detail.Qty > detail.IssuedQty)//要100 实际只有50 - { - if (detail.ReceivedQty >= detail.Qty)//执行的时候发的比100还多 就完成 - { - detail.Status = EnumStatus.Close; - } - else - { - detail.Status=EnumStatus.Open; - } - } - else//要100 实际够100 - { - detail.Status = EnumStatus.Close; - } - } - - public virtual async Task CompleteAsync(string number) - { - var entity = await GetByNumberAsync(number).ConfigureAwait(false); - if (entity!=null &&!entity.Details.Any(p => p.ToBeIssuedQty > 0)) - { - await CompleteAsync(entity).ConfigureAwait(false); - } - } #endregion diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs index 70d496dfa..f3cb5ca84 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs @@ -17,6 +17,13 @@ public class IssueJobEventHandler : , ILocalEventHandler> { + private readonly IBalanceAppService _balanceAppService; + + public IssueJobEventHandler(IBalanceAppService balanceAppService) + { + _balanceAppService = balanceAppService; + } + [UnitOfWork] public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/PurchaseReceiptJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/PurchaseReceiptJobEventHandler.cs index 331faa759..09821b5db 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/PurchaseReceiptJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/PurchaseReceiptJobEventHandler.cs @@ -35,7 +35,7 @@ public class PurchaseReceiptJobEventHandler : var entity = eventData.Entity; //创建收货记录 - await CreatePurchaseReceiptNoteAsync(entity).ConfigureAwait(false); + await BuildPurchaseReceiptNoteAsync(entity).ConfigureAwait(false); } #region 私有 @@ -44,8 +44,9 @@ public class PurchaseReceiptJobEventHandler : /// 创建收货记录 /// /// - private async Task CreatePurchaseReceiptNoteAsync(PurchaseReceiptJob purchaseReceiptJob) + private async Task BuildPurchaseReceiptNoteAsync(PurchaseReceiptJob purchaseReceiptJob) { + var holdLocation = await LocationAclService.GetFirstByTypeAsync(EnumLocationType.HOLD).ConfigureAwait(false); //隔离库位 var createInput = ObjectMapper.Map(purchaseReceiptJob); //未收货记录 @@ -58,6 +59,16 @@ public class PurchaseReceiptJobEventHandler : detailInput.PurchaseReceiptInspectStatus = EnumPurchaseReceiptInspect.NORECEIPT; } + var noOkNoteDetailInputs = + createInput.Details.Where(p => p.PurchaseReceiptInspectStatus == EnumPurchaseReceiptInspect.NOK); + foreach (var detailInput in noOkNoteDetailInputs) + { + detailInput.HandledToLocationArea = holdLocation.AreaCode; + detailInput.HandledToLocationErpCode = holdLocation.ErpLocationCode; + detailInput.HandledToLocationGroup = holdLocation.LocationGroupCode; + detailInput.HandledToWarehouseCode=holdLocation.WarehouseCode; + } + await _purchaseReceiptNoteAppService.CreateAsync(createInput).ConfigureAwait(false); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ItemTransformRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ItemTransformRequestEventHandler.cs index a71aeb6c3..3baf0a20c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ItemTransformRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ItemTransformRequestEventHandler.cs @@ -74,9 +74,9 @@ public class ItemTransformRequestEventHandler ReasonCode = detail.ReasonCode, ToArriveDate = detail.ToArriveDate, ToExpireDate = detail.ToExpireDate, - ToItemDesc1 = detail.ItemDesc1, - ToItemDesc2 = detail.ItemDesc2, - ToItemName = detail.ItemName, + ToItemDesc1 = detail.ToItemDesc1, + ToItemDesc2 = detail.ToItemDesc2, + ToItemName = detail.ToItemName, ToLot = detail.ToLot, ToPackingCode = detail.ToPackingCode, ToQty = detail.ToQty, diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs index df7782591..02937f8ff 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs @@ -28,17 +28,20 @@ public class MaterialRequestEventHandler private readonly IProductionLineAppService _productionLineAppService; private readonly IMaterialRequestManager _materialRequestManager; private readonly ILocationAppService _locationAppService; + private readonly IBalanceAppService _balanceAppService; public MaterialRequestEventHandler( IIssueJobAppService issueJobAppService , IProductionLineAppService productionLineAppService , IMaterialRequestManager materialRequestManager - , ILocationAppService locationAppService) + , ILocationAppService locationAppService + , IBalanceAppService balanceAppService) { _issueJobAppService = issueJobAppService; _productionLineAppService = productionLineAppService; _materialRequestManager = materialRequestManager; _locationAppService = locationAppService; + _balanceAppService = balanceAppService; } /// @@ -121,14 +124,18 @@ public class MaterialRequestEventHandler { var jobs = new List(); - var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); - var toLocationCodes = materialRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList(); - var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false); + var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false);//库存事务 - foreach (var materialRequestDetail in materialRequest.Details.Where(p => p.ToBeIssuedQty > 0))//如果有还有剩余未叫料的数量 则创建新的任务 + var toLocationCodes = materialRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList();//所有发送库位的集合 + var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false);//所有库位的集合 + + var materialRequestDetails = materialRequest.Details.Where(p => p.ToBeIssuedQty > 0);//所有还没发送物品的集合 + foreach (var materialRequestDetail in materialRequestDetails)//如果有还有剩余未叫料的数量 则创建新的任务 { - var toLocation = toLocations.FirstOrDefault(p => p.Code == materialRequestDetail.ToLocationCode); + var toLocation = toLocations.FirstOrDefault(p => p.Code == materialRequestDetail.ToLocationCode);//判断目标库位是否存在 Check.NotNull(toLocation, "库位代码", $"库位 {materialRequestDetail.ToLocationCode} 不存在"); + + //创建详情 var jobDetails = await BuildIssueJobDetailInputsAsync(materialRequest, materialRequestDetail, transactionType, toLocation.LocationGroupCode).ConfigureAwait(false); if (!jobDetails.Any()) { @@ -144,7 +151,7 @@ public class MaterialRequestEventHandler jobs.Add(job); } job.Details.AddRange(jobDetails); - if (materialRequestDetail.ToBeIssuedQty <= 0) + if (materialRequestDetail.ToBeIssuedQty < 0) { materialRequestDetail.Status = EnumStatus.Close; } @@ -204,7 +211,7 @@ public class MaterialRequestEventHandler Statuses = transactionType.OutInventoryStatuses, }; //获取推荐库存 - var recommendList = await BalanceAclService.GetRecommendBalancesAsync(input).ConfigureAwait(false); + var recommendList = await _balanceAppService.GetRecommendBalancesAsync(input).ConfigureAwait(false); //没有推荐库存时 跳过此明细 不生成任务 if (recommendList.Count != 0) { @@ -215,16 +222,17 @@ public class MaterialRequestEventHandler if (materialRequest.UseOnTheWayLocation) { //获取在途库 - var locationDto= await _locationAppService.GetFirstByTypeAsync(EnumLocationType.TRANSPORT).ConfigureAwait(false); + var locationDto = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.TRANSPORT).ConfigureAwait(false); detail.OnTheWayLocationCode = locationDto.Code; } jobDetails.Add(detail); materialRequestDetail.IssuedQty += recommend.Qty; + await _materialRequestManager.UpdateDetailsAsync(materialRequest).ConfigureAwait(false); + } } - return jobDetails; } @@ -240,21 +248,22 @@ public class MaterialRequestEventHandler detail.RecommendPackingCode = balance.PackingCode; detail.RecommendContainerCode = balance.ContainerCode; detail.RecommendSupplierBatch = balance.SupplierBatch; - detail.RecommendProduceDate= balance.ProduceDate; - detail.RecommendExpireDate= balance.ExpireDate; - detail.RecommendLot= balance.Lot; - detail.RecommendProduceDate=balance.ProduceDate; - detail.RecommendArriveDate= balance.ArriveDate; + detail.RecommendProduceDate = balance.ProduceDate; + detail.RecommendExpireDate = balance.ExpireDate; + detail.RecommendLot = balance.Lot; + detail.RecommendProduceDate = balance.ProduceDate; + detail.RecommendArriveDate = balance.ArriveDate; detail.RecommendFromLocationArea = balance.LocationArea; - detail.RecommendFromLocationCode= balance.LocationCode; - detail.RecommendFromLocationErpCode= balance.LocationErpCode; - detail.RecommendFromLocationGroup= balance.LocationGroup; - detail.RecommendFromWarehouseCode= balance.WarehouseCode; + detail.RecommendFromLocationCode = balance.LocationCode; + detail.RecommendFromLocationErpCode = balance.LocationErpCode; + detail.RecommendFromLocationGroup = balance.LocationGroup; + detail.RecommendFromWarehouseCode = balance.WarehouseCode; + detail.RecommendQty = balance.Qty; detail.Uom = balance.Uom; detail.ToLocationCode = materialRequestDetail.ToLocationCode; detail.ToLocationErpCode = materialRequestDetail.ToLocationErpCode; - detail.ToLocationArea= materialRequestDetail.ToLocationArea; + detail.ToLocationArea = materialRequestDetail.ToLocationArea; detail.ToWarehouseCode = materialRequestDetail.ToWarehouseCode; detail.ToLocationGroup = materialRequestDetail.ToLocationGroup; //detail.Operation = //TODO diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/PurchaseReturnNoteEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/PurchaseReturnNoteEventHandler.cs index 4942734d8..0c5f36fa1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/PurchaseReturnNoteEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/PurchaseReturnNoteEventHandler.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using Volo.Abp.EventBus; using Volo.Abp.Uow; +using Win_in.Sfs.Label.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Wms.Inventory.Application.Contracts; @@ -25,14 +26,16 @@ public class PurchaseReturnNoteEventHandler private readonly IPurchaseReturnRequestAppService _purchaseReturnRequestApp; private readonly IPurchaseOrderAppService _purchaseOrderAppService; + private readonly IInventoryLabelAppService _inventoryLabelAppService; public PurchaseReturnNoteEventHandler( IPurchaseReturnRequestAppService purchaseReturnRequestApp - , IPurchaseOrderAppService purchaseOrderAppService - ) + , IPurchaseOrderAppService purchaseOrderAppService, + IInventoryLabelAppService inventoryLabelAppService) { _purchaseReturnRequestApp = purchaseReturnRequestApp; _purchaseOrderAppService = purchaseOrderAppService; + _inventoryLabelAppService = inventoryLabelAppService; } [UnitOfWork] @@ -53,10 +56,15 @@ public class PurchaseReturnNoteEventHandler private async Task UpdatePurchaseOrderAsync(PurchaseReturnNote entity) { - var purchaseOrderDetailUpdateInputs = entity.Details + foreach (var detail in entity.Details) + { + var inventoryLabelDto=await _inventoryLabelAppService.GetByCodeAsync(detail.PackingCode).ConfigureAwait(false); + + var purchaseOrderDetailUpdateInputs = entity.Details .Select(BuildPurchaseOrderDetailUpdateInput).ToList(); - await _purchaseOrderAppService.UpdateDetailsAsync(entity.PoNumber, purchaseOrderDetailUpdateInputs).ConfigureAwait(false); + await _purchaseOrderAppService.UpdateDetailsAsync(entity.PoNumber, purchaseOrderDetailUpdateInputs).ConfigureAwait(false); + } } private static PurchaseOrderDetailUpdateInput BuildPurchaseOrderDetailUpdateInput(PurchaseReturnNoteDetail purchaseReturnNoteDetail) diff --git a/build/src/docker/publish/conf/nginx/nginx.conf b/build/src/docker/publish/conf/nginx/nginx.conf index ab34c37d0..09667bbbc 100644 --- a/build/src/docker/publish/conf/nginx/nginx.conf +++ b/build/src/docker/publish/conf/nginx/nginx.conf @@ -59,7 +59,7 @@ http { index index.html; } - location ^/api/ { + location ~* ^/api/ { proxy_pass http://proxy; if ($http_upgrade ~* "close") { break; @@ -81,7 +81,7 @@ http { index index.html; } - location ^/api/ { + location ~* ^/api/ { proxy_pass http://proxy; if ($http_upgrade ~* "close") { break;