郑勃旭 1 year ago
parent
commit
29d9eaa896
  1. 88
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesOutConverter.cs
  2. 14
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/appsettings.json
  3. 2
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/TyrpOutgoingBackgroundWorker.cs
  4. 7
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/UnplannedIssueNoteConverter.cs
  5. 9
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/UnplannedReceiptNoteConverter.cs
  6. 5
      be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/UnplannedIssueNote/UnplannedIssueNoteExchangeDto.cs
  7. 5
      be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/UnplannedReceiptNote/UnplannedReceiptNoteExchangeDto.cs
  8. 10
      be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml
  9. 2
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/UnplannedIssueJobController.cs
  10. 2
      be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/UnplannedReceiptJobController.cs
  11. 1
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs
  12. 5
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/Inputs/RecommendBalanceRequestInput.cs
  13. 29
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs
  14. 153
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs
  15. 1
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs
  16. 2
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedIssueType.cs
  17. 2
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedReceiptType.cs
  18. 7
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain/CurrentUserExtensions.cs
  19. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDTO.cs
  20. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/Inputs/UnplannedIssueJobEditInput.cs
  21. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedReceiptJobs/DTOs/UnplannedReceiptJobDTO.cs
  22. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedReceiptJobs/Inputs/UnplannedReceiptJobEditInput.cs
  23. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedIssueNotes/DTOs/UnplannedIssueNoteDTO.cs
  24. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedIssueNotes/Inputs/UnplannedIssueNoteEditInput.cs
  25. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedReceiptNotes/DTOs/UnplannedReceiptNoteDTO.cs
  26. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedReceiptNotes/Inputs/UnplannedReceiptNoteEditInput.cs
  27. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs
  28. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs
  29. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs
  30. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDTO.cs
  31. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/IUnplannedReceiptRequestAppService.cs
  32. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestEditInput.cs
  33. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Bases/SfsStoreRequestAppServiceBase.cs
  34. 16
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs
  35. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAutoMapperProfile.cs
  36. 166
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  37. 16
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAppService.cs
  38. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAutoMapperProfile.cs
  39. 98
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs
  40. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/ISfsStoreManager.cs
  41. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreManagerBase.cs
  42. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs
  43. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs
  44. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedReceiptJobs/UnplannedReceiptJob.cs
  45. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobManager.cs
  46. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/UnplannedIssueNotes/UnplannedIssueNote.cs
  47. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/UnplannedReceiptNotes/UnplannedReceiptNote.cs
  48. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedIssueRequests/UnplannedIssueRequest.cs
  49. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequest.cs
  50. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/UnplannedReceiptJobAutoMapperProfile.cs
  51. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/UnplannedIssueRequestAutoMapperProfile.cs
  52. 14
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedIssueRequestEventHandler.cs
  53. 17
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedReceiptRequestEventHandler.cs

88
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/Incoming/MesOutConverter.cs

@ -85,53 +85,61 @@ public class MesOutConverter : IIncomingConverter
{
var productReceiptNote = JsonSerializer.Deserialize<ProductReceiptNoteExchangeDto>(incomingFromExternal.DestinationDataContent);
var wmsProductReceiptNoteDetail = _objectMapper.Map<ProductReceiptNoteDetailExchangeDto, ProductReceiptNoteDetailInput>(productReceiptNote.Detail);
wmsProductReceiptNoteDetail.Lot = ""; //排序批次
wmsProductReceiptNoteDetail.PackingCode = "";//箱标签
wmsProductReceiptNoteDetail.Status = EnumInventoryStatus.OK;
wmsProductReceiptNoteDetail.WarehouseCode = "T8";
wmsProductReceiptNoteDetail.LocationArea = "";
wmsProductReceiptNoteDetail.LocationGroup = "";
var loc = await _locationAppService.GetListByTypesAndErpCodeAsync(types, wmsProductReceiptNoteDetail.LocationErpCode, wmsProductReceiptNoteDetail.LocationErpCode).ConfigureAwait(false);
if (loc != null)
var oldNoteDetail= wmsProductReceiptNote.Details.FirstOrDefault(r => r.ItemCode == wmsProductReceiptNoteDetail.ItemCode && r.LocationErpCode == wmsProductReceiptNoteDetail.LocationErpCode);
if (oldNoteDetail != null)
{
wmsProductReceiptNoteDetail.LocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.LocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.LocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.LocationErpCode = loc[0].ErpLocationCode;
oldNoteDetail.Qty = oldNoteDetail.Qty+wmsProductReceiptNoteDetail.Qty;
}
else
{
wmsProductReceiptNoteDetail.Lot = ""; //排序批次
wmsProductReceiptNoteDetail.PackingCode = "";//箱标签
wmsProductReceiptNoteDetail.Status = EnumInventoryStatus.OK;
wmsProductReceiptNoteDetail.WarehouseCode = "T8";
wmsProductReceiptNoteDetail.LocationArea = "";
wmsProductReceiptNoteDetail.LocationGroup = "";
var loc = await _locationAppService.GetListByTypesAndErpCodeAsync(types, wmsProductReceiptNoteDetail.LocationErpCode, wmsProductReceiptNoteDetail.LocationErpCode).ConfigureAwait(false);
if (loc != null)
{
wmsProductReceiptNoteDetail.LocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.LocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.LocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.LocationErpCode = loc[0].ErpLocationCode;
wmsProductReceiptNoteDetail.HandledToLocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.HandledToLocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.HandledToLocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.HandledToLocationErpCode = loc[0].ErpLocationCode;
wmsProductReceiptNoteDetail.HandledToLocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.HandledToLocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.HandledToLocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.HandledToLocationErpCode = loc[0].ErpLocationCode;
wmsProductReceiptNoteDetail.RecommendToLocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.RecommendToLocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.RecommendToLocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.RecommendToLocationErpCode = loc[0].ErpLocationCode;
}
wmsProductReceiptNoteDetail.RecommendToLocationCode = loc[0].Code;
wmsProductReceiptNoteDetail.RecommendToLocationArea = loc[0].AreaCode;
wmsProductReceiptNoteDetail.RecommendToLocationGroup = loc[0].LocationGroupCode;
wmsProductReceiptNoteDetail.RecommendToLocationErpCode = loc[0].ErpLocationCode;
}
var item = await _itemBasicAppService.GetByCodeAsync(wmsProductReceiptNoteDetail.ItemCode).ConfigureAwait(false);
if (item != null)
{
wmsProductReceiptNoteDetail.ItemName = !string.IsNullOrEmpty(item.Name) ? item.Name : "";
wmsProductReceiptNoteDetail.ItemDesc1 = !string.IsNullOrEmpty(item.Desc1) ? item.Desc1 : "";
wmsProductReceiptNoteDetail.ItemDesc2 = !string.IsNullOrEmpty(item.Desc2) ? item.Desc2 : "";
wmsProductReceiptNoteDetail.Uom = !string.IsNullOrEmpty(item.BasicUom) ? item.BasicUom : "";
var item = await _itemBasicAppService.GetByCodeAsync(wmsProductReceiptNoteDetail.ItemCode).ConfigureAwait(false);
if (item != null)
{
wmsProductReceiptNoteDetail.ItemName = !string.IsNullOrEmpty(item.Name) ? item.Name : "";
wmsProductReceiptNoteDetail.ItemDesc1 = !string.IsNullOrEmpty(item.Desc1) ? item.Desc1 : "";
wmsProductReceiptNoteDetail.ItemDesc2 = !string.IsNullOrEmpty(item.Desc2) ? item.Desc2 : "";
wmsProductReceiptNoteDetail.Uom = !string.IsNullOrEmpty(item.BasicUom) ? item.BasicUom : "";
wmsProductReceiptNoteDetail.ProduceDate = incomingFromExternal.EffectiveDate;
wmsProductReceiptNoteDetail.ArriveDate = incomingFromExternal.EffectiveDate;
wmsProductReceiptNoteDetail.ExpireDate = wmsProductReceiptNoteDetail.ProduceDate.AddDays(item.GetValidateDays());
wmsProductReceiptNoteDetail.ProduceDate = incomingFromExternal.EffectiveDate;
wmsProductReceiptNoteDetail.ArriveDate = incomingFromExternal.EffectiveDate;
wmsProductReceiptNoteDetail.ExpireDate = wmsProductReceiptNoteDetail.ProduceDate.AddDays(item.GetValidateDays());
}
else
{
//todo 这里不应该做完工 没有零件
wmsProductReceiptNoteDetail.ItemName = "";
wmsProductReceiptNoteDetail.ItemDesc1 = "";
wmsProductReceiptNoteDetail.ItemDesc2 = "";
wmsProductReceiptNoteDetail.Uom = "";
}
wmsProductReceiptNote.Details.Add(wmsProductReceiptNoteDetail);
}
else
{
//todo 这里不应该做完工 没有零件
wmsProductReceiptNoteDetail.ItemName = "";
wmsProductReceiptNoteDetail.ItemDesc1 = "";
wmsProductReceiptNoteDetail.ItemDesc2 = "";
wmsProductReceiptNoteDetail.Uom = "";
}
wmsProductReceiptNote.Details.Add(wmsProductReceiptNoteDetail);
}
incomingToWms.DataContent = JsonSerializer.Serialize(wmsProductReceiptNote);
incomingToWmsList.Add(incomingToWms);

14
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent/appsettings.json

@ -1,12 +1,12 @@
{
"ConnectionStrings": {
"Default": "Server=10.164.0.226,51433;Database=Wms_Dy_AnHui;uid=sa;pwd=Microsoft2008;TrustServerCertificate=True",
"DataExchange": "Server=10.164.0.226,51433;Database=Wms_DataExchange_Main_Dy_AnHui;uid=sa;pwd=Microsoft2008;TrustServerCertificate=True",
"MES": "Server=10.164.0.232,1818;Database=MES_AH;uid=AhMesUser;pwd=Faty@Mes_20230312#AH;TrustServerCertificate=True"
"Default": "Server=10.164.113.32,1818\\SHDB;Database=Wms_Dy_ShangHai;uid=ShWmsUser;pwd=Faty@Wms_20230413#SH;TrustServerCertificate=True",
"DataExchange": "Server=10.164.113.32,1818\\SHDB;Database=Wms_DataExchange_Main_Dy_ShangHai;uid=ShWmsUser;pwd=Faty@Wms_20230413#SH;TrustServerCertificate=True",
"MES": "Server=10.164.113.32,1818\\SHDB;Database=MES_SH;uid=ShWmsUser;pwd=Faty@Wms_20230413#SH;TrustServerCertificate=True"
},
"AuthServer": {
"Authority": "http://10.164.0.227:60083/",
"Authority": "http://10.164.113.31:60083/",
"RequireHttpsMetadata": "false",
"SwaggerClientId": "admin",
"SwaggerClientSecret": "1q2w3E*",
@ -24,13 +24,13 @@
"RemoteServices": {
"BaseData": {
"BaseUrl": "http://10.164.0.227:60084/"
"BaseUrl": "http://10.164.113.31:60084/"
},
"Store": {
"BaseUrl": "http://10.164.0.227:60085/"
"BaseUrl": "http://10.164.113.31:60085/"
},
"Label": {
"BaseUrl": "http://10.164.0.227:60082/"
"BaseUrl": "http://10.164.113.31:60082/"
}
},

2
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/TyrpOutgoingBackgroundWorker.cs

@ -34,7 +34,7 @@ public class TyrpOutgoingBackgroundWorker : AsyncPeriodicBackgroundWorkerBase
{
Logger.LogInformation($"Starting: Handling {Outgoing}");
if (!_options.Value.IncomingOptions.Active)
if (!_options.Value.OutgoingOptions.Active)
{
Logger.LogInformation($"{Outgoing} is not active!");
return;

7
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/UnplannedIssueNoteConverter.cs

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Auth.Users;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.DataExchange.Domain;
using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp;
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
@ -16,7 +17,6 @@ namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Outgoing;
public class UnplannedIssueNoteConverter : IOutgoingConverter
{
private readonly string billtype = "4013";
private readonly IOutgoingFromWmsManager _outgoingFromWmsManager;
private readonly IOutgoingToExternalManager _outgoingToExternalManager;
private readonly IDepartmentAppService _departmentAppService;
@ -125,6 +125,11 @@ public class UnplannedIssueNoteConverter : IOutgoingConverter
/// <returns></returns>
private Wmsoutm BuildDataInterface(UnplannedIssueNoteExchangeDto exchangeOrder,string tyrpNumber,string departmentCode)
{
string billtype = "4013";
if (exchangeOrder.UnplannedIssueType== EnumUnplannedIssueType.Wip)
{
billtype = "4036";
}
var ret = new Wmsoutm()
{
wmsoutm_nbr = tyrpNumber,

9
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent/Outgoing/UnplannedReceiptNoteConverter.cs

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Auth.Users;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.DataExchange.Domain;
using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp;
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
@ -16,7 +17,7 @@ namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Outgoing;
public class UnplannedReceiptNoteConverter : IOutgoingConverter
{
private readonly string billtype = "4014";
//private readonly string billtype = "4014";
private readonly IOutgoingFromWmsManager _outgoingFromWmsManager;
private readonly IOutgoingToExternalManager _outgoingToExternalManager;
private readonly IDepartmentAppService _departmentAppService;
@ -125,7 +126,11 @@ public class UnplannedReceiptNoteConverter : IOutgoingConverter
/// <returns></returns>
private Wmsoutm BuildDataInterface(UnplannedReceiptNoteExchangeDto exchangeOrder, string tyrpNumber,string departmentCode)
{
string billtype = "4014";
if (exchangeOrder.UnplannedReceiptType == EnumUnplannedReceiptType.Wip)
{
billtype = "4036";
}
var ret = new Wmsoutm()
{
wmsoutm_nbr = tyrpNumber,

5
be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/UnplannedIssueNote/UnplannedIssueNoteExchangeDto.cs

@ -1,4 +1,5 @@
using System;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.DataExchange.WMS.UnplannedIssueNote;
@ -22,4 +23,8 @@ public class UnplannedIssueNoteExchangeDto
/// 生效日期
/// </summary>
public DateTime ActiveDate { get; set; } = DateTime.Now.Date;
/// <summary>
/// 领料类别
/// </summary>
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
}

5
be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/WMS/UnplannedReceiptNote/UnplannedReceiptNoteExchangeDto.cs

@ -1,4 +1,5 @@
using System;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.DataExchange.WMS.UnplannedReceiptNote;
@ -23,5 +24,9 @@ public class UnplannedReceiptNoteExchangeDto
/// 生效日期
/// </summary>
public DateTime ActiveDate { get; set; } = DateTime.Now.Date;
/// <summary>
/// 退料类别
/// </summary>
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
}

10
be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Application.Contracts/Win_in.Sfs.Wms.DataExchange.Application.Contracts.xml

@ -1671,6 +1671,11 @@
生效日期
</summary>
</member>
<member name="P:Win_in.Sfs.Wms.DataExchange.WMS.UnplannedIssueNote.UnplannedIssueNoteExchangeDto.UnplannedIssueType">
<summary>
领料类别
</summary>
</member>
<member name="P:Win_in.Sfs.Wms.DataExchange.WMS.UnplannedReceiptNote.UnplannedReceiptNoteDetailExchangeDto.Number">
<summary>
单据号
@ -1726,6 +1731,11 @@
生效日期
</summary>
</member>
<member name="P:Win_in.Sfs.Wms.DataExchange.WMS.UnplannedReceiptNote.UnplannedReceiptNoteExchangeDto.UnplannedReceiptType">
<summary>
退料类别
</summary>
</member>
<member name="P:Win_in.Sfs.Wms.DataExchange.WMS.User.IdentityUserExchangerDto.UserName">
<summary>
用户号码

2
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/UnplannedIssueJobController.cs

@ -68,7 +68,7 @@ public class UnplannedIssueJobController : AbpController
{
Filters = new List<Filter>
{
new(nameof(UnplannedIssueJobDTO.WorkGroupCode),jsonWlgCodes,"In"),
// new(nameof(UnplannedIssueJobDTO.WorkGroupCode),jsonWlgCodes,"In"),
new(nameof(UnplannedIssueJobDTO.JobStatus),jsonStatus,"In")
}
}

2
be/Hosts/WmsPda.Host/Win_in.Sfs.Wms.Pda.Host/Controllers/Jobs/UnplannedReceiptJobController.cs

@ -67,7 +67,7 @@ public class UnplannedReceiptJobController : AbpController
{
Filters = new List<Filter>
{
new(nameof(UnplannedReceiptJobDTO.WorkGroupCode),jsonWlgCodes,"In"),
// new(nameof(UnplannedReceiptJobDTO.WorkGroupCode),jsonWlgCodes,"In"),
new(nameof(UnplannedReceiptJobDTO.JobStatus),jsonStatus,"In")
}
}

1
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs

@ -164,4 +164,5 @@ public interface IBalanceAppService
/// <param name="itemCode"></param>
/// <returns></returns>
Task<List<BalanceDTO>> GetListByErpLocationCodeAndItemCodeAsync(string erplocationCode, string itemCode);
Task<List<BalanceDTO>> GetRecommendBalancesByLocationsAsync(RecommendBalanceRequestInput input);
}

5
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/Inputs/RecommendBalanceRequestInput.cs

@ -28,6 +28,11 @@ public class RecommendBalanceRequestInput
[Display(Name = "库区域")]
public List<string> LocationAreas { get; set; }
/// <summary>
/// 库位
/// </summary>
[Display(Name = "库位")]
public List<string> Locations { get; set; }
/// <summary>
/// 库存状态
/// </summary>
[Display(Name = "库存状态")]

29
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs

@ -4,6 +4,7 @@ using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
@ -465,23 +466,39 @@ public class BalanceAppService
}
/// <summary>
/// 根据发料任务需求,算出推荐的库存 (在获取时 已经添加预占用)
/// 根据发料任务需求的库位,算出推荐的库存 (在获取时 已经添加预占用)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
[HttpGet("recommend-list-location")]
public virtual async Task<List<BalanceDTO>> GetRecommendBalancesAsync1(RecommendBalanceRequestInput input)
[HttpGet("recommend-list-location-by-locations")]
public virtual async Task<List<BalanceDTO>> GetRecommendBalancesByLocationsAsync(RecommendBalanceRequestInput input)
{
var traceId = GuidGenerator.Create();
var itemCode = input.ItemCode;
var qty = input.Qty;
var locationTypes = input.LocationTypes;
var locationAreas = input.LocationAreas;
var locations = input.Locations;
var statuses = input.Statuses;
foreach (var location in locations)
{
var locationDto = await _locationAclService.GetByCodeAsync(location).ConfigureAwait(false);
if (locationDto != null)
{
if(input.LocationAreas==null)
{
input.LocationAreas = new List<string>();
}
input.LocationAreas.Add(locationDto.AreaCode);
if (input.LocationTypes == null)
{
input.LocationTypes = new List<EnumLocationType>();
}
input.LocationTypes.Add(locationDto.Type);
}
}
Logger.LogDebug(traceId + "|Input:" + input);
var balances = await _balanceManager.GetRecommendBalancesAsync(traceId, itemCode, qty, locationTypes, locationAreas, statuses).ConfigureAwait(false);
var balances = await _balanceManager.GetRecommendBalancesByLocationAsync(traceId, itemCode, qty, locations, statuses).ConfigureAwait(false);
var dtos = ObjectMapper.Map<List<Balance>, List<BalanceDTO>>(balances);

153
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs

@ -436,6 +436,159 @@ public class BalanceManager : DomainService, IBalanceManager
#region GetRecommendList
/// <summary>
/// 根据库位获取推荐库位
/// </summary>
/// <param name="traceId"></param>
/// <param name="itemCode"></param>
/// <param name="requestQty"></param>
/// <param name="validLocationTypes"></param>
/// <param name="validLocationAreas"></param>
/// <param name="validStatuses"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
public virtual async Task<List<Balance>> GetRecommendBalancesByLocationAsync(Guid traceId, string itemCode,
decimal requestQty, List<string> validLocations,
List<EnumInventoryStatus> validStatuses)
{
var recommendBalances = new List<Balance>();//返回可使用的推荐库存余额
var item = await _itemBasicAclService.GetByCodeAsync(itemCode).ConfigureAwait(false);
if (item == null) //物品是否存在
{
// throw new UserFriendlyException($"未找到代码为 {itemCode} 的物料记录");
return recommendBalances;
}
//构造查询条件
Expression<Func<Balance, bool>> expression = p => p.ItemCode == itemCode;
expression = expression.And(p => validStatuses.Contains(p.Status));
expression = expression.And(p => p.IsActive);
//如果物品的有效期不是无限的, 要过滤掉过期库存
if (item.ValidityUnit != EnumValidityUnit.Infinite)
{
expression = expression.And(p => p.ExpireDate > DateTime.Now);
}
//筛选有效库区 2023-6-29 李智慧 王旭 袁静雯 确认不需要做区域校验
//if (validLocationAreas.Any())
//{
// if (!string.IsNullOrEmpty(validLocationAreas[0]))
// {
// expression = expression.And(p => validLocationAreas.Contains(p.LocationArea));
// }
//}
var allBalances = await
(await _balanceRepository.GetDbSetAsync().ConfigureAwait(false))
.Where(expression)
.AsNoTracking()
.ToListAsync().ConfigureAwait(false);
var balanceLocationCodes = allBalances.Select(p => p.LocationCode).Distinct().ToList();
var locations = await _locationAclService.GetByCodesAsync(balanceLocationCodes).ConfigureAwait(false);
//筛选有效库位类型
if (validLocations.Any())
{
locations = locations.Where(p => validLocations.Contains(p.Code)).ToList();
}
var locationCodes = locations.Where(p => p.EnablePick).Select(p => p.Code).ToList();
Logger.LogDebug(traceId + "|Locations:" + locationCodes.JoinAsString(","));
if (!locationCodes.Any())
{
return recommendBalances;
}
//获取物品存储关系
var itemStoreRelationDict = await GetItemStoreRelationDictAsync(itemCode, locationCodes).ConfigureAwait(false);
//过滤掉无用的库位代码
locationCodes = itemStoreRelationDict.Keys.ToList();
locations = locations.Where(p => locationCodes.Contains(p.Code)).ToList();
Logger.LogDebug(traceId + "|LocationsInStoreRelation:" + locationCodes.JoinAsString(","));
var usableBalances = allBalances.Where(p => locationCodes.Contains(p.LocationCode)).ToList();
LogDebug(traceId, usableBalances, "Balances");
if (!usableBalances.Any())
{
return recommendBalances;
}
//读取该itemCode的预占用库存
var expectOuts = await
(await _expectOutRepository.GetDbSetAsync().ConfigureAwait(false))
.AsNoTracking()
.Where(p => p.ItemCode == itemCode
&& locationCodes.Contains(p.LocationCode)
&& validStatuses.Contains(p.Status))
.ToListAsync().ConfigureAwait(false);
LogDebug(traceId, expectOuts, "ExpectOut");
var containerCodes = usableBalances
.Where(p => !string.IsNullOrEmpty(p.ContainerCode))
.Select(p => p.ContainerCode)
.ToList();
var expectOutContainerCodes = await
(await _expectOutRepository.GetDbSetAsync().ConfigureAwait(false))
.Where(p => containerCodes.Contains(p.ContainerCode))
.GroupBy(p => p.ContainerCode)
.Select(d => d.Key)
.ToListAsync().ConfigureAwait(false);
usableBalances
//扣减已占用库存
.DecreaseExpectOutQty(expectOuts, locations)
//去除不可拆箱 拆托的且有预占用的库存余额
.IgnoreExpectOutOfSameContainer(expectOutContainerCodes, itemStoreRelationDict, locations)
//过滤掉不允许拣料的库位
.FilterLocationEnablePickAsync(locations)
//排序库存余额 最终可用的余额集合
.SortByFifo();
LogDebug(traceId, usableBalances, "AvailableBalances");
var usableBalanceQueue = new Queue<Balance>(usableBalances);
var remainQty = requestQty;
while (usableBalanceQueue.TryDequeue(out var usableBalance))
{
if (usableBalance.Qty <= 0)
{
continue;
}
var location = locations.First(p => p.Code == usableBalance.LocationCode);
var itemStoreRelation = itemStoreRelationDict[usableBalance.LocationCode];
var recommendBalance = new Balance(usableBalance);
var recommendQty =
GetRecommendQty(traceId, requestQty, remainQty, usableBalance, location, itemStoreRelation);
recommendBalance.Qty = recommendQty;
recommendBalances.Add(recommendBalance);
remainQty -= recommendQty;
//如果剩余数量小于等于零, 说明所有请求数量已满足, 退出循环
if (remainQty <= 0)
{
break;
}
}
return recommendBalances;
#region Old
// var availableQty = GetAvailableQty(traceId, requestQty, 0, usableBalances, itemStoreRelationDict, locations, recommendBalances);
//
// if (availableQty >= requestQty)
// {
// return recommendBalances;
// }
// var availableBalanceQty = usableBalances.Sum(p => p.Qty);
// throw new UserFriendlyException($"物料 {itemCode} 的可用库存余额 {availableBalanceQty} 不足");
#endregion
}
/// <summary>
/// 获取推荐库位
/// </summary>

1
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs

@ -33,4 +33,5 @@ public interface IBalanceManager : IDomainService
Task<List<string>> GetItemCodesOfLocationAsync(string locationCode);
Task<Balance> ModifyAsync(Balance balance);
Task<List<Balance>> GetListByLocationTypeAndInventoryStatusAsync(string itemCode, EnumInventoryStatus enumInventoryStatus, List<EnumLocationType> enumLocationTypes);
Task<List<Balance>> GetRecommendBalancesByLocationAsync(Guid traceId, string itemCode, decimal requestQty, List<string> validLocations, List<EnumInventoryStatus> validStatuses);
}

2
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedIssueType.cs

@ -8,8 +8,6 @@ using System.Threading.Tasks;
namespace Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
public enum EnumUnplannedIssueType
{
[Display(Name = "无")]
None =0,
[Display(Name = "原料 非生产领料")]
Raw = 1,//原料 非生产领料
[Display(Name = "线边 非生产领料")]

2
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumUnplannedReceiptType.cs

@ -8,8 +8,6 @@ using System.Threading.Tasks;
namespace Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
public enum EnumUnplannedReceiptType
{
[Display(Name = "无")]
None =0,
[Display(Name = "原料 非生产退料")]
Raw = 1,//原料 非生产退料
[Display(Name = "线边 非生产退料")]

7
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain/CurrentUserExtensions.cs

@ -10,7 +10,12 @@ public static class CurrentUserExtensions
}
public static string GetName(this ICurrentUser currentUser)
{
{
return currentUser.Name;
}
public static string GetUserName_New(this ICurrentUser currentUser)
{
return currentUser.UserName;
}
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/DTOs/UnplannedIssueJobDTO.cs

@ -41,4 +41,11 @@ public class UnplannedIssueJobDTO : SfsJobDTOBase<UnplannedIssueJobDetailDTO>
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
[StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string OANumber { get; set; }
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/Inputs/UnplannedIssueJobEditInput.cs

@ -69,4 +69,11 @@ public class UnplannedIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCr
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedReceiptJobs/DTOs/UnplannedReceiptJobDTO.cs

@ -20,4 +20,11 @@ public class UnplannedReceiptJobDTO : SfsJobDTOBase<UnplannedReceiptJobDetailDTO
[Display(Name = "退料类别")]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
[StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string OANumber { get; set; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedReceiptJobs/Inputs/UnplannedReceiptJobEditInput.cs

@ -69,4 +69,9 @@ public class UnplannedReceiptJobEditInput : SfsJobCreateUpdateInputBase, ISfsJob
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedIssueNotes/DTOs/UnplannedIssueNoteDTO.cs

@ -39,5 +39,11 @@ public class UnplannedIssueNoteDTO : SfsStoreDTOBase<UnplannedIssueNoteDetailDTO
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
[StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedIssueNotes/Inputs/UnplannedIssueNoteEditInput.cs

@ -61,4 +61,10 @@ public class UnplannedIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedReceiptNotes/DTOs/UnplannedReceiptNoteDTO.cs

@ -38,4 +38,10 @@ public class UnplannedReceiptNoteDTO : SfsStoreDTOBase<UnplannedReceiptNoteDetai
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
[StringLength(SfsEfCorePropertyConst.NameLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string OANumber { get; set; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/UnplannedReceiptNotes/Inputs/UnplannedReceiptNoteEditInput.cs

@ -61,4 +61,9 @@ public class UnplannedReceiptNoteEditInput : SfsStoreCreateOrUpdateInputBase
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs

@ -32,4 +32,10 @@ public class UnplannedIssueRequestDTO : SfsStoreRequestDTOBase<UnplannedIssueReq
[Display(Name = "领料类别")]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs

@ -1,7 +1,9 @@
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IUnplannedIssueRequestAppService
: ISfsStoreRequestMasterAppServiceBase<UnplannedIssueRequestDTO, SfsStoreRequestInputBase, UnplannedIssueRequestEditInput, UnplannedIssueRequestDetailDTO, SfsStoreRequestInputBase>
{
Task<UnplannedIssueRequestDTO> CreateByOAAsync(UnplannedIssueRequestEditInput input);
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs

@ -47,4 +47,11 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
#endregion
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDTO.cs

@ -34,4 +34,9 @@ public class UnplannedReceiptRequestDTO : SfsStoreRequestDTOBase<UnplannedReceip
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/IUnplannedReceiptRequestAppService.cs

@ -1,7 +1,9 @@
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IUnplannedReceiptRequestAppService
: ISfsStoreRequestMasterAppServiceBase<UnplannedReceiptRequestDTO, SfsStoreRequestInputBase, UnplannedReceiptRequestEditInput, UnplannedReceiptRequestDetailDTO, SfsStoreRequestInputBase>
{
Task<UnplannedReceiptRequestDTO> CreateByOAAsync(UnplannedReceiptRequestEditInput input);
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestEditInput.cs

@ -47,4 +47,9 @@ public class UnplannedReceiptRequestEditInput : SfsStoreRequestCreateOrUpdateInp
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Bases/SfsStoreRequestAppServiceBase.cs

@ -60,11 +60,17 @@ public abstract class SfsStoreRequestAppServiceBase<TEntity, TEntityDto, TReques
{
var entity = await _repository.FindAsync(id).ConfigureAwait(false);
Check.NotNull(entity, typeof(TEntity).Name);
entity = ModifyEntityBeforeAgree(entity);
var result = await _requestManager.AgreeAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<TEntity, TEntityDto>(result);
return dto;
}
protected virtual TEntity ModifyEntityBeforeAgree(TEntity obj)
{
return obj;
}
/// <summary>
/// 拒绝请求
/// </summary>

16
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs

@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -42,5 +43,20 @@ public abstract class UnplannedIssueRequestAppService :
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto;
}
/// <summary>
/// OA创建计划外出库申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("create-by-oa")]
//[Authorize(UnplannedIssueRequestPermissions.Create)]
public virtual async Task<UnplannedIssueRequestDTO> CreateByOAAsync(UnplannedIssueRequestEditInput input)
{
var entity = ObjectMapper.Map<UnplannedIssueRequestEditInput, UnplannedIssueRequest>(input);
await _unplannedIssueRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto;
}
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAutoMapperProfile.cs

@ -63,5 +63,11 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.TenantId)
.Ignore(x => x.Id)
.Ignore(x => x.ExtraProperties);
CreateMap<UnplannedIssueRequestEditInput, UnplannedIssueRequest>();
CreateMap<UnplannedIssueRequestDetailInput, UnplannedIssueRequestDetail>();
}
}

166
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs

@ -3,9 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Users;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
@ -23,25 +25,53 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
private readonly IDepartmentAppService _departmentApp;
private readonly IUnplannedIssueRequestManager _unplannedIssueRequestManager;
private readonly IBalanceAppService _balanceAppService;
private readonly IDepartmentAppService _departmentAppService;
private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAclService _transactionTypeAclService;
public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager,
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, IDepartmentAppService departmentAppService, ILocationAppService locationAppService,
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService,
ITransactionTypeAclService transactionTypeAclService
) : base(repository, unplannedIssueRequestManager)
{
_unplannedIssueRequestManager = unplannedIssueRequestManager;
_departmentApp = departmentApp;
_balanceAppService = balanceAppService;
_departmentAppService = departmentAppService;
_locationAppService = locationAppService;
_transactionTypeAclService = transactionTypeAclService;
}
/// <summary>
/// OA创建计划外出库申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("create-by-oa")]
//[Authorize(UnplannedIssueRequestPermissions.Create)]
public override async Task<UnplannedIssueRequestDTO> CreateByOAAsync(UnplannedIssueRequestEditInput input)
{
var entity = ObjectMapper.Map<UnplannedIssueRequestEditInput, UnplannedIssueRequest>(input);
foreach (var item in entity.Details)
{
await SetDetailPropertiesAsync(item, input.UnplannedIssueType).ConfigureAwait(false);
}
entity.AutoCompleteJob = false;
entity.AutoSubmit = true;
entity.AutoAgree = true;
entity.AutoHandle = true;
if (entity.UnplannedIssueType == EnumUnplannedIssueType.Wip)
{
entity.DirectCreateNote = true;
}
else
{
entity.DirectCreateNote = false;
}
await _unplannedIssueRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<UnplannedIssueRequest, UnplannedIssueRequestDTO>(entity);
return dto;
}
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
@ -53,57 +83,99 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
foreach (var unplannedIssueRequest in addList)
{
unplannedIssueRequest.Worker = CurrentUser.GetUserName();
unplannedIssueRequest.CreatorId = CurrentUser.Id;
if(unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip&& unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw)
{
throw new UserFriendlyException($"【{unplannedIssueRequest.UnplannedIssueType}】领料类型," +
$"不是{EnumUnplannedIssueType.Wip.GetDisplayName()}" +
$"或{EnumUnplannedIssueType.Raw.GetDisplayName()}】");
}
await SetRequestAutoPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false);
List<UnplannedIssueRequestDetail> newDetails = new List<UnplannedIssueRequestDetail>();
foreach (var detail in unplannedIssueRequest.Details)
{
if (unplannedIssueRequest.UnplannedIssueType == EnumUnplannedIssueType.Raw)
{
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (locationDto.Type != EnumLocationType.RAW || locationDto.Type != EnumLocationType.SEMI)
if (locationDto.Type != EnumLocationType.RAW && locationDto.Type != EnumLocationType.SEMI)
{
throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," +
$"不是{EnumLocationType.RAW.GetDisplayName()}" +
$"或{EnumLocationType.SEMI.GetDisplayName()}】");
}
//需要复制一个这个方法 去掉区域参数 换成库位参数
//_balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput()
//{
// ItemCode = detail.ItemCode,
//});
unplannedIssueRequest.DirectCreateNote = false;
}
if (unplannedIssueRequest.UnplannedIssueType == EnumUnplannedIssueType.Wip)
{
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (locationDto.Type != EnumLocationType.WIP)
{
throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," +
$"不是{EnumLocationType.WIP.GetDisplayName()}");
}
//需要复制一个这个方法 去掉区域参数 换成库位参数
//_balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput()
//{
// ItemCode = detail.ItemCode,
//});
unplannedIssueRequest.DirectCreateNote = true; //线边 直接生成记录
$"不是{EnumLocationType.WIP.GetDisplayName()}】");
}
}
//需要复制一个这个方法 去掉区域参数 换成库位参数
RecommendBalanceRequestInput input = new RecommendBalanceRequestInput();
input.ItemCode = detail.ItemCode;
input.Locations = new List<string>() { detail.LocationCode };
input.Qty = detail.Qty;
input.Statuses = new List<EnumInventoryStatus> { EnumInventoryStatus.OK };
var balanceLst = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false);
if (balanceLst.Count == 0)
{
throw new UserFriendlyException($"GetRecommendBalancesByLocationsAsync返回0条记录");
}
var sumQty = balanceLst.Sum(itm => itm.Qty);
if (detail.Qty > sumQty)
{
throw new UserFriendlyException($"库存数量不足:GetRecommendBalancesByLocationsAsync");
}
foreach (var balance in balanceLst)
{
var newDetail = CreateNewDetail(detail, balance);
await SetDetailPropertiesAsync(newDetail, unplannedIssueRequest.UnplannedIssueType).ConfigureAwait(false);
newDetails.Add(newDetail);
}
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
}
unplannedIssueRequest.Details.Clear();//删除所有明细}
unplannedIssueRequest.Details.AddRange(newDetails);//按推荐添加
}
return dictionary;
}
/// <summary>
/// 创建明细
/// </summary>
/// <param name="detail"></param>
/// <param name="balance"></param>
/// <returns></returns>
protected UnplannedIssueRequestDetail CreateNewDetail(UnplannedIssueRequestDetail detail,BalanceDTO balance)
{
UnplannedIssueRequestDetail newDetail = new UnplannedIssueRequestDetail();
newDetail.ArriveDate = detail.ArriveDate;
newDetail.CaseCode = detail.CaseCode;
newDetail.ContainerCode = detail.ContainerCode;
newDetail.Explain = detail.Explain;
newDetail.ItemCode = detail.ItemCode;
newDetail.LocationCode = detail.LocationCode;
newDetail.Number = detail.Number;
newDetail.OnceBusiCode = detail.OnceBusiCode;
newDetail.ProjCapacityCode = detail.ProjCapacityCode;
newDetail.ProduceDate = detail.ProduceDate;
newDetail.PackingCode = balance.PackingCode;
newDetail.Qty = balance.Qty;
newDetail.SetIdAndNumber(GuidGenerator, detail.MasterID, detail.Number);
return newDetail;
}
protected override UnplannedIssueRequest ModifyEntityBeforeAgree(UnplannedIssueRequest obj)
{
if (obj.UnplannedIssueType == EnumUnplannedIssueType.Wip)
{
obj.DirectCreateNote = true; //线边 直接生成记录
}
return obj;
}
#region 赋值
@ -112,7 +184,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
/// </summary>
/// <param name="detail"></param>
/// <returns></returns>
private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail)
private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail, EnumUnplannedIssueType type)
{
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasic, detail.ItemCode);
@ -138,9 +210,13 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
detail.LocationArea = location.AreaCode;
detail.LocationCode = location.Code;
}
string packingcode = string.Empty;
if(type!= EnumUnplannedIssueType.Wip)
{
packingcode = detail.PackingCode;
}
var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
string.Empty,
packingcode,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
@ -211,19 +287,23 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
/// <returns></returns>
private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity)
{
//var userName = CurrentUser.GetUserName();
//var department = await _departmentAppService.GetByUsernameAsync(userName).ConfigureAwait(false);
var userName = CurrentUser.GetUserName_New();
var name = CurrentUser.GetName();
if (userName != null)
{
var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false);
//if (department != null)
//{
// entity.DeptCode = department.Code;
// entity.DeptName = department.Name;
//}
if (department != null)
{
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
//entity.Worker = userName;
entity.Worker = name;
entity.CreatorId = CurrentUser.Id;
}
//entity.BuildDate = DateTime.Now;
entity.BuildDate = DateTime.Now;
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
@ -329,7 +409,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
await CheckOnceBusiCodeAsync(model, validationRresult).ConfigureAwait(false);//次交易码
await CheckCaseCodeAsync(model, validationRresult).ConfigureAwait(false);//专案代码
await CheckProjCapacityCodeAsync(model, validationRresult).ConfigureAwait(false);//项目分类
_ = await CheckBalanceAsync(model, validationRresult).ConfigureAwait(false);
// _ = await CheckBalanceAsync(model, validationRresult).ConfigureAwait(false);
}
protected async Task<ItemBasicDTO> CheckItemBasicAsync(UnplannedIssueRequestImportInput importInput, List<ValidationResult> validationRresult)

16
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAppService.cs

@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -40,5 +41,20 @@ public abstract class UnplannedReceiptRequestAppService :
var dto = ObjectMapper.Map<UnplannedReceiptRequest, UnplannedReceiptRequestDTO>(entity);
return dto;
}
/// <summary>
/// OA创建计划外入库申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("create-by-oa")]
//[Authorize(UnplannedReceiptRequestPermissions.Create)]
public virtual async Task<UnplannedReceiptRequestDTO> CreateByOAAsync(UnplannedReceiptRequestEditInput input)
{
var entity = ObjectMapper.Map<UnplannedReceiptRequestEditInput, UnplannedReceiptRequest>(input);
await _unplannedReceiptRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<UnplannedReceiptRequest, UnplannedReceiptRequestDTO>(entity);
return dto;
}
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestAutoMapperProfile.cs

@ -61,5 +61,11 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.Status)
.Ignore(x => x.Number)
;
CreateMap<UnplannedReceiptRequestEditInput, UnplannedReceiptRequest>();
CreateMap<UnplannedReceiptRequestDetailInput, UnplannedReceiptRequestDetail>();
}
}

98
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Data;
@ -16,6 +17,7 @@ using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Dict;
namespace Win_in.Sfs.Wms.Store.Application;
@ -25,21 +27,57 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
private readonly LocationManager _locationManager;
private readonly ILocationAppService _locationAppService;
private readonly IUnplannedReceiptRequestManager _unplannedReceiptRequestManager;
private readonly IBalanceAppService _balanceAppService;
private new readonly IDictAclService DictAclService;
public UnplannedReceiptRequestForDongyangAppService(IUnplannedReceiptRequestRepository repository,
IUnplannedReceiptRequestManager unplannedReceiptRequestManager,
IDepartmentAppService departmentApp,
//LocationManager locationManager,
ILocationAppService locationAppService
ILocationAppService locationAppService,
IBalanceAppService balanceAppService,
IDictAclService dictAclService
) : base(repository, unplannedReceiptRequestManager)
{
_unplannedReceiptRequestManager = unplannedReceiptRequestManager;
_departmentApp = departmentApp;
//_locationManager = locationManager;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
DictAclService = dictAclService;
}
/// <summary>
/// OA创建计划外入库申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("create-by-oa")]
//[Authorize(UnplannedReceiptRequestPermissions.Create)]
public override async Task<UnplannedReceiptRequestDTO> CreateByOAAsync(UnplannedReceiptRequestEditInput input)
{
var entity = ObjectMapper.Map<UnplannedReceiptRequestEditInput, UnplannedReceiptRequest>(input);
foreach (var item in entity.Details)
{
await SetDetailPropertiesAsync(item).ConfigureAwait(false);
}
entity.AutoCompleteJob = false; //任务到记录
entity.AutoSubmit = true;
entity.AutoAgree = true;
entity.AutoHandle = true;
if (entity.UnplannedReceiptType == EnumUnplannedReceiptType.Wip)
{
entity.DirectCreateNote = true; //线边直接生成记录
}
else
{
entity.DirectCreateNote = false; //原料先生成任务、再生成记录
}
var res = await _unplannedReceiptRequestManager.CreateAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<UnplannedReceiptRequest, UnplannedReceiptRequestDTO>(entity);
return dto;
}
/// <summary>
/// 用来重写 导入数据时可以加工数据
/// </summary>
@ -51,9 +89,12 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
foreach (var unplannedReceiptRequest in addList)
{
unplannedReceiptRequest.Worker = CurrentUser.GetUserName();
unplannedReceiptRequest.CreatorId = CurrentUser.Id;
if (unplannedReceiptRequest.UnplannedReceiptType != EnumUnplannedReceiptType.Wip && unplannedReceiptRequest.UnplannedReceiptType != EnumUnplannedReceiptType.Raw)
{
throw new UserFriendlyException($"【{unplannedReceiptRequest.UnplannedReceiptType}】退料料类型," +
$"不是{EnumUnplannedReceiptType.Wip.GetDisplayName()}" +
$"或{EnumUnplannedReceiptType.Raw.GetDisplayName()}】");
}
await SetRequestAutoPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
@ -62,19 +103,18 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
if (unplannedReceiptRequest.UnplannedReceiptType == EnumUnplannedReceiptType.Raw)
{
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (locationDto.Type != EnumLocationType.RAW || locationDto.Type != EnumLocationType.SEMI)
if (locationDto.Type != EnumLocationType.RAW && locationDto.Type != EnumLocationType.SEMI)
{
throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," +
$"不是{EnumLocationType.RAW.GetDisplayName()}" +
$"或{EnumLocationType.SEMI.GetDisplayName()}】");
}
unplannedReceiptRequest.DirectCreateNote = false;
//需要复制一个这个方法 去掉区域参数 换成库位参数
//_balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput()
//{
// ItemCode = detail.ItemCode,
//});
//RecommendBalanceRequestInput input = new RecommendBalanceRequestInput();
//input.ItemCode = detail.ItemCode;
//input.Locations = new List<string>() { detail.LocationCode };
//await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false);
}
if (unplannedReceiptRequest.UnplannedReceiptType == EnumUnplannedReceiptType.Wip)
@ -87,12 +127,10 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
}
//需要复制一个这个方法 去掉区域参数 换成库位参数
//_balanceAppService.GetRecommendBalancesAsync(new RecommendBalanceRequestInput()
//{
// ItemCode = detail.ItemCode,
//});
unplannedReceiptRequest.DirectCreateNote = true; //线边 直接生成记录
//RecommendBalanceRequestInput input = new RecommendBalanceRequestInput();
//input.ItemCode = detail.ItemCode;
//input.Locations = new List<string>() { detail.LocationCode };
//await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false);
}
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
@ -102,6 +140,15 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
return dictionary;
}
protected override UnplannedReceiptRequest ModifyEntityBeforeAgree(UnplannedReceiptRequest obj)
{
if (obj.UnplannedReceiptType == EnumUnplannedReceiptType.Wip)
{
obj.DirectCreateNote = true;
}
return obj;
}
#region 赋值
/// <summary>
@ -191,7 +238,8 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
/// <returns></returns>
private async Task SetEntityPropertiesAsync(UnplannedReceiptRequest entity)
{
var userName = CurrentUser.GetUserName();
var userName = CurrentUser.GetUserName_New();
var name = CurrentUser.GetName();
if (userName != null)
{
var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false);
@ -201,8 +249,8 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
entity.DeptCode = department.Code;
entity.DeptName = department.Name;
}
entity.Worker = userName;
entity.CreatorId = CurrentUser.Id;
entity.Worker = name;
}
entity.BuildDate = DateTime.Now;
@ -272,7 +320,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
{
if (!string.IsNullOrEmpty(importInput.CaseCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(importInput.CaseCode)).ConfigureAwait(false);
var dict = await base.DictAclService.GetByCodeAsync(nameof(importInput.CaseCode)).ConfigureAwait(false);
Check.NotNull(dict, "字典编码", $"字典编码{nameof(importInput.CaseCode)}不存在");
if (dict == null)
@ -348,7 +396,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
{
if (!string.IsNullOrEmpty(importInput.OnceBusiCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(importInput.OnceBusiCode)).ConfigureAwait(false);
var dict = await base.DictAclService.GetByCodeAsync(nameof(importInput.OnceBusiCode)).ConfigureAwait(false);
if (dict == null)
{
validationRresult.Add("字典编码", $"字典编码{nameof(importInput.OnceBusiCode)}不存在");
@ -369,7 +417,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
protected virtual async Task CheckProjCapacityCodeAsync(UnplannedReceiptRequestImportInput importInput, List<ValidationResult> validationRresult)
{
var dict = await DictAclService.GetByCodeAsync(nameof(importInput.ProjCapacityCode)).ConfigureAwait(false);
var dict = await base.DictAclService.GetByCodeAsync(nameof(importInput.ProjCapacityCode)).ConfigureAwait(false);
if (dict == null)
{
validationRresult.Add("字典编码", $"字典编码{nameof(importInput.ProjCapacityCode)}不存在");
@ -401,7 +449,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
{
if (!string.IsNullOrEmpty(detail.CaseCode))
{
var dict = await DictAclService.GetByCodeAsync(nameof(detail.CaseCode)).ConfigureAwait(false);
var dict = await base.DictAclService.GetByCodeAsync(nameof(detail.CaseCode)).ConfigureAwait(false);
if (dict == null)
{

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/ISfsStoreManager.cs

@ -17,4 +17,9 @@ where TDetailEntity : SfsDetailEntityBase
public Task<TEntity> CreateAsync(TEntity entity);
Task<List<TEntity>> CreateManyAsync(List<TEntity> entities);
Task<TEntity> InsertOrUpdateAsync(TEntity entity);
Task<TEntity> UpdateAsync(TEntity entity);
}

19
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Bases/SfsStoreManagerBase.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.EventBus.Local;
@ -145,4 +146,22 @@ public abstract class SfsStoreManagerBase<TEntity, TDetailEntity>
throw;
}
}
public virtual async Task<TEntity> InsertOrUpdateAsync(TEntity entity)
{
var isExist = await Repository.AnyAsync(p => p.Id == entity.Id).ConfigureAwait(false);
if (!isExist)
{
return await Repository.InsertAsync(entity).ConfigureAwait(false);
}
else
{
return await Repository.UpdateAsync(entity).ConfigureAwait(false);
}
}
public virtual async Task<TEntity> UpdateAsync(TEntity entity)
{
return await Repository.UpdateAsync(entity).ConfigureAwait(false);
}
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs

@ -41,6 +41,11 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
/// <summary>
/// 任务明细
@ -64,10 +69,12 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
/// <param name="locationCode"></param>
/// <param name="qty"></param>
/// <returns></returns>
public virtual async Task BuildDetail(Guid id, string handledLocationCode, string handledLocationErpCode, string handledWarehouseCode, decimal handledQty, string handledSupplierBatch, DateTime handledArriveDate, DateTime handledProduceDate, DateTime handledExpireDate
public virtual async Task BuildDetail(Guid id,string handledLocationGroup,string handledLocationArea, string handledLocationCode, string handledLocationErpCode, string handledWarehouseCode, decimal handledQty, string handledSupplierBatch, DateTime handledArriveDate, DateTime handledProduceDate, DateTime handledExpireDate
, string handledContainerCode, string handledLot, string handledPackingCode, ExtraPropertyDictionary extraProperty)
{
var detail = GetDetail(id);
detail.HandledFromLocationGroup= handledLocationGroup;
detail.HandledFromLocationArea = handledLocationArea;
detail.HandledFromLocationCode = handledLocationCode;
detail.HandledFromLocationErpCode = handledLocationErpCode;
detail.HandledFromWarehouseCode = handledWarehouseCode;

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs

@ -33,11 +33,12 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
entity.BuildDate = input.BuildDate;
entity.DeptCode = input.DeptCode;
entity.DeptName = input.DeptName;
entity.CompleteUserName = input.CompleteUserName;
entity.CompleteUserId = input.CompleteUserId;
foreach (var detail in input.Details)
{
//发料子任务 赋值实际转移
await entity.BuildDetail(detail.Id, detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode, detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate,
await entity.BuildDetail(detail.Id, detail.HandledFromLocationGroup, detail.HandledFromLocationArea,detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode, detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate,
detail.HandledContainerCode, detail.HandledLot, detail.HandledPackingCode, detail.ExtraProperties).ConfigureAwait(false);
}

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedReceiptJobs/UnplannedReceiptJob.cs

@ -41,7 +41,11 @@ public class UnplannedReceiptJob : SfsJobAggregateRootBase<UnplannedReceiptJobDe
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
/// <summary>
/// 任务明细
/// </summary>
@ -62,9 +66,11 @@ public class UnplannedReceiptJob : SfsJobAggregateRootBase<UnplannedReceiptJobDe
/// <param name="handledPackingCode"></param>
/// <param name="extraProperty"></param>
/// <returns></returns>
public virtual async Task BuildDetail(Guid id, string handledLocationCode, string handledLocationErpCode, string handledWarehouseCode, decimal handledQty, string handledSupplierBatch, DateTime handledArriveDate, DateTime handledProduceDate, DateTime handledExpireDate, string handledContainerCode, string handledLot, string handledPackingCode, ExtraPropertyDictionary extraProperty)
public virtual async Task BuildDetail(Guid id,string handledLocationGroup ,string handledLocationArea, string handledLocationCode, string handledLocationErpCode, string handledWarehouseCode, decimal handledQty, string handledSupplierBatch, DateTime handledArriveDate, DateTime handledProduceDate, DateTime handledExpireDate, string handledContainerCode, string handledLot, string handledPackingCode, ExtraPropertyDictionary extraProperty)
{
var detail = GetDetail(id);
detail.HandledToLocationGroup = handledLocationGroup;
detail.HandledToLocationArea = handledLocationArea;
detail.HandledToLocationCode = handledLocationCode;
detail.HandledToLocationErpCode = handledLocationErpCode;
detail.HandledToWarehouseCode = handledWarehouseCode;

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobManager.cs

@ -33,7 +33,7 @@ public class UnplannedReceiptJobManager : SfsJobManagerBase<UnplannedReceiptJob,
foreach (var detail in input.Details)
{
//发料子任务 赋值实际转移
await entity.BuildDetail(detail.Id, detail.HandledToLocationCode, detail.HandledToLocationErpCode, detail.HandledToWarehouseCode,
await entity.BuildDetail(detail.Id, detail.HandledToLocationGroup, detail.HandledToLocationArea, detail.HandledToLocationCode, detail.HandledToLocationErpCode, detail.HandledToWarehouseCode,
detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate, detail.HandledContainerCode, detail.HandledLot, detail.HandledPackingCode, detail.ExtraProperties).ConfigureAwait(false);
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/UnplannedIssueNotes/UnplannedIssueNote.cs

@ -49,4 +49,10 @@ public class UnplannedIssueNote : SfsStoreAggregateRootBase<UnplannedIssueNoteDe
[Display(Name = "领料类别", Order = 0)]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/UnplannedReceiptNotes/UnplannedReceiptNote.cs

@ -49,4 +49,9 @@ public class UnplannedReceiptNote : SfsStoreAggregateRootBase<UnplannedReceiptNo
[Display(Name = "退料类别", Order = 0)]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedIssueRequests/UnplannedIssueRequest.cs

@ -38,4 +38,10 @@ public class UnplannedIssueRequest : SfsStoreRequestAggregateRootBase<UnplannedI
[IgnoreUpdate]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequest.cs

@ -35,7 +35,12 @@ public class UnplannedReceiptRequest : SfsStoreRequestAggregateRootBase<Unplanne
[IgnoreUpdate]
public override List<UnplannedReceiptRequestDetail> Details { get; set; } = new List<UnplannedReceiptRequestDetail>();
[Display(Name = "退料类别", Order = 0)]
[IgnoreUpdate]
public EnumUnplannedReceiptType UnplannedReceiptType { get; set; }
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/UnplannedReceiptJobAutoMapperProfile.cs

@ -14,7 +14,7 @@ public partial class StoreEventAutoMapperProfile : Profile
private void UnplannedReceiptJobAutoMapperProfile()
{
CreateMap<UnplannedReceiptJob, UnplannedReceiptNoteEditInput>()
.ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number)).Ignore(x => x.Details)
.ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number))
.ForMember(x => x.Worker, y => y.MapFrom(d => d.CompleteUserName))
.ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now))
.Ignore(x => x.Number)

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/UnplannedIssueRequestAutoMapperProfile.cs

@ -56,7 +56,7 @@ public partial class StoreEventAutoMapperProfile : Profile
.Ignore(x => x.HandledQty)
.Ignore(x => x.HandledUom)
.Ignore(x => x.ReasonCode)
.IgnoreIHasRecommendAndHandledFrom();
;
CreateMap<UnplannedIssueRequest, UnplannedIssueNoteEditInput>()
.ForMember(x => x.UnplannedIssueRequestNumber, y => y.MapFrom(d => d.Number)).Ignore(x => x.JobNumber)

14
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedIssueRequestEventHandler.cs

@ -35,10 +35,10 @@ public class UnplannedIssueRequestEventHandler
public async Task HandleEventAsync(SfsCreatedEntityEventData<UnplannedIssueRequest> eventData)
{
var entity = eventData.Entity;
if (entity.AutoSubmit)
{
await _unplannedIssueRequestManager.SubmitAsync(entity).ConfigureAwait(false);
}
//if (entity.AutoSubmit)
//{
// await _unplannedIssueRequestManager.SubmitAsync(entity).ConfigureAwait(false);
//}
}
/// <summary>
@ -65,6 +65,10 @@ public class UnplannedIssueRequestEventHandler
public virtual async Task HandleEventAsync(SfsHandledEntityEventData<UnplannedIssueRequest> eventData)
{
var entity = eventData.Entity;
if (entity.UnplannedIssueType == Shared.Domain.Shared.Enums.Store.EnumUnplannedIssueType.Wip&&!string.IsNullOrEmpty(entity.OANumber))
{
entity.RequestStatus = EnumRequestStatus.Completed;
}
if (entity.DirectCreateNote)
{
var note = await BuildUnplannedIssueNoteCreateInputAsync(entity).ConfigureAwait(false);
@ -112,7 +116,7 @@ public class UnplannedIssueRequestEventHandler
createInput.Details.Add(detail);
}
createInput.WarehouseCode = createInput.Details[0].RecommendFromWarehouseCode;
return createInput;
}

17
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/UnplannedReceiptRequestEventHandler.cs

@ -34,11 +34,11 @@ public class UnplannedReceiptRequestEventHandler
/// <param name="eventData">Event data</param>
public async Task HandleEventAsync(SfsCreatedEntityEventData<UnplannedReceiptRequest> eventData)
{
var entity = eventData.Entity;
if (entity.AutoSubmit)
{
await _unplannedReceiptRequestManager.SubmitAsync(entity).ConfigureAwait(false);
}
//var entity = eventData.Entity;
//if (entity.AutoSubmit)
//{
// await _unplannedReceiptRequestManager.SubmitAsync(entity).ConfigureAwait(false);
//}
}
/// <summary>
@ -66,6 +66,10 @@ public class UnplannedReceiptRequestEventHandler
{
var entity = eventData.Entity;
if (entity.UnplannedReceiptType == Shared.Domain.Shared.Enums.Store.EnumUnplannedReceiptType.Wip&&!string.IsNullOrEmpty(entity.OANumber))
{
entity.RequestStatus = EnumRequestStatus.Completed;
}
if (entity.DirectCreateNote)
{
var note = await BuildUnplannedReceiptNoteCreateInputAsync(entity).ConfigureAwait(false);
@ -112,8 +116,9 @@ public class UnplannedReceiptRequestEventHandler
detail.ExtraProperties = inputDetail.ExtraProperties;
createInput.Details.Add(detail);
}
}
createInput.WarehouseCode = createInput.Details[0].RecommendToWarehouseCode;
return createInput;
}

Loading…
Cancel
Save