Browse Source

增加产品退拆任务

dev_DY_CC
周红军 1 year ago
parent
commit
7549674323
  1. 18
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs
  2. 83
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs
  3. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs
  4. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobCheckInput.cs
  5. 90
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobDetailInput.cs
  6. 43
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobDetailSaveInput.cs
  7. 48
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs
  8. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Win_in.Sfs.Wms.Store.Application.Contracts.csproj
  9. 28
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs
  10. 31
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs
  11. 52
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs
  12. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobEfCoreRepository.cs
  13. 75
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs

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

@ -3,7 +3,21 @@ using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobDTO
{
[Display(Name = "客户退拆任务")]
public class ProductRecycleJobDTO : SfsJobDTOBase<ProductRecycleJobDetailDTO>
{
/// <summary>
/// 车间
/// </summary>
[Display(Name = "车间")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Workshop { get; set; }
/// <summary>
/// 班次
/// </summary>
[Display(Name = "班次")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string Shift { get; set; }
}

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

@ -1,9 +1,90 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Volo.Abp.Data;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobDetailDTO
public class ProductRecycleJobDetailDTO : SfsJobRecommendToDetailDTOBase
{
/// <summary>
/// Bom版本
/// </summary>
public string BomVersion { 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 RawLocationCode { get; set; }
/// <summary>
/// 原料库区
/// </summary>
public string RawLocationArea { get; set; }
/// <summary>
/// 原料库位组
/// </summary>
public string RawLocationGroup { get; set; }
/// <summary>
/// 原料ERP库位
/// </summary>
public string RawLocationErpCode { get; set; }
/// <summary>
/// 原料仓库
/// </summary>
public string RawWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
[MaxLength(SfsPropertyConst.CodeLength)]
public string Uom { get; set; }
/// <summary>
/// 数量
/// </summary>
[Display(Name = "数量")]
[Column(TypeName = "decimal(18,6)")]
public decimal Qty { get; set; }
/// <summary>
/// 扩展属性
/// </summary>
public ExtraPropertyDictionary ExtraProperties { get; } = new ExtraPropertyDictionary();
/// <summary>
/// 库存状态
/// </summary>
public EnumInventoryStatus Status { get; set; }
/// <summary>
/// 仓库代码
/// </summary>
public string WarehouseCode { get; set; }
}

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

@ -3,7 +3,7 @@ using System.Threading.Tasks;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface IProductRecycleJobAppService
: ISfsJobAppServiceBase<ProductReceiveJobDTO, SfsJobRequestInputBase, ProductReceiveJobCheckInput, ProductReceiveJobEditInput>
: ISfsJobAppServiceBase<ProductRecycleJobDTO, SfsJobRequestInputBase, ProductRecycleJobCheckInput, ProductRecycleJobEditInput>
{

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

@ -0,0 +1,6 @@
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobCheckInput : SfsJobCheckInputBase
{
}

90
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobDetailInput.cs

@ -0,0 +1,90 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Volo.Abp.Data;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobDetailInput : SfsJobRecommendToDetailInputBase
{
/// <summary>
/// Bom版本
/// </summary>
public string BomVersion { 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 RawLocationCode { get; set; }
/// <summary>
/// 原料库区
/// </summary>
public string RawLocationArea { get; set; }
/// <summary>
/// 原料库位组
/// </summary>
public string RawLocationGroup { get; set; }
/// <summary>
/// 原料ERP库位
/// </summary>
public string RawLocationErpCode { get; set; }
/// <summary>
/// 原料仓库
/// </summary>
public string RawWarehouseCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
[Display(Name = "计量单位")]
[MaxLength(SfsPropertyConst.CodeLength)]
public string Uom { get; set; }
/// <summary>
/// 数量
/// </summary>
[Display(Name = "数量")]
[Column(TypeName = "decimal(18,6)")]
public decimal Qty { get; set; }
/// <summary>
/// 扩展属性
/// </summary>
public ExtraPropertyDictionary ExtraProperties { get; } = new ExtraPropertyDictionary();
/// <summary>
/// 库存状态
/// </summary>
public EnumInventoryStatus Status { get; set; }
/// <summary>
/// 仓库代码
/// </summary>
public string WarehouseCode { get; set; }
}

43
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobDetailSaveInput.cs

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.FileStorage.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary>
/// 客户退拆 保存模型
/// </summary>
public class ProductRecycleJobDetailSaveInput
{
/// <summary>
/// Id
/// </summary>
[Display(Name = "Id")]
public Guid Id { get; set; }
/// <summary>
/// 详情ID
/// </summary>
[Display(Name = "详情ID")]
public Guid DetailId { get; set; }
/// <summary>
/// 不合格原因
/// </summary>
[Display(Name = "不合格原因")]
public string FailedReason { get; set; }
/// <summary>
/// 质量缺陷
/// </summary>
[Display(Name = "质量缺陷")]
public string MassDefect { get; set; }
/// <summary>
/// 图片字节流
/// </summary>
[Display(Name = "图片字节流")]
public List<FileDTO> FilesList { get; set; }
}

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

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class ProductRecycleJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<ProductRecycleJobDetailInput>
{
#region Create
/// <summary>
/// 上游任务编号
/// </summary>
[Display(Name = "上游任务编号")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string UpStreamJobNumber { get; set; }
/// <summary>
/// 任务类型
/// </summary>
[Display(Name = "任务类型")]
[Required(ErrorMessage = "{0}是必填项")]
public EnumJobType JobType { get; set; }
/// <summary>
/// 是否自动完成
/// </summary>
[Display(Name = "是否自动完成")]
[Required(ErrorMessage = "{0}是必填项")]
public bool IsAutoComplete { get; set; }
/// <summary>
/// 过期时间
/// </summary>
[Display(Name = "过期时间")]
[Required(ErrorMessage = "{0}是必填项")]
public DateTime ExpiredTime { get; set; }
/// <summary>
/// 任务明细
/// </summary>
[Display(Name = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")]
public List<ProductRecycleJobDetailInput> Details { get; set; }
#endregion
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Win_in.Sfs.Wms.Store.Application.Contracts.csproj

@ -42,7 +42,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Jobs\ProductRecycleJobs\Inputs\" />
<Folder Include="Orders" />
<Folder Include="Plans" />
</ItemGroup>

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

@ -0,0 +1,28 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
namespace Win_in.Sfs.Wms.Store.Application;
[Authorize]
[Route($"{StoreConsts.RootPath}production-recycle-job")]
public class ProductRecycleJobAppService
: SfsJobAppServiceBase<ProductRecycleJob, ProductRecycleJobDetail, ProductRecycleJobDTO, SfsJobRequestInputBase, ProductRecycleJobCheckInput, ProductRecycleJobEditInput>
, IProductRecycleJobAppService
{
private readonly IProductRecycleJobManager _productRecycleJobManager;
public ProductRecycleJobAppService(
IProductRecycleJobRepository repository, IProductRecycleJobManager productRecycleJobManager)
: base(repository, productRecycleJobManager)
{
_productRecycleJobManager = productRecycleJobManager;
}
}

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

@ -0,0 +1,31 @@
using AutoMapper;
using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Application;
public partial class StoreApplicationAutoMapperProfile : Profile
{
private void ProductRecycleJobAutoMapperProfile()
{
CreateMap<ProductRecycleJob, ProductRecycleJobDTO>()
.ReverseMap();
CreateMap<ProductRecycleJobDetail, ProductRecycleJobDetailDTO>()
;
CreateMap<ProductRecycleJobEditInput, ProductRecycleJob>();
CreateMap<ProductRecycleJobDetailInput, ProductRecycleJobDetail>()
.IgnoreAuditedObjectProperties()
.Ignore(x => x.MasterID)
.Ignore(x => x.TenantId)
.Ignore(x => x.Number)
.Ignore(x => x.Id);
CreateMap<ProductRecycleJobDetailDTO, ProductRecycleJobDetail>()
;
}
}

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

@ -0,0 +1,52 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
public static class ProductRecycleJobDbContextModelCreatingExtensions
{
public static void ConfigureProductRecycleJob(this ModelBuilder builder, StoreModelBuilderConfigurationOptions options)
{
builder.Entity<ProductRecycleJob>(b =>
{
//Configure table & schema name
b.ToTable(StoreDbProperties.JobDbTablePrefix + nameof(ProductReceiveJob), options.Schema);
//Configure ABP properties
b.ConfigureByConvention();
//Configure Sfs base properties
b.ConfigureSfsBase();
//Configure Job base properties
b.ConfigureJob<ProductRecycleJob, ProductRecycleJobDetail>();
//Properties
b.Property(q => q.Workshop).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.Shift).HasMaxLength(SfsPropertyConst.CodeLength);
//Relations
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired();
//Indexes
b.HasIndex(q => new { q.Number }).IsUnique();
});
builder.Entity<ProductRecycleJobDetail>(b =>
{
//Configure table & schema name
b.ToTable(StoreDbProperties.JobDbTablePrefix + nameof(ProductRecycleJobDetail), options.Schema);
//Configure ABP properties
b.ConfigureByConvention();
//Configure Sfs base properties
b.ConfigureSfsBase();
//Configure Job base properties
b.ConfigureJobRecommendToDetail();
//Properties
//Relations
//None
//Indexes
//b.HasIndex(q => new { q.PackingCode }).IsUnique();
});
}
}

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobEfCoreRepository.cs

@ -0,0 +1,11 @@
using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
public class ProductRecycleJobEfCoreRepository : SfsJobEfCoreRepositoryBase<StoreDbContext, ProductRecycleJob>, IProductRecycleJobRepository
{
public ProductRecycleJobEfCoreRepository(IDbContextProvider<StoreDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}

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

@ -0,0 +1,75 @@
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;
}
}
Loading…
Cancel
Save