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