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