61 changed files with 6220 additions and 2 deletions
@ -0,0 +1,38 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
/// <summary>
|
|||
/// Kitting叫料任务
|
|||
/// </summary>
|
|||
[Display(Name = "Kitting叫料任务")] |
|||
public class KittingIssueJobDTO : SfsJobDTOBase<KittingIssueJobDetailDTO> |
|||
{ |
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料请求类型")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
[Display(Name = "生产线")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 要货单号
|
|||
/// </summary>
|
|||
[Display(Name = "要货单号")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string KittingRequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
} |
@ -0,0 +1,519 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueJobDetailDTO : SfsDetailDTOBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,14 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public interface IKittingIssueJobAppService |
|||
: ISfsJobAppServiceBase<KittingIssueJobDTO, SfsJobRequestInputBase, KittingIssueJobCheckInput, KittingIssueJobEditInput> |
|||
{ |
|||
Task CancelByMaterialRequestAsync(string requestNumber); |
|||
|
|||
Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueJobCheckInput : SfsJobCheckInputBase |
|||
{ |
|||
|
|||
} |
@ -0,0 +1,519 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueJobDetailInput : SfsDetailInputBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,69 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<KittingIssueJobDetailInput> |
|||
{ |
|||
#region Create
|
|||
/// <summary>
|
|||
/// 上游任务编号
|
|||
/// </summary>
|
|||
[Display(Name = "上游任务编号")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string UpStreamJobNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 要货单号
|
|||
/// </summary>
|
|||
[Display(Name = "要货单号")] |
|||
[Required(ErrorMessage = "{0}是必填项")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string KittingRequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料请求类型")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string RequestType { 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<KittingIssueJobDetailInput> Details { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
#endregion
|
|||
} |
@ -0,0 +1,24 @@ |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public static class KittingIssueJobPermissions |
|||
{ |
|||
|
|||
public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueJob); |
|||
public const string Create = Default + "." + StorePermissions.CreateStr; |
|||
public const string Update = Default + "." + StorePermissions.UpdateStr; |
|||
public const string Delete = Default + "." + StorePermissions.DeleteStr; |
|||
|
|||
|
|||
public static void AddKittingIssueJobPermission(this PermissionGroupDefinition permissionGroup) |
|||
{ |
|||
var KittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob))); |
|||
KittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); |
|||
KittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); |
|||
KittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,47 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueNoteDTO : SfsStoreDTOBase<KittingIssueNoteDetailDTO>, IHasJobNumber, IHasRequestNumber |
|||
{ |
|||
|
|||
/// <summary>
|
|||
/// 任务ID
|
|||
/// </summary>
|
|||
[Display(Name = "任务ID")] |
|||
public string JobNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 请求代码
|
|||
/// </summary>
|
|||
[Display(Name = "请求代码")] |
|||
public string RequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料请求类型")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已确认
|
|||
/// </summary>
|
|||
[Display(Name = "已确认")] |
|||
public bool Confirmed { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 确认时间
|
|||
/// </summary>
|
|||
[Display(Name = "确认时间")] |
|||
public DateTime? ConfirmTime { get; set; } |
|||
|
|||
} |
@ -0,0 +1,519 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueNoteDetailDTO : SfsDetailDTOBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,21 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public interface IKittingIssueNoteAppService : ISfsStoreMasterReadOnlyAppServiceBase<KittingIssueNoteDTO, SfsStoreRequestInputBase, KittingIssueNoteDetailDTO, SfsStoreRequestInputBase> |
|||
{ |
|||
Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input); |
|||
|
|||
Task<KittingIssueNoteDTO> ConfirmAsync(Guid id); |
|||
|
|||
Task<KittingIssueNoteDTO> ConfirmAsync(string number); |
|||
|
|||
Task<PagedResultDto<KittingIssueNoteDTO>> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, |
|||
string requestType, bool includeDetails = false, CancellationToken cancellationToken = default); |
|||
|
|||
Task<List<KittingIssueNoteDTO>> GetListUnConfirmedByTypeAsync(string requestType); |
|||
} |
@ -0,0 +1,519 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueNoteDetailInput : SfsDetailInputBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,56 @@ |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase |
|||
{ |
|||
#region Base
|
|||
/// <summary>
|
|||
/// 已确认
|
|||
/// </summary>
|
|||
[Display(Name = "已确认")] |
|||
public bool Confirmed { get; set; } |
|||
#endregion
|
|||
|
|||
#region Create
|
|||
/// <summary>
|
|||
/// 发料记录号
|
|||
/// </summary>
|
|||
[Display(Name = "发料记录号")] |
|||
public string Number { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 任务ID
|
|||
/// </summary>
|
|||
[Display(Name = "任务ID")] |
|||
[Required(ErrorMessage = "{0}是必填项")] |
|||
public string JobNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细列表
|
|||
/// </summary>
|
|||
[Display(Name = "明细列表")] |
|||
public List<KittingIssueNoteDetailInput> Details { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 请求号码
|
|||
/// </summary>
|
|||
[Display(Name = "请求号码")] |
|||
public string RequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料请求类型")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
#endregion
|
|||
} |
@ -0,0 +1,33 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumber, IHasRequestNumber |
|||
{ |
|||
/// <summary>
|
|||
/// 任务ID
|
|||
/// </summary>
|
|||
[Display(Name = "任务ID")] |
|||
public string JobNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 车间
|
|||
/// </summary>
|
|||
[Display(Name = "车间")] |
|||
public string Workshop { get; set; } |
|||
|
|||
public string RequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料请求类型")] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
[Required(ErrorMessage = "{0}是必填项")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
} |
@ -0,0 +1,24 @@ |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public static class KittingIssueNotePermissions |
|||
{ |
|||
|
|||
public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote); |
|||
public const string Create = Default + "." + StorePermissions.CreateStr; |
|||
public const string Update = Default + "." + StorePermissions.UpdateStr; |
|||
public const string Delete = Default + "." + StorePermissions.DeleteStr; |
|||
|
|||
|
|||
|
|||
public static void AddKittingIssueNotePermission(this PermissionGroupDefinition permissionGroup) |
|||
{ |
|||
var injectionNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote))); |
|||
injectionNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); |
|||
injectionNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); |
|||
injectionNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); |
|||
|
|||
} |
|||
} |
@ -0,0 +1,34 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueRequestDTO : SfsStoreRequestDTOBase<KittingIssueRequestDetailDTO>, IHasNumber |
|||
{ |
|||
/// <summary>
|
|||
/// 叫料类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料类型")] |
|||
public string Type { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 是否使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "是否使用在途库")] |
|||
public bool IsUseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 可用来源库位Json集合
|
|||
/// </summary>
|
|||
public string FromLocationCodeJsonList { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料库位
|
|||
/// </summary>
|
|||
public string ToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标ERP储位
|
|||
/// </summary>
|
|||
[Display(Name = "目标ERP储位")] |
|||
public string ToLocationErpCode { get; set; } |
|||
} |
@ -0,0 +1,55 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase |
|||
{ |
|||
/// <summary>
|
|||
/// 已发数量
|
|||
/// </summary>
|
|||
[Display(Name = "已发数量")] |
|||
public decimal IssuedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已收数量
|
|||
/// </summary>
|
|||
[Display(Name = "已收数量")] |
|||
public decimal ReceivedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细状态
|
|||
/// </summary>
|
|||
[Display(Name = "明细状态")] |
|||
public EnumStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 请求未发
|
|||
/// </summary>
|
|||
[Display(Name = "请求未发")] |
|||
[NotMapped] |
|||
public decimal ToBeIssuedQty => Qty - IssuedQty; |
|||
|
|||
/// <summary>
|
|||
/// 已发未收
|
|||
/// </summary>
|
|||
[Display(Name = "已发未收")] |
|||
[NotMapped] |
|||
public decimal ToBeReceivedQty => IssuedQty - ReceivedQty; |
|||
|
|||
/// <summary>
|
|||
/// 请求未收
|
|||
/// </summary>
|
|||
[Display(Name = "请求未收")] |
|||
[NotMapped] |
|||
public decimal NotFinishQty => Qty - ReceivedQty; |
|||
|
|||
/// <summary>
|
|||
/// 需求箱数量
|
|||
/// </summary>
|
|||
[Display(Name = "需求箱数量")] |
|||
public decimal BoxQty { get; set; } |
|||
} |
@ -0,0 +1,13 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public interface IKittingIssueRequestAppService |
|||
: ISfsStoreRequestMasterAppServiceBase<KittingIssueRequestDTO, SfsStoreRequestInputBase, KittingIssueRequestEditInput, KittingIssueRequestDetailDTO, SfsStoreRequestInputBase> |
|||
|
|||
{ |
|||
Task<KittingIssueRequestDTO> CreateAndHandleAsync(KittingIssueRequestEditInput input); |
|||
} |
@ -0,0 +1,91 @@ |
|||
using System; |
|||
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 KittingIssueRequestDetailInput : SfsStoreDetailWithQtyInputBase |
|||
{ |
|||
#region 目标库位信息
|
|||
|
|||
/// <summary>
|
|||
/// 目标库位
|
|||
/// </summary>
|
|||
[Display(Name = "目标库位")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string ToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标库区
|
|||
/// </summary>
|
|||
[Display(Name = "目标库区")] |
|||
public string ToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标库位组
|
|||
/// </summary>
|
|||
[Display(Name = "目标库位组")] |
|||
public string ToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标ERP储位
|
|||
/// </summary>
|
|||
[Display(Name = "目标ERP储位")] |
|||
public string ToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标仓库
|
|||
/// </summary>
|
|||
[Display(Name = "目标仓库")] |
|||
public string ToWarehouseCode { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
[Display(Name = "生产线")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 状态
|
|||
/// </summary>
|
|||
[Display(Name = "状态")] |
|||
public EnumRequestStatus RequestStatus { get; set; } = EnumRequestStatus.New; |
|||
|
|||
/// <summary>
|
|||
/// 已发数量
|
|||
/// </summary>
|
|||
[Display(Name = "已发数量")] |
|||
public decimal IssuedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已收数量
|
|||
/// </summary>
|
|||
[Display(Name = "已收数量")] |
|||
public decimal ReceivedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细状态
|
|||
/// </summary>
|
|||
[Display(Name = "明细状态")] |
|||
public EnumStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求箱数量
|
|||
/// </summary>
|
|||
[Display(Name = "需求箱数量")] |
|||
public decimal BoxQty { get; set; } |
|||
} |
@ -0,0 +1,33 @@ |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public class KittingIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase |
|||
{ |
|||
#region Base
|
|||
|
|||
/// <summary>
|
|||
/// 叫料类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料类型")] |
|||
public string Type { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细列表
|
|||
/// </summary>
|
|||
[Display(Name = "明细列表")] |
|||
public List<KittingIssueRequestDetailInput> Details { get; set; } = new List<KittingIssueRequestDetailInput>(); |
|||
#endregion
|
|||
|
|||
#region Create
|
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,53 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
[Display(Name = "叫料申请")] |
|||
public class KittingIssueRequestImportInput : SfsStoreImportInputBase |
|||
{ |
|||
/// <summary>
|
|||
/// 叫料类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料类型")] |
|||
[Required(ErrorMessage = "{0}是必填项")] |
|||
[ImporterHeader(Name = "叫料类型")] |
|||
[ExporterHeader(DisplayName = "叫料类型")] |
|||
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)] |
|||
public string Type { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
[Display(Name = "物品代码")] |
|||
[Required] |
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标库位
|
|||
/// </summary>
|
|||
[Display(Name = "目标库位")] |
|||
[Required] |
|||
public string ToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 来源库区
|
|||
/// </summary>
|
|||
[Display(Name = "调出库区")] |
|||
[Required] |
|||
public string FromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 数量
|
|||
/// </summary>
|
|||
[Display(Name = "数量")] |
|||
[Required(ErrorMessage = "{0}是必填项")] |
|||
public decimal Qty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 备注
|
|||
/// </summary>
|
|||
[Display(Name = "备注")] |
|||
public string Remark { get; set; } |
|||
} |
@ -0,0 +1,22 @@ |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
|
|||
public static class KittingIssueRequestPermissions |
|||
{ |
|||
|
|||
public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueRequest); |
|||
public const string Create = Default + "." + StorePermissions.CreateStr; |
|||
public const string Update = Default + "." + StorePermissions.UpdateStr; |
|||
public const string Delete = Default + "." + StorePermissions.DeleteStr; |
|||
|
|||
public static void AddKittingIssueRequestPermission(this PermissionGroupDefinition permissionGroup) |
|||
{ |
|||
var kittingIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueRequest))); |
|||
kittingIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); |
|||
kittingIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); |
|||
kittingIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); |
|||
|
|||
} |
|||
} |
@ -0,0 +1,191 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Data; |
|||
using System.Linq; |
|||
using System.Linq.Expressions; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Castle.Components.DictionaryAdapter; |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Win_in.Sfs.Basedata.Application.Contracts; |
|||
using Win_in.Sfs.Basedata.Domain.Shared; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
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; |
|||
using Win_in.Sfs.Wms.Store.Notes; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application; |
|||
|
|||
[Authorize] |
|||
[Route($"{StoreConsts.RootPath}kitting-issue-job")] |
|||
public class KittingIssueJobAppService |
|||
: SfsJobAppServiceBase<KittingIssueJob, KittingIssueJobDetail, KittingIssueJobDTO, SfsJobRequestInputBase, |
|||
KittingIssueJobCheckInput, KittingIssueJobEditInput>, |
|||
IKittingIssueJobAppService, ITransferLibCallback |
|||
{ |
|||
private readonly IKittingIssueJobManager _kittingIssueJobManager; |
|||
private readonly ILocationAppService _locationAppService; |
|||
private readonly ITransferLibJobAppService _transferLibJobAppService; |
|||
|
|||
public KittingIssueJobAppService( |
|||
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager, |
|||
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService) : base(repository, kittingIssueJobManager) |
|||
{ |
|||
_kittingIssueJobManager = kittingIssueJobManager; |
|||
_locationAppService = locationAppService; |
|||
_transferLibJobAppService = transferLibJobAppService; |
|||
} |
|||
|
|||
[HttpPost("add-many")] |
|||
public override async Task<List<KittingIssueJobDTO>> CreateManyAsync(List<KittingIssueJobEditInput> inputs) |
|||
{ |
|||
foreach (var input in inputs) |
|||
{ |
|||
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); |
|||
} |
|||
|
|||
return await base.CreateManyAsync(inputs).ConfigureAwait(false); |
|||
} |
|||
|
|||
[HttpPost("")] |
|||
public override async Task<KittingIssueJobDTO> CreateAsync(KittingIssueJobEditInput input) |
|||
{ |
|||
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); |
|||
|
|||
return await base.CreateAsync(input).ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值
|
|||
/// </summary>
|
|||
/// <param name="input"></param>
|
|||
/// <returns></returns>
|
|||
private async Task CheckMinRowAndSetStatusAsync(KittingIssueJobEditInput input) |
|||
{ |
|||
var jobDetailInputdetail = input.Details.FirstOrDefault(); |
|||
|
|||
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) |
|||
.ConfigureAwait(false); |
|||
|
|||
if (loctionDto.RowCode != 1) |
|||
{ |
|||
input.JobStatus = EnumJobStatus.Wait; |
|||
|
|||
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate; |
|||
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode; |
|||
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate; |
|||
jobDetailInputdetail.TransferLibFromLocationArea = jobDetailInputdetail.RecommendFromLocationArea; |
|||
jobDetailInputdetail.TransferLibFromLocationCode = jobDetailInputdetail.RecommendFromLocationCode; |
|||
jobDetailInputdetail.TransferLibFromLocationErpCode = jobDetailInputdetail.RecommendFromLocationErpCode; |
|||
jobDetailInputdetail.TransferLibFromLocationGroup = jobDetailInputdetail.RecommendFromLocationGroup; |
|||
jobDetailInputdetail.TransferLibFromLot = jobDetailInputdetail.RecommendFromLot; |
|||
jobDetailInputdetail.TransferLibFromPackingCode = jobDetailInputdetail.RecommendFromPackingCode; |
|||
jobDetailInputdetail.TransferLibFromProduceDate = jobDetailInputdetail.RecommendFromProduceDate; |
|||
jobDetailInputdetail.TransferLibFromQty = jobDetailInputdetail.RecommendFromQty; |
|||
jobDetailInputdetail.TransferLibFromSupplierBatch = jobDetailInputdetail.RecommendFromSupplierBatch; |
|||
jobDetailInputdetail.TransferLibFromWarehouseCode = jobDetailInputdetail.RecommendFromWarehouseCode; |
|||
|
|||
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate; |
|||
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode; |
|||
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate; |
|||
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.RecommendToLocationArea; |
|||
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.RecommendToLocationCode; |
|||
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.RecommendToLocationErpCode; |
|||
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.RecommendToLocationGroup; |
|||
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot; |
|||
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode; |
|||
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate; |
|||
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty; |
|||
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch; |
|||
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.RecommendToWarehouseCode; |
|||
} |
|||
} |
|||
|
|||
[HttpPost("cancel-by-request/{requestNumber}")] |
|||
public virtual async Task CancelByMaterialRequestAsync(string requestNumber) |
|||
{ |
|||
var entities = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber) |
|||
.ConfigureAwait(false); |
|||
foreach (var entity in entities) |
|||
{ |
|||
await _kittingIssueJobManager.CancelAsync(entity).ConfigureAwait(false); |
|||
} |
|||
} |
|||
|
|||
[HttpPost("invalid")] |
|||
public override async Task CancelAsync(Guid id) |
|||
{ |
|||
var kittingIssueJob = await _repository.GetAsync(id).ConfigureAwait(false); |
|||
if (kittingIssueJob == null) |
|||
{ |
|||
throw new UserFriendlyException($"未找到ID为 {id} 的任务"); |
|||
} |
|||
|
|||
await _kittingIssueJobManager.CancelAsync(kittingIssueJob).ConfigureAwait(false); |
|||
} |
|||
|
|||
[HttpPost("by-request-number/{requestNumber}")] |
|||
public virtual async Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber) |
|||
{ |
|||
var entitys = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber) |
|||
.ConfigureAwait(false); |
|||
return ObjectMapper.Map<List<KittingIssueJob>, List<KittingIssueJobDTO>>(entitys); |
|||
} |
|||
|
|||
[HttpPost("Do-Call-Back")] |
|||
public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto) |
|||
{ |
|||
var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); |
|||
|
|||
var transferLibJobDto= await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false); |
|||
|
|||
var transferLibNoteDetail= dto.Details.First(); |
|||
|
|||
var jobDetail = job.Details.First(); |
|||
job.JobStatus = EnumJobStatus.Open; |
|||
|
|||
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; |
|||
jobDetail.TransferLibFromContainerCode=transferLibNoteDetail.HandledFromContainerCode; |
|||
jobDetail.TransferLibFromExpireDate=transferLibNoteDetail.HandledFromExpireDate; |
|||
jobDetail.TransferLibFromLocationArea=transferLibNoteDetail.HandledFromLocationArea; |
|||
jobDetail.TransferLibFromLocationCode=transferLibNoteDetail.HandledFromLocationCode; |
|||
jobDetail.TransferLibFromLocationErpCode = transferLibNoteDetail.HandledFromLocationErpCode; |
|||
jobDetail.TransferLibFromLocationGroup=transferLibNoteDetail.HandledFromLocationGroup; |
|||
jobDetail.TransferLibFromLot=transferLibNoteDetail.HandledFromLot; |
|||
jobDetail.TransferLibFromPackingCode = transferLibNoteDetail.HandledFromPackingCode; |
|||
jobDetail.TransferLibFromProduceDate = transferLibNoteDetail.HandledFromProduceDate; |
|||
jobDetail.TransferLibFromQty=transferLibNoteDetail.HandledFromQty; |
|||
jobDetail.TransferLibFromSupplierBatch=transferLibNoteDetail.HandledFromSupplierBatch; |
|||
jobDetail.TransferLibFromWarehouseCode = transferLibNoteDetail.HandledFromWarehouseCode; |
|||
|
|||
jobDetail.TransferLibToArriveDate = transferLibNoteDetail.HandledToArriveDate; |
|||
jobDetail.TransferLibToContainerCode = transferLibNoteDetail.HandledToContainerCode; |
|||
jobDetail.TransferLibToExpireDate = transferLibNoteDetail.HandledToExpireDate; |
|||
jobDetail.TransferLibToLocationArea = transferLibNoteDetail.HandledToLocationArea; |
|||
jobDetail.TransferLibToLocationCode = transferLibNoteDetail.HandledToLocationCode; |
|||
jobDetail.TransferLibToLocationErpCode = transferLibNoteDetail.HandledToLocationErpCode; |
|||
jobDetail.TransferLibToLocationGroup = transferLibNoteDetail.HandledToLocationGroup; |
|||
jobDetail.TransferLibToLot = transferLibNoteDetail.HandledToLot; |
|||
jobDetail.TransferLibToPackingCode = transferLibNoteDetail.HandledToPackingCode; |
|||
jobDetail.TransferLibToProduceDate = transferLibNoteDetail.HandledToProduceDate; |
|||
jobDetail.TransferLibToQty = transferLibNoteDetail.HandledToQty; |
|||
jobDetail.TransferLibToSupplierBatch = transferLibNoteDetail.HandledToSupplierBatch; |
|||
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode; |
|||
|
|||
await _repository.UpdateAsync(job).ConfigureAwait(false); |
|||
|
|||
return; |
|||
} |
|||
|
|||
[HttpPost("test")] |
|||
public virtual async Task Test() |
|||
{ |
|||
Console.WriteLine("FuAZCZXVZXVXZVZ"); |
|||
await Task.CompletedTask; |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
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 KittingIssueJobAutoMapperProfile() |
|||
{ |
|||
CreateMap<KittingIssueJob, KittingIssueJobDTO>() |
|||
.ReverseMap(); |
|||
|
|||
CreateMap<KittingIssueJobDetail, KittingIssueJobDetailDTO>() |
|||
; |
|||
|
|||
CreateMap<KittingIssueJobDetailDTO, KittingIssueJobDetail>() |
|||
; |
|||
|
|||
CreateMap<KittingIssueJobDetailInput, KittingIssueJobDetail>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.Ignore(x => x.MasterID) |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.Id); |
|||
|
|||
} |
|||
} |
@ -0,0 +1,108 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Linq.Expressions; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
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.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application; |
|||
|
|||
[Authorize] |
|||
[Route($"{StoreConsts.RootPath}kitting-issue-note")] |
|||
public class KittingIssueNoteAppService : |
|||
SfsStoreWithDetailsAppServiceBase<KittingIssueNote, KittingIssueNoteDTO, SfsStoreRequestInputBase, KittingIssueNoteEditInput, KittingIssueNoteDetail, |
|||
KittingIssueNoteDetailDTO, SfsStoreRequestInputBase, KittingIssueNoteImportInput>, |
|||
IKittingIssueNoteAppService |
|||
{ |
|||
private readonly IKittingIssueNoteManager _kittingIssueNoteManager; |
|||
|
|||
public KittingIssueNoteAppService( |
|||
IKittingIssueNoteRepository repository, |
|||
IKittingIssueNoteManager kittingIssueNoteManager |
|||
) : base(repository) |
|||
{ |
|||
_kittingIssueNoteManager = kittingIssueNoteManager; |
|||
} |
|||
|
|||
[HttpPost("")] |
|||
//[Authorize(KittingIssueNotePermissions.Create)]
|
|||
public override async Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input) |
|||
{ |
|||
var entity = ObjectMapper.Map<KittingIssueNoteEditInput, KittingIssueNote>(input); |
|||
await _kittingIssueNoteManager.CreateAsync(entity).ConfigureAwait(false); |
|||
var dto = ObjectMapper.Map<KittingIssueNote, KittingIssueNoteDTO>(entity); |
|||
return dto; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 确认对应的记录单
|
|||
/// </summary>
|
|||
/// <param name="id"></param>
|
|||
/// <returns></returns>
|
|||
[HttpPost("confirm/{id}")] |
|||
public virtual async Task<KittingIssueNoteDTO> ConfirmAsync(Guid id) |
|||
{ |
|||
var kittingIssueNote= await _repository.GetAsync(id).ConfigureAwait(false); |
|||
kittingIssueNote.Confirmed = true; |
|||
kittingIssueNote=await _repository.UpdateAsync(kittingIssueNote).ConfigureAwait(false); |
|||
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<KittingIssueNote>(kittingIssueNote), false).ConfigureAwait(false); |
|||
return ObjectMapper.Map<KittingIssueNote, KittingIssueNoteDTO>(kittingIssueNote); |
|||
} |
|||
|
|||
[HttpPost("confirm-by-number/{number}")] |
|||
public virtual async Task<KittingIssueNoteDTO> ConfirmAsync(string number) |
|||
{ |
|||
var entity = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false); |
|||
Check.NotNull(entity, nameof(KittingIssueNote)); |
|||
var result = await _kittingIssueNoteManager.ConfirmAsync(entity.Id).ConfigureAwait(false); |
|||
var dto = ObjectMapper.Map<KittingIssueNote, KittingIssueNoteDTO>(result); |
|||
return dto; |
|||
} |
|||
/// <summary>
|
|||
/// 根据叫料请求类型获取发料记录
|
|||
/// </summary>
|
|||
/// <param name="requestInput"></param>
|
|||
/// <param name="requestType">
|
|||
/// 叫料请求类型:
|
|||
/// 人工拉动:Issue_Manual;
|
|||
/// 线边拉动:Issue_WIP;
|
|||
/// </param>
|
|||
/// <param name="includeDetails"></param>
|
|||
/// <param name="cancellationToken"></param>
|
|||
/// <returns></returns>
|
|||
[HttpPost("by-type/{requestType}")] |
|||
public virtual async Task<PagedResultDto<KittingIssueNoteDTO>> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, |
|||
string requestType, bool includeDetails = false, CancellationToken cancellationToken = default) |
|||
{ |
|||
Expression<Func<KittingIssueNote, bool>> expression = p => p.RequestType == requestType; |
|||
if (requestInput.Condition.Filters?.Count > 0) |
|||
{ |
|||
expression = expression.And(requestInput.Condition.Filters.ToLambda<KittingIssueNote>()); |
|||
} |
|||
|
|||
return await GetPagedListAsync(expression, requestInput.SkipCount, requestInput.MaxResultCount, |
|||
requestInput.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); |
|||
} |
|||
|
|||
[HttpGet("list/un-confirmed/{requestType}")] |
|||
public virtual async Task<List<KittingIssueNoteDTO>> GetListUnConfirmedByTypeAsync(string requestType) |
|||
{ |
|||
var entities = await _repository.GetListAsync(c => !c.Confirmed && c.RequestType == requestType) |
|||
.ConfigureAwait(false); |
|||
|
|||
var dtos = ObjectMapper.Map<List<KittingIssueNote>, List<KittingIssueNoteDTO>>(entities); |
|||
|
|||
return dtos; |
|||
} |
|||
|
|||
} |
@ -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 KittingIssueNoteAutoMapperProfile() |
|||
{ |
|||
CreateMap<KittingIssueNote, KittingIssueNoteDTO>() |
|||
.ReverseMap(); |
|||
|
|||
CreateMap<KittingIssueNoteDetail, KittingIssueNoteDetailDTO>(); |
|||
|
|||
CreateMap<KittingIssueNoteDetailInput, KittingIssueNoteDetail>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.Ignore(x => x.MasterID) |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.Id); |
|||
|
|||
CreateMap<KittingIssueNoteEditInput, KittingIssueNote>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.Id); |
|||
; |
|||
} |
|||
} |
@ -0,0 +1,310 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.Linq; |
|||
using System.Linq.Expressions; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using DocumentFormat.OpenXml.Office.PowerPoint.Y2021.M06.Main; |
|||
using IdentityModel; |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.Domain.Repositories; |
|||
using Volo.Abp.ObjectMapping; |
|||
using Win_in.Sfs.Basedata.Application; |
|||
using Win_in.Sfs.Basedata.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
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.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Application; |
|||
|
|||
/// <summary>
|
|||
/// kitting叫料申请
|
|||
/// </summary>
|
|||
[Authorize] |
|||
[Route($"{StoreConsts.RootPath}kitting-issue-request")] |
|||
public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<KittingIssueRequest, KittingIssueRequestDTO, |
|||
SfsStoreRequestInputBase, KittingIssueRequestEditInput, KittingIssueRequestDetail, KittingIssueRequestDetailDTO, |
|||
SfsStoreRequestInputBase, KittingIssueRequestImportInput>, |
|||
IKittingIssueRequestAppService |
|||
{ |
|||
private readonly IKittingIssueRequestManager _kittingIssueRequestManager; |
|||
private readonly IItemStoreRelationAppService _itemStoreRelationApp; |
|||
private readonly IAreaAppService _areaApp; |
|||
private readonly ILocationAppService _locationAppService; |
|||
private readonly IItemBasicAppService _itemBasicAppService; |
|||
private readonly IProductionLineAppService _productionLineAppService; |
|||
|
|||
private readonly ITransactionTypeAppService _transactionTypeAppService; |
|||
|
|||
public KittingIssueRequestAppService( |
|||
IKittingIssueRequestRepository repository, |
|||
IKittingIssueRequestManager kittingIssueRequestManager, |
|||
IPreparationPlanManager preparationPlanManager, |
|||
IItemStoreRelationAppService itemStoreRelationApp, |
|||
IAreaAppService areaApp, |
|||
ILocationAppService locationAppService, |
|||
IItemBasicAppService itemBasicAppService, |
|||
IProductionLineAppService productionLineAppService, |
|||
ITransactionTypeAppService transactionTypeAppService |
|||
) |
|||
: base(repository, kittingIssueRequestManager) |
|||
{ |
|||
_kittingIssueRequestManager = kittingIssueRequestManager; |
|||
_itemStoreRelationApp = itemStoreRelationApp; |
|||
_areaApp = areaApp; |
|||
_locationAppService = locationAppService; |
|||
_itemBasicAppService = itemBasicAppService; |
|||
_productionLineAppService = productionLineAppService; |
|||
|
|||
_transactionTypeAppService = transactionTypeAppService; |
|||
} |
|||
|
|||
|
|||
#region 东阳V2
|
|||
|
|||
public override async Task<KittingIssueRequestDTO> HandleAsync(Guid id) |
|||
{ |
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
return null; |
|||
} |
|||
|
|||
[HttpPost("")] |
|||
public override async Task<KittingIssueRequestDTO> CreateAsync(KittingIssueRequestEditInput input) |
|||
{ |
|||
foreach (var item in input.Details) |
|||
{ |
|||
if (item.Qty <= 0) |
|||
{ |
|||
throw new UserFriendlyException($"{item.ItemCode} 物料的需求量必须大于0"); |
|||
} |
|||
} |
|||
|
|||
foreach (var detailInput in input.Details) //赋值生产线
|
|||
{ |
|||
var toLocationDto = |
|||
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); |
|||
CheckLocation(toLocationDto, detailInput.ToLocationCode); |
|||
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false); |
|||
CheckItemBasic(itemBasicDto, detailInput.ItemCode); |
|||
|
|||
detailInput.ToLocationArea = toLocationDto.AreaCode; |
|||
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode; |
|||
detailInput.ToWarehouseCode= toLocationDto.WarehouseCode; |
|||
detailInput.ProdLine = detailInput.ToLocationCode; |
|||
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode; |
|||
|
|||
detailInput.ItemDesc1 = itemBasicDto.Desc1; |
|||
detailInput.ItemDesc2 = itemBasicDto.Desc2; |
|||
detailInput.ItemName = itemBasicDto.Name; |
|||
detailInput.Uom = itemBasicDto.BasicUom; |
|||
detailInput.StdPackQty = itemBasicDto.StdPackQty; |
|||
detailInput.Status = EnumStatus.Open; |
|||
|
|||
//因为是刚创建的 所以发料数一定是0
|
|||
detailInput.IssuedQty = 0; |
|||
} |
|||
|
|||
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false); |
|||
var entity = ObjectMapper.Map<KittingIssueRequestEditInput, KittingIssueRequest>(input); |
|||
|
|||
var result = await _kittingIssueRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false); |
|||
|
|||
var dto = ObjectMapper.Map<KittingIssueRequest, KittingIssueRequestDTO>(result); |
|||
|
|||
return dto; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 赋值Request业务属性
|
|||
/// </summary>
|
|||
/// <param name="entity"></param>
|
|||
/// <returns></returns>
|
|||
private async Task SetRequestAutoPropertiesAsync(KittingIssueRequestEditInput entity) |
|||
{ |
|||
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); |
|||
Check.NotNull(tranType, "事务类型", "事务类型不存在"); |
|||
entity.AutoSubmit = tranType.AutoSubmitRequest; |
|||
entity.AutoAgree = tranType.AutoAgreeRequest; |
|||
entity.AutoHandle = tranType.AutoHandleRequest; |
|||
entity.AutoCompleteJob = tranType.AutoCompleteJob; |
|||
entity.DirectCreateNote = tranType.DirectCreateNote; |
|||
} |
|||
|
|||
[HttpPost("create-and-handle")] |
|||
public async Task<KittingIssueRequestDTO> CreateAndHandleAsync(KittingIssueRequestEditInput input) |
|||
{ |
|||
var kittingIssueRequestDto = await CreateAsync(input).ConfigureAwait(false); |
|||
|
|||
await HandleAsync(kittingIssueRequestDto.Id).ConfigureAwait(false); |
|||
|
|||
return kittingIssueRequestDto; |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#region 导入
|
|||
|
|||
/// <summary>
|
|||
/// 用来重写 导入数据时可以加工数据
|
|||
/// </summary>
|
|||
/// <param name="dictionary"></param>
|
|||
/// <returns></returns>
|
|||
protected override async Task<Dictionary<KittingIssueRequest, EntityState>> ImportProcessingEntityAsync( |
|||
Dictionary<KittingIssueRequest, EntityState> dictionary) |
|||
{ |
|||
var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key); |
|||
|
|||
foreach (var kittingIssueRequest in addList) |
|||
{ |
|||
kittingIssueRequest.Worker = CurrentUser.GetUserName(); |
|||
kittingIssueRequest.CreatorId = CurrentUser.Id; |
|||
if (kittingIssueRequest.Type == EnumTransSubType.Issue_Manual.GetDisplayName()) |
|||
{ |
|||
kittingIssueRequest.Type = EnumTransSubType.Issue_Manual.ToString(); |
|||
} |
|||
|
|||
foreach (var detail in kittingIssueRequest.Details) |
|||
{ |
|||
var locationDto = await _locationAppService.GetByCodeAsync(detail.ToLocationCode).ConfigureAwait(false); |
|||
CheckLocation(locationDto, detail.ToLocationCode); |
|||
|
|||
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); |
|||
CheckItemBasic(itemBasicDto, detail.ItemCode); |
|||
|
|||
detail.ToLocationArea = locationDto.AreaCode; |
|||
detail.ToLocationErpCode = locationDto.ErpLocationCode; |
|||
detail.ToLocationGroup = locationDto.LocationGroupCode; |
|||
detail.ToWarehouseCode = locationDto.WarehouseCode; |
|||
detail.ItemDesc1 = itemBasicDto.Desc1; |
|||
detail.ItemDesc2 = itemBasicDto.Desc2; |
|||
detail.ItemName = itemBasicDto.Name; |
|||
detail.Uom = itemBasicDto.BasicUom; |
|||
detail.StdPackQty = itemBasicDto.StdPackQty; |
|||
} |
|||
} |
|||
|
|||
return dictionary; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 导入验证
|
|||
/// </summary>
|
|||
/// <param name="model"></param>
|
|||
/// <param name="validationRresult"></param>
|
|||
/// <returns></returns>
|
|||
protected override async Task ValidateImportModelAsync(KittingIssueRequestImportInput model, |
|||
List<ValidationResult> validationRresult) |
|||
{ |
|||
_ = new Dictionary<string, string>(); |
|||
_ = await CheckItemBasicAsync(model, validationRresult).ConfigureAwait(false); |
|||
_ = await CheckLocationAsync(model, validationRresult).ConfigureAwait(false); |
|||
await CheckAreaAsync(model, validationRresult).ConfigureAwait(false); |
|||
await CheckStoreRelationAsync(model, validationRresult).ConfigureAwait(false); |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#region 校验
|
|||
|
|||
protected override async Task<bool> ValidateImportEntities(Dictionary<KittingIssueRequest, EntityState> dict) |
|||
{ |
|||
foreach (var entity in dict.Keys) |
|||
{ |
|||
var tranType = await TransactionTypeAclService |
|||
.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); |
|||
|
|||
Check.NotNull(tranType, "事务类型", "事务类型不存在"); |
|||
|
|||
entity.AutoCompleteJob = tranType.AutoCompleteJob; |
|||
entity.AutoSubmit = tranType.AutoSubmitRequest; |
|||
entity.AutoAgree = tranType.AutoAgreeRequest; |
|||
entity.AutoHandle = tranType.AutoHandleRequest; |
|||
entity.DirectCreateNote = tranType.DirectCreateNote; |
|||
} |
|||
|
|||
return await base.ValidateImportEntities(dict).ConfigureAwait(false); |
|||
} |
|||
|
|||
protected async Task CheckAreaAsync(KittingIssueRequestImportInput importInput, |
|||
List<ValidationResult> validationRresult) |
|||
{ |
|||
var area = await _areaApp.GetByCodeAsync(importInput.FromLocationArea).ConfigureAwait(false); |
|||
if (area == null) |
|||
{ |
|||
validationRresult.Add(new ValidationResult($"调出库区{importInput.FromLocationArea}不存在", new[] { "调出库区" })); |
|||
} |
|||
} |
|||
|
|||
protected async Task CheckStoreRelationAsync(KittingIssueRequestImportInput importInput, |
|||
List<ValidationResult> validationRresult) |
|||
{ |
|||
var itemStoreRelation = await _itemStoreRelationApp |
|||
.GetFirstAsync(importInput.ItemCode, importInput.ToLocationCode).ConfigureAwait(false); |
|||
if (itemStoreRelation == null) |
|||
{ |
|||
validationRresult.Add(new ValidationResult( |
|||
$"物品代码{importInput.ItemCode}与目标库位{importInput.ToLocationCode}不存在对应关", new[] { "物品库位对应关系" })); |
|||
} |
|||
} |
|||
|
|||
private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode) |
|||
{ |
|||
if (itemBasicDto == null) |
|||
{ |
|||
throw new UserFriendlyException($"物品代码为【{itemCode}】不存在"); |
|||
} |
|||
} |
|||
|
|||
private void CheckLocation(LocationDTO locationDto, string locationCode) |
|||
{ |
|||
if (locationDto == null) |
|||
{ |
|||
throw new UserFriendlyException($"库位代码为【{locationCode}】不存在"); |
|||
} |
|||
|
|||
if (locationDto.Type != EnumLocationType.WIP) |
|||
{ |
|||
throw new UserFriendlyException($"库位代码【{locationCode}】不是【{EnumLocationType.WIP.GetDisplayName()}】类型"); |
|||
} |
|||
} |
|||
|
|||
protected async Task<ItemBasicDTO> CheckItemBasicAsync(KittingIssueRequestImportInput importInput, |
|||
List<ValidationResult> validationRresult) |
|||
{ |
|||
var item = await _itemBasicAppService.GetByCodeAsync(importInput.ItemCode).ConfigureAwait(false); |
|||
if (item == null) |
|||
{ |
|||
validationRresult.Add(new ValidationResult($"物品代码{importInput.ItemCode}不存在", new[] { "物品代码" })); |
|||
} |
|||
else if (item.StdPackQty == 0) |
|||
{ |
|||
validationRresult.Add( |
|||
new ValidationResult($"物品代码{importInput.ItemCode}的物品信息中标准包装等于0或不存在", new[] { "标准包装" })); |
|||
} |
|||
|
|||
return item; |
|||
} |
|||
|
|||
protected async Task<LocationDTO> CheckLocationAsync(KittingIssueRequestImportInput importInput, |
|||
List<ValidationResult> validationRresult) |
|||
{ |
|||
var location = await _locationAppService.GetByCodeAsync(importInput.ToLocationCode).ConfigureAwait(false); |
|||
if (location == null) |
|||
{ |
|||
validationRresult.Add(new ValidationResult($"目标库位{importInput.ToLocationCode}不存在", new[] { "目标库位" })); |
|||
} |
|||
|
|||
return location; |
|||
} |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,66 @@ |
|||
using AutoMapper; |
|||
using Volo.Abp.AutoMapper; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
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 KittingIssueRequestAutoMapperProfile() |
|||
{ |
|||
CreateMap<KittingIssueRequest, KittingIssueRequestDTO>() |
|||
.ReverseMap(); |
|||
|
|||
CreateMap<KittingIssueRequestDetail, KittingIssueRequestDetailDTO>() |
|||
.ReverseMap(); |
|||
|
|||
CreateMap<KittingIssueRequestDetailInput, KittingIssueRequestDetail>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.Ignore(x => x.MasterID) |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.Id); |
|||
|
|||
CreateMap<KittingIssueRequestImportInput, KittingIssueRequest>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.ForMember(x => x.Type, y => y.MapFrom(t => t.Type.ToString())) |
|||
.Ignore(x => x.UseOnTheWayLocation) |
|||
.Ignore(x => x.Details) |
|||
.Ignore(x => x.Remark) |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.RequestStatus) |
|||
.Ignore(x => x.ConcurrencyStamp) |
|||
.Ignore(x => x.ExtraProperties) |
|||
.Ignore(x => x.ActiveDate) |
|||
.Ignore(x => x.Remark); |
|||
|
|||
CreateMap<KittingIssueRequestImportInput, KittingIssueRequestDetail>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.ForMember(x => x.Status, y => y.MapFrom(t => EnumStatus.Open)) |
|||
.Ignore(x => x.ToLocationErpCode) |
|||
.Ignore(x => x.ToWarehouseCode) |
|||
.Ignore(x => x.ToLocationArea) |
|||
.Ignore(x => x.ToLocationGroup) |
|||
.Ignore(x => x.ItemName).Ignore(x => x.ItemDesc1).Ignore(x => x.ItemDesc2) |
|||
.Ignore(x => x.ProdLine) |
|||
.Ignore(x => x.IssuedQty) |
|||
.Ignore(x => x.ReceivedQty) |
|||
.Ignore(x => x.ToBeIssuedQty) |
|||
.Ignore(x => x.ToBeReceivedQty) |
|||
.Ignore(x => x.NotFinishQty) |
|||
.Ignore(x => x.StdPackQty) |
|||
.Ignore(x => x.Uom) |
|||
.Ignore(x => x.TenantId) |
|||
.Ignore(x => x.MasterID) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.Id) |
|||
.Ignore(x => x.Remark); |
|||
CreateMap<KittingIssueRequestEditInput, KittingIssueRequest>() |
|||
.IgnoreAuditedObjectProperties() |
|||
.Ignore(x => x.RequestStatus) |
|||
.Ignore(x => x.ConcurrencyStamp).Ignore(x => x.Id); |
|||
} |
|||
} |
@ -0,0 +1,10 @@ |
|||
using System; |
|||
using System.Linq.Expressions; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueJobManager : IJobManager<KittingIssueJob> |
|||
{ |
|||
Task<KittingIssueJob> GetAsync(Expression<Func<KittingIssueJob, bool>> expression); |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueJobRepository : ISfsJobRepositoryBase<KittingIssueJob> |
|||
{ |
|||
|
|||
} |
@ -0,0 +1,47 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.Threading.Tasks; |
|||
using Win_in.Sfs.Shared.Domain.Entities; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
/// <summary>
|
|||
/// Kitting发料任务
|
|||
/// </summary>
|
|||
[Display(Name = "Kitting发料任务")] |
|||
public class KittingIssueJob : SfsJobAggregateRootBase<KittingIssueJobDetail> |
|||
{ |
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 要料单号
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public string KittingRequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[Display(Name = "使用在途库")] |
|||
[IgnoreUpdate] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 任务明细
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public override List<KittingIssueJobDetail> Details { get; set; } = new List<KittingIssueJobDetail>(); |
|||
|
|||
|
|||
} |
@ -0,0 +1,524 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public class KittingIssueJobDetail : SfsDetailEntityBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
public void SetId(Guid id) |
|||
{ |
|||
this.Id = id; |
|||
} |
|||
} |
@ -0,0 +1,121 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.Linq; |
|||
using System.Linq.Expressions; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Users; |
|||
using Volo.Abp.Validation; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public class KittingIssueJobManager : SfsJobManagerBase<KittingIssueJob, KittingIssueJobDetail>, IKittingIssueJobManager |
|||
{ |
|||
private readonly IBalanceAppService _balanceAppService; |
|||
private readonly IExpectOutAppService _expectOutAppService; |
|||
|
|||
public KittingIssueJobManager( |
|||
IKittingIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository) |
|||
{ |
|||
_balanceAppService = balanceAppService; |
|||
_expectOutAppService = expectOutAppService; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 执行任务 发料任务
|
|||
/// </summary>
|
|||
/// <param name="id"></param>
|
|||
/// <param name="input"></param>
|
|||
/// <param name="user"></param>
|
|||
/// <returns></returns>
|
|||
public override async Task<KittingIssueJob> CompleteAsync(KittingIssueJob input, ICurrentUser user) |
|||
{ |
|||
var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false); |
|||
|
|||
var inputDetail = input.Details.First(); |
|||
var detail = entity.Details.First(); |
|||
|
|||
var expectOutDtos = await _expectOutAppService.GetListByItemCodeAndStatusAndPackingCodeAsync(detail.ItemCode, detail.HandledFromLocationCode, detail.HandledFromPackingCode, detail.Status, detail.HandledFromLot).ConfigureAwait(false); |
|||
if (expectOutDtos.Any()) |
|||
{ |
|||
throw new UserFriendlyException($" 箱码:{detail.HandledFromPackingCode}," + |
|||
$" 物品代码:{detail.ItemCode}," + |
|||
$" 库位代码:{detail.HandledFromLocationCode}," + |
|||
$" 状态:{detail.Status}," + |
|||
$" 批次:{detail.HandledFromLot}" + |
|||
$" 的库存被占用【预计出】"); |
|||
} |
|||
|
|||
var balanceDto=await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false); |
|||
if (balanceDto.Qty <= 0) |
|||
{ |
|||
throw new UserFriendlyException($" 箱码:{detail.HandledFromPackingCode}," + |
|||
$" 物品代码:{detail.ItemCode}," + |
|||
$" 库位代码:{detail.HandledFromLocationCode}," + |
|||
$" 状态:{detail.Status}," + |
|||
$" 批次:{detail.HandledFromLot}" + |
|||
$" 的可用库存不大于0,现在为{balanceDto.Qty},请检查【库存数量】和【预计出】"); |
|||
} |
|||
|
|||
detail.HandledFromArriveDate = inputDetail.HandledFromArriveDate; |
|||
detail.HandledFromContainerCode = inputDetail.HandledFromContainerCode; |
|||
detail.HandledFromExpireDate = inputDetail.HandledFromExpireDate; |
|||
detail.HandledFromLocationArea = inputDetail.HandledFromLocationArea; |
|||
detail.HandledFromLocationCode = inputDetail.HandledFromLocationCode; |
|||
detail.HandledFromLocationErpCode = inputDetail.HandledFromLocationErpCode; |
|||
detail.HandledFromLocationGroup = inputDetail.HandledFromLocationGroup; |
|||
detail.HandledFromLot = inputDetail.HandledFromLot; |
|||
detail.HandledFromPackingCode = inputDetail.HandledFromPackingCode; |
|||
detail.HandledFromProduceDate = inputDetail.HandledFromProduceDate; |
|||
detail.HandledFromQty = inputDetail.HandledFromQty; |
|||
detail.HandledFromSupplierBatch = inputDetail.HandledFromSupplierBatch; |
|||
detail.HandledFromWarehouseCode = inputDetail.HandledFromWarehouseCode; |
|||
|
|||
detail.HandledToArriveDate = inputDetail.HandledToArriveDate; |
|||
detail.HandledToContainerCode = inputDetail.HandledToContainerCode; |
|||
detail.HandledToExpireDate = inputDetail.HandledToExpireDate; |
|||
detail.HandledToLocationArea = inputDetail.HandledToLocationArea; |
|||
detail.HandledToLocationCode = inputDetail.HandledToLocationCode; |
|||
detail.HandledToLocationErpCode = inputDetail.HandledToLocationErpCode; |
|||
detail.HandledToLocationGroup = inputDetail.HandledToLocationGroup; |
|||
detail.HandledToLot = inputDetail.HandledToLot; |
|||
detail.HandledToPackingCode = inputDetail.HandledToPackingCode; |
|||
detail.HandledToProduceDate = inputDetail.HandledToProduceDate; |
|||
detail.HandledToQty = inputDetail.HandledToQty; |
|||
detail.HandledToSupplierBatch = inputDetail.HandledToSupplierBatch; |
|||
detail.HandledToWarehouseCode = inputDetail.HandledToWarehouseCode; |
|||
|
|||
detail.HandledToPackingCode = string.Empty; |
|||
detail.HandledToLot = string.Empty; |
|||
detail.HandledToContainerCode = string.Empty; |
|||
|
|||
return await base.CompleteAsync(entity, user).ConfigureAwait(false); |
|||
} |
|||
|
|||
public async Task<KittingIssueJob> GetAsync(Expression<Func<KittingIssueJob, bool>> expression) |
|||
{ |
|||
return await Repository.FindAsync(expression).ConfigureAwait(false); |
|||
} |
|||
|
|||
#region 无用
|
|||
|
|||
public override Task<List<KittingIssueJob>> GetWorkingListByPackingAsync(string packingCode) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
public override Task<List<KittingIssueJob>> GetWorkingListByContainerAsync(string containerCode) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
public override void CheckDetails(KittingIssueJob entity, AbpValidationResult result) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,10 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueNoteManager : ISfsStoreManager<KittingIssueNote, KittingIssueNoteDetail> |
|||
{ |
|||
Task<KittingIssueNote> ConfirmAsync(Guid id); |
|||
|
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueNoteRepository : ISfsStoreRepositoryBase<KittingIssueNote> |
|||
{ |
|||
|
|||
} |
@ -0,0 +1,71 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Volo.Abp; |
|||
using Win_in.Sfs.Shared.Domain.Entities; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
/// <summary>
|
|||
/// Kitting叫料记录
|
|||
/// </summary>
|
|||
public class KittingIssueNote : SfsStoreAggregateRootBase<KittingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber |
|||
{ |
|||
/// <summary>
|
|||
/// 任务ID
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public string JobNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细列表
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public override List<KittingIssueNoteDetail> Details { get; set; } = new List<KittingIssueNoteDetail>(); |
|||
|
|||
[IgnoreUpdate] |
|||
public string RequestNumber { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 叫料请求类型
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public string RequestType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public bool UseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 确认时间
|
|||
/// </summary>
|
|||
[Display(Name = "确认时间")] |
|||
[IgnoreUpdate] |
|||
public DateTime? ConfirmTime { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已确认
|
|||
/// </summary>
|
|||
[Display(Name = "已确认")] |
|||
public bool Confirmed { get; set; } |
|||
|
|||
public void Confirm(DateTime confirmTime) |
|||
{ |
|||
|
|||
CheckStatus(Confirmed); |
|||
Confirmed = true; |
|||
ConfirmTime = confirmTime; |
|||
} |
|||
|
|||
private static void CheckStatus(bool confirmed) |
|||
{ |
|||
if (confirmed) |
|||
{ |
|||
throw new UserFriendlyException($"当前状态为 【已确认】 ,无法再次确认!"); |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,519 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public class KittingIssueNoteDetail : SfsStoreDetailEntityBase |
|||
{ |
|||
#region 库存基础信息
|
|||
|
|||
/// <summary>
|
|||
/// 物品代码
|
|||
/// </summary>
|
|||
public string ItemCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品名称
|
|||
/// </summary>
|
|||
public string ItemName { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述1
|
|||
/// </summary>
|
|||
public string ItemDesc1 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 物品描述2
|
|||
/// </summary>
|
|||
public string ItemDesc2 { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 标包数量
|
|||
/// </summary>
|
|||
[Display(Name = "标包数量")] |
|||
[Column(TypeName = "decimal(18,6)")] |
|||
public decimal StdPackQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库存状态
|
|||
/// </summary>
|
|||
public EnumInventoryStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 计量单位
|
|||
/// </summary>
|
|||
public string Uom { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 请求信息
|
|||
|
|||
/// <summary>
|
|||
/// 请求库位
|
|||
/// </summary>
|
|||
public string RequestLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库区
|
|||
/// </summary>
|
|||
public string RequestLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到库位组
|
|||
/// </summary>
|
|||
public string RequestLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到ERP库位
|
|||
/// </summary>
|
|||
public string RequestLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 到仓库
|
|||
/// </summary>
|
|||
public string RequestWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 在途库库位
|
|||
/// </summary>
|
|||
public string OnTheWayLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐的类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求数量
|
|||
/// </summary>
|
|||
public decimal RequestQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐来源
|
|||
|
|||
/// <summary>
|
|||
/// 推荐来源托标签
|
|||
/// </summary>
|
|||
public string RecommendFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源箱标签
|
|||
/// </summary>
|
|||
public string RecommendFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源批次排序
|
|||
/// </summary>
|
|||
public string RecommendFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库区
|
|||
/// </summary>
|
|||
public string RecommendFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源库位组
|
|||
/// </summary>
|
|||
public string RecommendFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源ERP库位
|
|||
/// </summary>
|
|||
public string RecommendFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源仓库
|
|||
/// </summary>
|
|||
public string RecommendFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐来源数量
|
|||
/// </summary>
|
|||
public decimal RecommendFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 推荐目标
|
|||
|
|||
/// <summary>
|
|||
/// 推荐目标托标签
|
|||
/// </summary>
|
|||
public string RecommendToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标箱标签
|
|||
/// </summary>
|
|||
public string RecommendToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次供应商批次
|
|||
/// </summary>
|
|||
public string RecommendToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime RecommendToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标批次排序
|
|||
/// </summary>
|
|||
public string RecommendToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库区
|
|||
/// </summary>
|
|||
public string RecommendToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标库位组
|
|||
/// </summary>
|
|||
public string RecommendToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标ERP库位
|
|||
/// </summary>
|
|||
public string RecommendToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标仓库
|
|||
/// </summary>
|
|||
public string RecommendToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐目标数量
|
|||
/// </summary>
|
|||
public decimal RecommendToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移来源
|
|||
|
|||
/// <summary>
|
|||
/// 库移来源托标签
|
|||
/// </summary>
|
|||
public string TransferLibFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源箱标签
|
|||
/// </summary>
|
|||
public string TransferLibFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源批次排序
|
|||
/// </summary>
|
|||
public string TransferLibFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库区
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源库位组
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源仓库
|
|||
/// </summary>
|
|||
public string TransferLibFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移来源数量
|
|||
/// </summary>
|
|||
public decimal TransferLibFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 库移目标
|
|||
|
|||
/// <summary>
|
|||
/// 库移目标托标签
|
|||
/// </summary>
|
|||
public string TransferLibToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标箱标签
|
|||
/// </summary>
|
|||
public string TransferLibToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次供应商批次
|
|||
/// </summary>
|
|||
public string TransferLibToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次到货时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次生产时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次过期时间
|
|||
/// </summary>
|
|||
public DateTime TransferLibToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标批次排序
|
|||
/// </summary>
|
|||
public string TransferLibToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库区
|
|||
/// </summary>
|
|||
public string TransferLibToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标库位组
|
|||
/// </summary>
|
|||
public string TransferLibToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标ERP库位
|
|||
/// </summary>
|
|||
public string TransferLibToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标仓库
|
|||
/// </summary>
|
|||
public string TransferLibToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 库移目标数量
|
|||
/// </summary>
|
|||
public decimal TransferLibToQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际来源
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledFromContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledFromPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledFromSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledFromExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledFromLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledFromLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledFromLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledFromLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledFromWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledFromQty { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
#region 实际目标
|
|||
|
|||
/// <summary>
|
|||
/// 实际目标托标签
|
|||
/// </summary>
|
|||
public string HandledToContainerCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际箱标签
|
|||
/// </summary>
|
|||
public string HandledToPackingCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次供应商批次
|
|||
/// </summary>
|
|||
public string HandledToSupplierBatch { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次到货时间
|
|||
/// </summary>
|
|||
public DateTime HandledToArriveDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次生产时间
|
|||
/// </summary>
|
|||
public DateTime HandledToProduceDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次过期时间
|
|||
/// </summary>
|
|||
public DateTime HandledToExpireDate { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际批次排序
|
|||
/// </summary>
|
|||
public string HandledToLot { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位
|
|||
/// </summary>
|
|||
public string HandledToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库区
|
|||
/// </summary>
|
|||
public string HandledToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际库位组
|
|||
/// </summary>
|
|||
public string HandledToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际ERP库位
|
|||
/// </summary>
|
|||
public string HandledToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际仓库
|
|||
/// </summary>
|
|||
public string HandledToWarehouseCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 实际数量
|
|||
/// </summary>
|
|||
public decimal HandledToQty { get; set; } |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,42 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.Logging; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Uow; |
|||
using Win_in.Sfs.Shared.Event; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public class KittingIssueNoteManager : SfsStoreManagerBase<KittingIssueNote, KittingIssueNoteDetail>, IKittingIssueNoteManager |
|||
{ |
|||
|
|||
public KittingIssueNoteManager( |
|||
IKittingIssueNoteRepository repository |
|||
) : base(repository) |
|||
{ |
|||
} |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task<KittingIssueNote> ConfirmAsync(Guid id) |
|||
{ |
|||
var entity = await Repository.FindAsync(id).ConfigureAwait(false); |
|||
Check.NotNull(entity, EntityClassName); |
|||
entity.Confirm(Clock.Now); |
|||
await PublishConfirmedAsync(entity).ConfigureAwait(false); |
|||
return await Repository.UpdateAsync(entity).ConfigureAwait(false); |
|||
} |
|||
private async Task PublishConfirmedAsync(KittingIssueNote entity) |
|||
{ |
|||
try |
|||
{ |
|||
await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData<KittingIssueNote>(entity), false).ConfigureAwait(false); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Logger.LogDebug($"{nameof(KittingIssueNote)} Confirmed Event:{ex.Message}", null); |
|||
Console.WriteLine(ex.Source); |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,13 @@ |
|||
using System.Threading.Tasks; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueRequestManager : ISfsStoreRequestManager<KittingIssueRequest, KittingIssueRequestDetail>, |
|||
IBulkImportService<KittingIssueRequest> |
|||
{ |
|||
|
|||
Task CompleteAsync(string number); |
|||
|
|||
Task<KittingIssueRequest> CreateByNumberAsync(KittingIssueRequest entity); |
|||
} |
@ -0,0 +1,9 @@ |
|||
using Win_in.Sfs.Shared.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public interface IKittingIssueRequestRepository : ISfsStoreRepositoryBase<KittingIssueRequest>, |
|||
ISfsBulkRepositoryBase<KittingIssueRequest> |
|||
{ |
|||
|
|||
} |
@ -0,0 +1,29 @@ |
|||
using System.Collections.Generic; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Win_in.Sfs.Shared.Domain.Entities; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
/// <summary>
|
|||
/// Kitting叫料申请
|
|||
/// </summary>
|
|||
public class KittingIssueRequest : SfsStoreRequestAggregateRootBase<KittingIssueRequestDetail> |
|||
{ |
|||
/// <summary>
|
|||
/// 叫料类型
|
|||
/// </summary>
|
|||
[Display(Name = "叫料类型")] |
|||
[IgnoreUpdate] |
|||
public string Type { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 使用在途库
|
|||
/// </summary>
|
|||
public bool UseOnTheWayLocation { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细列表
|
|||
/// </summary>
|
|||
[IgnoreUpdate] |
|||
public override List<KittingIssueRequestDetail> Details { get; set; } = new List<KittingIssueRequestDetail>(); |
|||
} |
@ -0,0 +1,103 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.ComponentModel.DataAnnotations.Schema; |
|||
using Win_in.Sfs.Shared.Domain; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
/// <summary>
|
|||
/// Kitting叫料申请明细
|
|||
/// </summary>
|
|||
public class KittingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation |
|||
{ |
|||
#region 目标库位信息
|
|||
|
|||
/// <summary>
|
|||
/// 目标库位
|
|||
/// </summary>
|
|||
[Display(Name = "目标库位")] |
|||
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] |
|||
public string ToLocationCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标库区
|
|||
/// </summary>
|
|||
[Display(Name = "目标库区")] |
|||
public string ToLocationArea { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标库位组
|
|||
/// </summary>
|
|||
[Display(Name = "目标库位组")] |
|||
public string ToLocationGroup { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标ERP储位
|
|||
/// </summary>
|
|||
[Display(Name = "目标ERP储位")] |
|||
public string ToLocationErpCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 目标仓库
|
|||
/// </summary>
|
|||
[Display(Name = "目标仓库")] |
|||
public string ToWarehouseCode { get; set; } |
|||
|
|||
#endregion
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 生产线
|
|||
/// </summary>
|
|||
public string ProdLine { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已发数量
|
|||
/// </summary>
|
|||
public decimal IssuedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 已收数量
|
|||
/// </summary>
|
|||
public decimal ReceivedQty { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 明细状态
|
|||
/// </summary>
|
|||
public EnumStatus Status { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 请求未发 还未发送的数量
|
|||
/// </summary>
|
|||
[NotMapped] |
|||
public decimal ToBeIssuedQty => Qty - IssuedQty; |
|||
|
|||
/// <summary>
|
|||
/// 已发未收
|
|||
/// </summary>
|
|||
[NotMapped] |
|||
public decimal ToBeReceivedQty => IssuedQty - ReceivedQty; |
|||
|
|||
/// <summary>
|
|||
/// 请求未收
|
|||
/// </summary>
|
|||
[NotMapped] |
|||
public decimal NotFinishQty => Qty - ReceivedQty; |
|||
|
|||
/// <summary>
|
|||
/// 位置码
|
|||
/// </summary>
|
|||
public string PositionCode { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 推荐类型
|
|||
/// </summary>
|
|||
public EnumRecommendType RecommendType { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 需求箱数量
|
|||
/// </summary>
|
|||
[Display(Name = "需求箱数量")] |
|||
public decimal BoxQty { get; set; } |
|||
} |
@ -0,0 +1,75 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Shared.Event; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
public class KittingIssueRequestManager |
|||
: SfsStoreRequestManagerBase<KittingIssueRequest, KittingIssueRequestDetail> |
|||
, IKittingIssueRequestManager |
|||
{ |
|||
private readonly IKittingIssueRequestRepository _repository; |
|||
|
|||
public KittingIssueRequestManager( |
|||
IKittingIssueRequestRepository repository |
|||
, IInjectionJobRepository injectionJobRepository |
|||
) : base(repository) |
|||
{ |
|||
_repository = repository; |
|||
} |
|||
|
|||
#region 东阳V2
|
|||
|
|||
#endregion
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 创建 同时 直接赋值Number 为了返回Number
|
|||
/// </summary>
|
|||
/// <param name="entity"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task<KittingIssueRequest> CreateByNumberAsync(KittingIssueRequest entity) |
|||
{ |
|||
var number = string.IsNullOrEmpty(entity.Number) |
|||
? await GenerateNumberAsync(nameof(KittingIssueRequest), entity.ActiveDate).ConfigureAwait(false) |
|||
: entity.Number; |
|||
entity.SetIdAndNumberWithDetails(GuidGenerator, number); |
|||
entity.Submit(); |
|||
entity.Agree(); |
|||
entity.RequestStatus = EnumRequestStatus.Partial; |
|||
await LocalEventBus.PublishAsync(new SfsHandledEntityEventData<KittingIssueRequest>(entity),false) |
|||
.ConfigureAwait(false); |
|||
await _repository.InsertAsync(entity).ConfigureAwait(false); |
|||
return entity; |
|||
} |
|||
|
|||
public virtual async Task CompleteAsync(string number) |
|||
{ |
|||
var entity = await GetByNumberAsync(number).ConfigureAwait(false); |
|||
if (entity != null && !entity.Details.Any(p => p.ToBeIssuedQty > 0)) |
|||
{ |
|||
await CompleteAsync(entity).ConfigureAwait(false); |
|||
} |
|||
} |
|||
|
|||
|
|||
#region 导入
|
|||
|
|||
/// <summary>
|
|||
/// 执行导入
|
|||
/// </summary>
|
|||
public virtual async Task ImportDataAsync(List<KittingIssueRequest> mergeEntities, |
|||
List<KittingIssueRequest> deleteEntities = null) |
|||
{ |
|||
if (deleteEntities != null && deleteEntities.Count > 0) |
|||
{ |
|||
await _repository.BulkDeleteAsync(deleteEntities).ConfigureAwait(false); |
|||
} |
|||
|
|||
await CreateManyAsync(mergeEntities).ConfigureAwait(false); |
|||
} |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,62 @@ |
|||
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 KittingIssueJobDbContextModelCreatingExtensions |
|||
{ |
|||
public static void ConfigureKittingIssueJob(this ModelBuilder builder, StoreModelBuilderConfigurationOptions options) |
|||
{ |
|||
builder.Entity<KittingIssueJob>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(StoreDbProperties.JobDbTablePrefix + nameof(KittingIssueJob), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsBase(); |
|||
//Configure Job base properties
|
|||
b.ConfigureJob<KittingIssueJob, KittingIssueJobDetail>(); |
|||
//Properties
|
|||
b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.KittingRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.JobType).HasConversion<string>(); |
|||
b.Property(q => q.JobStatus).HasConversion<string>(); |
|||
//Relations
|
|||
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired(); |
|||
//Indexes
|
|||
b.HasIndex(q => new { q.Number }).IsUnique(); |
|||
}); |
|||
|
|||
builder.Entity<KittingIssueJobDetail>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(StoreDbProperties.JobDbTablePrefix + nameof(KittingIssueJobDetail), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsBase(); |
|||
//Configure Job base properties
|
|||
//b.ConfigureJobRecommendFromDetail();
|
|||
//Properties
|
|||
|
|||
b.Property(q => q.RequestLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.OnTheWayLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.PositionCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.OnTheWayLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.PositionCode).HasMaxLength(SfsPropertyConst.CodeLength).IsRequired(false); |
|||
b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.CodeLength).HasConversion<string>(); |
|||
b.Property(q => q.Status).IsRequired().HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); |
|||
//Relations
|
|||
//None
|
|||
|
|||
//Indexes
|
|||
//b.HasIndex(q => new { q.PackingCode }).IsUnique();
|
|||
}); |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; |
|||
|
|||
public class KittingIssueJobEfCoreRepository : SfsJobEfCoreRepositoryBase<StoreDbContext, KittingIssueJob>, IKittingIssueJobRepository |
|||
{ |
|||
public KittingIssueJobEfCoreRepository(IDbContextProvider<StoreDbContext> dbContextProvider) : base(dbContextProvider) |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,57 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore.Modeling; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; |
|||
|
|||
public static class KittingIssueNoteDbContextModelCreatingExtensions |
|||
{ |
|||
public static void ConfigureKittingIssueNote(this ModelBuilder builder, StoreModelBuilderConfigurationOptions options) |
|||
{ |
|||
builder.Entity<KittingIssueNote>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(options.TablePrefix + nameof(KittingIssueNote), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsStoreBase(); |
|||
|
|||
//Properties
|
|||
b.Property(q => q.RequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.Remark).HasMaxLength(SfsPropertyConst.RemarkLength); |
|||
|
|||
//Relations
|
|||
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired(); |
|||
|
|||
//Indexes
|
|||
b.HasIndex(q => new { q.Number }).IsUnique(); |
|||
}); |
|||
|
|||
builder.Entity<KittingIssueNoteDetail>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(options.TablePrefix + nameof(KittingIssueNoteDetail), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsStoreBase(); |
|||
//Configure Sfs store detail properties
|
|||
b.ConfigureSfsStoreDetailBase(); |
|||
|
|||
//Properties
|
|||
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.NameLength); |
|||
b.Property(q => q.OnTheWayLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.PositionCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); |
|||
|
|||
//Relations
|
|||
|
|||
//Indexes
|
|||
b.HasIndex(q => new { q.Number, q.HandledFromPackingCode, q.HandledFromLocationCode, q.HandledToLocationCode }).IsUnique(); |
|||
b.HasIndex(q => new { q.HandledFromPackingCode }); |
|||
}); |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; |
|||
|
|||
public class KittingIssueNoteEfCoreRepository : SfsStoreEfCoreRepositoryBase<StoreDbContext, KittingIssueNote>, IKittingIssueNoteRepository |
|||
{ |
|||
public KittingIssueNoteEfCoreRepository(IDbContextProvider<StoreDbContext> dbContextProvider) : base(dbContextProvider) |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,62 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore.Modeling; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; |
|||
|
|||
public static class KittingIssueRequestDbContextModelCreatingExtensions |
|||
{ |
|||
public static void ConfigureKittingIssueRequest(this ModelBuilder builder, StoreModelBuilderConfigurationOptions options) |
|||
{ |
|||
builder.Entity<KittingIssueRequest>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(options.TablePrefix + nameof(KittingIssueRequest), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsStoreBase(); |
|||
|
|||
//Properties
|
|||
b.Property(q => q.Type).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.RequestStatus).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); |
|||
|
|||
//Relations
|
|||
b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired(); |
|||
|
|||
//Indexes
|
|||
b.HasIndex(q => new { q.Number }).IsUnique(); |
|||
}); |
|||
|
|||
builder.Entity<KittingIssueRequestDetail>(b => |
|||
{ |
|||
//Configure table & schema name
|
|||
b.ToTable(options.TablePrefix + nameof(KittingIssueRequestDetail), options.Schema); |
|||
//Configure ABP properties
|
|||
b.ConfigureByConvention(); |
|||
//Configure Sfs base properties
|
|||
b.ConfigureSfsStoreBase(); |
|||
//Configure Sfs store detail properties
|
|||
b.ConfigureSfsStoreDetailBase(); |
|||
//Properties
|
|||
b.Property(q => q.ToLocationCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ToLocationErpCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ToWarehouseCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ToLocationArea).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ToLocationGroup).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.IssuedQty).HasPrecision(18, 6); |
|||
b.Property(q => q.ReceivedQty).HasPrecision(18, 6); |
|||
b.Property(q => q.Status).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); |
|||
b.Property(q => q.PositionCode).HasMaxLength(SfsPropertyConst.CodeLength); |
|||
b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); |
|||
|
|||
//Relations
|
|||
|
|||
//Indexes
|
|||
b.HasIndex(q => new { q.Number, q.ItemCode, q.ToLocationCode }).IsUnique(); |
|||
b.HasIndex(q => new { q.ItemCode }); |
|||
}); |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; |
|||
|
|||
public class KittingIssueRequestEfCoreRepository : SfsStoreEfCoreRepositoryBase<StoreDbContext, KittingIssueRequest>, IKittingIssueRequestRepository |
|||
{ |
|||
public KittingIssueRequestEfCoreRepository(IDbContextProvider<StoreDbContext> dbContextProvider) : base(dbContextProvider) |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,37 @@ |
|||
using System; |
|||
using AutoMapper; |
|||
using Volo.Abp.AutoMapper; |
|||
using Win_in.Sfs.Shared.Application; |
|||
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 KittingIssueJobAutoMapperProfile() |
|||
{ |
|||
|
|||
CreateMap<KittingIssueJob, KittingIssueNote>() |
|||
.ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number)) |
|||
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.KittingRequestNumber)) |
|||
.ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now)) |
|||
.ForMember(x => x.Worker, y => y.MapFrom(d => d.CompleteUserName)) |
|||
.Ignore(x => x.Confirmed) |
|||
.Ignore(x => x.Number) |
|||
.Ignore(x => x.ConfirmTime); |
|||
|
|||
CreateMap<KittingIssueJobDetail, KittingIssueNoteDetail>() |
|||
; |
|||
|
|||
CreateMap<KittingIssueJob, KittingIssueNoteEditInput>() |
|||
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.KittingRequestNumber)) |
|||
.Ignore(x => x.Confirmed) |
|||
.Ignore(x => x.JobNumber) |
|||
.Ignore(x => x.ActiveDate) |
|||
; |
|||
CreateMap<KittingIssueJobDetail, KittingIssueNoteDetailInput>() |
|||
; |
|||
} |
|||
} |
@ -0,0 +1,51 @@ |
|||
using AutoMapper; |
|||
using Volo.Abp.AutoMapper; |
|||
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Event; |
|||
|
|||
public partial class StoreEventAutoMapperProfile : Profile |
|||
{ |
|||
private void KittingIssueNoteAutoMapperProfile() |
|||
{ |
|||
CreateMap<KittingIssueNoteDetail, TransferLogEditInput>() |
|||
.Ignore(x => x.DocNumber) |
|||
.Ignore(x => x.JobNumber) |
|||
.Ignore(x => x.Worker) |
|||
.Ignore(x => x.TransType) |
|||
.Ignore(x => x.ExtraProperties) |
|||
.Ignore(x => x.TransSubType) |
|||
|
|||
.ForMember(x => x.Qty, y => y.MapFrom(t => t.HandledToQty)) |
|||
.ForMember(x => x.SupplierBatch, y => y.MapFrom(t => t.HandledFromSupplierBatch)) |
|||
.ForMember(x => x.ArriveDate, y => y.MapFrom(t => t.HandledFromArriveDate)) |
|||
.ForMember(x => x.ProduceDate, y => y.MapFrom(t => t.HandledFromProduceDate)) |
|||
.ForMember(x => x.ExpireDate, y => y.MapFrom(t => t.HandledFromExpireDate)) |
|||
|
|||
.ForMember(x => x.FromPackingCode, y => y.MapFrom(t => t.HandledFromPackingCode)) |
|||
.ForMember(x => x.FromContainerCode, y => y.MapFrom(t => t.HandledFromContainerCode)) |
|||
|
|||
.ForMember(x => x.FromLot, y => y.MapFrom(t => t.HandledFromLot)) |
|||
.ForMember(x => x.FromStatus, y => y.MapFrom(t => t.Status)) |
|||
|
|||
.ForMember(x => x.FromLocationCode, y => y.MapFrom(t => t.HandledFromLocationCode)) |
|||
.ForMember(x => x.FromLocationGroup, y => y.MapFrom(t => t.HandledFromLocationGroup)) |
|||
.ForMember(x => x.FromLocationArea, y => y.MapFrom(t => t.HandledFromLocationArea)) |
|||
.ForMember(x => x.FromLocationErpCode, y => y.MapFrom(t => t.HandledFromLocationErpCode)) |
|||
.ForMember(x => x.FromWarehouseCode, y => y.MapFrom(t => t.HandledFromWarehouseCode)) |
|||
|
|||
.ForMember(x => x.ToLot, y => y.MapFrom(t => t.HandledToLot)) |
|||
.ForMember(x => x.ToStatus, y => y.MapFrom(t => t.Status)) |
|||
.ForMember(x => x.ToPackingCode, y => y.MapFrom(t => t.HandledToPackingCode)) |
|||
.ForMember(x => x.ToContainerCode, y => y.MapFrom(t => t.HandledToContainerCode)) |
|||
|
|||
.ForMember(x => x.ToLocationCode, y => y.MapFrom(t => t.HandledToLocationCode)) |
|||
.ForMember(x => x.ToLocationGroup, y => y.MapFrom(t => t.HandledToLocationGroup)) |
|||
.ForMember(x => x.ToLocationArea, y => y.MapFrom(t => t.HandledToLocationArea)) |
|||
.ForMember(x => x.ToLocationErpCode, y => y.MapFrom(t => t.HandledToLocationErpCode)) |
|||
.ForMember(x => x.ToWarehouseCode, y => y.MapFrom(t => t.HandledToWarehouseCode)) |
|||
|
|||
; |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
using AutoMapper; |
|||
using Volo.Abp.AutoMapper; |
|||
using Win_in.Sfs.Shared.Application; |
|||
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 KittingIssueRequestAutoMapperProfile() |
|||
{ |
|||
CreateMap<KittingIssueRequest, KittingIssueJobEditInput>() |
|||
.ForMember(x => x.KittingRequestNumber, y => y.MapFrom(d => d.Number)) |
|||
.ForMember(x => x.RequestType, y => y.MapFrom(d => d.Type)) |
|||
.Ignore(x => x.WarehouseCode) |
|||
.Ignore(x => x.UpStreamJobNumber) |
|||
.Ignore(x => x.JobType) |
|||
.Ignore(x => x.IsAutoComplete) |
|||
.Ignore(x => x.ExpiredTime) |
|||
.Ignore(x => x.JobDescription) |
|||
.Ignore(x => x.JobStatus) |
|||
.Ignore(x => x.WorkGroupCode) |
|||
.Ignore(x => x.Priority) |
|||
.Ignore(x => x.PriorityIncrement) |
|||
.Ignore(x => x.AcceptUserId) |
|||
.Ignore(x => x.AcceptTime) |
|||
.Ignore(x => x.AcceptUserName) |
|||
.Ignore(x => x.CompleteUserId) |
|||
.Ignore(x => x.CompleteUserName) |
|||
.Ignore(x => x.CompleteTime) |
|||
.Ignore(x => x.Details) |
|||
; |
|||
} |
|||
} |
@ -0,0 +1,224 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
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.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.BusinessJob; |
|||
|
|||
public class KittingIssueJobEventHandler : |
|||
StoreEventHandlerBase |
|||
, ILocalEventHandler<SfsCompletedEntityEventData<KittingIssueJob>> |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueJob>> |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueJob>>> |
|||
{ |
|||
private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService; |
|||
private readonly IExpectOutAppService _expectOutAppService; |
|||
private readonly ILocationAppService _locationAppService; |
|||
private readonly ITransferLibRequestAppService _transferLibRequestAppService; |
|||
|
|||
public KittingIssueJobEventHandler(IKittingIssueNoteAppService kittingIssueNoteAppService, |
|||
IExpectOutAppService expectOutAppService, |
|||
ILocationAppService locationAppService, ITransferLibRequestAppService transferLibRequestAppService) |
|||
{ |
|||
_kittingIssueNoteAppService = kittingIssueNoteAppService; |
|||
_expectOutAppService = expectOutAppService; |
|||
_locationAppService = locationAppService; |
|||
_transferLibRequestAppService = transferLibRequestAppService; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 执行后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
[UnitOfWork] |
|||
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<KittingIssueJob> eventData) |
|||
{ |
|||
var entity = eventData.Entity; |
|||
var kittingIssueNote = await BuildKittingIssueNoteAsync(entity).ConfigureAwait(false); |
|||
await _kittingIssueNoteAppService.CreateAsync(kittingIssueNote).ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<KittingIssueJob> eventData) |
|||
{ |
|||
var entity = eventData.Entity; |
|||
|
|||
await CreateExpectOutAsync(entity).ConfigureAwait(false); |
|||
|
|||
await CreateTransferLibAsync(entity).ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 批量创建后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<KittingIssueJob>> eventData) |
|||
{ |
|||
var entitys = eventData.Entity; |
|||
|
|||
foreach (var entity in entitys) |
|||
{ |
|||
await CreateExpectOutAsync(entity).ConfigureAwait(false); |
|||
|
|||
await CreateTransferLibAsync(entity).ConfigureAwait(false); |
|||
} |
|||
} |
|||
|
|||
#region 私有
|
|||
|
|||
/// <summary>
|
|||
/// 创建预计出
|
|||
/// </summary>
|
|||
/// <param name="entity"></param>
|
|||
/// <returns></returns>
|
|||
private async Task CreateExpectOutAsync(KittingIssueJob entity) |
|||
{ |
|||
var expectOutEditInputs = new List<ExpectOutEditInput>(); |
|||
foreach (var detail in entity.Details) |
|||
{ |
|||
var inputoExpectOutEditInput = new ExpectOutEditInput(); |
|||
inputoExpectOutEditInput.JobNumber = entity.Number; |
|||
inputoExpectOutEditInput.ItemCode = detail.ItemCode; |
|||
inputoExpectOutEditInput.Qty = detail.RecommendFromQty; |
|||
inputoExpectOutEditInput.LocationCode = detail.RecommendFromLocationCode; |
|||
inputoExpectOutEditInput.ArriveDate = detail.RecommendFromArriveDate; |
|||
inputoExpectOutEditInput.ContainerCode = detail.RecommendFromContainerCode; |
|||
inputoExpectOutEditInput.ExpireDate = detail.RecommendFromExpireDate; |
|||
inputoExpectOutEditInput.ItemDesc1 = detail.ItemDesc1; |
|||
inputoExpectOutEditInput.ItemDesc2 = detail.ItemDesc2; |
|||
inputoExpectOutEditInput.ItemName = detail.ItemName; |
|||
inputoExpectOutEditInput.LocationArea = detail.RecommendFromLocationArea; |
|||
inputoExpectOutEditInput.LocationGroup = detail.RecommendFromLocationGroup; |
|||
inputoExpectOutEditInput.LocationErpCode = detail.RecommendFromLocationErpCode; |
|||
inputoExpectOutEditInput.PackingCode = detail.RecommendFromPackingCode; |
|||
inputoExpectOutEditInput.Lot = detail.RecommendFromLot; |
|||
inputoExpectOutEditInput.ProduceDate = detail.RecommendFromProduceDate; |
|||
inputoExpectOutEditInput.Status = detail.Status; |
|||
inputoExpectOutEditInput.Uom = detail.Uom; |
|||
inputoExpectOutEditInput.SupplierBatch = detail.RecommendFromSupplierBatch; |
|||
inputoExpectOutEditInput.WarehouseCode = detail.RecommendFromWarehouseCode; |
|||
|
|||
expectOutEditInputs.Add(inputoExpectOutEditInput); |
|||
} |
|||
|
|||
await _expectOutAppService.AddManyAsync(expectOutEditInputs).ConfigureAwait(false); |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 根据是否在 第一层 来创建 是否生成库移任务
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
private async Task CreateTransferLibAsync(KittingIssueJob kittingIssueJob) |
|||
{ |
|||
if (!await IsMinRowAsync(kittingIssueJob).ConfigureAwait(false)) |
|||
{ |
|||
foreach (var detail in kittingIssueJob.Details) |
|||
{ |
|||
var input = new TransferLibRequestEditInput(); |
|||
input.CallBusinessType = nameof(IKittingIssueJobAppService); |
|||
input.CallJobNumber = kittingIssueJob.Number; |
|||
input.CallRequestNumber = kittingIssueJob.KittingRequestNumber; |
|||
input.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; |
|||
input.Type = "Transfer_Warehouse"; |
|||
input.UseOnTheWayLocation = true; |
|||
|
|||
var detailInput = new TransferLibRequestDetailInput(); |
|||
detailInput.CallBusinessType = nameof(IKittingIssueJobAppService); |
|||
detailInput.CallRequestNumber = kittingIssueJob.KittingRequestNumber; |
|||
detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; |
|||
detailInput.CallJobNumber = kittingIssueJob.Number; |
|||
|
|||
detailInput.JobStatus = EnumJobStatus.Open; |
|||
detailInput.ItemCode = detail.ItemCode; |
|||
detailInput.StdPackQty = detail.StdPackQty; |
|||
detailInput.Uom = detail.Uom; |
|||
detailInput.Status = detail.Status; |
|||
|
|||
detailInput.RecommendFromQty = detail.RecommendFromQty; |
|||
detailInput.RecommendFromLot = detail.RecommendFromLot; |
|||
detailInput.RecommendFromPackingCode = detailInput.RecommendFromPackingCode; |
|||
detailInput.RecommendToLot = detail.RecommendToLot; |
|||
|
|||
detailInput.RecommendFromArriveDate = detail.RecommendFromArriveDate; |
|||
detailInput.RecommendFromExpireDate = detail.RecommendFromExpireDate; |
|||
detailInput.RecommendFromProduceDate = detail.RecommendFromProduceDate; |
|||
detailInput.RecommendFromSupplierBatch = detail.RecommendFromSupplierBatch; |
|||
|
|||
detailInput.RecommendFromLocationCode = detail.RecommendFromLocationCode; |
|||
detailInput.RecommendFromLocationGroup = detail.RecommendFromLocationGroup; |
|||
detailInput.RecommendFromLocationArea = detail.RecommendFromLocationArea; |
|||
detailInput.RecommendFromLocationErpCode = detail.RecommendFromLocationErpCode; |
|||
detailInput.RecommendFromWarehouseCode = detail.RecommendFromWarehouseCode; |
|||
|
|||
detailInput.RecommendToQty = detail.RecommendToQty; |
|||
detailInput.RecommendToLot = detail.RecommendToLot; |
|||
detailInput.RecommendToPackingCode = detailInput.RecommendToPackingCode; |
|||
detailInput.RecommendToLot = detail.RecommendToLot; |
|||
|
|||
detailInput.RecommendToArriveDate = detail.RecommendToArriveDate; |
|||
detailInput.RecommendToExpireDate = detail.RecommendToExpireDate; |
|||
detailInput.RecommendToProduceDate = detail.RecommendToProduceDate; |
|||
detailInput.RecommendToSupplierBatch = detail.RecommendToSupplierBatch; |
|||
|
|||
detailInput.RecommendToLocationCode = detail.RecommendToLocationCode; |
|||
detailInput.RecommendToLocationGroup = detail.RecommendToLocationGroup; |
|||
detailInput.RecommendToLocationArea = detail.RecommendToLocationArea; |
|||
detailInput.RecommendToLocationErpCode = detail.RecommendToLocationErpCode; |
|||
detailInput.RecommendToWarehouseCode = detail.RecommendToWarehouseCode; |
|||
|
|||
await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建补料记录实体
|
|||
/// </summary>
|
|||
/// <param name="entity"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<KittingIssueNoteEditInput> BuildKittingIssueNoteAsync(KittingIssueJob entity) |
|||
{ |
|||
var kittingIssueNoteCreateInput = ObjectMapper.Map<KittingIssueJob, KittingIssueNoteEditInput>(entity); |
|||
kittingIssueNoteCreateInput.JobNumber = entity.Number; |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
|
|||
return kittingIssueNoteCreateInput; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 判断是不是在最底层 如果不是则把状态变更为等待
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueJob"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<bool> IsMinRowAsync(KittingIssueJob kittingIssueJob) |
|||
{ |
|||
var detail = kittingIssueJob.Details.FirstOrDefault(); |
|||
|
|||
var loctionDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode) |
|||
.ConfigureAwait(false); |
|||
if (loctionDto.RowCode == 1) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,512 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Text.Json; |
|||
using System.Threading.Tasks; |
|||
using Castle.Components.DictionaryAdapter; |
|||
using Volo.Abp; |
|||
using Volo.Abp.EventBus; |
|||
using Win_in.Sfs.Basedata.Application.Contracts; |
|||
using Win_in.Sfs.Shared.Domain.Shared; |
|||
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; |
|||
using Win_in.Sfs.Shared.Event; |
|||
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|||
using Win_in.Sfs.Wms.Store.Application.Contracts; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
using Win_in.Sfs.Wms.Store.Domain.Shared; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; |
|||
|
|||
public class KittingIssueRequestEventHandler |
|||
: StoreEventHandlerBase |
|||
, ILocalEventHandler<SfsHandledEntityEventData<KittingIssueRequest>> |
|||
, ILocalEventHandler<SfsAbortedEntityEventData<KittingIssueRequest>> |
|||
, ILocalEventHandler<SfsCompletedEntityEventData<KittingIssueRequest>> |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueRequest>> |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueRequest>>> |
|||
{ |
|||
private readonly IKittingIssueJobAppService _kittingIssueJobAppService; |
|||
private readonly IProductionLineAppService _productionLineAppService; |
|||
private readonly IProductionLineItemAppService _productionLineItemAppService; |
|||
private readonly ILocationAppService _locationAppService; |
|||
private readonly IBalanceAppService _balanceAppService; |
|||
|
|||
public KittingIssueRequestEventHandler( |
|||
IKittingIssueJobAppService kittingIssueJobAppService, IProductionLineAppService productionLineAppService, |
|||
ILocationAppService locationAppService, |
|||
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService) |
|||
{ |
|||
_kittingIssueJobAppService = kittingIssueJobAppService; |
|||
_productionLineAppService = productionLineAppService; |
|||
_locationAppService = locationAppService; |
|||
_balanceAppService = balanceAppService; |
|||
_productionLineItemAppService = productionLineItemAppService; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建后
|
|||
/// </summary>
|
|||
/// <param name="eventData">Event data</param>
|
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<KittingIssueRequest> eventData) |
|||
{ |
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 批量创建后
|
|||
/// </summary>
|
|||
/// <param name="eventData">Event data</param>
|
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<KittingIssueRequest>> eventData) |
|||
{ |
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 执行后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task HandleEventAsync(SfsHandledEntityEventData<KittingIssueRequest> eventData) |
|||
{ |
|||
var entity = eventData.Entity; |
|||
|
|||
List<KittingIssueJobEditInput> kittingIssueJobs = new EditableList<KittingIssueJobEditInput>(); |
|||
|
|||
switch (entity.Type) |
|||
{ |
|||
case nameof(EnumIssueType.BoxQty): |
|||
kittingIssueJobs = await CreateKittingIssueJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false); |
|||
break; |
|||
case nameof(EnumIssueType.Qty): |
|||
kittingIssueJobs = await CreateKittingIssueJobWithQtyTypeAsync(entity).ConfigureAwait(false); |
|||
break; |
|||
} |
|||
|
|||
if (kittingIssueJobs.Any()) |
|||
{ |
|||
await _kittingIssueJobAppService.CreateManyAsync(kittingIssueJobs).ConfigureAwait(false); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 驳回后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task HandleEventAsync(SfsAbortedEntityEventData<KittingIssueRequest> eventData) |
|||
{ |
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 完成后
|
|||
/// </summary>
|
|||
/// <param name="eventData"></param>
|
|||
/// <returns></returns>
|
|||
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<KittingIssueRequest> eventData) |
|||
{ |
|||
_ = eventData.Entity; |
|||
// await _kittingIssueJobAppService.CompleteByKittingIssueRequestAsync(entity.Number);
|
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
} |
|||
|
|||
#region 私有
|
|||
|
|||
#region 按数量叫料
|
|||
|
|||
/// <summary>
|
|||
/// 创建注塑任务
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequest"></param>
|
|||
/// <returns></returns>
|
|||
/// <exception cref="UserFriendlyException"></exception>
|
|||
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithQtyTypeAsync |
|||
(KittingIssueRequest kittingIssueRequest) |
|||
{ |
|||
var jobs = new List<KittingIssueJobEditInput>(); |
|||
|
|||
var toLocationCodes = kittingIssueRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList(); //所有发送库位的集合
|
|||
var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false); //所有库位的集合
|
|||
|
|||
var kittingIssueRequestDetails = kittingIssueRequest.Details.Where(p => p.ToBeIssuedQty > 0); //所有还没发送物品的集合
|
|||
foreach (var kittingIssueRequestDetail in kittingIssueRequestDetails) //如果有还有剩余未叫料的数量 则创建新的任务
|
|||
{ |
|||
var toLocation = |
|||
toLocations.FirstOrDefault(p => p.Code == kittingIssueRequestDetail.ToLocationCode); //判断目标库位是否存在
|
|||
Check.NotNull(toLocation, "库位代码", $"库位 {kittingIssueRequestDetail.ToLocationCode} 不存在"); |
|||
|
|||
//创建详情
|
|||
var jobDetails = |
|||
await CreateKittingIssueJobDetailInputsWithQtyTypeAsync(kittingIssueRequest, kittingIssueRequestDetail, |
|||
toLocation.LocationGroupCode).ConfigureAwait(false); |
|||
if (!jobDetails.Any()) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var fromLocationCode = jobDetails[0].RecommendFromLocationCode; |
|||
var fromLocation = await _locationAppService.GetByCodeAsync(fromLocationCode).ConfigureAwait(false); |
|||
var job = jobs.FirstOrDefault(p => p.WorkGroupCode == fromLocation?.WorkGroupCode); |
|||
if (job == null || job.Details.Any(p => p.RecommendToLocationCode != kittingIssueRequestDetail.ToLocationCode)) |
|||
{ |
|||
job = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(kittingIssueRequest, fromLocation) |
|||
.ConfigureAwait(false); |
|||
jobs.Add(job); |
|||
} |
|||
|
|||
job.Details.AddRange(jobDetails); |
|||
if (kittingIssueRequestDetail.ToBeIssuedQty < 0) |
|||
{ |
|||
kittingIssueRequestDetail.Status = EnumStatus.Close; |
|||
} |
|||
} |
|||
|
|||
jobs = jobs.Where(p => p.Details.Any()).ToList(); |
|||
|
|||
var openRequestDetails = |
|||
kittingIssueRequest.Details.Where(p => p.Status != EnumStatus.Close).ToList(); |
|||
|
|||
if (!openRequestDetails.Any()) |
|||
{ |
|||
return jobs; |
|||
} |
|||
|
|||
|
|||
var enableMultipleCreateKittingIssueJob = await SettingManager |
|||
.IsTrueAsync(StoreSettings.MaterialRequest.EnableMultipleCreateIssueJob).ConfigureAwait(false); |
|||
if (enableMultipleCreateKittingIssueJob) |
|||
{ |
|||
//kittingIssueRequest.Partial();
|
|||
} |
|||
else |
|||
{ |
|||
var sb = new StringBuilder(); |
|||
foreach (var openRequestDetail in openRequestDetails) |
|||
{ |
|||
sb.AppendLine( |
|||
$"{openRequestDetail.ItemCode}请求数量 {openRequestDetail.Qty},可用库存数量 {openRequestDetail.IssuedQty}"); |
|||
} |
|||
|
|||
throw new UserFriendlyException($"{sb} 可用库存数量不足, 无法生成发料任务"); |
|||
} |
|||
|
|||
return jobs; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 构造注塑任务
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequest"></param>
|
|||
/// <param name="fromLocation"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithQtyTypeAsync( |
|||
KittingIssueRequest kittingIssueRequest, |
|||
LocationDTO fromLocation) |
|||
{ |
|||
KittingIssueJobEditInput job; |
|||
job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(kittingIssueRequest); |
|||
job.JobType = EnumJobType.IssueJob; |
|||
job.JobStatus = EnumJobStatus.Open; |
|||
job.WorkGroupCode = fromLocation.WorkGroupCode; |
|||
job.WarehouseCode = fromLocation.WarehouseCode; |
|||
job.Worker = kittingIssueRequest.Worker; |
|||
if (string.IsNullOrEmpty(job.Worker)) |
|||
{ |
|||
job.Worker = "admin"; |
|||
} |
|||
|
|||
job.KittingRequestNumber = kittingIssueRequest.Number; |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
|
|||
return job; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 创建注塑任务明细
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequest"></param>
|
|||
/// <param name="kittingIssueRequestDetail"></param>
|
|||
/// <param name="toLocationGroupCode"></param>
|
|||
/// <returns></returns>
|
|||
/// <exception cref="UserFriendlyException"></exception>
|
|||
private async Task<List<KittingIssueJobDetailInput>> CreateKittingIssueJobDetailInputsWithQtyTypeAsync( |
|||
KittingIssueRequest kittingIssueRequest, |
|||
KittingIssueRequestDetail kittingIssueRequestDetail, string toLocationGroupCode) |
|||
{ |
|||
var jobDetails = new List<KittingIssueJobDetailInput>(); |
|||
|
|||
//获取推荐库存
|
|||
var productionLineDto = await _productionLineAppService |
|||
.GetByLocationCodeAsync(kittingIssueRequestDetail.ToLocationCode).ConfigureAwait(false); |
|||
var productionLineItemDtos = await _productionLineItemAppService |
|||
.GetByProductLineCodeAsync(productionLineDto.Code).ConfigureAwait(false); |
|||
if (productionLineItemDtos == null) |
|||
{ |
|||
throw new UserFriendlyException($"物品代码【{kittingIssueRequestDetail.ItemCode}】没有对应的【生产线物品关系】"); |
|||
} |
|||
|
|||
var productionLineItemDto = |
|||
productionLineItemDtos.FirstOrDefault(p => p.ItemCode == kittingIssueRequestDetail.ItemCode); |
|||
var input = new RecommendBalanceRequestInput |
|||
{ |
|||
ItemCode = kittingIssueRequestDetail.ItemCode, |
|||
Qty = kittingIssueRequestDetail.ToBeIssuedQty, |
|||
//LocationTypes = transactionType.OutLocationTypes, productionLineItemDto.RawLocationCodeListJson
|
|||
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|||
Locations = JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson) |
|||
}; |
|||
|
|||
var recommendList = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false); |
|||
//没有推荐库存时 跳过此明细 不生成任务
|
|||
if (recommendList.Count != 0) |
|||
{ |
|||
foreach (var recommend in recommendList) |
|||
{ |
|||
//拿走需求量
|
|||
var detail = |
|||
await BuildKittingIssueJobDetailWithQtyTypeAsync(kittingIssueRequestDetail, recommend, |
|||
toLocationGroupCode) |
|||
.ConfigureAwait(false); |
|||
if (kittingIssueRequest.UseOnTheWayLocation) |
|||
{ |
|||
//获取在途库
|
|||
var locationDto = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.TRANSPORT) |
|||
.ConfigureAwait(false); |
|||
|
|||
detail.OnTheWayLocationCode = locationDto.Code; |
|||
} |
|||
|
|||
jobDetails.Add(detail); |
|||
kittingIssueRequestDetail.IssuedQty += recommend.Qty; |
|||
|
|||
//await _kittingIssueRequestManager.UpdateDetailsAsync(kittingIssueRequest).ConfigureAwait(false);
|
|||
} |
|||
} |
|||
|
|||
return jobDetails; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 构造注塑任务明细
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequestDetail"></param>
|
|||
/// <param name="balance"></param>
|
|||
/// <param name="toLocationGroupCode"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithQtyTypeAsync( |
|||
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balance, string toLocationGroupCode) |
|||
{ |
|||
//ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false);
|
|||
|
|||
var detail = ObjectMapper.Map<BalanceDTO, KittingIssueJobDetailInput>(balance); |
|||
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; |
|||
detail.PositionCode = kittingIssueRequestDetail.PositionCode; |
|||
detail.RecommendType = kittingIssueRequestDetail.RecommendType; |
|||
|
|||
detail.RecommendFromPackingCode = balance.PackingCode; |
|||
detail.RecommendFromContainerCode = balance.ContainerCode; |
|||
detail.RecommendFromSupplierBatch = balance.SupplierBatch; |
|||
detail.RecommendFromProduceDate = balance.ProduceDate; |
|||
detail.RecommendFromExpireDate = balance.ExpireDate; |
|||
detail.RecommendFromLot = balance.Lot; |
|||
detail.RecommendFromProduceDate = balance.ProduceDate; |
|||
detail.RecommendFromArriveDate = balance.ArriveDate; |
|||
detail.RecommendFromLocationArea = balance.LocationArea; |
|||
detail.RecommendFromLocationCode = balance.LocationCode; |
|||
detail.RecommendFromLocationErpCode = balance.LocationErpCode; |
|||
detail.RecommendFromLocationGroup = balance.LocationGroup; |
|||
detail.RecommendFromWarehouseCode = balance.WarehouseCode; |
|||
detail.RecommendFromQty = balance.Qty; |
|||
detail.Uom = balance.Uom; |
|||
|
|||
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode; |
|||
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; |
|||
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea; |
|||
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; |
|||
|
|||
//detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code;
|
|||
detail.ProdLine = toLocationGroupCode; |
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
return detail; |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#region 按箱叫料
|
|||
|
|||
/// <summary>
|
|||
/// 创建注塑任务
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequest"></param>
|
|||
/// <returns></returns>
|
|||
/// <exception cref="UserFriendlyException"></exception>
|
|||
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithBoxQtyTypeAsync |
|||
(KittingIssueRequest kittingIssueRequest) |
|||
{ |
|||
var inputJobs = new List<KittingIssueJobEditInput>(); |
|||
var inputExpectOutEditInput = new ExpectOutEditInput(); |
|||
//已用的库存的箱码集合
|
|||
var useBalanceList = new List<string>(); |
|||
|
|||
var groupByItemCodeAndLocationCode = |
|||
kittingIssueRequest.Details.GroupBy(p => new { p.ItemCode, p.ToLocationCode }); |
|||
|
|||
foreach (var locationCodeItemCodeGroup in groupByItemCodeAndLocationCode) |
|||
{ |
|||
var inputDetails = kittingIssueRequest.Details.Where(p => |
|||
p.ItemCode == locationCodeItemCodeGroup.Key.ItemCode && |
|||
p.ToLocationCode == locationCodeItemCodeGroup.Key.ToLocationCode); |
|||
var inputDetailTemplate = inputDetails.First(); |
|||
//获取请求下 这个零件和这个库位一个需要多少箱
|
|||
var sumBoxQty = inputDetails.Sum(p => p.BoxQty); |
|||
//获取生产线
|
|||
var productionLineDto = await _productionLineAppService |
|||
.GetByLocationCodeAsync(inputDetails.First().ToLocationCode).ConfigureAwait(false); |
|||
if (productionLineDto == null) |
|||
{ |
|||
throw new UserFriendlyException($"库位【{inputDetailTemplate.ToLocationCode}】没有对应的【生产线】"); |
|||
} |
|||
|
|||
var productLineCodeAndItemCode = await _productionLineItemAppService |
|||
.GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, inputDetailTemplate.ItemCode) |
|||
.ConfigureAwait(false); |
|||
if (productLineCodeAndItemCode == null) |
|||
{ |
|||
throw new UserFriendlyException( |
|||
$"物品代码【{inputDetailTemplate.ItemCode}】在生产线【{productionLineDto.Code}】中没有对应的【生产线物品关系】"); |
|||
} |
|||
|
|||
//获取可用库存
|
|||
var input = new RecommendBalanceRequestInput |
|||
{ |
|||
ItemCode = locationCodeItemCodeGroup.Key.ItemCode, |
|||
Qty = decimal.MaxValue, |
|||
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|||
Locations = JsonSerializer.Deserialize<List<string>>(productLineCodeAndItemCode |
|||
.RawLocationCodeListJson) |
|||
}; |
|||
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); |
|||
usableList = usableList.Where(p => !useBalanceList.Contains(p.PackingCode)).ToList(); |
|||
if (usableList.Any()) |
|||
{ |
|||
for (var i = 0; i < sumBoxQty; i++) |
|||
{ |
|||
var firstUsable = usableList.First(); |
|||
useBalanceList.Add(firstUsable.PackingCode); |
|||
usableList.Remove(firstUsable); |
|||
|
|||
var kittingIssueJobEditInput = |
|||
await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(kittingIssueRequest, inputDetailTemplate, |
|||
firstUsable) |
|||
.ConfigureAwait(false); |
|||
|
|||
inputJobs.Add(kittingIssueJobEditInput); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return inputJobs; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 构造注塑任务
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequest"></param>
|
|||
/// <param name="kittingIssueRequestDetail"></param>
|
|||
/// <param name="balanceDtos"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync( |
|||
KittingIssueRequest kittingIssueRequest, |
|||
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balanceDtos) |
|||
{ |
|||
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(kittingIssueRequest); |
|||
job.JobType = EnumJobType.IssueJob; |
|||
job.JobStatus = EnumJobStatus.Open; |
|||
job.WorkGroupCode = kittingIssueRequestDetail.ToLocationGroup; |
|||
job.WarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; |
|||
job.Worker = kittingIssueRequest.Worker; |
|||
job.KittingRequestNumber = kittingIssueRequest.Number; |
|||
|
|||
job.Details.Add(await BuildKittingIssueJobDetailWithBoxQtyTypeAsync(kittingIssueRequestDetail, balanceDtos) |
|||
.ConfigureAwait(false)); |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
|
|||
return job; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 构造注塑任务明细
|
|||
/// </summary>
|
|||
/// <param name="kittingIssueRequestDetail"></param>
|
|||
/// <param name="balance"></param>
|
|||
/// <param name="toLocationGroupCode"></param>
|
|||
/// <returns></returns>
|
|||
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithBoxQtyTypeAsync( |
|||
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balance) |
|||
{ |
|||
var detail = new KittingIssueJobDetailInput(); |
|||
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; |
|||
detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup; |
|||
detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea; |
|||
detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; |
|||
detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; |
|||
|
|||
detail.PositionCode = kittingIssueRequestDetail.PositionCode; |
|||
detail.RecommendType = kittingIssueRequestDetail.RecommendType; |
|||
detail.ProdLine = kittingIssueRequestDetail.ToLocationCode; |
|||
|
|||
detail.ItemCode = kittingIssueRequestDetail.ItemCode; |
|||
detail.ItemName = kittingIssueRequestDetail.ItemName; |
|||
detail.ItemDesc1 = kittingIssueRequestDetail.ItemDesc1; |
|||
detail.ItemDesc2 = kittingIssueRequestDetail.ItemDesc2; |
|||
|
|||
detail.Status = EnumInventoryStatus.OK; |
|||
detail.Uom = balance.Uom; |
|||
|
|||
detail.RecommendFromPackingCode = balance.PackingCode; |
|||
detail.RecommendFromContainerCode = balance.ContainerCode; |
|||
detail.RecommendFromLot = balance.Lot; |
|||
|
|||
detail.RecommendFromQty = balance.Qty; |
|||
|
|||
detail.RecommendFromSupplierBatch = balance.SupplierBatch; |
|||
detail.RecommendFromProduceDate = balance.ProduceDate; |
|||
detail.RecommendFromExpireDate = balance.ExpireDate; |
|||
detail.RecommendFromProduceDate = balance.ProduceDate; |
|||
detail.RecommendFromArriveDate = balance.ArriveDate; |
|||
|
|||
detail.RecommendFromLocationArea = balance.LocationArea; |
|||
detail.RecommendFromLocationCode = balance.LocationCode; |
|||
detail.RecommendFromLocationErpCode = balance.LocationErpCode; |
|||
detail.RecommendFromLocationGroup = balance.LocationGroup; |
|||
detail.RecommendFromWarehouseCode = balance.WarehouseCode; |
|||
|
|||
detail.RecommendToPackingCode = balance.PackingCode; |
|||
detail.RecommendToContainerCode = balance.ContainerCode; |
|||
detail.RecommendToLot = balance.Lot; |
|||
|
|||
detail.RecommendToQty = balance.Qty; |
|||
|
|||
detail.RecommendToSupplierBatch = balance.SupplierBatch; |
|||
detail.RecommendToProduceDate = balance.ProduceDate; |
|||
detail.RecommendToExpireDate = balance.ExpireDate; |
|||
detail.RecommendToProduceDate = balance.ProduceDate; |
|||
detail.RecommendToArriveDate = balance.ArriveDate; |
|||
|
|||
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode; |
|||
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; |
|||
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea; |
|||
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; |
|||
detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
return detail; |
|||
} |
|||
|
|||
#endregion
|
|||
|
|||
#endregion
|
|||
} |
@ -0,0 +1,88 @@ |
|||
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.Inventory.Application.Contracts; |
|||
using Win_in.Sfs.Wms.Store.Domain; |
|||
using Win_in.Sfs.Wms.Store.Event.Transaction; |
|||
|
|||
namespace Win_in.Sfs.Wms.Store.Event.Transactions; |
|||
|
|||
public class KittingIssueNoteEventHandler |
|||
: StoreInventoryEventHandlerBase |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueNote>> |
|||
, ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueNote>>> |
|||
, ILocalEventHandler<SfsConfirmedEntityEventData<KittingIssueNote>> |
|||
{ |
|||
private const EnumTransType TransType = EnumTransType.Issue; |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<KittingIssueNote> eventData) |
|||
{ |
|||
var entity = eventData.Entity; |
|||
var transferLogs = new List<TransferLogEditInput>(); |
|||
var route = entity.UseOnTheWayLocation |
|||
? EnumTransferRoute.SourceToOnTheWay |
|||
: EnumTransferRoute.SourceToDestination; |
|||
transferLogs.AddRange(await BuildTransferLogsAsync(entity).ConfigureAwait(false)); |
|||
|
|||
await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); |
|||
} |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<KittingIssueNote>> eventData) |
|||
{ |
|||
var entities = eventData.Entity; |
|||
var transferLogs = new List<TransferLogEditInput>(); |
|||
//如果要做库存事务汇总,可以修改此处
|
|||
foreach (var issueNote in entities) |
|||
{ |
|||
transferLogs.AddRange(await BuildTransferLogsAsync(issueNote).ConfigureAwait(false)); |
|||
} |
|||
|
|||
await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); |
|||
} |
|||
|
|||
[UnitOfWork] |
|||
public virtual async Task HandleEventAsync(SfsConfirmedEntityEventData<KittingIssueNote> eventData) |
|||
{ |
|||
var entity = eventData.Entity; |
|||
|
|||
var inputList = await BuildTransferLogsAsync(entity) |
|||
.ConfigureAwait(false); |
|||
await AddTransferLogsAsync(inputList).ConfigureAwait(false); |
|||
} |
|||
|
|||
private async Task AddTransferLogsAsync(List<TransferLogEditInput> inputList) |
|||
{ |
|||
var transferLogs = new List<TransferLogEditInput>(); |
|||
|
|||
transferLogs.AddRange(inputList); |
|||
|
|||
await TransferLogAppService.AddManyAsync(transferLogs).ConfigureAwait(false); |
|||
} |
|||
|
|||
private async Task<List<TransferLogEditInput>> BuildTransferLogsAsync(KittingIssueNote issueNote) |
|||
{ |
|||
var transferLogs = new List<TransferLogEditInput>(); |
|||
foreach (var detail in issueNote.Details.Where(detail => detail.HandledToQty != 0)) |
|||
{ |
|||
var transferLog = ObjectMapper.Map<KittingIssueNoteDetail, TransferLogEditInput>(detail); |
|||
|
|||
transferLog.TransSubType = EnumTransSubType.Issue_WIP; |
|||
transferLog.TransType = TransType; |
|||
transferLog.DocNumber = issueNote.Number; |
|||
transferLog.JobNumber = issueNote.JobNumber; |
|||
|
|||
transferLogs.Add(transferLog); |
|||
} |
|||
|
|||
await Task.CompletedTask.ConfigureAwait(false); |
|||
|
|||
return transferLogs; |
|||
} |
|||
} |
Loading…
Reference in new issue