From 3cd9f003ae893abe2483ab3ce0a62bfbd9fa8554 Mon Sep 17 00:00:00 2001 From: zs <zhousong@weben-smart.com> Date: 周一, 05 5月 2025 18:04:15 +0800 Subject: [PATCH] 库存后端修改 --- HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs | 119 +++ HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStock.cs | 128 ++++ HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs | 385 ++++++++++++ HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockDto.cs | 205 ++++++ HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockConsts.cs | 12 HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs | 187 +++++ HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Extensions/CMSPluginEfCoreExtensions.WmsMaterialStock.cs | 141 ++++ HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs | 46 + HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockDataSeedContributor.cs | 79 ++ HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/GetWmsMaterialStocksInput.cs | 110 +++ HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockUpdateDto.cs | 14 HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksImportModel.cs | 34 + HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksExportModel.cs | 136 ++++ HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateOrUpdateDtoBase.cs | 112 +++ HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockEto.cs | 22 HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockSpecification.cs | 41 + HIAWms/server/src/CMS.Plugin.HIAWms.SqlServer/CMSPluginDbContext.cs | 1 HIAWms/server/src/CMS.Plugin.HIAWms.MySQL/CMSPluginDbContext.cs | 1 HIAWms/server/src/CMS.Plugin.HIAWms.PostgreSql/CMSPluginDbContext.cs | 1 HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs | 17 HIAWms/server/src/CMS.Plugin.HIAWms.Application/MapperProfiles/WmsMaterialStockAutoMapperProfile.cs | 28 HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs | 54 + HIAWms/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterialStock导出模板.xlsx | 0 HIAWms/server/src/CMS.Plugin.HIAWms.Domain/EventHandlers/WmsMaterialStockEventHandler.cs | 17 24 files changed, 1,890 insertions(+), 0 deletions(-) diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/GetWmsMaterialStocksInput.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/GetWmsMaterialStocksInput.cs new file mode 100644 index 0000000..a3bddeb --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/GetWmsMaterialStocksInput.cs @@ -0,0 +1,110 @@ +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using Volo.Abp.Application.Dtos; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock鏌ヨ鍙傛暟瀵硅薄 +/// </summary> +public class GetWmsMaterialStocksInput : ExtensiblePagedAndSortedResultRequestDto +{ + /// <summary> + /// Gets or sets the filter. + /// </summary> + public string Filter { get; set; } + + /// <summary> + /// Gets or sets the name. + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 寮�濮嬫椂闂� + /// </summary> + public DateTime? StartTime { get; set; } + + /// <summary> + /// 缁撴潫鏃堕棿 + /// </summary> + public DateTime? EndTime { get; set; } + + /// <summary> + /// 缂栧彿 + /// </summary> + public virtual string MaterialId { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public virtual string MaterialName { get; set; } + + /// <summary> + /// 瀹瑰櫒缂栧彿 + /// </summary> + public string ContainerNo { get; set; } + + /// <summary> + /// 瀹瑰櫒鐘舵�� + /// </summary> + public ContainerStatusEnum? ContainerStatus { get; set; } + + /// <summary> + /// 瀹瑰櫒绫诲瀷 + /// </summary> + public ContainerTypeEnum? ContainerType { get; set; } + + /// <summary> + /// 鐗╂枡缂栧彿 + /// </summary> + public string MaterialNo { get; set; } + + /// <summary> + /// 鐗╂枡鎵规 + /// </summary> + public string MaterialBatch { get; set; } + + /// <summary> + /// 渚涘簲鍟嗙紪鍙� + /// </summary> + public string SupplierCode { get; set; } + + /// <summary> + /// 鏈哄瀷 + /// </summary> + public string MaterialModel { get; set; } + + /// <summary> + /// 搴撲綅缂栧彿 + /// </summary> + public string PlaceNo { get; set; } + + /// <summary> + /// 搴撲綅鐘舵�� + /// </summary> + public PlaceStatusEnum? PlaceStatus { get; set; } + + /// <summary> + /// 搴撲綅绫诲瀷缂栧彿 + /// </summary> + public PlaceTypeEnum? StorageTypeNo { get; set; } + + /// <summary> + /// 鍖哄煙缂栧彿 + /// </summary> + public string AreaCode { get; set; } + + /// <summary> + /// 搴撳尯鍚嶇О + /// </summary> + public string AreaName { get; set; } + + /// <summary> + /// 鏄惁閿佸畾 + /// </summary> + public YesNoEnum? IsLock { get; set; } + + /// <summary> + /// 鍏ュ簱鏃堕棿 + /// </summary> + public DateTime? InStockTime { get; set; } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs new file mode 100644 index 0000000..16d40b0 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateDto.cs @@ -0,0 +1,17 @@ +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock鍒涘缓鍙傛暟瀵硅薄 +/// </summary> +public class WmsMaterialStockCreateDto : WmsMaterialStockCreateOrUpdateDtoBase +{ + /// <summary> + /// 鎺掑簭 + /// </summary> + public virtual int? Sort { get; set; } + + /// <summary> + /// 鏄惁绂佺敤 + /// </summary> + public bool? IsDisabled { get; set; } = false; +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateOrUpdateDtoBase.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateOrUpdateDtoBase.cs new file mode 100644 index 0000000..8f776ef --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockCreateOrUpdateDtoBase.cs @@ -0,0 +1,112 @@ +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using Volo.Abp.Application.Dtos; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock鍒涘缓鎴栨洿鏂板熀绫� +/// </summary> +public abstract class WmsMaterialStockCreateOrUpdateDtoBase : ExtensibleEntityDto +{ + /// <summary> + /// 缂栧彿 + /// </summary> + public virtual string MaterialId { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public virtual string MaterialName { get; set; } + + /// <summary> + /// 瀹瑰櫒缂栧彿 + /// </summary> + public string ContainerNo { get; set; } + + /// <summary> + /// 瀹瑰櫒鐘舵�� + /// </summary> + public ContainerStatusEnum ContainerStatus { get; set; } + + /// <summary> + /// 瀹瑰櫒绫诲瀷 + /// </summary> + public ContainerTypeEnum ContainerType { get; set; } + + /// <summary> + /// 鐗╂枡缂栧彿 + /// </summary> + public string MaterialNo { get; set; } + + /// <summary> + /// 搴撳瓨鏁伴噺 + /// </summary> + public int StockNumber { get; set; } + + /// <summary> + /// 鐗╂枡鎵规 + /// </summary> + public string MaterialBatch { get; set; } + + /// <summary> + /// 渚涘簲鍟嗙紪鍙� + /// </summary> + public string SupplierCode { get; set; } + + /// <summary> + /// 鏈哄瀷 + /// </summary> + public string MaterialModel { get; set; } + + /// <summary> + /// 搴撲綅缂栧彿 + /// </summary> + public string PlaceNo { get; set; } + + /// <summary> + /// 搴撲綅鐘舵�� + /// </summary> + public PlaceStatusEnum PlaceStatus { get; set; } + + /// <summary> + /// 搴撲綅绫诲瀷缂栧彿 + /// </summary> + public PlaceTypeEnum StorageTypeNo { get; set; } + + /// <summary> + /// 鍖哄煙缂栧彿 + /// </summary> + public string AreaCode { get; set; } + + /// <summary> + /// 搴撳尯鍚嶇О + /// </summary> + public string AreaName { get; set; } + + /// <summary> + /// 鏄惁閿佸畾 + /// </summary> + public int IsLock { get; set; } + + /// <summary> + /// 鏄惁绌烘墭 + /// </summary> + public YesNoEnum EmptyContainer { get; protected set; } + + /// <summary> + /// 鍏ュ簱鏃堕棿 + /// </summary> + public DateTime? InStockTime { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string Remark { get; set; } + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockCreateOrUpdateDtoBase"/> class. + /// </summary> + public WmsMaterialStockCreateOrUpdateDtoBase() : base(false) + { + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockDto.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockDto.cs new file mode 100644 index 0000000..722b8e6 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockDto.cs @@ -0,0 +1,205 @@ +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using System.Runtime.CompilerServices; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Domain.Entities; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock鏁版嵁鍙傛暟瀵硅薄 +/// </summary> +public class WmsMaterialStockDto : ExtensibleEntityDto<Guid>, IHasConcurrencyStamp +{ + /// <summary> + /// 缂栧彿 + /// </summary> + public virtual string MaterialId { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public virtual string MaterialName { get; set; } + + /// <summary> + /// 瀹瑰櫒缂栧彿 + /// </summary> + public string ContainerNo { get; set; } + + /// <summary> + /// 瀹瑰櫒鐘舵�� + /// </summary> + public ContainerStatusEnum ContainerStatus { get; set; } + + /// <summary> + /// 鎵樼洏鐘舵�� + /// </summary> + public string ContainerStatusDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(ContainerStatus); + } + } + + /// <summary> + /// 瀹瑰櫒绫诲瀷 + /// </summary> + public ContainerTypeEnum ContainerType { get; set; } + + /// <summary> + /// 鎵樼洏绫诲瀷 + /// </summary> + public string ContainerTypeDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(ContainerType); + } + } + + + /// <summary> + /// 鐗╂枡缂栧彿 + /// </summary> + public string MaterialNo { get; set; } + + /// <summary> + /// 搴撳瓨鏁伴噺 + /// </summary> + public int StockNumber { get; set; } + + /// <summary> + /// 鐗╂枡鎵规 + /// </summary> + public string MaterialBatch { get; set; } + + /// <summary> + /// 渚涘簲鍟嗙紪鍙� + /// </summary> + public string SupplierCode { get; set; } + + /// <summary> + /// 鏈哄瀷 + /// </summary> + public string MaterialModel { get; set; } + + /// <summary> + /// 搴撲綅缂栧彿 + /// </summary> + public string PlaceNo { get; set; } + + /// <summary> + /// 搴撲綅鐘舵�� + /// </summary> + public PlaceStatusEnum PlaceStatus { get; set; } + + /// <summary> + /// 璐т綅鐘舵�� + /// </summary> + public string PlaceStatusDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(PlaceStatus); + } + } + + + /// <summary> + /// 搴撲綅绫诲瀷缂栧彿 + /// </summary> + public PlaceTypeEnum StorageTypeNo { get; set; } + + /// <summary> + /// 璐т綅绫诲瀷 + /// </summary> + public string StorageTypeNoDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(StorageTypeNo); + } + } + + /// <summary> + /// 鍖哄煙缂栧彿 + /// </summary> + public string AreaCode { get; set; } + + /// <summary> + /// 搴撳尯鍚嶇О + /// </summary> + public string AreaName { get; set; } + + /// <summary> + /// 鏄惁閿佸畾 + /// </summary> + public YesNoEnum IsLock { get; set; } + + /// <summary> + /// 鏄惁閿佸畾 + /// </summary> + public string IsLockDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(IsLock); + } + } + + /// <summary> + /// 鏄惁绌烘墭 + /// </summary> + public YesNoEnum EmptyContainer { get; protected set; } + + /// <summary> + /// 鏄惁绌烘墭 + /// </summary> + public string EmptyContainerDesc + { + get + { + return GetEnumDescriptionUtil.GetEnumDescription(EmptyContainer); + } + } + + /// <summary> + /// 鍏ュ簱鏃堕棿 + /// </summary> + public DateTime? InStockTime { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public virtual int Sort { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string Remark { get; set; } + + /// <summary> + /// 鏄惁绂佺敤 + /// </summary> + public virtual bool? IsDisabled { get; set; } + + /// <summary> + /// 骞跺彂鎴� + /// </summary> + public string ConcurrencyStamp { get; set; } + + /// <summary> + /// Gets the export data. + /// </summary> + /// <returns></returns> + public Dictionary<string, object> GetExportData() + { + var exportData = new Dictionary<string, object>(); + foreach (var property in this.GetType().GetProperties()) + { + exportData.Add(property.Name, property.GetValue(this)); + } + + return exportData; + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockUpdateDto.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockUpdateDto.cs new file mode 100644 index 0000000..0578e9f --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStockUpdateDto.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Domain.Entities; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock鏇存柊鍙傛暟瀵硅薄 +/// </summary> +public class WmsMaterialStockUpdateDto : WmsMaterialStockCreateOrUpdateDtoBase, IHasConcurrencyStamp +{ + /// <summary> + /// 骞跺彂鎴� + /// </summary> + public string ConcurrencyStamp { get; set; } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksExportModel.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksExportModel.cs new file mode 100644 index 0000000..46f79ea --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksExportModel.cs @@ -0,0 +1,136 @@ +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using MiniExcelLibs.Attributes; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks +{ + /// <summary> + /// WmsMaterialStocks瀵煎嚭妯″瀷 + /// </summary> + public class WmsMaterialStocksExportModel + { + /// <summary> + /// WmsMaterialStock瀵煎嚭妯″瀷 + /// </summary> + public class WorkSectionExportModel + { + /// <summary> + /// 鐗╂枡缂栧彿锛堝敮涓�鏍囪瘑锛� + /// </summary> + [ExcelColumn(Name = "鐗╂枡缂栧彿", Width = 25)] + public string MaterialNo { get; set; } + + /// <summary> + /// 鐗╂枡鍚嶇О/鎻忚堪 + /// </summary> + [ExcelColumn(Name = "鐗╂枡鍚嶇О", Width = 25)] + public string MaterialName { get; set; } + + /// <summary> + /// 瀹瑰櫒/鎵樼洏缂栧彿 + /// </summary> + [ExcelColumn(Name = "瀹瑰櫒缂栧彿", Width = 25)] + public string ContainerNo { get; set; } + + /// <summary> + /// 瀹瑰櫒鐘舵�佹灇涓惧�� + /// <para>0-绌哄鍣� 1-宸茶杞� 2-鏁呴殰</para> + /// </summary> + [ExcelColumn(Name = "瀹瑰櫒鐘舵��", Width = 25)] + public ContainerStatusEnum ContainerStatus { get; set; } + + /// <summary> + /// 瀹瑰櫒绫诲瀷鏋氫妇鍊� + /// <para>1-鎵樼洏 2-鏂欑 3-鍛ㄨ浆绠�</para> + /// </summary> + [ExcelColumn(Name = "瀹瑰櫒绫诲瀷", Width = 25)] + public ContainerTypeEnum ContainerType { get; set; } + + /// <summary> + /// 褰撳墠搴撳瓨鏁伴噺锛堟暣鏁帮級 + /// </summary> + [ExcelColumn(Name = "搴撳瓨鏁伴噺", Width = 25)] + public int StockNumber { get; set; } + + /// <summary> + /// 鐗╂枡鎵规鍙凤紙LOT锛� + /// </summary> + [ExcelColumn(Name = "鐗╂枡鎵规", Width = 25)] + public string MaterialBatch { get; set; } + + /// <summary> + /// 渚涘簲鍟嗙紪鐮侊紙鍏宠仈渚涘簲鍟嗚〃锛� + /// </summary> + [ExcelColumn(Name = "渚涘簲鍟嗙紪鍙�", Width = 25)] + public string SupplierCode { get; set; } + + /// <summary> + /// 鐗╂枡瑙勬牸鍨嬪彿 + /// </summary> + [ExcelColumn(Name = "鍨嬪彿", Width = 25)] + public string MaterialModel { get; set; } + + /// <summary> + /// 搴撲綅缂栫爜锛堝簱浣嶈〃澶栭敭锛� + /// </summary> + [ExcelColumn(Name = "搴撲綅缂栧彿", Width = 25)] + public string PlaceNo { get; set; } + + /// <summary> + /// 搴撲綅鐘舵�佹灇涓惧�� + /// <para>1-绌洪棽 2-鍗犵敤 3-绂佺敤</para> + /// </summary> + [ExcelColumn(Name = "搴撲綅鐘舵��", Width = 25)] + public PlaceStatusEnum PlaceStatus { get; set; } + + /// <summary> + /// 搴撲綅绫诲瀷鏋氫妇鍊� + /// <para>1-骞抽潰搴� 2-绔嬩綋搴� 3-閲嶅瀷璐ф灦</para> + /// </summary> + [ExcelColumn(Name = "搴撲綅绫诲瀷", Width = 25)] + public PlaceTypeEnum StorageTypeNo { get; set; } + + /// <summary> + /// 鎵�灞炲簱鍖虹紪鐮侊紙鍖哄煙琛ㄥ閿級 + /// </summary> + [ExcelColumn(Name = "鍖哄煙缂栧彿", Width = 25)] + public string AreaCode { get; set; } + + /// <summary> + /// 搴撳尯鍚嶇О锛堟樉绀虹敤锛� + /// </summary> + [ExcelColumn(Name = "搴撳尯鍚嶇О", Width = 25)] + public string AreaName { get; set; } + + /// <summary> + /// 閿佸畾鐘舵�� + /// <para>0-鏈攣瀹� 1-宸查攣瀹�</para> + /// </summary> + [ExcelColumn(Name = "鏄惁閿佸畾", Width = 25)] + public int IsLock { get; set; } + + /// <summary> + /// 鏄惁绌烘墭 + /// </summary> + [ExcelColumn(Name = "鏄惁绌烘墭", Width = 25)] + public YesNoEnum EmptyContainer { get; protected set; } + + /// <summary> + /// 鏈�鍚庡叆搴撴椂闂达紙鍙负绌猴級 + /// </summary> + [ExcelColumn(Name = "鍏ュ簱鏃堕棿", Width = 25, Format = "yyyy-MM-dd HH:mm")] + public DateTime? InStockTime { get; set; } + + /// <summary> + /// 鏄剧ず鎺掑簭搴忓彿 + /// </summary> + [ExcelColumn(Name = "鎺掑簭", Width = 15)] + public int Sort { get; set; } + + /// <summary> + /// 澶囨敞淇℃伅 + /// </summary> + [ExcelColumn(Name = "澶囨敞", Width = 30)] + public string Remark { get; set; } + } + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksImportModel.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksImportModel.cs new file mode 100644 index 0000000..0b363ab --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterialStocks/WmsMaterialStocksImportModel.cs @@ -0,0 +1,34 @@ +using static CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks.WmsMaterialStocksExportModel; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks +{ + /// <summary> + /// WmsMaterialStocks瀵煎叆妯″瀷 + /// </summary> + public class WmsMaterialStocksImportModel + { + private List<WmsMaterialStockImportModel> _wmsmaterialstocks = new(); + + public List<WmsMaterialStockImportModel> WmsMaterialStocks + { + get => _wmsmaterialstocks; + set + { + _wmsmaterialstocks = value; + var rowIndex = 2; + _wmsmaterialstocks?.ForEach(x => x.RowIndex = rowIndex++); + } + } + + /// <summary> + /// WmsMaterialStock瀵煎叆妯″瀷 + /// </summary> + public class WmsMaterialStockImportModel : WorkSectionExportModel + { + /// <summary> + /// 琛屽彿 + /// </summary> + public int RowIndex { get; set; } + } + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs new file mode 100644 index 0000000..c12f034 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs @@ -0,0 +1,46 @@ +using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; +using Volo.Abp.Application.Services; + +namespace CMS.Plugin.HIAWms.Application.Contracts.Services; + +/// <summary> +/// WmsMaterialStock搴旂敤鏈嶅姟 +/// </summary> +public interface IWmsMaterialStockAppService : ICrudAppService<WmsMaterialStockDto, Guid, GetWmsMaterialStocksInput, WmsMaterialStockCreateDto, WmsMaterialStockUpdateDto> +{ + /// <summary> + /// Clones the asynchronous. + /// </summary> + /// <param name="ids">The ids.</param> + /// <returns></returns> + Task<List<WmsMaterialStockDto>> CloneAsync(IEnumerable<Guid> ids); + + /// <summary> + /// Deletes the many asynchronous. + /// </summary> + /// <param name="ids">The ids.</param> + /// <returns></returns> + Task DeleteManyAsync(IEnumerable<Guid> ids); + + /// <summary> + /// Adjusts the sort asynchronous. + /// </summary> + /// <param name="id">The identifier.</param> + /// <param name="sort">The sort.</param> + /// <returns></returns> + Task AdjustSortAsync(Guid id, int sort); + + /// <summary> + /// Imports the asynchronous. + /// </summary> + /// <param name="input">The input.</param> + /// <returns></returns> + Task ImportAsync(WmsMaterialStocksImportModel input); + + /// <summary> + /// Exports the asynchronous. + /// </summary> + /// <param name="input">The input.</param> + /// <returns></returns> + Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialStocksInput input); +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs new file mode 100644 index 0000000..6b88e6a --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs @@ -0,0 +1,385 @@ +using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; +using CMS.Plugin.HIAWms.Application.Contracts.Services; +using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; +using CMS.Plugin.HIAWms.Domain.Shared; +using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Data; +using Volo.Abp.ObjectExtending; +using CMS.Plugin.HIAWms.Domain.Shared.Util; + +namespace CMS.Plugin.HIAWms.Application.Implements; + +/// <inheritdoc /> +public class WmsMaterialStockAppService : CMSPluginAppService, IWmsMaterialStockAppService +{ + private readonly IWmsMaterialStockRepository _wmsmaterialstockRepository; + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockAppService"/> class. + /// </summary> + /// <param name="wmsmaterialstockRepository">The task job repository.</param> + public WmsMaterialStockAppService(IWmsMaterialStockRepository wmsmaterialstockRepository) + { + _wmsmaterialstockRepository = wmsmaterialstockRepository; + } + + /// <inheritdoc /> + public virtual async Task<WmsMaterialStockDto> GetAsync(Guid id) + { + return ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(await _wmsmaterialstockRepository.GetAsync(id)); + } + + /// <inheritdoc /> + public virtual async Task<PagedResultDto<WmsMaterialStockDto>> GetListAsync(GetWmsMaterialStocksInput input) + { + Check.NotNull(input, nameof(input)); + + if (input.Sorting.IsNullOrWhiteSpace()) + { + input.Sorting = nameof(WmsMaterialStock.Sort); + } + + var specification = new WmsMaterialStockSpecification(input.Name); + var stock = ObjectMapper.Map<GetWmsMaterialStocksInput, WmsMaterialStock>(input); + var count = await _wmsmaterialstockRepository.GetCountAsync(stock, input.StartTime, input.EndTime, input.Filter, specification); + var list = await _wmsmaterialstockRepository.GetListAsync(stock, input.StartTime, input.EndTime, input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification); + + return new PagedResultDto<WmsMaterialStockDto>(count, ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(list)); + } + + /// <inheritdoc /> + public virtual async Task<WmsMaterialStockDto> CreateAsync(WmsMaterialStockCreateDto input) + { + await CheckCreateOrUpdateDtoAsync(input); + + var exist = await _wmsmaterialstockRepository.NameExistAsync(input.MaterialNo); + if (exist) + { + throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialNo]); + } + + var maxSort = await _wmsmaterialstockRepository.GetMaxSortAsync(); + var sort = input.Sort ?? maxSort; + var wmsmaterialstock = ObjectMapper.Map<WmsMaterialStockCreateDto, WmsMaterialStock>(input); + input.MapExtraPropertiesTo(wmsmaterialstock, MappingPropertyDefinitionChecks.None); + wmsmaterialstock.Sort = sort; + wmsmaterialstock.InStockTime = DateTime.Now; + await _wmsmaterialstockRepository.InsertAsync(wmsmaterialstock); + + if (input.Sort.HasValue && wmsmaterialstock.Sort != maxSort) + { + await AdjustSortAsync(wmsmaterialstock.Id, wmsmaterialstock.Sort); + } + + return ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(wmsmaterialstock); + } + + /// <inheritdoc /> + public virtual async Task<WmsMaterialStockDto> UpdateAsync(Guid id, WmsMaterialStockUpdateDto input) + { + await CheckCreateOrUpdateDtoAsync(input); + + var wmsmaterialstock = await _wmsmaterialstockRepository.GetAsync(id); + var exist = await _wmsmaterialstockRepository.NameExistAsync(input.MaterialNo, wmsmaterialstock.Id); + if (exist) + { + throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialNo]); + } + + wmsmaterialstock.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + input.MapExtraPropertiesTo(wmsmaterialstock, MappingPropertyDefinitionChecks.None); + + wmsmaterialstock.MaterialNo = input.MaterialNo; + wmsmaterialstock.MaterialName = input.MaterialName; + wmsmaterialstock.ContainerNo = input.ContainerNo; + wmsmaterialstock.ContainerStatus = input.ContainerStatus; + wmsmaterialstock.ContainerType = input.ContainerType; + wmsmaterialstock.StockNumber = input.StockNumber; + wmsmaterialstock.MaterialBatch = input.MaterialBatch; + wmsmaterialstock.SupplierCode = input.SupplierCode; + wmsmaterialstock.MaterialModel = input.MaterialModel; + wmsmaterialstock.PlaceNo = input.PlaceNo; + wmsmaterialstock.PlaceStatus = input.PlaceStatus; + wmsmaterialstock.StorageTypeNo = input.StorageTypeNo; + wmsmaterialstock.AreaCode = input.AreaCode; + wmsmaterialstock.AreaName = input.AreaName; + wmsmaterialstock.IsLock = input.IsLock; + wmsmaterialstock.InStockTime = input.InStockTime; + wmsmaterialstock.Remark = input.Remark; + + await _wmsmaterialstockRepository.UpdateAsync(wmsmaterialstock); + + return ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(wmsmaterialstock); + } + + /// <inheritdoc /> + public async Task<List<WmsMaterialStockDto>> CloneAsync(IEnumerable<Guid> ids) + { + var wmsmaterialstocks = new List<WmsMaterialStock>(); + if (ids != null) + { + var sort = await _wmsmaterialstockRepository.GetMaxSortAsync(); + foreach (var id in ids) + { + var wmsmaterialstock = await _wmsmaterialstockRepository.FindAsync(id); + if (wmsmaterialstock != null) + { + var name = wmsmaterialstock.MaterialNo + WmsMaterialStockConsts.CloneTag; + var notExist = false; + while (!notExist) + { + var exist = await _wmsmaterialstockRepository.NameExistAsync(name); + if (exist || wmsmaterialstocks.Any(x => x.MaterialNo == name)) + { + name += WmsMaterialStockConsts.CloneTag; + continue; + } + + notExist = true; + } + + //wmsmaterialstock = await _wmsmaterialstockRepository.InsertAsync(wmsmaterialstock.Clone(GuidGenerator.Create(), name, sort++)); + wmsmaterialstocks.Add(wmsmaterialstock); + } + } + } + + return ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(wmsmaterialstocks); + } + + /// <inheritdoc /> + public virtual Task DeleteAsync(Guid id) + { + return _wmsmaterialstockRepository.DeleteAsync(id); + } + + /// <inheritdoc /> + public async Task DeleteManyAsync(IEnumerable<Guid> ids) + { + foreach (var id in ids) + { + await DeleteAsync(id); + } + } + + /// <inheritdoc /> + public virtual async Task AdjustSortAsync(Guid id, int sort) + { + var list = await _wmsmaterialstockRepository.GetListAsync(null, null, null, nameof(WmsMaterialStock.Sort)); + if (list != null && list.Any()) + { + var initSort = 1; + list.ForEach(x => x.AdjustSort(initSort++)); + var entity = list.FirstOrDefault(x => x.Id == id); + if (entity != null) + { + if (sort == 1) + { + list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); + } + else if (entity.Sort > sort) + { + list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); + list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); + } + else if (entity.Sort < sort) + { + list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); + list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); + } + + entity.AdjustSort(sort); + } + } + + await _wmsmaterialstockRepository.UpdateManyAsync(list); + } + + /// <inheritdoc /> + public async Task ImportAsync(WmsMaterialStocksImportModel input) + { + Check.NotNull(input, nameof(input)); + + var wmsmaterialstockCreateDtos = new List<(int RowIndex, WmsMaterialStockCreateDto Item)>(); + var wmsmaterialstockUpdateDtos = new List<(int RowIndex, Guid Id, WmsMaterialStockUpdateDto Item)>(); + var wmsmaterialstocks = input.WmsMaterialStocks; + + if (wmsmaterialstocks != null && wmsmaterialstocks.Any()) + { + #region 瀵煎叆鏍¢獙 + + // 鍒ゆ柇鍚嶇О鏄惁閲嶅锛屽苟杈撳嚭绗嚑琛岄噸澶� + var duplicateWmsMaterialStocks = wmsmaterialstocks.GroupBy(x => x.MaterialNo).Where(x => x.Count() > 1).ToList(); + if (duplicateWmsMaterialStocks?.Any() == true) + { + var duplicateWmsMaterialStockMsgs = duplicateWmsMaterialStocks.Select(x => $"绗� {string.Join(",", x.Select(x => x.RowIndex))} 琛岋細{x.Key} 鍚嶇О閲嶅"); + var errorMsg = $"瀵煎叆澶辫触锛侀厤缃紝 {string.Join(",", duplicateWmsMaterialStockMsgs)}锛岀粓姝㈠鍏�"; + throw new UserFriendlyException(errorMsg); + } + + #endregion + + foreach (var wmsmaterialstock in wmsmaterialstocks) + { + if (wmsmaterialstock.MaterialNo.IsNullOrWhiteSpace() && wmsmaterialstock.MaterialNo.IsNullOrWhiteSpace()) + { + continue; + } + + if (wmsmaterialstock.MaterialNo.IsNullOrWhiteSpace()) + { + var errorMsg = $"瀵煎叆澶辫触锛侀厤缃紝绗瑊wmsmaterialstock.RowIndex}琛岋細WmsMaterialStock鍚嶇О涓嶈兘涓虹┖"; + throw new UserFriendlyException(errorMsg); + } + + var oldWmsMaterialStock = await _wmsmaterialstockRepository.FindByNameAsync(wmsmaterialstock.MaterialNo); + if (oldWmsMaterialStock != null) + { + var wmsMaterialStockUpdateDto = new WmsMaterialStockUpdateDto + { + // 鍩虹淇℃伅 + MaterialNo = wmsmaterialstock.MaterialNo, + MaterialName = wmsmaterialstock.MaterialName, + Remark = wmsmaterialstock.Remark, + + // 瀹瑰櫒淇℃伅 + ContainerNo = wmsmaterialstock.ContainerNo, + ContainerStatus = wmsmaterialstock.ContainerStatus, + ContainerType = wmsmaterialstock.ContainerType, + + // 搴撳瓨淇℃伅 + StockNumber = wmsmaterialstock.StockNumber, + MaterialBatch = wmsmaterialstock.MaterialBatch, + + // 渚涘簲鍟嗕俊鎭� + SupplierCode = wmsmaterialstock.SupplierCode, + MaterialModel = wmsmaterialstock.MaterialModel, + + // 搴撲綅淇℃伅 + PlaceNo = wmsmaterialstock.PlaceNo, + PlaceStatus = wmsmaterialstock.PlaceStatus, + StorageTypeNo = wmsmaterialstock.StorageTypeNo, + + // 搴撳尯淇℃伅 + AreaCode = wmsmaterialstock.AreaCode, + AreaName = wmsmaterialstock.AreaName, + + // 鐘舵�佷俊鎭� + IsLock = wmsmaterialstock.IsLock, + InStockTime = wmsmaterialstock.InStockTime, + + // 骞跺彂鎺у埗 + ConcurrencyStamp = oldWmsMaterialStock.ConcurrencyStamp + }; + + wmsmaterialstockUpdateDtos.Add((wmsmaterialstock.RowIndex, oldWmsMaterialStock.Id, wmsMaterialStockUpdateDto)); + } + else + { + var wmsmaterialstockCreateDto = new WmsMaterialStockCreateDto + { + // 鍩虹淇℃伅 + MaterialNo = wmsmaterialstock.MaterialNo, + MaterialName = wmsmaterialstock.MaterialName, + Remark = wmsmaterialstock.Remark, + + // 瀹瑰櫒淇℃伅 + ContainerNo = wmsmaterialstock.ContainerNo, + ContainerStatus = wmsmaterialstock.ContainerStatus, + ContainerType = wmsmaterialstock.ContainerType, + + // 搴撳瓨淇℃伅 + StockNumber = wmsmaterialstock.StockNumber, + MaterialBatch = wmsmaterialstock.MaterialBatch, + + // 渚涘簲鍟嗕俊鎭� + SupplierCode = wmsmaterialstock.SupplierCode, + MaterialModel = wmsmaterialstock.MaterialModel, + + // 搴撲綅淇℃伅 + PlaceNo = wmsmaterialstock.PlaceNo, + PlaceStatus = wmsmaterialstock.PlaceStatus, + StorageTypeNo = wmsmaterialstock.StorageTypeNo, + + // 搴撳尯淇℃伅 + AreaCode = wmsmaterialstock.AreaCode, + AreaName = wmsmaterialstock.AreaName, + + // 鐘舵�佷俊鎭� + IsLock = wmsmaterialstock.IsLock, + InStockTime = wmsmaterialstock.InStockTime, + }; + + wmsmaterialstockCreateDtos.Add((wmsmaterialstock.RowIndex, wmsmaterialstockCreateDto)); + } + } + } + + // 鏂板 + foreach (var wmsmaterialstockDto in wmsmaterialstockCreateDtos) + { + try + { + await CreateAsync(wmsmaterialstockDto.Item); + } + catch (Exception e) + { + var errorMsg = $"瀵煎叆澶辫触锛侀厤缃紝绗瑊wmsmaterialstockDto.RowIndex}琛岋細{e.Message}锛岀粓姝㈠鍏�"; + throw new UserFriendlyException(errorMsg); + } + } + + // 鏇存柊 + foreach (var wmsmaterialstockDto in wmsmaterialstockUpdateDtos) + { + try + { + await UpdateAsync(wmsmaterialstockDto.Id, wmsmaterialstockDto.Item); + } + catch (Exception e) + { + var errorMsg = $"瀵煎叆澶辫触锛侀厤缃紝绗瑊wmsmaterialstockDto.RowIndex}琛岋細{e.Message}锛岀粓姝㈠鍏�"; + throw new UserFriendlyException(errorMsg); + } + } + } + + /// <inheritdoc /> + public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialStocksInput input) + { + Check.NotNull(input, nameof(input)); + + if (input.Sorting.IsNullOrWhiteSpace()) + { + input.Sorting = nameof(WmsMaterialStock.Sort); + } + + var specification = new WmsMaterialStockSpecification(input.Name); + var stock = ObjectMapper.Map<GetWmsMaterialStocksInput, WmsMaterialStock>(input); + var list = await _wmsmaterialstockRepository.GetListAsync(stock, input.StartTime, input.EndTime, input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification, includeDetails: true); + var result = ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(list); + + var sheets = new Dictionary<string, object> + { + ["閰嶇疆"] = ExportHelper.ConvertListToExportData(result), + }; + + var fileName = result.Count > 1 ? "WmsMaterialStock鍒楄〃" : result.Count == 1 ? result.First()?.MaterialNo : "WmsMaterialStock妯$増"; + return (sheets, fileName); + } + + /// <summary> + /// Checks the create or update dto asynchronous. + /// </summary> + /// <param name="input">The input.</param> + protected Task CheckCreateOrUpdateDtoAsync(WmsMaterialStockCreateOrUpdateDtoBase input) + { + Check.NotNull(input, nameof(input)); + Check.NotNullOrWhiteSpace(input.MaterialNo, "缂栧彿", WmsMaterialStockConsts.MaxCodeLength); + Check.NotNullOrWhiteSpace(input.MaterialName, "鍚嶇О", WmsMaterialStockConsts.MaxNameLength); + Check.Length(input.Remark, "澶囨敞", WmsMaterialStockConsts.MaxRemarkLength); + return Task.CompletedTask; + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/MapperProfiles/WmsMaterialStockAutoMapperProfile.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/MapperProfiles/WmsMaterialStockAutoMapperProfile.cs new file mode 100644 index 0000000..8973ba8 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/MapperProfiles/WmsMaterialStockAutoMapperProfile.cs @@ -0,0 +1,28 @@ +using AutoMapper; +using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterials; +using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; +using CMS.Plugin.HIAWms.Domain.WmsMaterials; +using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; +using Volo.Abp.ObjectExtending; + +namespace CMS.Plugin.HIAWms.Application.MapperProfiles; + +/// <summary> +/// AutoMapper閰嶇疆 +/// </summary> +/// <seealso cref="AutoMapper.Profile" /> +public class WmsMaterialStockAutoMapperProfile : Profile +{ + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockAutoMapperProfile"/> class. + /// </summary> + public WmsMaterialStockAutoMapperProfile() + { + /* You can configure your AutoMapper mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple profile classes for a better organization. */ + CreateMap<WmsMaterialStock, WmsMaterialStockDto>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None); + CreateMap<WmsMaterialStockCreateDto, WmsMaterialStock>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None); + CreateMap<GetWmsMaterialStocksInput, WmsMaterialStock>(MemberList.None).MapExtraProperties(MappingPropertyDefinitionChecks.None); + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockConsts.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockConsts.cs new file mode 100644 index 0000000..fb9a534 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockConsts.cs @@ -0,0 +1,12 @@ +namespace CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock甯搁噺瀹氫箟 +/// </summary> +public static class WmsMaterialStockConsts +{ + public const string CloneTag = "_鍓湰"; + public static int MaxCodeLength { get; set; } = 64; + public static int MaxNameLength { get; set; } = 64; + public static int MaxRemarkLength { get; set; } = 256; +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockEto.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockEto.cs new file mode 100644 index 0000000..d9afcdb --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/WmsMaterialStocks/WmsMaterialStockEto.cs @@ -0,0 +1,22 @@ +namespace CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock浜嬩欢鍙傛暟瀵硅薄 +/// </summary> +[Serializable] +public class WmsMaterialStockEto +{ + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockEto"/> class. + /// </summary> + /// <param name="name">The name.</param> + public WmsMaterialStockEto(string name) + { + Name = name; + } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/EventHandlers/WmsMaterialStockEventHandler.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/EventHandlers/WmsMaterialStockEventHandler.cs new file mode 100644 index 0000000..5c7524b --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/EventHandlers/WmsMaterialStockEventHandler.cs @@ -0,0 +1,17 @@ +using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace CMS.Plugin.HIAWms.Domain.EventHandlers; + +/// <summary> +/// WmsMaterialStock浜嬩欢澶勭悊绋嬪簭 +/// </summary> +public class WmsMaterialStockEventHandler : IDistributedEventHandler<WmsMaterialStockEto>, ITransientDependency +{ + /// <inheritdoc /> + public Task HandleEventAsync(WmsMaterialStockEto eventData) + { + return Task.CompletedTask; + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs new file mode 100644 index 0000000..6160a0e --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs @@ -0,0 +1,54 @@ +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Specifications; + +namespace CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; + +/// <summary> +/// WmsMaterialStock浠撳偍 +/// </summary> +public interface IWmsMaterialStockRepository : IBasicRepository<WmsMaterialStock, Guid> +{ + /// <summary> + /// Finds the by name asynchronous. + /// </summary> + /// <param name="name">The name.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns></returns> + Task<WmsMaterialStock> FindByNameAsync(string name, CancellationToken cancellationToken = default); + + /// <summary> + /// Names the exist asynchronous. + /// </summary> + /// <param name="name">The name.</param> + /// <param name="id">The identifier.</param> + /// <returns></returns> + Task<bool> NameExistAsync(string name, Guid? id = null); + + /// <summary> + /// Gets the maximum sort asynchronous. + /// </summary> + /// <returns></returns> + Task<int> GetMaxSortAsync(); + + /// <summary> + /// Gets the list asynchronous. + /// </summary> + /// <param name="sorting">The sorting.</param> + /// <param name="maxResultCount">The maximum result count.</param> + /// <param name="skipCount">The skip count.</param> + /// <param name="filter">The filter.</param> + /// <param name="specification">The specification.</param> + /// <param name="includeDetails">if set to <c>true</c> [include details].</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns></returns> + Task<List<WmsMaterialStock>> GetListAsync(WmsMaterialStock? stock, DateTime? startTime = null, DateTime? endTime = null, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, string filter = null, Specification<WmsMaterialStock> specification = null, bool includeDetails = false, CancellationToken cancellationToken = default); + + /// <summary> + /// Gets the count asynchronous. + /// </summary> + /// <param name="filter">The filter.</param> + /// <param name="specification">The specification.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns></returns> + Task<long> GetCountAsync(WmsMaterialStock? stock, DateTime? startTime = null, DateTime? endTime = null, string filter = null, Specification<WmsMaterialStock> specification = null, CancellationToken cancellationToken = default); +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStock.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStock.cs new file mode 100644 index 0000000..1b3279e --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStock.cs @@ -0,0 +1,128 @@ +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace CMS.Plugin.HIAWms.Domain.WmsMaterialStocks +{ + /// <summary> + /// WmsMaterialStock + /// </summary> + public class WmsMaterialStock : FullAuditedAggregateRoot<Guid> + { + /// <summary> + /// 鐗╂枡缂栧彿 + /// </summary> + public virtual string MaterialId { get; set; } + + /// <summary> + /// 鐗╂枡鍚嶇О + /// </summary> + public virtual string MaterialName { get; set; } + + /// <summary> + /// 瀹瑰櫒缂栧彿 + /// </summary> + public string ContainerNo { get; set; } + + /// <summary> + /// 瀹瑰櫒鐘舵�� + /// </summary> + public ContainerStatusEnum ContainerStatus { get; set; } + + /// <summary> + /// 瀹瑰櫒绫诲瀷 + /// </summary> + public ContainerTypeEnum ContainerType { get; set; } + + /// <summary> + /// 鐗╂枡缂栧彿 + /// </summary> + public string MaterialNo { get; set; } + + /// <summary> + /// 搴撳瓨鏁伴噺 + /// </summary> + public int StockNumber { get; set; } + + /// <summary> + /// 鐗╂枡鎵规 + /// </summary> + public string MaterialBatch { get; set; } + + /// <summary> + /// 渚涘簲鍟嗙紪鍙� + /// </summary> + public string SupplierCode { get; set; } + + /// <summary> + /// 鍨嬪彿 + /// </summary> + public string MaterialModel { get; set; } + + /// <summary> + /// 搴撲綅缂栧彿 + /// </summary> + public string PlaceNo { get; set; } + + /// <summary> + /// 搴撲綅鐘舵�� + /// </summary> + public PlaceStatusEnum PlaceStatus { get; set; } + + /// <summary> + /// 搴撲綅绫诲瀷缂栧彿 + /// </summary> + public PlaceTypeEnum StorageTypeNo { get; set; } + + /// <summary> + /// 鍖哄煙缂栧彿 + /// </summary> + public string AreaCode { get; set; } + + /// <summary> + /// 搴撳尯鍚嶇О + /// </summary> + public string AreaName { get; set; } + + /// <summary> + /// 鏄惁閿佸畾 + /// </summary> + public int IsLock { get; set; } + + /// <summary> + /// 鏄惁绌烘墭 + /// </summary> + public YesNoEnum EmptyContainer { get; protected set; } + + /// <summary> + /// 鍏ュ簱鏃堕棿 + /// </summary> + public DateTime? InStockTime { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public virtual int Sort { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string Remark { get; set; } + + /// <summary> + /// 鏄惁绂佺敤 + /// </summary> + public virtual bool? IsDisabled { get; protected set; } + + /// <summary> + /// Adjusts the sort. + /// </summary> + /// <param name="sort">The sort.</param> + public void AdjustSort(int sort) + { + Sort = sort; + } + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockDataSeedContributor.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockDataSeedContributor.cs new file mode 100644 index 0000000..a56c283 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockDataSeedContributor.cs @@ -0,0 +1,79 @@ +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.Uow; + +namespace CMS.Plugin.HIAWms.Domain.WmsMaterialStocks +{ + /// <summary> + /// WmsMaterialStock绉嶅瓙鏁版嵁鎻愪緵绋嬪簭 + /// </summary> + public class WmsMaterialStockDataSeedContributor : IDataSeedContributor, ITransientDependency + { + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IWmsMaterialStockRepository _wmsmaterialstockRepository; + private readonly IGuidGenerator _guidGenerator; + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockDataSeedContributor"/> class. + /// </summary> + /// <param name="unitOfWorkManager">The unit of work manager.</param> + /// <param name="guidGenerator">The unique identifier generator.</param> + /// <param name="wmsmaterialstockRepository">The work section repository.</param> + public WmsMaterialStockDataSeedContributor(IUnitOfWorkManager unitOfWorkManager, IGuidGenerator guidGenerator, IWmsMaterialStockRepository wmsmaterialstockRepository) + { + _unitOfWorkManager = unitOfWorkManager; + _wmsmaterialstockRepository = wmsmaterialstockRepository; + _guidGenerator = guidGenerator; + } + + /// <inheritdoc /> + public async Task SeedAsync(DataSeedContext context) + { + if (context.Properties.ContainsKey(CMSPluginDbProperties.ConnectionStringName) && context.Properties[CMSPluginDbProperties.ConnectionStringName]?.ToString() == CMSPluginDbProperties.ConnectionStringName) + { + try + { + //using var unitofWork = _unitOfWorkManager.Begin(requiresNew: true); + //await unitofWork.SaveChangesAsync(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + + if (context.Properties.ContainsKey("SeedTestData") && context.Properties["SeedTestData"]?.ToString() == "SeedTestData") + { + try + { + await SeedWmsMaterialStockDataAsync(); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + + /// <summary> + /// Seeds the work section data asynchronous. + /// </summary> + private async Task SeedWmsMaterialStockDataAsync() + { + using var unitofWork = _unitOfWorkManager.Begin(requiresNew: true); + if (await _wmsmaterialstockRepository.GetCountAsync() == 0) + { + var WmsMaterialStocks = new List<WmsMaterialStock>(); + for (int i = 1; i <= 80; i++) + { + var wmsmaterialstock = new WmsMaterialStock(_guidGenerator.Create(), $"WmsMaterialStock_Code{i}", $"WmsMaterialStock_Name{i}", i, $"WmsMaterialStock_Remark{i}"); + WmsMaterialStocks.Add(wmsmaterialstock); + } + + await _wmsmaterialstockRepository.InsertManyAsync(WmsMaterialStocks); + await unitofWork.SaveChangesAsync(); + } + } + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockSpecification.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockSpecification.cs new file mode 100644 index 0000000..af277b7 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/WmsMaterialStockSpecification.cs @@ -0,0 +1,41 @@ +using System.Linq.Expressions; + +namespace CMS.Plugin.HIAWms.Domain.WmsMaterialStocks +{ + /// <summary> + /// WmsMaterialStock瑙勭害 + /// </summary> + public class WmsMaterialStockSpecification : Volo.Abp.Specifications.Specification<WmsMaterialStock> + { + private readonly string _materialName; + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockSpecification"/> class. + /// </summary> + public WmsMaterialStockSpecification() + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockSpecification"/> class. + /// </summary> + /// <param name="materialName">The name.</param> + public WmsMaterialStockSpecification(string materialName = null) + { + _materialName = materialName; + } + + /// <inheritdoc /> + public override Expression<Func<WmsMaterialStock, bool>> ToExpression() + { + Expression<Func<WmsMaterialStock, bool>> expression = c => 1 == 1; + + if (_materialName != null) + { + expression = expression.And(c => c.MaterialNo == _materialName); + } + + return expression; + } + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Extensions/CMSPluginEfCoreExtensions.WmsMaterialStock.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Extensions/CMSPluginEfCoreExtensions.WmsMaterialStock.cs new file mode 100644 index 0000000..d178432 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Extensions/CMSPluginEfCoreExtensions.WmsMaterialStock.cs @@ -0,0 +1,141 @@ +using CMS.Plugin.HIAWms.Domain; +using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; +using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace CMS.Plugin.HIAWms.EntityFrameworkCore.Extensions; + +/// <summary> +/// EfCore鎵╁睍 +/// </summary> +public static partial class CMSPluginEfCoreExtensions +{ + /// <summary> + /// Includes the details. + /// </summary> + /// <param name="queryable">The queryable.</param> + /// <param name="include">if set to <c>true</c> [include].</param> + /// <returns></returns> + public static IQueryable<WmsMaterialStock> IncludeDetails(this IQueryable<WmsMaterialStock> queryable, bool include = true) + { + if (!include) + { + return queryable; + } + + return queryable; + } + + /// <summary> + /// Configures the wmsmaterialstock. + /// </summary> + /// <param name="builder">The builder.</param> + public static void ConfigureWmsMaterialStock(this ModelBuilder builder) + { + Check.NotNull(builder, nameof(builder)); + + builder.Entity<WmsMaterialStock>(b => + { + // 閰嶇疆琛ㄥ拰鏋舵瀯鍚嶇О + b.ToTable((CMSPluginDbProperties.DbTablePrefix + "_WmsMaterialStocks").ToLower(), + CMSPluginDbProperties.DbSchema) + .HasComment("WMS鐗╂枡搴撳瓨琛�"); + + b.ConfigureByConvention(); + + // 涓婚敭閰嶇疆 + b.HasKey(x => x.Id); + + // 灞炴�ч厤缃� + b.Property(x => x.MaterialId) + .HasMaxLength(64) + .IsRequired() + .HasComment("鐗╂枡ID"); + + b.Property(x => x.MaterialName) + .HasMaxLength(128) + .IsRequired() + .HasComment("鐗╂枡鍚嶇О"); + + b.Property(x => x.ContainerNo) + .HasMaxLength(64) + .HasComment("瀹瑰櫒缂栧彿"); + + b.Property(x => x.ContainerStatus) + .HasComment("瀹瑰櫒鐘舵��"); + + b.Property(x => x.ContainerType) + .HasComment("瀹瑰櫒绫诲瀷"); + + b.Property(x => x.MaterialNo) + .HasMaxLength(64) + .IsRequired() + .HasComment("鐗╂枡缂栧彿"); + + b.Property(x => x.StockNumber) + .HasComment("搴撳瓨鏁伴噺"); + + b.Property(x => x.MaterialBatch) + .HasMaxLength(64) + .HasComment("鐗╂枡鎵规"); + + b.Property(x => x.SupplierCode) + .HasMaxLength(64) + .HasComment("渚涘簲鍟嗙紪鍙�"); + + b.Property(x => x.MaterialModel) + .HasMaxLength(128) + .HasComment("鏈哄瀷/瑙勬牸"); + + b.Property(x => x.PlaceNo) + .HasMaxLength(64) + .HasComment("搴撲綅缂栧彿"); + + b.Property(x => x.PlaceStatus) + .HasComment("搴撲綅鐘舵��;"); + + b.Property(x => x.StorageTypeNo) + .HasComment("搴撲綅绫诲瀷"); + + b.Property(x => x.AreaCode) + .HasMaxLength(64) + .HasComment("鍖哄煙缂栧彿"); + + b.Property(x => x.AreaName) + .HasMaxLength(128) + .HasComment("搴撳尯鍚嶇О"); + + b.Property(x => x.IsLock) + .HasComment("鏄惁閿佸畾(2:鏈攣瀹�,1:宸查攣瀹�)"); + b.Property(x => x.EmptyContainer) + .HasComment("鏄惁绌烘墭(2:鍚�,1:鏄�)"); + + b.Property(x => x.InStockTime) + .HasComment("鍏ュ簱鏃堕棿"); + + b.Property(x => x.Sort) + .HasDefaultValue(0) + .HasComment("鎺掑簭"); + + b.Property(x => x.Remark) + .HasMaxLength(500) + .HasComment("澶囨敞"); + + b.Property(x => x.IsDisabled) + .HasComment("鏄惁绂佺敤"); + + // 绱㈠紩閰嶇疆 + b.HasIndex(x => x.MaterialNo).IsUnique(); + b.HasIndex(x => x.MaterialName); + b.HasIndex(x => x.ContainerNo); + b.HasIndex(x => x.PlaceNo); + b.HasIndex(x => x.AreaCode); + b.HasIndex(x => new { x.MaterialBatch, x.SupplierCode }); + + // 鎵╁睍灞炴�ч厤缃� + b.ApplyObjectExtensionMappings(); + }); + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs new file mode 100644 index 0000000..4e491d3 --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs @@ -0,0 +1,119 @@ +using System.Linq.Dynamic.Core; +using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; +using CMS.Plugin.HIAWms.EntityFrameworkCore.Extensions; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Specifications; + +namespace CMS.Plugin.HIAWms.EntityFrameworkCore.Repositories; + +/// <inheritdoc /> +public class EfCoreWmsMaterialStockRepository : EfCoreRepository<ICMSPluginDbContext, WmsMaterialStock, Guid>, IWmsMaterialStockRepository +{ + /// <summary> + /// Initializes a new instance of the <see cref="EfCoreWmsMaterialStockRepository"/> class. + /// </summary> + /// <param name="dbContextProvider">The database context provider.</param> + public EfCoreWmsMaterialStockRepository(IDbContextProvider<ICMSPluginDbContext> dbContextProvider) + : base(dbContextProvider) + { + } + + /// <inheritdoc /> + public virtual async Task<WmsMaterialStock> FindByNameAsync(string materialNo, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .IncludeDetails() + .OrderBy(t => t.Sort) + .FirstOrDefaultAsync(t => t.MaterialNo == materialNo, GetCancellationToken(cancellationToken)); + } + + /// <inheritdoc /> + public async Task<bool> NameExistAsync(string materialNo, Guid? id = null) + { + return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).AnyAsync(x => x.MaterialNo == materialNo); + } + + /// <inheritdoc /> + public async Task<int> GetMaxSortAsync() + { + var hasAny = await (await GetQueryableAsync()).AnyAsync(); + if (!hasAny) + { + return 1; + } + + var sort = await (await GetQueryableAsync()).MaxAsync(x => x.Sort); + return sort + 1; + } + + /// <inheritdoc /> + public async Task<List<WmsMaterialStock>> GetListAsync(WmsMaterialStock? stock, DateTime? startTime = null, DateTime? endTime = null, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, string filter = null, Specification<WmsMaterialStock> specification = null, bool includeDetails = false, CancellationToken cancellationToken = default) + { + specification ??= new WmsMaterialStockSpecification(); + return await (await GetDbSetAsync()) + .IncludeDetails(includeDetails) + .WhereIf(!filter.IsNullOrWhiteSpace(), + u => u.MaterialNo.Contains(filter) || + u.MaterialName.Contains(filter) || + u.MaterialBatch.Contains(filter) || + u.PlaceNo.Contains(filter) || + u.AreaName.Contains(filter)) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialNo), u => u.MaterialNo.Contains(stock.MaterialNo)) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialName), u => u.MaterialName.Contains(stock.MaterialName)) + .WhereIf(!string.IsNullOrEmpty(stock?.ContainerNo), u => u.ContainerNo == stock.ContainerNo) + .WhereIf(stock?.ContainerStatus > 0, u => u.ContainerStatus == stock.ContainerStatus) + .WhereIf(stock?.ContainerType > 0, u => u.ContainerType == stock.ContainerType) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialBatch), u => u.MaterialBatch == stock.MaterialBatch) + .WhereIf(!string.IsNullOrEmpty(stock?.SupplierCode), u => u.SupplierCode == stock.SupplierCode) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialModel), u => u.MaterialModel.Contains(stock.MaterialModel)) + .WhereIf(!string.IsNullOrEmpty(stock?.PlaceNo), u => u.PlaceNo == stock.PlaceNo) + .WhereIf(stock.PlaceStatus > 0, u => u.PlaceStatus == stock.PlaceStatus) + .WhereIf(stock?.StorageTypeNo > 0, u => u.StorageTypeNo == stock.StorageTypeNo) + .WhereIf(!string.IsNullOrEmpty(stock?.AreaCode), u => u.AreaCode == stock.AreaCode) + .WhereIf(!string.IsNullOrEmpty(stock?.AreaName), u => u.AreaName.Contains(stock.AreaName)) + .WhereIf(stock.IsLock > 0, u => u.IsLock == stock.IsLock) + .WhereIf(startTime.HasValue, u => u.InStockTime >= startTime.Value) + .WhereIf(endTime.HasValue, u => u.InStockTime <= endTime.Value) + .OrderBy(sorting.IsNullOrEmpty() ? nameof(WmsMaterialStock.Sort) : sorting) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + /// <inheritdoc /> + public async Task<long> GetCountAsync(WmsMaterialStock? stock, DateTime? startTime = null, DateTime? endTime = null, string filter = null, Specification<WmsMaterialStock> specification = null, CancellationToken cancellationToken = default) + { + specification ??= new WmsMaterialStockSpecification(); + return await (await GetQueryableAsync()) + .WhereIf(!filter.IsNullOrWhiteSpace(), + u => u.MaterialNo.Contains(filter) || + u.MaterialName.Contains(filter) || + u.MaterialBatch.Contains(filter) || + u.PlaceNo.Contains(filter) || + u.AreaName.Contains(filter)) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialNo), u => u.MaterialNo.Contains(stock.MaterialNo)) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialName), u => u.MaterialName.Contains(stock.MaterialName)) + .WhereIf(!string.IsNullOrEmpty(stock?.ContainerNo), u => u.ContainerNo == stock.ContainerNo) + .WhereIf(stock?.ContainerStatus > 0, u => u.ContainerStatus == stock.ContainerStatus) + .WhereIf(stock?.ContainerType > 0, u => u.ContainerType == stock.ContainerType) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialBatch), u => u.MaterialBatch == stock.MaterialBatch) + .WhereIf(!string.IsNullOrEmpty(stock?.SupplierCode), u => u.SupplierCode == stock.SupplierCode) + .WhereIf(!string.IsNullOrEmpty(stock?.MaterialModel), u => u.MaterialModel.Contains(stock.MaterialModel)) + .WhereIf(!string.IsNullOrEmpty(stock?.PlaceNo), u => u.PlaceNo == stock.PlaceNo) + .WhereIf(stock.PlaceStatus > 0, u => u.PlaceStatus == stock.PlaceStatus) + .WhereIf(stock?.StorageTypeNo > 0, u => u.StorageTypeNo == stock.StorageTypeNo) + .WhereIf(!string.IsNullOrEmpty(stock?.AreaCode), u => u.AreaCode == stock.AreaCode) + .WhereIf(!string.IsNullOrEmpty(stock?.AreaName), u => u.AreaName.Contains(stock.AreaName)) + .WhereIf(stock.IsLock > 0, u => u.IsLock == stock.IsLock) + .WhereIf(startTime.HasValue, u => u.InStockTime >= startTime.Value) + .WhereIf(endTime.HasValue, u => u.InStockTime <= endTime.Value) + .CountAsync(cancellationToken: GetCancellationToken(cancellationToken)); + } + + /// <inheritdoc /> + public override async Task<IQueryable<WmsMaterialStock>> WithDetailsAsync() + { + return (await GetQueryableAsync()).IncludeDetails(); + } +} diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.MySQL/CMSPluginDbContext.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.MySQL/CMSPluginDbContext.cs index bd06548..69c16c1 100644 --- a/HIAWms/server/src/CMS.Plugin.HIAWms.MySQL/CMSPluginDbContext.cs +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.MySQL/CMSPluginDbContext.cs @@ -37,6 +37,7 @@ builder.ConfigureWmsArea(); builder.ConfigureWmsPlace(); builder.ConfigureWmsMaterial(); + builder.ConfigureWmsMaterialStock(); /* Configure your own tables/entities inside here */ diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.PostgreSql/CMSPluginDbContext.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.PostgreSql/CMSPluginDbContext.cs index 5ba375d..de77d36 100644 --- a/HIAWms/server/src/CMS.Plugin.HIAWms.PostgreSql/CMSPluginDbContext.cs +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.PostgreSql/CMSPluginDbContext.cs @@ -37,6 +37,7 @@ builder.ConfigureWmsArea(); builder.ConfigureWmsPlace(); builder.ConfigureWmsMaterial(); + builder.ConfigureWmsMaterialStock(); /* Configure your own tables/entities inside here */ //builder.Entity<YourEntity>(b => diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.SqlServer/CMSPluginDbContext.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.SqlServer/CMSPluginDbContext.cs index 5c9a9e7..7a4e331 100644 --- a/HIAWms/server/src/CMS.Plugin.HIAWms.SqlServer/CMSPluginDbContext.cs +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.SqlServer/CMSPluginDbContext.cs @@ -37,6 +37,7 @@ builder.ConfigureWmsArea(); builder.ConfigureWmsPlace(); builder.ConfigureWmsMaterial(); + builder.ConfigureWmsMaterialStock(); /* Configure your own tables/entities inside here */ diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs new file mode 100644 index 0000000..bcefdbb --- /dev/null +++ b/HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs @@ -0,0 +1,187 @@ +using Ao.Lang; +using CMS.Extensions.Abp.AspNetCore.Mvc.Filters; +using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; +using CMS.Plugin.HIAWms.Application.Contracts.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using MiniExcelLibs; +using System.Reflection; +using Volo.Abp; +using Volo.Abp.Application.Dtos; + +namespace CMS.Plugin.HIAWms.Controller +{ + /// <summary> + /// WmsMaterialStock鏈嶅姟 + /// </summary> + [ApiController] + [TypeFilter(typeof(CMSLanguageFilter))] + [TypeFilter(typeof(CMSUowActionFilter))] + [TypeFilter(typeof(CMSAuditActionFilter))] + [TypeFilter(typeof(CMSExceptionFilter))] + [Route("api/v{version:apiVersion}/HIAWms/[controller]")] + public class WmsMaterialStockController : ControllerBase + { + private readonly IWmsMaterialStockAppService _wmsmaterialstockAppService; + + /// <summary> + /// Initializes a new instance of the <see cref="WmsMaterialStockController"/> class. + /// </summary> + /// <param name="wmsmaterialstockAppService">The wmsmaterialstock application service.</param> + public WmsMaterialStockController(IWmsMaterialStockAppService wmsmaterialstockAppService) + { + _wmsmaterialstockAppService = wmsmaterialstockAppService; + } + + /// <summary> + /// 鑾峰彇wmsmaterialstock. + /// </summary> + /// <param name="id">鏍囪瘑绗�.</param> + /// <returns></returns> + [HttpGet] + [Route("{id}")] + public virtual Task<WmsMaterialStockDto> GetAsync(Guid id) + { + return _wmsmaterialstockAppService.GetAsync(id); + } + + /// <summary> + /// 鑾峰彇wmsmaterialstock鐨勫垪琛�. + /// </summary> + /// <param name="input">杈撳叆.</param> + /// <returns></returns> + [HttpGet] + public virtual Task<PagedResultDto<WmsMaterialStockDto>> GetListAsync([FromQuery] GetWmsMaterialStocksInput input) + { + return _wmsmaterialstockAppService.GetListAsync(input); + } + + /// <summary> + /// 鍒涘缓wmsmaterialstock. + /// </summary> + /// <param name="input">杈撳叆.</param> + /// <returns></returns> + //[Authorize] + [HttpPost] + public virtual Task<WmsMaterialStockDto> CreateAsync(WmsMaterialStockCreateDto input) + { + return _wmsmaterialstockAppService.CreateAsync(input); + } + + /// <summary> + /// 鏇存柊wmsmaterialstock. + /// </summary> + /// <param name="id">鏍囪瘑绗�.</param> + /// <param name="input">杈撳叆.</param> + /// <returns></returns> + //[Authorize] + [HttpPut] + [Route("{id}")] + public virtual Task<WmsMaterialStockDto> UpdateAsync(Guid id, WmsMaterialStockUpdateDto input) + { + return _wmsmaterialstockAppService.UpdateAsync(id, input); + } + + /// <summary> + /// 鍏嬮殕WmsMaterialStock. + /// </summary> + /// <param name="ids">Id闆嗗悎.</param> + /// <returns></returns> + //[Authorize] + [HttpPost] + [Route("Clone")] + public virtual Task<List<WmsMaterialStockDto>> CloneAsync([FromBody] IEnumerable<Guid> ids) + { + return _wmsmaterialstockAppService.CloneAsync(ids); + } + + /// <summary> + /// 鍒犻櫎wmsmaterialstock. + /// </summary> + /// <param name="id">鏍囪瘑绗�.</param> + /// <returns></returns> + //[Authorize] + [HttpDelete] + [Route("{id}")] + public virtual Task DeleteAsync(Guid id) + { + return _wmsmaterialstockAppService.DeleteAsync(id); + } + + /// <summary> + /// 鎵归噺鍒犻櫎wmsmaterialstock. + /// </summary> + /// <param name="ids">The ids.</param> + /// <returns></returns> + //[Authorize] + [HttpDelete] + public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids) + { + return _wmsmaterialstockAppService.DeleteManyAsync(ids); + } + + /// <summary> + /// 璋冩暣鎺掑簭. + /// </summary> + /// <param name="id">鏍囪瘑绗�.</param> + /// <returns></returns> + [HttpPut] + [Route("{id}/AdjustSort/{sort}")] + public virtual Task AdjustSortAsync(Guid id, int sort) + { + return _wmsmaterialstockAppService.AdjustSortAsync(id, sort); + } + + /// <summary> + /// 瀵煎叆wmsmaterialstock. + /// </summary> + /// <returns></returns> + [Authorize] + [HttpPost] + [Route("Import")] + public virtual async Task<IActionResult> ImportAsync(IFormFile file) + { + using var stream = new MemoryStream(); + await file.CopyToAsync(stream); + stream.Seek(0L, SeekOrigin.Begin); + + var sheetNames = stream.GetSheetNames(); + var wmsmaterialstockRows = sheetNames.Contains("閰嶇疆") ? MiniExcel.Query<WmsMaterialStocksImportModel.WmsMaterialStockImportModel>(stream, sheetName: "閰嶇疆").ToList() : new(); + + if (!wmsmaterialstockRows.Any()) + { + throw new UserFriendlyException("璇锋鏌ュ鍏ョ殑琛ㄦ牸"); + } + + await _wmsmaterialstockAppService.ImportAsync(new WmsMaterialStocksImportModel + { + WmsMaterialStocks = wmsmaterialstockRows, + }); + + return Ok(); + } + + /// <summary> + /// 瀵煎嚭wmsmaterialstock. + /// </summary> + /// <returns></returns> + [HttpGet] + [Route("Export")] + public virtual async Task<IActionResult> ExportAsync([FromQuery] GetWmsMaterialStocksInput input) + { + input.MaxResultCount = int.MaxValue; + var exportData = await _wmsmaterialstockAppService.ExportAsync(input); + var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources/Templates/WmsMaterialStock瀵煎嚭妯℃澘.xlsx"); + if (!System.IO.File.Exists(templatePath)) + { + templatePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, $"Resources/Templates/WmsMaterialStock瀵煎嚭妯℃澘.xlsx"); + } + + var memoryStream = new MemoryStream(); + await memoryStream.SaveAsByTemplateAsync(templatePath, exportData.Sheets); + memoryStream.Seek(0L, SeekOrigin.Begin); + return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportData.FileName}_{DateTime.Now:yyyyMMddhhmmss}.xlsx" }; + } + } +} diff --git "a/HIAWms/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterialStock\345\257\274\345\207\272\346\250\241\346\235\277.xlsx" "b/HIAWms/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterialStock\345\257\274\345\207\272\346\250\241\346\235\277.xlsx" new file mode 100644 index 0000000..59dee9c --- /dev/null +++ "b/HIAWms/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterialStock\345\257\274\345\207\272\346\250\241\346\235\277.xlsx" Binary files differ -- Gitblit v1.9.3