Browse Source

退拆业务修改

dev_DY_CC
lvzb 1 year ago
parent
commit
dcc7b54cfb
  1. 6
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs
  2. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs
  3. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs
  4. 44
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs
  5. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs
  6. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs
  7. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs
  8. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs
  9. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs
  10. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs
  11. 36
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs
  12. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs
  13. 31
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs
  14. 31
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs
  15. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs
  16. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs
  17. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs
  18. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs
  19. 27
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs
  20. 45
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs
  21. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs
  22. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs
  23. 52
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs
  24. 80
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs
  25. 129
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs
  26. 75
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs
  27. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs
  28. 22
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs
  29. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs
  30. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs

6
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs

@ -29,6 +29,12 @@ public enum EnumJobStatus
[Display(Name = "完成")]
Done = 3,
/// <summary>
/// 部分完成
/// </summary>
[Display(Name = "部分完成")]
Partial = 4,
/// <summary>
/// 关闭
/// </summary>

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs

@ -1,12 +1,17 @@
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Entities;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
[Display(Name = "客户退拆任务")]
public class ProductRecycleJobDTO : SfsJobDTOBase<ProductRecycleJobDetailDTO>
{
{
/// <summary>
/// 客户退拆申请单号
/// </summary>
[Display(Name = "客户退拆申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 车间
/// </summary>

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs

@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Volo.Abp.Data;
@ -87,4 +88,6 @@ public class ProductRecycleJobDetailDTO : SfsJobRecommendToDetailDTOBase
/// </summary>
public string WarehouseCode { get; set; }
public List<ProductRecycleJobMaterialDetailDto> MaterialDetails { get; set; } = new List<ProductRecycleJobMaterialDetailDto>();
}

44
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobMaterialDetailDto : EntityDto
{
/// <summary>
/// 零件代码
/// </summary>
public string ItemCode { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal Qty { get; set; }
/// <summary>
/// 库位代码
/// </summary>
public string LocationCode { get; set; }
/// <summary>
/// 库区
/// </summary>
public string LocationArea { get; set; }
/// <summary>
/// 库位组
/// </summary>
public string LocationGroup { get; set; }
/// <summary>
/// ERP库位代码
/// </summary>
public string LocationErpCode { get; set; }
/// <summary>
/// 仓库代码
/// </summary>
public string WarehouseCode { get; set; }
}

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs

@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -6,5 +7,5 @@ public interface IProductRecycleJobAppService
: ISfsJobAppServiceBase<ProductRecycleJobDTO, SfsJobRequestInputBase, ProductRecycleJobCheckInput, ProductRecycleJobEditInput>
{
}

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs

@ -9,7 +9,11 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<ProductRecycleJobDetailInput>
{
#region Create
/// <summary>
/// 申请单号
/// </summary>
[Display(Name = "申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 车间
/// </summary>

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs

@ -11,9 +11,14 @@ using System.Collections.Generic;
/// </summary>
public class ProductRecycleNoteDTO : SfsStoreDTOBase<ProductRecycleNoteDetailDTO>, IHasNumber
{
[Display(Name = "成品回收申请单号")]
[Display(Name = "客户退拆申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 客户退拆任务单号
/// </summary>
[Display(Name = "客户退拆任务单号")]
public string JobNumber { get; set; }
/// <summary>
/// 回收时间
/// </summary>

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs

@ -6,6 +6,7 @@ using System.Text;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Notes.ProductRecycleNotes.DTOs;
[Display(Name = "客户退拆明细")]
public class ProductRecycleNoteDetailExtendDto
{

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs

@ -39,7 +39,6 @@ public class ProductRecycleNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary>
[Display(Name = "申请单号")]
public string RequestNumber { get; set; }
/// <summary>
/// 任务单号
/// </summary>

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs

@ -1,3 +1,4 @@
using System.Threading.Tasks;
using Win_in.Sfs.Shared.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -6,5 +7,5 @@ public interface IProductRecycleRequestAppService
: ISfsStoreRequestMasterAppServiceBase<ProductRecycleRequestDTO, SfsStoreRequestInputBase, ProductRecycleRequestEditInput, ProductRecycleRequestDetailDTO, SfsStoreRequestInputBase>
, ISfsCheckStatusAppService
{
Task UpdateStatusByNumberAsync(string number);
}

36
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs

@ -1,6 +1,10 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Uow;
using Volo.Abp;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -16,13 +20,39 @@ public class ProductRecycleJobAppService
{
private readonly IProductRecycleJobManager _productRecycleJobManager;
private readonly IProductRecycleRequestAppService _productRecycleRequestAppService;
public ProductRecycleJobAppService(
IProductRecycleJobRepository repository, IProductRecycleJobManager productRecycleJobManager)
IProductRecycleJobRepository repository, IProductRecycleJobManager productRecycleJobManager,
IProductRecycleRequestAppService productRecycleRequestAppService)
: base(repository, productRecycleJobManager)
{
_productRecycleJobManager = productRecycleJobManager;
_productRecycleRequestAppService = productRecycleRequestAppService;
}
/// <summary>
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost("handle/{id}")]
[UnitOfWork]
public override async Task<ProductRecycleJobDTO> CompleteAsync(Guid id, ProductRecycleJobDTO dto)
{
var handleEntity = ObjectMapper.Map<ProductRecycleJobDTO, ProductRecycleJob>(dto);
var job = await _repository.GetAsync(id).ConfigureAwait(false);
if (job.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None or EnumJobStatus.Done)//需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException($"任务状态错误:编号为【{job.Number}】的任务已经【{job.JobStatus.GetDisplayName()}】");
}
var handleResult = await _productRecycleJobManager.CompleteAsync(handleEntity, job, CurrentUser).ConfigureAwait(false);
//判断申请是否执行完成
if(job.JobStatus== EnumJobStatus.Done)
{
await _productRecycleRequestAppService.UpdateStatusByNumberAsync(job.RequestNumber).ConfigureAwait(false);
}
var handleDto = ObjectMapper.Map<ProductRecycleJob, ProductRecycleJobDTO>(handleResult);
return handleDto;
}
}

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs

@ -2,6 +2,7 @@ using AutoMapper;
using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs;
namespace Win_in.Sfs.Wms.Store.Application;
@ -12,9 +13,12 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<ProductRecycleJob, ProductRecycleJobDTO>()
.ReverseMap();
CreateMap<ProductRecycleJobDetail, ProductRecycleJobDetailDTO>()
.ReverseMap();
CreateMap<ProductRecycleJobDetailDTO,ProductRecycleJobDetail>()
.AfterMap((x, y) => y.ExecutedQty += x.Qty)//已完成数量进行累计
.ReverseMap();
CreateMap<ProductRecycleJobDetail, ProductRecycleJobDetailDTO>()
.ReverseMap();
CreateMap<ProductRecycleJobEditInput, ProductRecycleJob>();
CreateMap<ProductRecycleJobDetailInput, ProductRecycleJobDetail>()
@ -26,6 +30,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<ProductRecycleJobDetailDTO, ProductRecycleJobDetail>()
;
CreateMap<ProductRecycleJobMaterialDetailDto, ProductRecycleJobMaterialDetail>()
;
}
}

31
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs

@ -107,29 +107,28 @@ public class ProductRecycleNoteAppService :
var items = pagedResult.Items.ToList();
await SetNoteAndBackFlushDetailsAsync(pagedResult.Items.ToList()).ConfigureAwait(false);
//await SetNoteAndBackFlushDetailsAsync(pagedResult.Items.ToList()).ConfigureAwait(false);
var exports = BuildProductRecycleNoteAndBackFlushDetailExport(items);
// var exports = BuildProductRecycleNoteAndBackFlushDetailExport(items);
List<ProductRecycleNoteDetailExtendDto> exportlist=new List<ProductRecycleNoteDetailExtendDto>();
foreach (var itm in exports)
foreach (var itm in items)
{
exportlist.Add(new ProductRecycleNoteDetailExtendDto()
foreach (var m_item in itm.MaterialDetails)
{
exportlist.Add(new ProductRecycleNoteDetailExtendDto()
{
ItemCode = itm.ItemCode,
LocCode = itm.LocationCode,
Reason = string.Empty,
Qty = itm.Qty,
Type = "客户退拆"
ItemCode = m_item.ItemCode,
LocCode = m_item.LocationCode,
Reason = String.Join(',', itm.Details.Where(p=>!string.IsNullOrEmpty(p.ReasonCode)).SelectMany(r=>r.ReasonCode)),
Qty = m_item.Qty,
Type = "客户退拆"
});
});
}
}
return ExportImportService.Export(exports);
return ExportImportService.Export(exportlist);
}
catch (Exception ex)
{
@ -222,7 +221,7 @@ public class ProductRecycleNoteAppService :
dto.LocationCode = nabfDetail.LocationCode;
dto.WorkHour = nabfDetail.WorkHour;
dto.RawItemCode = nabfDetail.RawItemCode;
dto.RawQty = nabfDetail.Qty;
dto.RawQty = nabfDetail.RawQty;
dto.RawLocationCode = nabfDetail.RawLocationCode;
result.Add(dto);

31
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs

@ -19,6 +19,7 @@ namespace Win_in.Sfs.Wms.Store.Application;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Inventory.Domain;
@ -88,6 +89,13 @@ public class ProductRecycleRequestAppService :
await Task.CompletedTask.ConfigureAwait(false);
throw new NotImplementedException();
}
[HttpPost("update-status")]
public virtual async Task UpdateStatusByNumberAsync(string number)
{
var item=await _productRecycleRequestManager.GetByNumberAsync(number).ConfigureAwait(false);
item.RequestStatus = EnumRequestStatus.Completed;
await _productRecycleRequestManager.UpdateAsync(item).ConfigureAwait(false);
}
#region 东阳
@ -97,22 +105,21 @@ public class ProductRecycleRequestAppService :
foreach (var productRecycleRequest in addList)
{
await SetRequestAutoPropertiesAsync(productRecycleRequest)
.ConfigureAwait(false);
await SetRequestAutoPropertiesAsync(productRecycleRequest).ConfigureAwait(false);
productRecycleRequest.Worker = CurrentUser.GetUserName();
foreach (var detail in productRecycleRequest.Details)
{
//var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
// string.Empty,
// detail.ItemCode,
// detail.LocationCode).ConfigureAwait(false);
//if (balance != null)
//{
// detail.Status = balance.Status;
//}
detail.Status = EnumInventoryStatus.OK;
var balance = await _balanceAppService.GetByItemLocationAndPackingAsync(
string.Empty,
detail.ItemCode,
detail.LocationCode).ConfigureAwait(false);
if (balance != null)
{
detail.Status = balance.Status;
}
// detail.Status = EnumInventoryStatus.OK;
var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode)
.ConfigureAwait(false);

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs

@ -62,6 +62,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile
.Ignore(x => x.Remark);
CreateMap<ProductRecycleRequest, ProductRecycleJobEditInput>()
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.Number))
.ReverseMap();
CreateMap<ProductRecycleRequestDetail, ProductRecycleJobDetailInput>()

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs

@ -1,10 +1,12 @@
using System;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Volo.Abp.Users;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface IProductRecycleJobManager : IJobManager<ProductRecycleJob>
{
Task<ProductRecycleJob> CompleteAsync(ProductRecycleJob entityinput, ProductRecycleJob entity, ICurrentUser user);
Task<ProductRecycleJob> GetAsync(Expression<Func<ProductRecycleJob, bool>> expression);
}

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs

@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Threading.Tasks;
using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs;
namespace Win_in.Sfs.Wms.Store.Domain;
@ -12,6 +14,11 @@ namespace Win_in.Sfs.Wms.Store.Domain;
[Display(Name = "产品退拆任务")]
public class ProductRecycleJob : SfsJobAggregateRootBase<ProductRecycleJobDetail>
{
/// <summary>
/// 退拆请求单号
/// </summary>
[IgnoreUpdate]
public string RequestNumber { get; set; }
/// <summary>
/// 车间
/// </summary>
@ -30,6 +37,8 @@ public class ProductRecycleJob : SfsJobAggregateRootBase<ProductRecycleJobDetail
[IgnoreUpdate]
public override List<ProductRecycleJobDetail> Details { get; set; } = new List<ProductRecycleJobDetail>();
/// <summary>
/// 设置任务明细的实际库位和实际数量
/// </summary>

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs

@ -2,6 +2,8 @@ using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Data;
using Win_in.Sfs.Shared.Domain.Shared;
using System.Collections.Generic;
using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs;
namespace Win_in.Sfs.Wms.Store.Domain;
@ -71,6 +73,13 @@ public class ProductRecycleJobDetail : SfsJobRecommendToDetailEntityBase
[Column(TypeName = "decimal(18,6)")]
public decimal Qty { get; set; }
/// <summary>
/// 已完成数量
/// </summary>
[Display(Name = "数量")]
[Column(TypeName = "decimal(18,6)")]
public decimal ExecutedQty { get; set; }
/// <summary>
/// 扩展属性
/// </summary>
@ -85,4 +94,10 @@ public class ProductRecycleJobDetail : SfsJobRecommendToDetailEntityBase
/// 仓库代码
/// </summary>
public string WarehouseCode { get; set; }
/// <summary>
/// 子零件明细列表
/// </summary>
[NotMapped]
public List<ProductRecycleJobMaterialDetail> MaterialDetails { get; set; } = new List<ProductRecycleJobMaterialDetail>();
}

27
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs

@ -57,5 +57,32 @@ public class ProductRecycleJobManager : SfsJobManagerBase<ProductRecycleJob, Pro
{
return await Repository.FindAsync(expression).ConfigureAwait(false);
}
public async Task<ProductRecycleJob> CompleteAsync(ProductRecycleJob entityinput, ProductRecycleJob entity, ICurrentUser user)
{
await entity.CompleteAsync(user.Id, user.Name, Clock.Now).ConfigureAwait(false);
//判断是否部分完成
bool isDone = true;
foreach (var item in entity.Details)
{
var detail= entityinput.Details.FirstOrDefault(r=> r.ItemCode==item.ItemCode);
if (detail != null)
{
item.ExecutedQty += detail.Qty;
}
}
var ExecutedItem = entity.Details.Where(r => r.ExecutedQty != r.Qty).ToList();
if (ExecutedItem.Count > 0) isDone = false;
if (!isDone)
{
entity.JobStatus=EnumJobStatus.Partial;
}
await PublishCompletedAsync(entityinput).ConfigureAwait(false);
entity.Remark = entityinput.Remark;//返给前台记录用于下载记录excle
return await Repository.UpdateAsync(entity).ConfigureAwait(false);
}
}

45
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs;
public class ProductRecycleJobMaterialDetail
{
/// <summary>
/// 零件代码
/// </summary>
public string ItemCode { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal Qty { get; set; }
/// <summary>
/// 库位代码
/// </summary>
public string LocationCode { get; set; }
/// <summary>
/// 库区
/// </summary>
public string LocationArea { get; set; }
/// <summary>
/// 库位组
/// </summary>
public string LocationGroup { get; set; }
/// <summary>
/// ERP库位代码
/// </summary>
public string LocationErpCode { get; set; }
/// <summary>
/// 仓库代码
/// </summary>
public string WarehouseCode { get; set; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs

@ -15,6 +15,11 @@ public class ProductRecycleNote : SfsStoreAggregateRootBase<ProductRecycleNoteDe
/// </summary>
[IgnoreUpdate]
public string RequestNumber { get; set; }
/// <summary>
/// 退拆任务单号
/// </summary>
[IgnoreUpdate]
public string JobNumber { get; set; }
/// <summary>
/// 回收时间

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs

@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain;
@ -22,7 +23,9 @@ public static class ProductRecycleJobDbContextModelCreatingExtensions
b.ConfigureJob<ProductRecycleJob, ProductRecycleJobDetail>();
//Properties
b.Property(q => q.Workshop).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.Shift).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.Shift).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ExtraProperties).HasPrecision(18, 6);
//Relations
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired();
//Indexes

52
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs

@ -0,0 +1,52 @@
using System;
using AutoMapper;
using Volo.Abp.AutoMapper;
using Win_in.Sfs.Shared.Application;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Event;
public partial class StoreEventAutoMapperProfile : Profile
{
private void ProductRecycleJobAutoMapperProfile()
{
CreateMap<ProductRecycleJob, ProductRecycleNoteEditInput>()
.ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number))
.ForMember(x => x.RecycleTime, y => y.MapFrom(d => d.CompleteTime))
.ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now))
.Ignore(x => x.MaterialDetails)
;
CreateMap<ProductRecycleJobDetail, ProductRecycleNoteDetailInput>()
.Ignore(x => x.StdPackQty)
.Ignore(x => x.ContainerCode)
.Ignore(x => x.PackingCode)
.Ignore(x => x.SupplierBatch)
.Ignore(x => x.ArriveDate)
.Ignore(x => x.ProduceDate)
.Ignore(x => x.ExpireDate)
.Ignore(x => x.Lot)
.Ignore(x => x.ReasonCode)
.AfterMap((x, y) => y.Lot = string.Empty)
.AfterMap((x, y) => y.PackingCode = string.Empty)
;
CreateMap<ProductRecycleJobDetail, ExpectOutEditInput>()
.MapExpectInOutTo()
.Ignore(x => x.SerialNumber)
.Ignore(x => x.Worker)
.Ignore(x => x.ExtraProperties)
;
CreateMap<ProductRecycleJobDetail, ExpectInEditInput>()
.MapExpectInOutTo()
.ForMember(x => x.LocationCode, y => y.MapFrom(d => d.RecommendToLocationCode))
.ForMember(x => x.LocationArea, y => y.MapFrom(d => d.RecommendToLocationArea))
.ForMember(x => x.LocationGroup, y => y.MapFrom(d => d.RecommendToLocationGroup))
.ForMember(x => x.LocationErpCode, y => y.MapFrom(d => d.RecommendToLocationErpCode))
.ForMember(x => x.WarehouseCode, y => y.MapFrom(d => d.RecommendToWarehouseCode))
.Ignore(x => x.SerialNumber)
.Ignore(x => x.Worker)
.Ignore(x => x.ExtraProperties);
}
}

80
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.EventBus;
using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Event.Inventories;
namespace Win_in.Sfs.Wms.Store.Event.ExpectInOuts;
public class ProductRecycleJobEventHandler :
StoreExpectInOutEventHandlerBase
, ILocalEventHandler<SfsCreatedEntityEventData<ProductRecycleJob>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<ProductRecycleJob>>>
, ILocalEventHandler<SfsCompletedEntityEventData<ProductRecycleJob>>
, ILocalEventHandler<SfsCancelledEntityEventData<ProductRecycleJob>>
{
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
if (!entity.IsAutoComplete)
{
await AddExpectOutsAsync(new List<ProductRecycleJob>() { entity }).ConfigureAwait(false);
}
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<ProductRecycleJob>> eventData)
{
var entities = eventData.Entity;
foreach (var entity in entities)
{
await AddExpectOutsAsync(new List<ProductRecycleJob>() { entity }).ConfigureAwait(false);
}
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
await ExpectOutAppService.RemoveAsync(entity.Number).ConfigureAwait(false);
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCancelledEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
await ExpectOutAppService.RemoveAsync(entity.Number).ConfigureAwait(false);
}
private async Task AddExpectOutsAsync(List<ProductRecycleJob> entities)
{
var expectOuts = new List<ExpectOutEditInput>();
foreach (var entity in entities)
{
var entityExpectOuts = BuildExpectOutInventoryAsync(entity);
expectOuts.AddRange(entityExpectOuts);
}
await ExpectOutAppService.AddManyAsync(expectOuts).ConfigureAwait(false);
}
private List<ExpectOutEditInput> BuildExpectOutInventoryAsync(ProductRecycleJob purchaseReturnJob)
{
var inputs = ObjectMapper.Map<List<ProductRecycleJobDetail>, List<ExpectOutEditInput>>(purchaseReturnJob.Details);
foreach (var input in inputs)
{
input.WarehouseCode = purchaseReturnJob.WarehouseCode;
input.Worker = purchaseReturnJob.Worker;
input.JobNumber = purchaseReturnJob.Number;
}
return inputs;
}
}

129
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs

@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.EventBus;
using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts;
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 Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs;
namespace Win_in.Sfs.Wms.Store.Event.BusinessJob;
public class ProductRecycleJobEventHandler :
StoreEventHandlerBase
, ILocalEventHandler<SfsCreatedEntityEventData<ProductRecycleJob>>
, ILocalEventHandler<SfsCompletedEntityEventData<ProductRecycleJob>>
{
private readonly IProductRecycleNoteAppService _productRecycleNoteAppService;
private readonly IBomAppService _bomApp;
public ProductRecycleJobEventHandler(
IProductRecycleNoteAppService productRecycleNoteAppService,
IBomAppService bomApp
)
{
_productRecycleNoteAppService = productRecycleNoteAppService;
_bomApp=bomApp;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
if (entity.IsAutoComplete)
{
entity.CompleteTime = Clock.Now;
entity.JobStatus = EnumJobStatus.Done;
foreach (var detail in eventData.Entity.Details)
{
detail.SetHandledFromRecommend();
}
var note = await BuildProductRecycleNoteAsync(entity).ConfigureAwait(false);
await _productRecycleNoteAppService.CreateAsync(note).ConfigureAwait(false);
}
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
var ProductRecycleNote = await BuildProductRecycleNoteAsync(entity).ConfigureAwait(false);
var dto= await _productRecycleNoteAppService.CreateAsync(ProductRecycleNote).ConfigureAwait(false);
eventData.Entity.Remark = dto.Number;//返给前台记录用于下载记录excle
}
private async Task<ProductRecycleNoteEditInput> BuildProductRecycleNoteAsync(ProductRecycleJob job)
{
var createInput = ObjectMapper.Map<ProductRecycleJob, ProductRecycleNoteEditInput>(job);
createInput.MaterialDetails = await BuildMaterialDetailsAsync(job).ConfigureAwait(false);
return createInput;
}
private async Task<List<ProductRecycleMaterialDetailInput>> BuildMaterialDetailsAsync(ProductRecycleJob request)
{
var materialDetailInputs = new List<ProductRecycleMaterialDetailInput>();
foreach (var detail in request.Details)
{
var materialdetails = detail.MaterialDetails;
var componentItemCode = materialdetails.Select(p => p.ItemCode).Distinct().ToList();
var items = await ItemBasicAclService.GetByCodesAsync(componentItemCode).ConfigureAwait(false);
foreach (var materialdetail in materialdetails)
{
var item = items.FirstOrDefault(p => p.Code == materialdetail.ItemCode);
var detailInput = BuildMaterialDetailInput(materialdetail, item, detail);
materialDetailInputs.Add(detailInput);
}
}
return materialDetailInputs;
}
private static ProductRecycleMaterialDetailInput BuildMaterialDetailInput(ProductRecycleJobMaterialDetail materialdetail, ItemBasicDTO item,
ProductRecycleJobDetail detail)
{
var detailInput = new ProductRecycleMaterialDetailInput
{
ProductPackingCode = string.Empty,
ProductItemCode = detail.ItemCode,
ProductItemName = detail.ItemName,
ProductItemDesc1 = detail.ItemDesc1,
ProductItemDesc2 = detail.ItemDesc2,
ProductLot = string.Empty,
PackingCode = string.Empty,
ItemCode = materialdetail.ItemCode,
Qty = materialdetail.Qty ,
Uom = detail.Uom,
BomVersion = detail.BomVersion,
LocationCode = materialdetail.LocationCode,
LocationErpCode = materialdetail.LocationErpCode,
WarehouseCode = materialdetail.WarehouseCode,
Lot = string.Empty,
Status = EnumInventoryStatus.OK,
LocationArea = materialdetail.LocationArea,
LocationGroup = materialdetail.LocationGroup,
};
if (item != null)
{
detailInput.ItemName = item.Name;
detailInput.ItemDesc1 = item.Desc1;
detailInput.ItemDesc2 = item.Desc2;
detailInput.StdPackQty = item.StdPackQty;
}
return detailInput;
}
}

75
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs

@ -1,75 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.EventBus;
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;
namespace Win_in.Sfs.Wms.Store.Event.BusinessJob;
public class ProductionRecycleJobEventHandler :
StoreEventHandlerBase
, ILocalEventHandler<SfsCreatedEntityEventData<ProductRecycleJob>>
, ILocalEventHandler<SfsCompletedEntityEventData<ProductRecycleJob>>
{
private readonly IProductRecycleNoteAppService _productRecycleNoteAppService;
public ProductionRecycleJobEventHandler(
IProductRecycleNoteAppService productRecycleNoteAppService
)
{
_productRecycleNoteAppService = productRecycleNoteAppService;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
if (entity.IsAutoComplete)
{
entity.CompleteTime = Clock.Now;
entity.JobStatus = EnumJobStatus.Done;
foreach (var detail in eventData.Entity.Details)
{
detail.SetHandledFromRecommend();
}
var note = BuildProductionReturnNote(entity);
await _productRecycleNoteAppService.CreateAsync(note).ConfigureAwait(false);
}
}
[UnitOfWork]
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<ProductRecycleJob> eventData)
{
var entity = eventData.Entity;
var productRecycleNote = BuildProductionReturnNote(entity);
await _productRecycleNoteAppService.CreateAsync(productRecycleNote).ConfigureAwait(false);
}
private ProductRecycleNoteEditInput BuildProductionReturnNote(ProductRecycleJob entity)
{
var input = ObjectMapper.Map<ProductRecycleJob, ProductRecycleNoteEditInput>(entity);
input.Details = new List<ProductRecycleNoteDetailInput>();
foreach (var detail in entity.Details.Where(detail => detail.HandledQty != 0))
{
var inputDetail = ObjectMapper.Map<ProductRecycleJobDetail, ProductRecycleNoteDetailInput>(detail);
input.Details.Add(inputDetail);
}
return input;
}
}

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs

@ -9,6 +9,7 @@ using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
using System.Runtime.InteropServices;
using Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductReceiptNoteEventHandler
@ -22,14 +23,18 @@ public class ProductReceiptNoteEventHandler
//private readonly IProductReceiptRequestAppService _productReceiptRequestApp;
private readonly IProductReceiptRequestManager _productReceiptRequestManager;
private readonly IDeliverRequestAppService _deliverRequestAppService;
public ProductReceiptNoteEventHandler(
IPutawayJobAppService putawayJobAppService
//, IProductReceiptRequestAppService productReceiptRequestApp
, IProductReceiptRequestManager productReceiptRequestManager)
, IProductReceiptRequestManager productReceiptRequestManager,
IDeliverRequestAppService deliverRequestAppService)
{
_putawayJobAppService = putawayJobAppService;
//_productReceiptRequestApp = productReceiptRequestApp;
_productReceiptRequestManager = productReceiptRequestManager;
_deliverRequestAppService = deliverRequestAppService;
}
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<ProductReceiptNote> eventData)
@ -95,6 +100,8 @@ public class ProductReceiptNoteEventHandler
public virtual async Task HandleEventAsync(SfsHandledEntityEventData<ProductReceiptNote> eventData)
{
throw new System.NotImplementedException();
var productReceiptNote = eventData.Entity;
var input = ObjectMapper.Map<ProductReceiptNote, DeliverRequestEditInput>(productReceiptNote);
await _deliverRequestAppService.CreateAsync(input).ConfigureAwait(false);
}
}

22
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs

@ -74,8 +74,6 @@ public class ProductRecycleRequestEventHandler
var entitys = eventData.Entity;
foreach (var entity in entitys)
{
entity.AutoAgree = true;
entity.DirectCreateNote = false;
if (entity.AutoSubmit)
{
await _productRecycleRequestManager.SubmitAsync(entity).ConfigureAwait(false);
@ -158,16 +156,16 @@ public class ProductRecycleRequestEventHandler
ProductRecycleRequestDetail productRecycleRequestDetail, TransactionTypeDTO transactionType)
{
var jobDetails = new List<ProductRecycleJobDetailInput>();
//var input = new RecommendBalanceRequestInput()
//{
// ItemCode = productRecycleRequestDetail.ItemCode,
// Qty = productRecycleRequestDetail.Qty,
// LocationTypes = transactionType.OutLocationTypes,
// LocationAreas = new List<string> { productRecycleRequestDetail.LocationArea },
// Statuses = transactionType.OutInventoryStatuses,
//};
var input = new RecommendBalanceRequestInput()
{
ItemCode = productRecycleRequestDetail.ItemCode,
Qty = productRecycleRequestDetail.Qty,
LocationTypes = transactionType.OutLocationTypes,
LocationAreas = new List<string> { productRecycleRequestDetail.LocationArea },
Statuses = transactionType.OutInventoryStatuses,
};
//获取推荐库存
var recommendList = await _balanceAppService.GetListByItemCodeAsync(productRecycleRequestDetail.ItemCode).ConfigureAwait(false);
var recommendList = await _balanceAppService.GetRecommendBalancesAsync(input).ConfigureAwait(false);
//没有推荐库存时 跳过此明细 不生成任务
if (recommendList.Count != 0)
{
@ -193,6 +191,8 @@ public class ProductRecycleRequestEventHandler
detail.RecommendToLocationErpCode = balance.LocationErpCode;
detail.RecommendToLocationCode = balance.LocationCode;
detail.RecommendToLocationGroup = balance.LocationGroup;
detail.RecommendToLocationArea= balance.LocationArea;
detail.RecommendPackingCode = balance.PackingCode;
detail.RecommendContainerCode = balance.ContainerCode;
detail.RecommendSupplierBatch = balance.SupplierBatch;

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs

@ -39,6 +39,7 @@ public partial class StoreEventAutoMapperProfile : Profile
ProductionReturnJobAutoMapperProfile();
ProductReceiveJobAutoMapperProfile();
PurchaseReceiptJobAutoMapperProfile();
ProductRecycleJobAutoMapperProfile();
PurchaseReturnJobAutoMapperProfile();
PutawayJobAutoMapperProfile();
UnplannedIssueJobAutoMapperProfile();

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs

@ -32,9 +32,9 @@ public class ProductRecycleNoteEventHandler
var entity = eventData.Entity;
await AddTransactionsOfProductAsync(entity).ConfigureAwait(false);
if (!string.IsNullOrEmpty(entity.RequestNumber))
if (!string.IsNullOrEmpty(entity.Number))
{
await _requestAppService.CompleteByNumberAsync(entity.RequestNumber).ConfigureAwait(false);
await _requestAppService.CompleteByNumberAsync(entity.Number).ConfigureAwait(false);
}
}
@ -54,9 +54,9 @@ public class ProductRecycleNoteEventHandler
{
await AddTransactionsOfProductAsync(entity).ConfigureAwait(false);
if (!string.IsNullOrEmpty(entity.RequestNumber))
if (!string.IsNullOrEmpty(entity.Number))
{
await _requestAppService.CompleteByNumberAsync(entity.RequestNumber).ConfigureAwait(false);
await _requestAppService.CompleteByNumberAsync(entity.Number).ConfigureAwait(false);
}
}

Loading…
Cancel
Save