Browse Source

非生产退料

dev_DY_CC
郑勃旭 7 months ago
parent
commit
6d4cb5e76d
  1. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs
  2. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs
  3. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs
  4. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs
  5. 113
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs
  6. 237
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs
  7. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs
  8. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs
  9. 321
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs
  10. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs
  11. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs
  12. 36
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJobManager.cs
  13. 82
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs
  14. 16
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs

@ -10,4 +10,8 @@ public interface IUnplannedIssueJobAppService
Task CreateByRecommendAsync(UnplannedIssueRequest requestDto); Task CreateByRecommendAsync(UnplannedIssueRequest requestDto);
Task<bool> IsAllJobOverByRequestNumberAsync(string requestNumber);
} }

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

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -39,3 +41,16 @@ public class UnplannedIssueRequestDTO : SfsStoreRequestDTOBase<UnplannedIssueReq
public string OANumber { get; set; } public string OANumber { get; set; }
} }
public class RetUnplannedIssueRequestDTO
{
public UnplannedIssueRequestDTO requestDTO { get; set; }
public List<string> Errors { set; get; }
public bool Status { set; get; }
}

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

@ -6,4 +6,7 @@ public interface IUnplannedIssueRequestAppService
: ISfsStoreRequestMasterAppServiceBase<UnplannedIssueRequestDTO, SfsStoreRequestInputBase, UnplannedIssueRequestEditInput, UnplannedIssueRequestDetailDTO, SfsStoreRequestInputBase> : ISfsStoreRequestMasterAppServiceBase<UnplannedIssueRequestDTO, SfsStoreRequestInputBase, UnplannedIssueRequestEditInput, UnplannedIssueRequestDetailDTO, SfsStoreRequestInputBase>
{ {
Task<UnplannedIssueRequestDTO> CreateByOAAsync(UnplannedIssueRequestEditInput input); Task<UnplannedIssueRequestDTO> CreateByOAAsync(UnplannedIssueRequestEditInput input);
Task UpdateStatusByJobAsync(string requestNumber);
} }

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

@ -60,6 +60,13 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput
public class UnplannedIssueRequestImportDto public class UnplannedIssueRequestImportDto
{ {
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
/// <summary> /// <summary>
/// 部门代码 /// 部门代码
/// </summary> /// </summary>

113
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs

@ -9,9 +9,9 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
, IHasQty , IHasQty
{ {
[Display(Name = "领料类别", Order = 0)] //[Display(Name = "领料类别", Order = 0)]
[Required(ErrorMessage = "领料类别不能为空")] //[Required(ErrorMessage = "领料类别不能为空")]
public EnumUnplannedIssueType UnplannedIssueType { get; set; } //public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary> /// <summary>
/// ERP料号 /// ERP料号
@ -38,7 +38,7 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
/// </summary> /// </summary>
[Display(Name = "调出库位")] [Display(Name = "调出库位")]
[Required(ErrorMessage = "调出库位不能为空")] [Required(ErrorMessage = "调出库位不能为空")]
public string LocationCode { get; set; } public string LocationErpCode { get; set; }
/// <summary> /// <summary>
/// 专案 /// 专案
@ -59,13 +59,13 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
[Display(Name = "次交易码")] [Display(Name = "次交易码")]
public string OnceBusiCode { get; set; } public string OnceBusiCode { get; set; }
/// <summary> ///// <summary>
/// 箱码 ///// 箱码
/// </summary> ///// </summary>
[Display(Name = "箱码")] //[Display(Name = "箱码")]
[ImporterHeader(IsIgnore = true)] //[ImporterHeader(IsIgnore = true)]
[ExporterHeader(IsIgnore = true)] //[ExporterHeader(IsIgnore = true)]
public string PackingCode { get; set; } //public string PackingCode { get; set; }
/// <summary> /// <summary>
/// 仓库代码 /// 仓库代码
@ -87,4 +87,95 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
[Display(Name = "说明")] [Display(Name = "说明")]
[Required(ErrorMessage = "说明不能为空")] [Required(ErrorMessage = "说明不能为空")]
public string Explain { get; set; } public string Explain { get; set; }
///// <summary>
///// 部门代码
///// </summary>
//[Display(Name = "部门代码")]
//public string DeptCode { get; set; }
///// <summary>
///// 部门名称
///// </summary>
//[Display(Name = "部门名称")]
//public string DeptName { get; set; }
///// <summary>
///// 料号
///// </summary>
//[Display(Name = "料号")]
//[Required(ErrorMessage = "{0}是必填项")]
//public string ItemCode { get; set; }
///// <summary>
///// 数量
///// </summary>
//[Display(Name = "数量")]
//[Required(ErrorMessage = "{0}是必填项")]
//public decimal Qty { get; set; }
///// <summary>
///// 单位
///// </summary>
//[Display(Name = "单位")]
//public string Uom { get; set; }
///// <summary>
///// 调出库位
///// </summary>
//[Display(Name = "调出库位")]
//[Required(ErrorMessage = "{0}是必填项")]
//public string LocationErpCode { get; set; }
///// <summary>
///// 专案
///// </summary>
//[Display(Name = "专案")]
//[Required(ErrorMessage = "{0}是必填项")]
//public string CaseCode { get; set; }
///// <summary>
///// 项目分类
///// </summary>
//[Display(Name = "项目分类")]
//[Required(ErrorMessage = "{0}是必填项")]
//public string ProjCapacityCode { get; set; }
///// <summary>
///// 次交易码
///// </summary>
//[Display(Name = "次交易码")]
//[Required(ErrorMessage = "{0}是必填项")]
//public string OnceBusiCode { get; set; }
///// <summary>
///// 说明
///// </summary>
//[Display(Name = "说明")]
//public string Explain { get; set; }
} }

237
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs

@ -2,15 +2,19 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using Irony; using Irony;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Omu.ValueInjecter; using Omu.ValueInjecter;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectMapping; using Volo.Abp.ObjectMapping;
using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
@ -29,21 +33,26 @@ public class UnplannedIssueJobAppService
: SfsJobAppServiceBase<UnplannedIssueJob, UnplannedIssueJobDetail, UnplannedIssueJobDTO, SfsJobRequestInputBase, UnplannedIssueJobCheckInput, UnplannedIssueJobEditInput>, : SfsJobAppServiceBase<UnplannedIssueJob, UnplannedIssueJobDetail, UnplannedIssueJobDTO, SfsJobRequestInputBase, UnplannedIssueJobCheckInput, UnplannedIssueJobEditInput>,
IUnplannedIssueJobAppService IUnplannedIssueJobAppService
{ {
protected IUnplannedIssueRequestAppService UnplannedReceiptRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IUnplannedIssueRequestAppService>();
private readonly IUnplannedIssueJobManager _unplannedIssueJobManager; private readonly IUnplannedIssueJobManager _unplannedIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService; private readonly IExpectOutAppService _expectOutAppService;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly ILogger<UnplannedIssueJobAppService> _logger;
public UnplannedIssueJobAppService( public UnplannedIssueJobAppService(
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService,
) : base(repository, unplannedIssueJobManager) IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, IUnitOfWorkManager unitOfWorkManager, ILogger<UnplannedIssueJobAppService> logger
) : base(repository, unplannedIssueJobManager )
{ {
_unplannedIssueJobManager = unplannedIssueJobManager; _unplannedIssueJobManager = unplannedIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService; _expectOutAppService = expectOutAppService;
_unitOfWorkManager = unitOfWorkManager;
_logger = logger;
} }
/// <summary> /// <summary>
@ -61,6 +70,15 @@ public class UnplannedIssueJobAppService
} }
} }
private async Task UpdateRequestStatusAsync(string requestNumber)
{
await UnplannedReceiptRequestAppService.UpdateStatusByJobAsync(requestNumber).ConfigureAwait(false);
}
/// <summary> /// <summary>
/// 根据储位推荐 /// 根据储位推荐
@ -84,19 +102,53 @@ public class UnplannedIssueJobAppService
private List<BalanceDTO> DeductInventory(List<BalanceDTO> inventory, decimal quantityToDeduct)
//public static string[] GetAllFields(Type type)
//{
// // 获取公共实例字段
// var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
// // 返回字段名称
// return fields.Select(f => f.Name).ToArray();
//}
private async Task<List<BalanceDTO>> DeductInventory(List<BalanceDTO> inventory, decimal quantityToDeduct)
{ {
List<BalanceDTO> balanceDTOs = new List<BalanceDTO>(); List<BalanceDTO> balanceDTOs = new List<BalanceDTO>();
decimal totalDeducted = 0; decimal totalDeducted = 0;
foreach (var item in inventory) foreach (var item in inventory)
{ {
decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted); decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted);
item.Qty -= availableToDeduct; item.Qty -= availableToDeduct;
totalDeducted += availableToDeduct; totalDeducted += availableToDeduct;
BalanceDTO dto = new BalanceDTO(); if (availableToDeduct > 0)
dto.InjectFrom(item); {
dto.Qty = availableToDeduct; var locationDto = await _locationAppService.GetByCodeAsync(item.LocationCode).ConfigureAwait(false);
balanceDTOs.Add(dto); BalanceDTO dto = new BalanceDTO();
switch (locationDto.Type)
{
case EnumLocationType.RAW:
dto.InjectFrom(item);
dto.Qty = availableToDeduct;
balanceDTOs.Add(dto);
break;
case EnumLocationType.FG:
case EnumLocationType.DimensionalStorehouse:
case EnumLocationType.CUST:
case EnumLocationType.KittingWip:
case EnumLocationType.OUTSIDE:
case EnumLocationType.SEMI:
case EnumLocationType.WIP:
case EnumLocationType.THIRDPARTY:
dto.InjectFrom(item);
balanceDTOs.Add(dto);
break;
}
}
// 如果已经扣减达到所需数量,退出循环 // 如果已经扣减达到所需数量,退出循环
if (totalDeducted >= quantityToDeduct) if (totalDeducted >= quantityToDeduct)
{ {
@ -110,37 +162,15 @@ public class UnplannedIssueJobAppService
//public override async Task<UnplannedIssueJobDTO> GetAsync(Guid id)
//{
// var entity=await _repository.GetAsync(id).ConfigureAwait(false);
// var entityDTO=ObjectMapper.Map<UnplannedIssueJob, UnplannedIssueJobDTO>(entity);
// var details=ObjectMapper.Map<List<UnplannedIssueJobDetail>, List<UnplannedIssueJobDetailDTO>>(entity.Details);
// var facDetails=ObjectMapper.Map<List<UnplannedIssueJobFacDetail>, List<UnplannedIssueJobFacDetailDTO>>(entity.FacDetails);
// entityDTO.Details = details;
// entityDTO.FacDetails = facDetails;
// return entityDTO;
// // var inspectJob = await _repository.FindAsync(id).ConfigureAwait(false);
//}
private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedIssueRequest requestDto, List<BalanceDTO> useBalancesOut) private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedIssueRequest requestDto, List<BalanceDTO> useBalancesOut)
{ {
List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>(); List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>();
List<string> Errors= new List<string>();
foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细 foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细
{ {
var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位 var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = requestDtoDetail.ItemCode, ItemCode = requestDtoDetail.ItemCode,
@ -150,6 +180,9 @@ public class UnplannedIssueJobAppService
IsPackingCode = false IsPackingCode = false
}; };
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存 var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存
usableList = usableList.Where(p => p.Qty> 0).ToList();
usableList = usableList usableList = usableList
.OrderBy(p => p.Lot) .OrderBy(p => p.Lot)
.ThenBy(p => p.PutInTime) .ThenBy(p => p.PutInTime)
@ -161,7 +194,7 @@ public class UnplannedIssueJobAppService
decimal qty = 0; decimal qty = 0;
//实际要用库存 //实际要用库存
List<BalanceDTO> useBalances = new List<BalanceDTO>(); List<BalanceDTO> useBalances = new List<BalanceDTO>();
var returnlist=DeductInventory(usableList, requestDtoDetail.Qty); var returnlist=await DeductInventory(usableList, requestDtoDetail.Qty).ConfigureAwait(false);
useBalances.AddRange(returnlist); useBalances.AddRange(returnlist);
useBalancesOut.AddRange(returnlist); useBalancesOut.AddRange(returnlist);
@ -194,18 +227,37 @@ public class UnplannedIssueJobAppService
//} //}
if (returnlist.Count == 0) if (returnlist.Count == 0)
{ {
throw new UserFriendlyException("库存余额不够!"); Errors.Add($"{""+requestDto.Number+":"+requestDtoDetail.ItemCode + "" + requestDtoDetail.Qty.ToString()}");
} }
foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode))
{ {
var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
var job = new UnplannedIssueJob(); var job = new UnplannedIssueJob();
switch (locationDto.Type)
{
case EnumLocationType.RAW:
job.UnplannedIssueType = EnumUnplannedIssueType.Raw;
break;
case EnumLocationType.FG:
case EnumLocationType.DimensionalStorehouse:
case EnumLocationType.CUST:
case EnumLocationType.KittingWip:
case EnumLocationType.OUTSIDE:
case EnumLocationType.SEMI:
case EnumLocationType.WIP:
case EnumLocationType.THIRDPARTY:
job.UnplannedIssueType = EnumUnplannedIssueType.Wip;
break;
}
job.SetId(GuidGenerator.Create()); job.SetId(GuidGenerator.Create());
job.UnplannedIssueRequestNumber= requestDto.Number; job.UnplannedIssueRequestNumber= requestDto.Number;
job.JobType = EnumJobType.UnplannedIssueJob; job.JobType = EnumJobType.UnplannedIssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.IsAutoComplete = false; job.IsAutoComplete = false;
job.DeptCode = requestDto.DeptCode;
job.DeptName = requestDto.DeptName;
job.Worker = requestDto.Worker;
job.OANumber = requestDto.OANumber; job.OANumber = requestDto.OANumber;
job.Number =await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true); job.Number =await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true);
job.Details = new List<UnplannedIssueJobDetail>(); job.Details = new List<UnplannedIssueJobDetail>();
@ -215,42 +267,7 @@ public class UnplannedIssueJobAppService
foreach (var balanceDto in balanceDtoGroup) foreach (var balanceDto in balanceDtoGroup)
{ {
var jobDetail = new UnplannedIssueJobDetail();
jobDetail.Number = job.Number;
jobDetail.SetIdAndNumber(GuidGenerator,job.Id,job.Number);
jobDetail.CaseCode = requestDtoDetail.CaseCode;
jobDetail.Explain = requestDtoDetail.Explain;
jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode;
jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode;
//jobDetail.ReasonCode = requestDtoDetail.ReasonCode;
jobDetail.ItemCode = requestDtoDetail.ItemCode;
jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
jobDetail.ItemName = requestDtoDetail.ItemName;
jobDetail.RecommendArriveDate = balanceDto.ArriveDate;
jobDetail.RecommendContainerCode = string.Empty;
jobDetail.RecommendExpireDate = balanceDto.ExpireDate;
jobDetail.RecommendLot = balanceDto.Lot;
jobDetail.RecommendPackingCode = balanceDto.PackingCode;
jobDetail.RecommendProduceDate = balanceDto.ProduceDate;
jobDetail.RecommendQty = balanceDto.Qty;
jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
jobDetail.StdPackQty = requestDtoDetail.StdPackQty;
jobDetail.RecommendPackingCode = balanceDto.PackingCode;
jobDetail.HandledPackingCode = balanceDto.PackingCode;
jobDetail.RecommendFromLocationArea = balanceDto.LocationArea;
jobDetail.RecommendFromLocationCode = balanceDto.LocationCode;
jobDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode;
jobDetail.RecommendFromLocationGroup = balanceDto.LocationGroup;
jobDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode;
jobDetail.HandledQty = balanceDto.Qty;
var jobfacDetail = new UnplannedIssueJobFacDetail(); var jobfacDetail = new UnplannedIssueJobFacDetail();
jobfacDetail.Number = job.Number; jobfacDetail.Number = job.Number;
jobfacDetail.SetIdAndNumber(GuidGenerator, job.Id, job.Number); jobfacDetail.SetIdAndNumber(GuidGenerator, job.Id, job.Number);
jobfacDetail.CaseCode = requestDtoDetail.CaseCode; jobfacDetail.CaseCode = requestDtoDetail.CaseCode;
@ -272,17 +289,29 @@ public class UnplannedIssueJobAppService
jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
jobfacDetail.StdPackQty = requestDtoDetail.StdPackQty; jobfacDetail.StdPackQty = requestDtoDetail.StdPackQty;
jobfacDetail.RecommendPackingCode = balanceDto.PackingCode; jobfacDetail.RecommendPackingCode = balanceDto.PackingCode;
jobfacDetail.HandledPackingCode = balanceDto.PackingCode; jobfacDetail.HandledFromLocationGroup = balanceDto.LocationGroup;
jobfacDetail.HandledFromLocationArea = balanceDto.LocationArea;
jobfacDetail.HandledFromLocationCode = balanceDto.LocationCode;
jobfacDetail.HandledFromLocationErpCode = balanceDto.LocationErpCode;
jobfacDetail.HandledFromWarehouseCode = balanceDto.WarehouseCode;
jobfacDetail.HandledQty = balanceDto.Qty;
jobfacDetail.HandledSupplierBatch = balanceDto.Lot;
jobfacDetail.HandledArriveDate = balanceDto.ArriveDate;
jobfacDetail.HandledProduceDate = balanceDto.ProduceDate;
jobfacDetail.HandledExpireDate = balanceDto.ExpireDate;
jobfacDetail.HandledContainerCode =balanceDto.ContainerCode ;
jobfacDetail.HandledLot = balanceDto.Lot;
jobfacDetail.HandledPackingCode =balanceDto.PackingCode;
jobfacDetail.RecommendFromLocationArea = balanceDto.LocationArea; jobfacDetail.RecommendFromLocationArea = balanceDto.LocationArea;
jobfacDetail.RecommendFromLocationCode = balanceDto.LocationCode; jobfacDetail.RecommendFromLocationCode = balanceDto.LocationCode;
jobfacDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode; jobfacDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode;
jobfacDetail.RecommendFromLocationGroup = balanceDto.LocationGroup; jobfacDetail.RecommendFromLocationGroup = balanceDto.LocationGroup;
jobfacDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode; jobfacDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode;
jobfacDetail.Status = balanceDto.Status;
jobfacDetail.HandledQty = balanceDto.Qty; jobfacDetail.HandledQty = balanceDto.Qty;
jobfacDetail.Uom = balanceDto.Uom;
job.Details.Add(jobDetail); //job.Details.Add(jobDetail);
job.FacDetails.Add(jobfacDetail); job.FacDetails.Add(jobfacDetail);
} }
if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的 if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的
@ -290,10 +319,16 @@ public class UnplannedIssueJobAppService
await SendDimensionalStorehouseAsync().ConfigureAwait(false); await SendDimensionalStorehouseAsync().ConfigureAwait(false);
job.JobStatus = EnumJobStatus.Wait; job.JobStatus = EnumJobStatus.Wait;
} }
jobs.Add(job); jobs.Add(job);
} }
} }
if (Errors.Count > 0)
{
foreach (var itm in Errors)
{
_logger.LogError(itm);
}
}
return jobs; return jobs;
} }
@ -341,6 +376,56 @@ public class UnplannedIssueJobAppService
return issuenote; return issuenote;
} }
/// <summary>
/// 根据申请单号判断下面的任务是否都是完成或取消
/// </summary>
/// <returns></returns>
[HttpPost("is-all-job-over-by-request-number")]
public async Task<bool> IsAllJobOverByRequestNumberAsync(string requestNumber)
{
var unplannedRequestJobs = await _repository.GetListAsync(p => p.UnplannedIssueRequestNumber == requestNumber).ConfigureAwait(false);
if (unplannedRequestJobs.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Partial ||
p.JobStatus == EnumJobStatus.Doing || p.JobStatus == EnumJobStatus.Wait))
{
return false;
}
return true;
}
[HttpPost("handle/{id}")]
public override async Task<UnplannedIssueJobDTO> CompleteAsync(Guid id, UnplannedIssueJobDTO dto)
{
var job = await _repository.GetAsync(id).ConfigureAwait(false);
var handleDto = new UnplannedIssueJobDTO();
//using (var uow = _unitOfWorkManager.Begin())
//{
// 在工作单元中插入数据
if (job.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None or EnumJobStatus.Done)//需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException($"任务状态错误:编号为【{job.Number}】的任务已经【{job.JobStatus.GetDisplayName()}】");
}
var handleEntity = ObjectMapper.Map<UnplannedIssueJobDTO, UnplannedIssueJob>(dto);
var handleResult = await _unplannedIssueJobManager.CompleteAsync(handleEntity, CurrentUser).ConfigureAwait(false);
handleDto = ObjectMapper.Map<UnplannedIssueJob, UnplannedIssueJobDTO>(handleResult);
await _expectOutAppService.RemoveAsync(dto.Number).ConfigureAwait(false);
handleResult.JobStatus = EnumJobStatus.Done;
handleResult.CompleteUserName = dto.Worker;
handleResult.JobStatus = EnumJobStatus.Done;
job = await _repository.UpdateAsync(handleResult).ConfigureAwait(false);
await UpdateRequestStatusAsync(job.UnplannedIssueRequestNumber).ConfigureAwait(false);
//};
return handleDto;
}

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs

@ -50,7 +50,8 @@ public class UnplannedIssueNoteAppService :
entity.Details.Add(detail); entity.Details.Add(detail);
//2023-10-20 袁静雯要求修改计划外出入库 Worker为userName //2023-10-20 袁静雯要求修改计划外出入库 Worker为userName
var userName = await _userAppService.GetUserNameByUserAsync(input.Worker).ConfigureAwait(false); var userName = input.Worker;
//await _userAppService.GetUserNameByUserAsync(input.Worker).ConfigureAwait(false);
entity.Worker = userName; entity.Worker = userName;
} }

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

@ -77,8 +77,9 @@ public abstract class UnplannedIssueRequestAppService :
return dto; return dto;
} }
[HttpPost("update-status-by-job")]
public virtual async Task UpdateStatusByJobAsync(string requestNumber)
{
throw new System.NotImplementedException();
}
} }

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

@ -9,9 +9,11 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Omu.ValueInjecter; using Omu.ValueInjecter;
using Org.BouncyCastle.Asn1.Ocsp;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.Uow;
using Volo.Abp.Users; using Volo.Abp.Users;
using Win_in.Sfs.Auth.Application.Contracts; using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
@ -36,13 +38,19 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAclService _transactionTypeAclService; private readonly ITransactionTypeAclService _transactionTypeAclService;
private readonly IUnplannedIssueJobAppService _unplannedIssueJobAppService;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly ILogger<UnplannedIssueRequestForDongyangAppService> _logger;
//private readonly IExportImportService _excelService; //private readonly IExportImportService _excelService;
public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository, public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager, IUnplannedIssueRequestManager unplannedIssueRequestManager,
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService, IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService,
ITransactionTypeAclService transactionTypeAclService ITransactionTypeAclService transactionTypeAclService, IUnplannedIssueJobAppService unplannedIssueJobAppService, IUnitOfWorkManager unitOfWorkManager
, ILogger<UnplannedIssueRequestForDongyangAppService> logger
) : base( repository, unplannedIssueRequestManager, excelService) ) : base( repository, unplannedIssueRequestManager, excelService)
{ {
_unplannedIssueRequestManager = unplannedIssueRequestManager; _unplannedIssueRequestManager = unplannedIssueRequestManager;
@ -50,6 +58,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transactionTypeAclService = transactionTypeAclService; _transactionTypeAclService = transactionTypeAclService;
_unplannedIssueJobAppService = unplannedIssueJobAppService;
_unitOfWorkManager = unitOfWorkManager;
_logger = logger;
} }
/// <summary> /// <summary>
/// OA创建计划外出库申请 /// OA创建计划外出库申请
@ -86,11 +97,12 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
[HttpPost("import-dongyang")] [HttpPost("import-dongyang")]
public async Task<IActionResult> ImportDYAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file) public async Task<IActionResult> ImportDYAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file)
{ {
try try
{ {
using var ms = new MemoryStream(); using var ms = new MemoryStream();
await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false);
var inputFileBytes = ms.GetAllBytes(); var inputFileBytes = ms.GetAllBytes();
@ -98,14 +110,31 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
await CreateByDYOAsync(importList, EnumUnplannedIssueType.IMPORT).ConfigureAwait(false); await CreateByDYOAsync(importList, EnumUnplannedIssueType.IMPORT).ConfigureAwait(false);
//if (errors.Count > 0) List<UnplannedIssueRequestImportDto> errorsList = new List<UnplannedIssueRequestImportDto>();
//{
// var fileContent = _excelService.Export(errors); foreach (var itm in importList)
// return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName = "错误信息" }; {
//} if (string.IsNullOrEmpty(itm.CaseCode)
|| string.IsNullOrEmpty(itm.ItemCode)
|| itm.Qty == 0
|| string.IsNullOrEmpty(itm.ProjCapacityCode)
|| string.IsNullOrEmpty(itm.LocationErpCode)
)
{
itm.Explain = "此项错误";
errorsList.Add(itm);
}
}
if (errorsList.Count > 0)
{
var fileContent = _excelService.Export(errorsList);
return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName =fileContent.FileDownloadName };
}
var fileContent1 = _excelService.Export(importList); var fileContent1 = _excelService.Export(importList);
// return new TestResult(fileContent1.FileContents, ExportImportService.ContentType) { FileDownloadName = "Kitting导入文件" };
return new JsonResult(new { Code = 200, FileDownloadName = fileContent1.FileDownloadName }); return new JsonResult(new { Code = 200, FileDownloadName = fileContent1.FileDownloadName });
} }
catch (Exception e) catch (Exception e)
@ -115,6 +144,39 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
} }
private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity)
{
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;
}
entity.CreatorId = CurrentUser.Id;
entity.Worker = name;
}
entity.BuildDate = DateTime.Now;
//await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
/// <summary> /// <summary>
/// OA接口 /// OA接口
/// </summary> /// </summary>
@ -124,8 +186,18 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
public async Task<UnplannedIssueRequestDTO> CreateByAsync(List<UnplannedIssueRequestImportDto> p_list) public async Task<UnplannedIssueRequestDTO> CreateByAsync(List<UnplannedIssueRequestImportDto> p_list)
{ {
UnplannedIssueRequestDTO request = new UnplannedIssueRequestDTO();
try
{
return await CreateByDYOAsync(p_list, EnumUnplannedIssueType.OA, true).ConfigureAwait(false);
}
catch (Exception e)
{
throw new UserFriendlyException(e.Message);
}
return await CreateByDYOAsync(p_list, EnumUnplannedIssueType.OA, true).ConfigureAwait(false);
} }
@ -134,6 +206,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
protected async Task<UnplannedIssueRequestDTO> CreateByDYOAsync(List<UnplannedIssueRequestImportDto> p_list, EnumUnplannedIssueType type, bool isAutoSubmit=false) protected async Task<UnplannedIssueRequestDTO> CreateByDYOAsync(List<UnplannedIssueRequestImportDto> p_list, EnumUnplannedIssueType type, bool isAutoSubmit=false)
{ {
UnplannedIssueRequest request = new UnplannedIssueRequest(); UnplannedIssueRequest request = new UnplannedIssueRequest();
if (p_list.Count == 0) if (p_list.Count == 0)
{ {
@ -151,9 +226,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
request.DeptCode = first.DeptCode; request.DeptCode = first.DeptCode;
request.DeptName = first.DeptName; request.DeptName = first.DeptName;
request.BuildDate= DateTime.Now; request.BuildDate= DateTime.Now;
request.OANumber=first.OANumber;
await SetEntityPropertiesAsync(request).ConfigureAwait(false);
List<UnplannedIssueRequestDetail> detailList = new List<UnplannedIssueRequestDetail>(); List<UnplannedIssueRequestDetail> detailList = new List<UnplannedIssueRequestDetail>();
foreach (var itm in p_list) foreach (var itm in p_list)
{ {
@ -162,13 +237,10 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
detail.Qty = itm.Qty; detail.Qty = itm.Qty;
detail.LocationErpCode = itm.LocationErpCode; detail.LocationErpCode = itm.LocationErpCode;
detail.LocationCode = "Random"; detail.LocationCode = "Random";
detail.WarehouseCode ="Random"; detail.WarehouseCode ="Random";
detail.LocationGroup ="Random"; detail.LocationGroup ="Random";
detail.LocationArea = "Random"; detail.LocationArea = "Random";
detail.CaseCode = first.CaseCode; detail.CaseCode = first.CaseCode;
detail.ProjCapacityCode = first.ProjCapacityCode; detail.ProjCapacityCode = first.ProjCapacityCode;
detail.OnceBusiCode = first.OnceBusiCode; detail.OnceBusiCode = first.OnceBusiCode;
@ -186,6 +258,22 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
return dto; return dto;
} }
[HttpPost("update-status-by-job")]
public override async Task UpdateStatusByJobAsync(string requestNumber)
{
var flag = await _unplannedIssueJobAppService.IsAllJobOverByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (flag)
{
var unplannedReceiptRequest = await _repository.FindAsync(p => p.Number == requestNumber).ConfigureAwait(false);
unplannedReceiptRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(unplannedReceiptRequest).ConfigureAwait(false);
}
}
private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail) private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail)
{ {
var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false);
@ -205,16 +293,12 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
packingcode =string.IsNullOrEmpty(detail.PackingCode)?"99999999":detail.PackingCode; packingcode =string.IsNullOrEmpty(detail.PackingCode)?"99999999":detail.PackingCode;
detail.PackingCode = packingcode; detail.PackingCode = packingcode;
}
detail.Status = EnumInventoryStatus.OK;
}
/// <summary> /// <summary>
@ -226,71 +310,39 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
{ {
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key); var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key);
foreach (var unplannedIssueRequest in addList) foreach (var unplannedReceiptRequest in addList)
{ {
if(unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip&& unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw) //if (unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip && unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw)
{ //{
throw new UserFriendlyException($"【{unplannedIssueRequest.UnplannedIssueType}】领料类型," + // throw new UserFriendlyException($"【{unplannedReceiptRequest.UnplannedIssueType}】退料料类型," +
$"不是{EnumUnplannedIssueType.Wip.GetDisplayName()}" + // $"不是{EnumUnplannedReceiptType.Wip.GetDisplayName()}" +
$"或{EnumUnplannedIssueType.Raw.GetDisplayName()}】"); // $"或{EnumUnplannedReceiptType.Raw.GetDisplayName()}】");
} //}
await SetRequestAutoPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false); await SetRequestAutoPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false); await SetEntityPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
List<UnplannedIssueRequestDetail> newDetails = new List<UnplannedIssueRequestDetail>();
foreach (var detail in unplannedIssueRequest.Details)
{
//需要复制一个这个方法 去掉区域参数 换成库位参数
RecommendBalanceRequestInput input = new RecommendBalanceRequestInput();
if (unplannedIssueRequest.UnplannedIssueType == EnumUnplannedIssueType.Raw)
{
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false);
if (locationDto.Type != EnumLocationType.RAW && locationDto.Type != EnumLocationType.SEMI && locationDto.Type != EnumLocationType.FG)
{
throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," +
$"不是{EnumLocationType.RAW.GetDisplayName()}" +
$"或{EnumLocationType.SEMI.GetDisplayName()}" +
$"或{EnumLocationType.FG.GetDisplayName()}】");
}
// unplannedIssueRequest.DirectCreateNote = false;
input.IsPackingCode = true;//只查询带箱码的推荐
}
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()}】");
}
}
input.ItemCode = detail.ItemCode; foreach (var detail in unplannedReceiptRequest.Details)
input.Locations = new List<string>() { detail.LocationCode }; {
input.Qty = detail.Qty; await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
input.Statuses = new List<EnumInventoryStatus> { EnumInventoryStatus.OK };
var balanceLst = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false);
if (balanceLst.Count == 0)
{
throw new UserFriendlyException($"无推荐库存零件号:{input.ItemCode}库位{input.Locations[0]}!");
}
var sumQty = balanceLst.Sum(itm => itm.Qty);
if (detail.Qty > sumQty)
{
throw new UserFriendlyException($"库存数量不足!");
}
foreach (var balance in balanceLst)
{
var newDetail = CreateNewDetail(detail, balance);
await SetDetailPropertiesAsync(newDetail, unplannedIssueRequest.UnplannedIssueType).ConfigureAwait(false);
newDetails.Add(newDetail);
}
} }
unplannedIssueRequest.Details.Clear();//删除所有明细}
unplannedIssueRequest.Details.AddRange(newDetails);//按推荐添加
} }
return dictionary; return dictionary;
} }
/// <summary> /// <summary>
/// 创建明细 /// 创建明细
/// </summary> /// </summary>
@ -349,29 +401,29 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
detail.LocationArea = location.AreaCode; detail.LocationArea = location.AreaCode;
detail.LocationCode = location.Code; detail.LocationCode = location.Code;
} }
string packingcode = string.Empty; //string packingcode = string.Empty;
if(type!= EnumUnplannedIssueType.Wip) //if(type!= EnumUnplannedIssueType.Wip)
{ //{
packingcode = detail.PackingCode; // packingcode = detail.PackingCode;
} //}
var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( //var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
packingcode, // packingcode,
detail.ItemCode, // detail.ItemCode,
detail.LocationCode).ConfigureAwait(false); // detail.LocationCode).ConfigureAwait(false);
if (balance != null) //if (balance != null)
{ //{
detail.SupplierBatch = balance.SupplierBatch; // detail.SupplierBatch = balance.SupplierBatch;
detail.ArriveDate = balance.ArriveDate; // detail.ArriveDate = balance.ArriveDate;
detail.ProduceDate = balance.ProduceDate; // detail.ProduceDate = balance.ProduceDate;
detail.ExpireDate = balance.ExpireDate; // detail.ExpireDate = balance.ExpireDate;
detail.Lot = balance.Lot; // detail.Lot = balance.Lot;
detail.ContainerCode = balance.ContainerCode; // detail.ContainerCode = balance.ContainerCode;
detail.PackingCode = balance.PackingCode; // detail.PackingCode = balance.PackingCode;
detail.Qty = detail.Qty; // detail.Qty = detail.Qty;
detail.Status = balance.Status; // detail.Status = balance.Status;
} //}
//if (!string.IsNullOrEmpty(detail)) //if (!string.IsNullOrEmpty(detail))
//{ //{
@ -419,33 +471,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
//} //}
} }
/// <summary>
/// 赋值主记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity)
{
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;
}
entity.Worker = name;
entity.CreatorId = CurrentUser.Id;
}
entity.BuildDate = DateTime.Now;
await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false);
}
/// <summary> /// <summary>
/// 赋值业务事务 /// 赋值业务事务
@ -459,13 +485,27 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
Check.NotNull(tranType, "事务类型", "事务类型不存在"); Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob; entity.AutoCompleteJob = false;
entity.AutoSubmit = tranType.AutoSubmitRequest; entity.AutoSubmit = true;
entity.AutoAgree = tranType.AutoAgreeRequest; entity.AutoAgree = false;
entity.AutoHandle = tranType.AutoHandleRequest; entity.AutoHandle = false;
entity.DirectCreateNote = tranType.DirectCreateNote; entity.DirectCreateNote = false;
//entity.AutoCompleteJob = tranType.AutoCompleteJob;
//entity.AutoSubmit = tranType.AutoSubmitRequest;
//entity.AutoAgree = tranType.AutoAgreeRequest;
//entity.AutoHandle = tranType.AutoHandleRequest;
//entity.DirectCreateNote = tranType.DirectCreateNote;
} }
#endregion #endregion
#region 校验 #region 校验
@ -491,11 +531,11 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty, string.Empty,
importInput.ItemCode, importInput.ItemCode,
importInput.LocationCode).ConfigureAwait(false); importInput.LocationErpCode).ConfigureAwait(false);
if (balance == null) if (balance == null)
{ {
validationRresult.Add(new ValidationResult($"ERP料号{importInput.ItemCode}在库位{importInput.LocationCode}没有库存记录", new string[] { "库存余额" })); validationRresult.Add(new ValidationResult($"ERP料号{importInput.ItemCode}在库位{importInput.LocationErpCode}没有库存记录", new string[] { "库存余额" }));
} }
else else
{ {
@ -543,7 +583,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
protected override async Task ValidateImportModelAsync(UnplannedIssueRequestImportInput model, List<ValidationResult> validationRresult) protected override async Task ValidateImportModelAsync(UnplannedIssueRequestImportInput model, List<ValidationResult> validationRresult)
{ {
_ = await CheckItemBasicAsync(model, validationRresult).ConfigureAwait(false); _ = await CheckItemBasicAsync(model, validationRresult).ConfigureAwait(false);
_ = await CheckLocationAsync(model.LocationCode, validationRresult).ConfigureAwait(false); await CheckErpLocationAsync(model.LocationErpCode, validationRresult).ConfigureAwait(false);
await CheckOnceBusiCodeAsync(model, validationRresult).ConfigureAwait(false);//次交易码 await CheckOnceBusiCodeAsync(model, validationRresult).ConfigureAwait(false);//次交易码
//await CheckCaseCodeAsync(model, validationRresult).ConfigureAwait(false);//专案代码 //await CheckCaseCodeAsync(model, validationRresult).ConfigureAwait(false);//专案代码
@ -566,14 +606,13 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
return item; return item;
} }
protected async Task<LocationDTO> CheckLocationAsync(string locationCode, List<ValidationResult> validationRresult) protected virtual async Task CheckErpLocationAsync(string locationCode, List<ValidationResult> validationRresult)
{ {
var location = await LocationAclService.GetByCodeAsync(locationCode).ConfigureAwait(false); var location = await _locationAppService.GetListByErpLocationCodes(new List<string> { locationCode }).ConfigureAwait(false);
if (location == null) if (location == null || location.Count == 0)
{ {
validationRresult.Add(new ValidationResult($"调出库位{locationCode}不存在", new string[] { "调出库位" })); validationRresult.Add("调出储位", $"调入出位{locationCode}不存在");
} }
return location;
} }
protected async Task CheckOnceBusiCodeAsync(UnplannedIssueRequestImportInput importInput, List<ValidationResult> validationRresult) protected async Task CheckOnceBusiCodeAsync(UnplannedIssueRequestImportInput importInput, List<ValidationResult> validationRresult)

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

@ -326,7 +326,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
var location = await _locationAppService.GetListByErpLocationCodes(new List<string>{ locationCode }).ConfigureAwait(false); var location = await _locationAppService.GetListByErpLocationCodes(new List<string>{ locationCode }).ConfigureAwait(false);
if (location == null||location.Count==0) if (location == null||location.Count==0)
{ {
validationRresult.Add("调入储位", $"调入库位{locationCode}不存在"); validationRresult.Add("调出储位", $"调入出位{locationCode}不存在");
} }
} }

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

@ -101,4 +101,7 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase<UnplannedIssueJobDetail
detail.ExtraProperties = extraProperty; detail.ExtraProperties = extraProperty;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
} }
} }

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

@ -4,6 +4,10 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office.CustomUI;
using DocumentFormat.OpenXml.Office2010.Excel;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
@ -22,26 +26,36 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
/// <summary> /// <summary>
/// 执行任务 发料任务 /// 执行任务 发料任务
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name=id></param>
/// <param name="input"></param> /// <param name=input></param>
/// <param name="user"></param> /// <param name=user></param>
/// <returns></returns> /// <returns></returns>
public override async Task<UnplannedIssueJob> CompleteAsync(UnplannedIssueJob input, ICurrentUser user) public override async Task<UnplannedIssueJob> CompleteAsync(UnplannedIssueJob input, ICurrentUser user)
{ {
UnplannedIssueJob entity = await Repository.FindAsync(input.Id).ConfigureAwait(false); var entity = await Repository.GetAsync(input.Id).ConfigureAwait(false);
entity.BuildDate = input.BuildDate; entity.BuildDate = input.BuildDate;
entity.DeptCode = input.DeptCode; entity.DeptCode = input.DeptCode;
entity.DeptName = input.DeptName; entity.DeptName = input.DeptName;
entity.CompleteUserName = input.CompleteUserName; entity.CompleteUserName = input.CompleteUserName;
entity.CompleteUserId = input.CompleteUserId; entity.CompleteUserId = input.CompleteUserId;
var first= entity.FacDetails.FirstOrDefault();
foreach (var detail in input.Details) foreach (var detail in input.Details)
{ {
//发料子任务 赋值实际转移 detail.SetIdAndNumber(GuidGenerator, input.Id, input.Number);
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.ReasonCode = first.ReasonCode;
detail.HandledContainerCode, detail.HandledLot, detail.HandledPackingCode, detail.ExtraProperties).ConfigureAwait(false); detail.CaseCode = first.CaseCode;
detail.ProjCapacityCode = first.ProjCapacityCode;
detail.OnceBusiCode = first.OnceBusiCode;
detail.Explain = first.Explain;
detail.Status = EnumInventoryStatus.OK;
entity.AddDetail(detail);
//发料子任务 赋值实际转移
} }
return await base.CompleteAsync(entity, user).ConfigureAwait(false); return await base.CompleteAsync(entity, user).ConfigureAwait(false);
} }
@ -52,7 +66,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
{ {
if (detail.HandledFromLocationCode == null) if (detail.HandledFromLocationCode == null)
{ {
result.Errors.Add(new ValidationResult($"{detail.HandledFromLocationCode} 不能为空")); result.Errors.Add(new ValidationResult($"{detail.HandledFromLocationCode}不能为空"));
} }
} }
@ -73,7 +87,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
///// <summary> ///// <summary>
///// 临时修改 解决补料无法拿到订阅错误 ///// 临时修改 解决补料无法拿到订阅错误
///// </summary> ///// </summary>
///// <param name="eventData"></param> ///// <param name=eventData></param>
///// <returns></returns> ///// <returns></returns>
//public virtual async Task<List<UnplannedIssueJob>> AddByEtoAsync(MaterialRequestHandledETO eventData) //public virtual async Task<List<UnplannedIssueJob>> AddByEtoAsync(MaterialRequestHandledETO eventData)
//{ //{
@ -89,7 +103,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
//public virtual async Task TestError() //public virtual async Task TestError()
//{ //{
// throw new UserFriendlyException("我是测试的异常"); // throw new UserFriendlyException(我是测试的异常);
//} //}
public async Task<UnplannedIssueJob> GetAsync(Expression<Func<UnplannedIssueJob, bool>> expression) public async Task<UnplannedIssueJob> GetAsync(Expression<Func<UnplannedIssueJob, bool>> expression)
{ {

82
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs

@ -1,11 +1,13 @@
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using static Quartz.Logging.OperationName;
namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; namespace Win_in.Sfs.Wms.Store.Event.BusinessJob;
@ -44,6 +46,18 @@ public class UnplannedIssueJobEventHandler :
var note = BuildUnplannedIssueNoteCreateInput(entity); var note = BuildUnplannedIssueNoteCreateInput(entity);
await _noteApp.CreateAsync(note).ConfigureAwait(false); await _noteApp.CreateAsync(note).ConfigureAwait(false);
entity.JobStatus=EnumJobStatus.Done;
//job.CompleteUserName = worker;
//job.JobStatus = EnumJobStatus.Done;
//job = await _repository.UpdateAsync(job).ConfigureAwait(false);
//await LocalEventBus.PublishAsync(new SfsCompletedEntityEventData<UnplannedReceiptJob>(job), false).ConfigureAwait(false);
//await UpdateRequestStatusAsync(job.UnplannedReceiptRequestNumber).ConfigureAwait(false);
} }
[UnitOfWork] [UnitOfWork]
@ -71,17 +85,71 @@ public class UnplannedIssueJobEventHandler :
/* /*
createInput.Details = new List<UnplannedIssueNoteDetailInput>(); createInput.Details = new List<UnplannedIssueNoteDetailInput>();
//var strs= GetDifferentPropertyNames(typeof(UnplannedIssueJobDetail), typeof(UnplannedIssueNoteDetailInput));
//var strs1 = GetDifferentPropertyNames(typeof(UnplannedIssueNoteDetailInput), typeof(UnplannedIssueJobDetail));
foreach (var inputDetail in entity.Details) foreach (var inputDetail in entity.Details)
{ {
var detail = ObjectMapper.Map<UnplannedIssueJobDetail, UnplannedIssueNoteDetailInput>(inputDetail); if (inputDetail.HandledQty > 0)
{
var detail = ObjectMapper.Map<UnplannedIssueJobDetail, UnplannedIssueNoteDetailInput>(inputDetail);
detail.LocationCode = inputDetail.HandledFromLocationCode;
detail.LocationArea = inputDetail.HandledFromLocationArea;
detail.LocationGroup=inputDetail.HandledFromLocationGroup;
detail.LocationErpCode = inputDetail.HandledFromLocationErpCode;
detail.WarehouseCode = inputDetail.HandledFromWarehouseCode;
detail.PackingCode = inputDetail.HandledPackingCode;
detail.ContainerCode=inputDetail.HandledContainerCode;
detail.Qty=inputDetail.HandledQty;
detail.Lot=inputDetail.HandledLot;
detail.SupplierBatch = inputDetail.HandledSupplierBatch;
detail.ArriveDate=inputDetail.HandledArriveDate;
detail.ProduceDate = inputDetail.HandledProduceDate;
detail.ExpireDate=inputDetail.HandledExpireDate;
detail.Uom = inputDetail.Uom;
detail.ExtraProperties = inputDetail.ExtraProperties;
createInput.Details.Add(detail);
}
}
return createInput;
}
detail.ExtraProperties = inputDetail.ExtraProperties; //public static string[] GetDifferentFieldNames(Type type1, Type type2)
//{
// // 获取两个类型的字段
// var fields1 = type1.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
// var fields2 = type2.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
createInput.Details.Add(detail); // // 获取字段名称
} // var fieldNames1 = fields1.Select(f => f.Name).ToArray();
*/ // var fieldNames2 = fields2.Select(f => f.Name).ToArray();
return createInput; // // 找出不同的字段名称
// var differentFields = fieldNames1.Except(fieldNames2).ToArray();
// return differentFields;
//}
public static string[] GetDifferentPropertyNames(Type type1, Type type2)
{
// 获取两个类型的属性
var properties1 = type1.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
var properties2 = type2.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
// 获取属性名称
var propertyNames1 = properties1.Select(p => p.Name).ToArray();
var propertyNames2 = properties2.Select(p => p.Name).ToArray();
// 找出不同的属性名称
var differentProperties = propertyNames1.Except(propertyNames2)
.ToArray();
return differentProperties;
} }
} }

16
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
@ -11,6 +12,7 @@ using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Event.Inventories; using Win_in.Sfs.Wms.Store.Event.Inventories;
using Win_in.Sfs.Wms.Store.Event.Transaction; using Win_in.Sfs.Wms.Store.Event.Transaction;
using static Quartz.Logging.OperationName;
namespace Win_in.Sfs.Wms.Store.Event.Transactions; namespace Win_in.Sfs.Wms.Store.Event.Transactions;
@ -23,8 +25,9 @@ public class UnplannedIssueNoteEventHandler
private const EnumTransType TransType = EnumTransType.UnplannedIssue; private const EnumTransType TransType = EnumTransType.UnplannedIssue;
private readonly IUnplannedIssueRequestAppService _unplannedIssueRequestApp; private readonly IUnplannedIssueRequestAppService _unplannedIssueRequestApp;
private readonly IUnplannedIssueJobAppService _unplannedIssueJobApp;
public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp) public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp,IUnplannedIssueJobAppService _unplannedIssueJobApp)
{ {
this._unplannedIssueRequestApp = unplannedIssueRequestApp; this._unplannedIssueRequestApp = unplannedIssueRequestApp;
} }
@ -37,11 +40,12 @@ public class UnplannedIssueNoteEventHandler
if (!string.IsNullOrEmpty(entity.UnplannedIssueRequestNumber)) if (!string.IsNullOrEmpty(entity.UnplannedIssueRequestNumber))
{ {
await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); //await _unplannedIssueRequestApp.UpdateStatusByJobAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw) //await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
{ //if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw)
await ExpectOutAppService.RemoveAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); //{
} // await ExpectOutAppService.RemoveAsync(entity.JobNumber).ConfigureAwait(false);
//}
} }
} }

Loading…
Cancel
Save