lvzb 2 years ago
parent
commit
052e61ec98
  1. 44
      README.md
  2. 1
      be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs
  3. 48
      be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs
  4. 19
      be/Hosts/Wms.Host/Win_in.Sfs.Wms.Store.HttpApi.Host/scripts/db.Microsoft.EntityFrameworkCore.SqlServer.StoreDbContext.sql
  5. 1
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs
  6. 15
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Transactions/TransactionManager.cs
  7. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs
  8. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs
  9. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/IssueJobAppService.cs
  10. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/BackFlushNotes/BackFlushNoteAppService.cs
  11. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ItemTransformRequests/ItemTransformRequestAppService.cs
  12. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/MaterialRequests/MaterialRequestAppService.cs
  13. 22
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs
  14. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestDetail.cs
  15. 124
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/MaterialRequestManager.cs
  16. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs
  17. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/PurchaseReceiptJobEventHandler.cs
  18. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ItemTransformRequestEventHandler.cs
  19. 49
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/MaterialRequestEventHandler.cs
  20. 16
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/PurchaseReturnNoteEventHandler.cs
  21. 4
      build/src/docker/publish/conf/nginx/nginx.conf

44
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

1
be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/IncomingToWmsExtensions.cs

@ -157,6 +157,7 @@ public static class IncomingToWmsExtensions
var backFlush = JsonSerializer.Deserialize<BackFlushNoteEditInput>(incomingConverted.DataContent);
var balanceAppService = workerContext.ServiceProvider.GetRequiredService<IBalanceAppService>();
var balanceDtos = await balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput()
{
Qty = backFlush.Qty,

48
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<TokenService> _logger;
private readonly IConfiguration _configuration;
public TokenService(IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger<TokenService> logger)
public TokenService(IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger<TokenService> logger)
{
this._httpContextAccessor = httpContextAccessor;
this._httpClientFactory = httpClientFactory;
this._configuration = configuration;
this._logger = logger;
}
[HttpPost]
[HttpPost("token")]
[AllowAnonymous]
public async Task<IActionResult> 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<IActionResult> 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";
}
}

19
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,

1
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;
}

15
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<string> 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);

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/IIssueJobAppService.cs

@ -14,4 +14,6 @@ public interface IIssueJobAppService
Task<PagedResultDto<IssueJobDTO>> GetListByTypeAsync(SfsJobRequestInputBase requestInput, string requestType,
bool includeDetails = false, CancellationToken cancellationToken = default);
Task<List<IssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Orders/PurchaseOrders/IPurchaseOrderAppService.cs

@ -29,7 +29,7 @@ public interface IPurchaseOrderAppService
/// <param name="number"></param>
/// <param name="input"></param>
/// <returns></returns>
Task UpdateDetailsAsync(string number, List<PurchaseOrderDetailUpdateInput> input);
Task UpdateDetailsAsync(string number,List<PurchaseOrderDetailUpdateInput> input);
/// <summary>
/// 【批量创建】到货通知 (收货单)

8
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<List<IssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.MaterialRequestNumber == requestNumber).ConfigureAwait(false);
return ObjectMapper.Map<List<IssueJob>, List<IssueJobDTO>>(entitys);
}
/*
/// <summary>
///

1
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<BackFlushNote>, List<BackFlushNoteDTO>>(entities);
}
}

19
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;
}
}

12
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<MaterialR
private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IIssueJobAppService _issueJobAppService;
public MaterialRequestAppService(
IMaterialRequestRepository repository,
IMaterialRequestManager materialRequestManager,
IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp
, ILocationAppService locationAppService
, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService)
IAreaAppService areaApp,
ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService,
IIssueJobAppService issueJobAppService)
: base(repository, materialRequestManager)
{
_materialRequestManager = materialRequestManager;
@ -61,6 +64,7 @@ public class MaterialRequestAppService : SfsStoreRequestAppServiceBase<MaterialR
_locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService;
_issueJobAppService = issueJobAppService;
}
#region 东阳使用

22
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/PurchaseReturnRequests/PurchaseReturnRequestAppService.cs

@ -37,18 +37,20 @@ public class PurchaseReturnRequestAppService :
private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService;
private readonly IPurchaseReturnRequestManager _purchaseReturnRequestManager;
private readonly IPurchaseOrderAppService _purchaseOrderAppService;
public PurchaseReturnRequestAppService(
IPurchaseReturnRequestRepository repository,
IPurchaseReturnRequestManager purchaseReturnRequestManager,
IInventoryLabelAppService inventoryLabelApp,
ILocationAppService locationAppService,
ITransactionTypeAppService transactionTypeAppService) : base(repository, purchaseReturnRequestManager)
ITransactionTypeAppService transactionTypeAppService,
IPurchaseOrderAppService purchaseOrderAppService) : base(repository, purchaseReturnRequestManager)
{
_purchaseReturnRequestManager = purchaseReturnRequestManager;
_inventoryLabelApp = inventoryLabelApp;
_locationAppService = locationAppService;
_transactionTypeAppService = transactionTypeAppService;
_purchaseOrderAppService = purchaseOrderAppService;
base.CreatePolicyName = PurchaseReturnRequestPermissions.Create;
base.UpdatePolicyName = PurchaseReturnRequestPermissions.Update;
@ -97,13 +99,16 @@ public class PurchaseReturnRequestAppService :
var labelDto = await _inventoryLabelApp.GetByCodeAsync(detail.PackingCode).ConfigureAwait(false);
var balanceDto = await BalanceAclService.GetByPackingCodeAsync(detail.PackingCode).ConfigureAwait(false);
var locationDto= await _locationAppService.GetByCodeAsync(balanceDto.LocationCode).ConfigureAwait(false);
var purchaseOrderDto= await _purchaseOrderAppService.GetByNumberAsync(labelDto.PoNumber).ConfigureAwait(false);
purchaseOrderDto = await _purchaseOrderAppService.GetAsync(purchaseOrderDto.Id).ConfigureAwait(false);
purchaseReturnRequest.AsnNumber = labelDto.AsnNumber;
purchaseReturnRequest.RpNumber = labelDto.RpNumber;
purchaseReturnRequest.ReturnTime=DateTime.Now;
purchaseReturnRequest.SupplierCode= labelDto.SupplierCode;
purchaseReturnRequest.ReturnType = EnumPurchaseReturnType.AfterPuton;
purchaseReturnRequest.PoNumber = labelDto.PoNumber;
await SetDetailPropertiesAsync(detail, labelDto, balanceDto,locationDto).ConfigureAwait(false);
await SetDetailPropertiesAsync(detail, labelDto, balanceDto,locationDto, purchaseOrderDto).ConfigureAwait(false);
}
}
@ -135,12 +140,15 @@ public class PurchaseReturnRequestAppService :
/// <param name="labelDto"></param>
/// <param name="balanceDto"></param>
/// <param name="locationDto"></param>
/// <param name="purchaseOrderDto"></param>
/// <returns></returns>
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

2
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; }
/// <summary>
/// 请求未发
/// 请求未发 还未发送的数量
/// </summary>
[NotMapped]
public decimal ToBeIssuedQty => Qty - IssuedQty;

124
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;
}
/// <summary>
@ -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

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/IssueJobEventHandler.cs

@ -17,6 +17,13 @@ public class IssueJobEventHandler :
, ILocalEventHandler<SfsCancelledEntityEventData<IssueJob>>
{
private readonly IBalanceAppService _balanceAppService;
public IssueJobEventHandler(IBalanceAppService balanceAppService)
{
_balanceAppService = balanceAppService;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<IssueJob> eventData)
{

15
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 :
/// 创建收货记录
/// </summary>
/// <returns></returns>
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, PurchaseReceiptNoteEditInput>(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);
}

6
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,

49
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;
}
/// <summary>
@ -121,14 +124,18 @@ public class MaterialRequestEventHandler
{
var jobs = new List<IssueJobEditInput>();
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

16
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)

4
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;

Loading…
Cancel
Save