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<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.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
@ -39,3 +41,16 @@ public class UnplannedIssueRequestDTO : SfsStoreRequestDTOBase<UnplannedIssueReq
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>
{
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
{
/// <summary>
/// OA单据号
/// </summary>
[Display(Name = "OA单据号")]
public string OANumber { get; set; }
/// <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
, IHasQty
{
[Display(Name = "领料类别", Order = 0)]
[Required(ErrorMessage = "领料类别不能为空")]
public EnumUnplannedIssueType UnplannedIssueType { get; set; }
//[Display(Name = "领料类别", Order = 0)]
//[Required(ErrorMessage = "领料类别不能为空")]
//public EnumUnplannedIssueType UnplannedIssueType { get; set; }
/// <summary>
/// ERP料号
@ -38,7 +38,7 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
/// </summary>
[Display(Name = "调出库位")]
[Required(ErrorMessage = "调出库位不能为空")]
public string LocationCode { get; set; }
public string LocationErpCode { get; set; }
/// <summary>
/// 专案
@ -59,13 +59,13 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
[Display(Name = "次交易码")]
public string OnceBusiCode { get; set; }
/// <summary>
/// 箱码
/// </summary>
[Display(Name = "箱码")]
[ImporterHeader(IsIgnore = true)]
[ExporterHeader(IsIgnore = true)]
public string PackingCode { get; set; }
///// <summary>
///// 箱码
///// </summary>
//[Display(Name = "箱码")]
//[ImporterHeader(IsIgnore = true)]
//[ExporterHeader(IsIgnore = true)]
//public string PackingCode { get; set; }
/// <summary>
/// 仓库代码
@ -87,4 +87,95 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase
[Display(Name = "说明")]
[Required(ErrorMessage = "说明不能为空")]
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Irony;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Omu.ValueInjecter;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared;
@ -29,21 +33,26 @@ public class UnplannedIssueJobAppService
: SfsJobAppServiceBase<UnplannedIssueJob, UnplannedIssueJobDetail, UnplannedIssueJobDTO, SfsJobRequestInputBase, UnplannedIssueJobCheckInput, UnplannedIssueJobEditInput>,
IUnplannedIssueJobAppService
{
protected IUnplannedIssueRequestAppService UnplannedReceiptRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IUnplannedIssueRequestAppService>();
private readonly IUnplannedIssueJobManager _unplannedIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly ILogger<UnplannedIssueJobAppService> _logger;
public UnplannedIssueJobAppService(
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService
) : base(repository, unplannedIssueJobManager)
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, IUnitOfWorkManager unitOfWorkManager, ILogger<UnplannedIssueJobAppService> logger
) : base(repository, unplannedIssueJobManager )
{
_unplannedIssueJobManager = unplannedIssueJobManager;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService;
_unitOfWorkManager = unitOfWorkManager;
_logger = logger;
}
/// <summary>
@ -61,6 +70,15 @@ public class UnplannedIssueJobAppService
}
}
private async Task UpdateRequestStatusAsync(string requestNumber)
{
await UnplannedReceiptRequestAppService.UpdateStatusByJobAsync(requestNumber).ConfigureAwait(false);
}
/// <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>();
decimal totalDeducted = 0;
foreach (var item in inventory)
{
decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted);
item.Qty -= availableToDeduct;
totalDeducted += availableToDeduct;
BalanceDTO dto = new BalanceDTO();
dto.InjectFrom(item);
dto.Qty = availableToDeduct;
balanceDTOs.Add(dto);
if (availableToDeduct > 0)
{
var locationDto = await _locationAppService.GetByCodeAsync(item.LocationCode).ConfigureAwait(false);
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)
{
@ -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)
{
List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>();
List<string> Errors= new List<string>();
foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细
{
var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位
var input = new RecommendBalanceRequestInput
{
ItemCode = requestDtoDetail.ItemCode,
@ -150,6 +180,9 @@ public class UnplannedIssueJobAppService
IsPackingCode = false
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存
usableList = usableList.Where(p => p.Qty> 0).ToList();
usableList = usableList
.OrderBy(p => p.Lot)
.ThenBy(p => p.PutInTime)
@ -161,7 +194,7 @@ public class UnplannedIssueJobAppService
decimal qty = 0;
//实际要用库存
List<BalanceDTO> useBalances = new List<BalanceDTO>();
var returnlist=DeductInventory(usableList, requestDtoDetail.Qty);
var returnlist=await DeductInventory(usableList, requestDtoDetail.Qty).ConfigureAwait(false);
useBalances.AddRange(returnlist);
useBalancesOut.AddRange(returnlist);
@ -194,18 +227,37 @@ public class UnplannedIssueJobAppService
//}
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))
{
var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
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.UnplannedIssueRequestNumber= requestDto.Number;
job.JobType = EnumJobType.UnplannedIssueJob;
job.JobStatus = EnumJobStatus.Open;
job.IsAutoComplete = false;
job.DeptCode = requestDto.DeptCode;
job.DeptName = requestDto.DeptName;
job.Worker = requestDto.Worker;
job.OANumber = requestDto.OANumber;
job.Number =await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true);
job.Details = new List<UnplannedIssueJobDetail>();
@ -215,42 +267,7 @@ public class UnplannedIssueJobAppService
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();
jobfacDetail.Number = job.Number;
jobfacDetail.SetIdAndNumber(GuidGenerator, job.Id, job.Number);
jobfacDetail.CaseCode = requestDtoDetail.CaseCode;
@ -272,17 +289,29 @@ public class UnplannedIssueJobAppService
jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
jobfacDetail.StdPackQty = requestDtoDetail.StdPackQty;
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.RecommendFromLocationCode = balanceDto.LocationCode;
jobfacDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode;
jobfacDetail.RecommendFromLocationGroup = balanceDto.LocationGroup;
jobfacDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode;
jobfacDetail.Status = balanceDto.Status;
jobfacDetail.HandledQty = balanceDto.Qty;
jobfacDetail.Uom = balanceDto.Uom;
job.Details.Add(jobDetail);
//job.Details.Add(jobDetail);
job.FacDetails.Add(jobfacDetail);
}
if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的
@ -290,10 +319,16 @@ public class UnplannedIssueJobAppService
await SendDimensionalStorehouseAsync().ConfigureAwait(false);
job.JobStatus = EnumJobStatus.Wait;
}
jobs.Add(job);
}
}
if (Errors.Count > 0)
{
foreach (var itm in Errors)
{
_logger.LogError(itm);
}
}
return jobs;
}
@ -341,6 +376,56 @@ public class UnplannedIssueJobAppService
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);
//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;
}

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;
}
[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.Extensions.Logging;
using Omu.ValueInjecter;
using Org.BouncyCastle.Asn1.Ocsp;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Uow;
using Volo.Abp.Users;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Basedata.Application.Contracts;
@ -36,13 +38,19 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
private readonly IBalanceAppService _balanceAppService;
private readonly ILocationAppService _locationAppService;
private readonly ITransactionTypeAclService _transactionTypeAclService;
private readonly IUnplannedIssueJobAppService _unplannedIssueJobAppService;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly ILogger<UnplannedIssueRequestForDongyangAppService> _logger;
//private readonly IExportImportService _excelService;
public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository,
IUnplannedIssueRequestManager unplannedIssueRequestManager,
IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService,
ITransactionTypeAclService transactionTypeAclService
ITransactionTypeAclService transactionTypeAclService, IUnplannedIssueJobAppService unplannedIssueJobAppService, IUnitOfWorkManager unitOfWorkManager
, ILogger<UnplannedIssueRequestForDongyangAppService> logger
) : base( repository, unplannedIssueRequestManager, excelService)
{
_unplannedIssueRequestManager = unplannedIssueRequestManager;
@ -50,6 +58,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
_balanceAppService = balanceAppService;
_locationAppService = locationAppService;
_transactionTypeAclService = transactionTypeAclService;
_unplannedIssueJobAppService = unplannedIssueJobAppService;
_unitOfWorkManager = unitOfWorkManager;
_logger = logger;
}
/// <summary>
/// OA创建计划外出库申请
@ -86,11 +97,12 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
[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
{
using var ms = new MemoryStream();
await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false);
var inputFileBytes = ms.GetAllBytes();
@ -98,14 +110,31 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
await CreateByDYOAsync(importList, EnumUnplannedIssueType.IMPORT).ConfigureAwait(false);
//if (errors.Count > 0)
//{
// var fileContent = _excelService.Export(errors);
// return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName = "错误信息" };
//}
List<UnplannedIssueRequestImportDto> errorsList = new List<UnplannedIssueRequestImportDto>();
foreach (var itm in importList)
{
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);
// return new TestResult(fileContent1.FileContents, ExportImportService.ContentType) { FileDownloadName = "Kitting导入文件" };
return new JsonResult(new { Code = 200, FileDownloadName = fileContent1.FileDownloadName });
}
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>
/// OA接口
/// </summary>
@ -124,8 +186,18 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
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)
{
UnplannedIssueRequest request = new UnplannedIssueRequest();
if (p_list.Count == 0)
{
@ -151,9 +226,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
request.DeptCode = first.DeptCode;
request.DeptName = first.DeptName;
request.BuildDate= DateTime.Now;
request.OANumber=first.OANumber;
await SetEntityPropertiesAsync(request).ConfigureAwait(false);
List<UnplannedIssueRequestDetail> detailList = new List<UnplannedIssueRequestDetail>();
foreach (var itm in p_list)
{
@ -162,13 +237,10 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
detail.Qty = itm.Qty;
detail.LocationErpCode = itm.LocationErpCode;
detail.LocationCode = "Random";
detail.WarehouseCode ="Random";
detail.LocationGroup ="Random";
detail.LocationArea = "Random";
detail.CaseCode = first.CaseCode;
detail.ProjCapacityCode = first.ProjCapacityCode;
detail.OnceBusiCode = first.OnceBusiCode;
@ -186,6 +258,22 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
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)
{
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;
detail.PackingCode = packingcode;
}
detail.PackingCode = packingcode;
detail.Status = EnumInventoryStatus.OK;
}
/// <summary>
@ -226,71 +310,39 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
{
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)
{
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)
{
//需要复制一个这个方法 去掉区域参数 换成库位参数
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()}】");
}
}
//if (unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip && unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw)
//{
// throw new UserFriendlyException($"【{unplannedReceiptRequest.UnplannedIssueType}】退料料类型," +
// $"不是{EnumUnplannedReceiptType.Wip.GetDisplayName()}" +
// $"或{EnumUnplannedReceiptType.Raw.GetDisplayName()}】");
//}
await SetRequestAutoPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
await SetEntityPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false);
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($"无推荐库存零件号:{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);
}
foreach (var detail in unplannedReceiptRequest.Details)
{
await SetDetailPropertiesAsync(detail).ConfigureAwait(false);
}
unplannedIssueRequest.Details.Clear();//删除所有明细}
unplannedIssueRequest.Details.AddRange(newDetails);//按推荐添加
}
return dictionary;
}
/// <summary>
/// 创建明细
/// </summary>
@ -349,29 +401,29 @@ 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(
packingcode,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
//string packingcode = string.Empty;
//if(type!= EnumUnplannedIssueType.Wip)
//{
// packingcode = detail.PackingCode;
//}
//var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
// packingcode,
// detail.ItemCode,
// detail.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.SupplierBatch = balance.SupplierBatch;
detail.ArriveDate = balance.ArriveDate;
detail.ProduceDate = balance.ProduceDate;
detail.ExpireDate = balance.ExpireDate;
detail.Lot = balance.Lot;
detail.ContainerCode = balance.ContainerCode;
detail.PackingCode = balance.PackingCode;
detail.Qty = detail.Qty;
detail.Status = balance.Status;
}
//if (balance != null)
//{
// detail.SupplierBatch = balance.SupplierBatch;
// detail.ArriveDate = balance.ArriveDate;
// detail.ProduceDate = balance.ProduceDate;
// detail.ExpireDate = balance.ExpireDate;
// detail.Lot = balance.Lot;
// detail.ContainerCode = balance.ContainerCode;
// detail.PackingCode = balance.PackingCode;
// detail.Qty = detail.Qty;
// detail.Status = balance.Status;
//}
//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>
/// 赋值业务事务
@ -459,13 +485,27 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoCompleteJob = tranType.AutoCompleteJob;
entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest;
entity.AutoHandle = tranType.AutoHandleRequest;
entity.DirectCreateNote = tranType.DirectCreateNote;
entity.AutoCompleteJob = false;
entity.AutoSubmit = true;
entity.AutoAgree = false;
entity.AutoHandle = false;
entity.DirectCreateNote = false;
//entity.AutoCompleteJob = tranType.AutoCompleteJob;
//entity.AutoSubmit = tranType.AutoSubmitRequest;
//entity.AutoAgree = tranType.AutoAgreeRequest;
//entity.AutoHandle = tranType.AutoHandleRequest;
//entity.DirectCreateNote = tranType.DirectCreateNote;
}
#endregion
#region 校验
@ -491,11 +531,11 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty,
importInput.ItemCode,
importInput.LocationCode).ConfigureAwait(false);
importInput.LocationErpCode).ConfigureAwait(false);
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
{
@ -543,7 +583,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
protected override async Task ValidateImportModelAsync(UnplannedIssueRequestImportInput model, List<ValidationResult> validationRresult)
{
_ = 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 CheckCaseCodeAsync(model, validationRresult).ConfigureAwait(false);//专案代码
@ -566,14 +606,13 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA
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);
if (location == null)
var location = await _locationAppService.GetListByErpLocationCodes(new List<string> { locationCode }).ConfigureAwait(false);
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)

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);
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;
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.Expressions;
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.Validation;
using Win_in.Sfs.Shared.Domain.Shared;
@ -22,26 +26,36 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
/// <summary>
/// 执行任务 发料任务
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <param name="user"></param>
/// <param name=id></param>
/// <param name=input></param>
/// <param name=user></param>
/// <returns></returns>
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.DeptCode = input.DeptCode;
entity.DeptName = input.DeptName;
entity.CompleteUserName = input.CompleteUserName;
entity.CompleteUserId = input.CompleteUserId;
var first= entity.FacDetails.FirstOrDefault();
foreach (var detail in input.Details)
{
//发料子任务 赋值实际转移
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);
detail.SetIdAndNumber(GuidGenerator, input.Id, input.Number);
detail.ReasonCode = first.ReasonCode;
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);
}
@ -52,7 +66,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
{
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>
///// <param name="eventData"></param>
///// <param name=eventData></param>
///// <returns></returns>
//public virtual async Task<List<UnplannedIssueJob>> AddByEtoAsync(MaterialRequestHandledETO eventData)
//{
@ -89,7 +103,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase<UnplannedIssueJob, Unp
//public virtual async Task TestError()
//{
// throw new UserFriendlyException("我是测试的异常");
// throw new UserFriendlyException(我是测试的异常);
//}
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 Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using static Quartz.Logging.OperationName;
namespace Win_in.Sfs.Wms.Store.Event.BusinessJob;
@ -44,6 +46,18 @@ public class UnplannedIssueJobEventHandler :
var note = BuildUnplannedIssueNoteCreateInput(entity);
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]
@ -71,17 +85,71 @@ public class UnplannedIssueJobEventHandler :
/*
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)
{
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.Linq;
using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
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.Event.Inventories;
using Win_in.Sfs.Wms.Store.Event.Transaction;
using static Quartz.Logging.OperationName;
namespace Win_in.Sfs.Wms.Store.Event.Transactions;
@ -23,8 +25,9 @@ public class UnplannedIssueNoteEventHandler
private const EnumTransType TransType = EnumTransType.UnplannedIssue;
private readonly IUnplannedIssueRequestAppService _unplannedIssueRequestApp;
private readonly IUnplannedIssueJobAppService _unplannedIssueJobApp;
public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp)
public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp,IUnplannedIssueJobAppService _unplannedIssueJobApp)
{
this._unplannedIssueRequestApp = unplannedIssueRequestApp;
}
@ -37,11 +40,12 @@ public class UnplannedIssueNoteEventHandler
if (!string.IsNullOrEmpty(entity.UnplannedIssueRequestNumber))
{
await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw)
{
await ExpectOutAppService.RemoveAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
}
//await _unplannedIssueRequestApp.UpdateStatusByJobAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
//await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false);
//if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw)
//{
// await ExpectOutAppService.RemoveAsync(entity.JobNumber).ConfigureAwait(false);
//}
}
}

Loading…
Cancel
Save